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

Commit 41fd079b authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Camera: Handling out-of-order request id" into udc-qpr-dev

parents 94ef4389 9dd5eda0
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -70,7 +70,9 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
                cameraDeviceId, api1CameraId, cameraFacing, sensorOrientation, clientPid,
                clientUid, servicePid, overrideForPerfClass, overrideToPortrait,
                /*legacyClient*/ true),
        mParameters(api1CameraId, cameraFacing)
        mParameters(api1CameraId, cameraFacing),
        mLatestRequestIds(kMaxRequestIds),
        mLatestFailedRequestIds(kMaxRequestIds)
{
    ATRACE_CALL();

@@ -1843,7 +1845,7 @@ void Camera2Client::notifyError(int32_t errorCode,
                    (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT == errorCode)) {
                Mutex::Autolock al(mLatestRequestMutex);

                mLatestFailedRequestId = resultExtras.requestId;
                mLatestFailedRequestIds.add(resultExtras.requestId);
                mLatestRequestSignal.signal();
            }
            mCaptureSequencer->notifyError(errorCode, resultExtras);
@@ -2418,7 +2420,10 @@ status_t Camera2Client::waitUntilCurrentRequestIdLocked() {

status_t Camera2Client::waitUntilRequestIdApplied(int32_t requestId, nsecs_t timeout) {
    Mutex::Autolock l(mLatestRequestMutex);
    while ((mLatestRequestId != requestId) && (mLatestFailedRequestId != requestId)) {
    while ((std::find(mLatestRequestIds.begin(), mLatestRequestIds.end(), requestId) ==
            mLatestRequestIds.end()) &&
           (std::find(mLatestFailedRequestIds.begin(), mLatestFailedRequestIds.end(), requestId) ==
            mLatestFailedRequestIds.end())) {
        nsecs_t startTime = systemTime();

        auto res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout);
@@ -2427,13 +2432,14 @@ status_t Camera2Client::waitUntilRequestIdApplied(int32_t requestId, nsecs_t tim
        timeout -= (systemTime() - startTime);
    }

    return (mLatestRequestId == requestId) ? OK : DEAD_OBJECT;
    return (std::find(mLatestRequestIds.begin(), mLatestRequestIds.end(), requestId) !=
             mLatestRequestIds.end()) ? OK : DEAD_OBJECT;
}

void Camera2Client::notifyRequestId(int32_t requestId) {
    Mutex::Autolock al(mLatestRequestMutex);

    mLatestRequestId = requestId;
    mLatestRequestIds.add(requestId);
    mLatestRequestSignal.signal();
}

+3 −7
Original line number Diff line number Diff line
@@ -22,11 +22,7 @@
#include "common/Camera2ClientBase.h"
#include "api1/client2/Parameters.h"
#include "api1/client2/FrameProcessor.h"
//#include "api1/client2/StreamingProcessor.h"
//#include "api1/client2/JpegProcessor.h"
//#include "api1/client2/ZslProcessor.h"
//#include "api1/client2/CaptureSequencer.h"
//#include "api1/client2/CallbackProcessor.h"
#include <media/RingBuffer.h>

namespace android {

@@ -263,8 +259,8 @@ private:

    mutable Mutex mLatestRequestMutex;
    Condition mLatestRequestSignal;
    int32_t mLatestRequestId = -1;
    int32_t mLatestFailedRequestId = -1;
    static constexpr size_t kMaxRequestIds = BufferQueueDefs::NUM_BUFFER_SLOTS;
    RingBuffer<int32_t> mLatestRequestIds, mLatestFailedRequestIds;
    status_t waitUntilRequestIdApplied(int32_t requestId, nsecs_t timeout);
    status_t waitUntilCurrentRequestIdLocked();
};
+8 −1
Original line number Diff line number Diff line
@@ -3030,6 +3030,7 @@ Camera3Device::RequestThread::RequestThread(wp<Camera3Device> parent,
        mNotifyPipelineDrain(false),
        mFrameNumber(0),
        mLatestRequestId(NAME_NOT_FOUND),
        mLatestFailedRequestId(NAME_NOT_FOUND),
        mCurrentAfTriggerId(0),
        mCurrentPreCaptureTriggerId(0),
        mRotateAndCropOverride(ANDROID_SCALER_ROTATE_AND_CROP_NONE),
@@ -3281,7 +3282,7 @@ status_t Camera3Device::RequestThread::waitUntilRequestProcessed(
    ATRACE_CALL();
    Mutex::Autolock l(mLatestRequestMutex);
    status_t res;
    while (mLatestRequestId != requestId) {
    while (mLatestRequestId != requestId && mLatestFailedRequestId != requestId) {
        nsecs_t startTime = systemTime();

        res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout);
@@ -4359,6 +4360,12 @@ void Camera3Device::RequestThread::cleanUpFailedRequests(bool sendRequestError)
                        hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST,
                        captureRequest->mResultExtras);
            }
            {
                Mutex::Autolock al(mLatestRequestMutex);

                mLatestFailedRequestId = captureRequest->mResultExtras.requestId;
                mLatestRequestSignal.signal();
            }
        }

        // Remove yet-to-be submitted inflight request from inflightMap
+1 −0
Original line number Diff line number Diff line
@@ -1142,6 +1142,7 @@ class Camera3Device :
        Condition          mLatestRequestSignal;
        // android.request.id for latest process_capture_request
        int32_t            mLatestRequestId;
        int32_t            mLatestFailedRequestId;
        CameraMetadata     mLatestRequest;
        std::unordered_map<std::string, CameraMetadata> mLatestPhysicalRequest;