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

Commit 4746fff6 authored by Emilian Peev's avatar Emilian Peev
Browse files

Camera: Check for failing request ids when syncing with device

Capture requests especially those near the end of a capture session
can fail due to various reasons like Hal errors, invalid output
surfaces etc. Avoid possible timeouts when waiting for a request id
to return by checking the respective error notifications.

Bug: 159476108
Test: Legacy API Camera CTS
Change-Id: I84dedfbee1eeb0ff8cddf67fdb36c5dfafbb70ef
parent ae87d21c
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -1777,6 +1777,14 @@ void Camera2Client::notifyError(int32_t errorCode,
        case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER:
            ALOGW("%s: Received recoverable error %d from HAL - ignoring, requestId %" PRId32,
                    __FUNCTION__, errorCode, resultExtras.requestId);

            if ((hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST == errorCode) ||
                    (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT == errorCode)) {
                Mutex::Autolock al(mLatestRequestMutex);

                mLatestFailedRequestId = resultExtras.requestId;
                mLatestRequestSignal.signal();
            }
            mCaptureSequencer->notifyError(errorCode, resultExtras);
            return;
        default:
@@ -2303,7 +2311,7 @@ status_t Camera2Client::waitUntilCurrentRequestIdLocked() {

status_t Camera2Client::waitUntilRequestIdApplied(int32_t requestId, nsecs_t timeout) {
    Mutex::Autolock l(mLatestRequestMutex);
    while (mLatestRequestId != requestId) {
    while ((mLatestRequestId != requestId) && (mLatestFailedRequestId != requestId)) {
        nsecs_t startTime = systemTime();

        auto res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout);
@@ -2312,7 +2320,7 @@ status_t Camera2Client::waitUntilRequestIdApplied(int32_t requestId, nsecs_t tim
        timeout -= (systemTime() - startTime);
    }

    return OK;
    return (mLatestRequestId == requestId) ? OK : DEAD_OBJECT;
}

void Camera2Client::notifyRequestId(int32_t requestId) {
+1 −0
Original line number Diff line number Diff line
@@ -237,6 +237,7 @@ private:
    mutable Mutex mLatestRequestMutex;
    Condition mLatestRequestSignal;
    int32_t mLatestRequestId = -1;
    int32_t mLatestFailedRequestId = -1;
    status_t waitUntilRequestIdApplied(int32_t requestId, nsecs_t timeout);
    status_t waitUntilCurrentRequestIdLocked();
};