Camera: Remove redundant RequestThread wait during flush
If RequestThread::clear() is called right before the
mRequestSignal.waitRelative(), an extra 50ms latency is incurred.
Creating a condition for the conditional variable fixes the issue.
Test: Camera CTS
Bug: 228419719
Change-Id: Ibc8d2c9e2c98d68b73d2442118694c7a33e9d3b5
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 55acec4..04e65d4 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -2857,6 +2857,7 @@
mInterface(interface),
mListener(nullptr),
mId(getId(parent)),
+ mRequestClearing(false),
mFirstRepeating(false),
mReconfigured(false),
mDoPause(false),
@@ -3090,6 +3091,7 @@
*lastFrameNumber = mRepeatingLastFrameNumber;
}
mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES;
+ mRequestClearing = true;
mRequestSignal.signal();
return OK;
}
@@ -4218,7 +4220,9 @@
break;
}
- res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout);
+ if (!mRequestClearing) {
+ res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout);
+ }
if ((mRequestQueue.empty() && mRepeatingRequests.empty()) ||
exitPending()) {
@@ -4240,6 +4244,7 @@
if (parent != nullptr) {
parent->mRequestBufferSM.onRequestThreadPaused();
}
+ mRequestClearing = false;
}
// Stop waiting for now and let thread management happen
return NULL;
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index 1a240c3..749b342 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -982,6 +982,8 @@
Mutex mRequestLock;
Condition mRequestSignal;
+ bool mRequestClearing;
+
Condition mRequestSubmittedSignal;
RequestList mRequestQueue;
RequestList mRepeatingRequests;