Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8eb6c4ed authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Camera: fix per stream error code for HAL buffer manager"

parents 48c35915 71e6298e
Loading
Loading
Loading
Loading
+100 −93
Original line number Diff line number Diff line
@@ -186,13 +186,29 @@ camera3_buffer_request_status_t CameraDeviceSession::requestStreamBuffers(
    }
    ATRACE_END();

    if (status == BufferRequestStatus::OK || status == BufferRequestStatus::FAILED_PARTIAL) {
    switch (status) {
        case BufferRequestStatus::FAILED_CONFIGURING:
            return CAMERA3_BUF_REQ_FAILED_CONFIGURING;
        case BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS:
            return CAMERA3_BUF_REQ_FAILED_ILLEGAL_ARGUMENTS;
        default:
            break; // Other status Handled by following code
    }

    if (status != BufferRequestStatus::OK && status != BufferRequestStatus::FAILED_PARTIAL &&
            status != BufferRequestStatus::FAILED_UNKNOWN) {
        ALOGE("%s: unknown buffer request error code %d", __FUNCTION__, status);
        return CAMERA3_BUF_REQ_FAILED_UNKNOWN;
    }

    // Only OK, FAILED_PARTIAL and FAILED_UNKNOWN reaches here
    if (bufRets.size() != num_buffer_reqs) {
        ALOGE("%s: expect %d buffer requests returned, only got %zu",
                __FUNCTION__, num_buffer_reqs, bufRets.size());
        return CAMERA3_BUF_REQ_FAILED_UNKNOWN;
    }

    *num_returned_buf_reqs = num_buffer_reqs;
    for (size_t i = 0; i < num_buffer_reqs; i++) {
        // maybe we can query all streams in one call to avoid frequent locking device here?
        Camera3Stream* stream = getStreamPointer(bufRets[i].streamId);
@@ -203,12 +219,9 @@ camera3_buffer_request_status_t CameraDeviceSession::requestStreamBuffers(
        returned_buf_reqs[i].stream = stream;
    }

        std::vector<int> importedFences;
        std::vector<std::pair<buffer_handle_t, int>> importedBuffers;
    // Handle failed streams
    for (size_t i = 0; i < num_buffer_reqs; i++) {
            int streamId = bufRets[i].streamId;
            switch (bufRets[i].val.getDiscriminator()) {
                case StreamBuffersVal::hidl_discriminator::error:
        if (bufRets[i].val.getDiscriminator() == StreamBuffersVal::hidl_discriminator::error) {
            returned_buf_reqs[i].num_output_buffers = 0;
            switch (bufRets[i].val.error()) {
                case StreamBufferRequestError::NO_BUFFER_AVAILABLE:
@@ -226,11 +239,24 @@ camera3_buffer_request_status_t CameraDeviceSession::requestStreamBuffers(
                default:
                    ALOGE("%s: Unknown StreamBufferRequestError %d",
                            __FUNCTION__, bufRets[i].val.error());
                            cleanupInflightBufferFences(importedFences, importedBuffers);
                    return CAMERA3_BUF_REQ_FAILED_UNKNOWN;
            }
                    break;
                case StreamBuffersVal::hidl_discriminator::buffers: {
        }
    }

    if (status == BufferRequestStatus::FAILED_UNKNOWN) {
        return CAMERA3_BUF_REQ_FAILED_UNKNOWN;
    }

    // Only BufferRequestStatus::OK and BufferRequestStatus::FAILED_PARTIAL reaches here
    std::vector<int> importedFences;
    std::vector<std::pair<buffer_handle_t, int>> importedBuffers;
    for (size_t i = 0; i < num_buffer_reqs; i++) {
        if (bufRets[i].val.getDiscriminator() !=
                StreamBuffersVal::hidl_discriminator::buffers) {
            continue;
        }
        int streamId = bufRets[i].streamId;
        const hidl_vec<StreamBuffer>& hBufs = bufRets[i].val.buffers();
        camera3_stream_buffer_t* outBufs = returned_buf_reqs[i].output_buffers;
        for (size_t b = 0; b < hBufs.size(); b++) {
@@ -268,31 +294,12 @@ camera3_buffer_request_status_t CameraDeviceSession::requestStreamBuffers(
            outBuf.release_fence = -1;
        }
        returned_buf_reqs[i].status = CAMERA3_PS_BUF_REQ_OK;
                } break;
                default:
                    ALOGE("%s: unknown StreamBuffersVal discrimator!", __FUNCTION__);
                    cleanupInflightBufferFences(importedFences, importedBuffers);
                    return CAMERA3_BUF_REQ_FAILED_UNKNOWN;
    }
        }

        *num_returned_buf_reqs = num_buffer_reqs;

    return (status == BufferRequestStatus::OK) ?
            CAMERA3_BUF_REQ_OK : CAMERA3_BUF_REQ_FAILED_PARTIAL;
}

    switch (status) {
        case BufferRequestStatus::FAILED_CONFIGURING:
            return CAMERA3_BUF_REQ_FAILED_CONFIGURING;
        case BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS:
            return CAMERA3_BUF_REQ_FAILED_ILLEGAL_ARGUMENTS;
        case BufferRequestStatus::FAILED_UNKNOWN:
        default:
            return CAMERA3_BUF_REQ_FAILED_UNKNOWN;
    }
}

void CameraDeviceSession::returnStreamBuffers(
        uint32_t num_buffers,
        const camera3_stream_buffer_t* const* buffers) {
+3 −1
Original line number Diff line number Diff line
@@ -120,7 +120,9 @@ enum BufferRequestStatus : uint32_t {

    /**
     * Method call failed for all streams and no buffers are returned at all.
     * Failure due to unknown reason.
     * Failure due to unknown reason, or all streams has individual failing
     * reason. For the latter case, check per stream status for each returned
     * StreamBufferRet.
     */
    FAILED_UNKNOWN = 4,
};
+1 −1
Original line number Diff line number Diff line
@@ -444,7 +444,7 @@ f7431f3e3e4e3387fc6f27a6cf423eddcd824a395dc4349d302c995ab44a9895 android.hardwar
09ab9b24994429d9bb32a3fb420b6f6be3e47eb655139a2c08c4e80d3f33ff95 android.hardware.camera.device@3.5::ICameraDevice
06237de53c42890029e3f8fe7d1480d078469c0d07608e51c37b4d485d342992 android.hardware.camera.device@3.5::ICameraDeviceCallback
08c68b196e2fc4e5ba67ba0d0917bde828a87cbe2cffec19d04733972da9eb49 android.hardware.camera.device@3.5::ICameraDeviceSession
d487ab209944df8987eeca70cf09307fc1429cedf64b0ea9e77c61d8caeb8c15 android.hardware.camera.device@3.5::types
acaba39216973e58949f50978762bcda1c29f5f7e0bca3e08db21f0767356130 android.hardware.camera.device@3.5::types
74ec7732fdacb22292c907b49f8f933510851ea1b3ed195c4dcdff35a20387f5 android.hardware.camera.metadata@3.4::types
0fb39a7809ad1c52b3efbbed5ef4749b06c2a4f1f19cdc3efa2e3d9b28f1205c android.hardware.camera.provider@2.5::ICameraProvider
f5777403d65135a5407723671bc7a864cdca83aea13ee3ce2894b95e6588ca3a android.hardware.camera.provider@2.5::types