Camera: fix RequestBufferStateMachine bug
The old implementation only toggle idle when waitUnitlDrained
is explicitly called, but there are some cases where
application don't need to call waitUntilDrained but can still
expect the device goes into idle.
Test: CTS on Pixel3 equipped with webcam HAL
Bug: 109829698
Change-Id: I48c26abcc9c2f1263c2360611c935fc317745e59
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 8360d76..d8fbaf5 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -6325,8 +6325,9 @@
bool Camera3Device::RequestBufferStateMachine::startRequestBuffer() {
std::lock_guard<std::mutex> lock(mLock);
- if (mStatus == RB_STATUS_READY) {
+ if (mStatus == RB_STATUS_READY || mStatus == RB_STATUS_PENDING_STOP) {
mRequestBufferOngoing = true;
+ notifyTrackerLocked(/*active*/true);
return true;
}
return false;
@@ -6342,15 +6343,12 @@
if (mStatus == RB_STATUS_PENDING_STOP) {
checkSwitchToStopLocked();
}
+ notifyTrackerLocked(/*active*/false);
}
void Camera3Device::RequestBufferStateMachine::onStreamsConfigured() {
std::lock_guard<std::mutex> lock(mLock);
- RequestBufferState oldStatus = mStatus;
mStatus = RB_STATUS_READY;
- if (oldStatus != RB_STATUS_READY) {
- notifyTrackerLocked(/*active*/true);
- }
return;
}
@@ -6360,7 +6358,6 @@
mInflightMapEmpty = false;
if (mStatus == RB_STATUS_STOPPED) {
mStatus = RB_STATUS_READY;
- notifyTrackerLocked(/*active*/true);
}
return;
}
@@ -6405,7 +6402,6 @@
bool Camera3Device::RequestBufferStateMachine::checkSwitchToStopLocked() {
if (mInflightMapEmpty && mRequestThreadPaused && !mRequestBufferOngoing) {
mStatus = RB_STATUS_STOPPED;
- notifyTrackerLocked(/*active*/false);
return true;
}
return false;