diff options
author | Shuzhen Wang <shuzhenwang@google.com> | 2024-04-26 16:42:54 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-26 16:42:54 +0000 |
commit | 16bf9fca6716ef0f9c2b6ebfd39c30a3f6401d7d (patch) | |
tree | a210c963878fec21e6a48ef853f37ce358baff26 | |
parent | ac76e8e9e330f27a75b0deb5734171ca3731952b (diff) | |
parent | 5c8cbeda54a0a90e8d42cee6089ccf593d633ac3 (diff) | |
download | av-16bf9fca6716ef0f9c2b6ebfd39c30a3f6401d7d.tar.gz |
Merge "camera:fix wait request timeout in switching camera" into main
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.cpp | 32 | ||||
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.h | 5 |
2 files changed, 25 insertions, 12 deletions
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 271860478d..58b3e510c9 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -3649,19 +3649,18 @@ bool Camera3Device::RequestThread::threadLoop() { cleanUpFailedRequests(/*sendRequestError*/ true); // Check if any stream is abandoned. checkAndStopRepeatingRequest(); + // Inform waitUntilRequestProcessed thread of a failed request ID + wakeupLatestRequest(/*failedRequestId*/true, latestRequestId); return true; } else if (res != OK) { cleanUpFailedRequests(/*sendRequestError*/ false); + // Inform waitUntilRequestProcessed thread of a failed request ID + wakeupLatestRequest(/*failedRequestId*/true, latestRequestId); return false; } // Inform waitUntilRequestProcessed thread of a new request ID - { - Mutex::Autolock al(mLatestRequestMutex); - - mLatestRequestId = latestRequestId; - mLatestRequestSignal.signal(); - } + wakeupLatestRequest(/*failedRequestId*/false, latestRequestId); // Submit a batch of requests to HAL. // Use flush lock only when submitting multilple requests in a batch. @@ -4393,12 +4392,7 @@ void Camera3Device::RequestThread::cleanUpFailedRequests(bool sendRequestError) hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, captureRequest->mResultExtras); } - { - Mutex::Autolock al(mLatestRequestMutex); - - mLatestFailedRequestId = captureRequest->mResultExtras.requestId; - mLatestRequestSignal.signal(); - } + wakeupLatestRequest(/*failedRequestId*/true, captureRequest->mResultExtras.requestId); } // Remove yet-to-be submitted inflight request from inflightMap @@ -5060,6 +5054,20 @@ status_t Camera3Device::RequestThread::setHalInterface( return OK; } +void Camera3Device::RequestThread::wakeupLatestRequest( + bool latestRequestFailed, + int32_t latestRequestId) { + Mutex::Autolock al(mLatestRequestMutex); + + if (latestRequestFailed) { + mLatestFailedRequestId = latestRequestId; + } else { + mLatestRequestId = latestRequestId; + } + mLatestRequestSignal.signal(); +} + + /** * PreparerThread inner class methods */ diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index 9a2f2b15c0..1820702349 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -1026,6 +1026,11 @@ class Camera3Device : const sp<CaptureRequest> &request, const CameraMetadata& injectedSessionParams); + /** + * signal mLatestRequestmutex + **/ + void wakeupLatestRequest(bool latestRequestFailed, int32_t latestRequestId); + protected: virtual bool threadLoop(); |