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

Commit 71e6298e authored by Yin-Chia Yeh's avatar Yin-Chia Yeh
Browse files

Camera: fix per stream error code for HAL buffer manager

Also some refactoring to make the code more readable and less
indent.
Also clarify the unknown error case that per stream error code
might still be provided.

Test: GCA smoke test and camera CTS
Bug: 120986771
Change-Id: I3b7d3eadfe3895a3fdf3888735a3932d5c6c03bc
parent e50086a2
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