Merge "Camera: Wait for the status tracker idle fence" into main am: 502ad30e70 am: 011ccffbf9 am: ffc9aa2178 am: 5c49ddb1b5
Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/2719522
Change-Id: I616f63252134bace651fdc1882a4bc44ac246f0c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/services/camera/libcameraservice/device3/StatusTracker.cpp b/services/camera/libcameraservice/device3/StatusTracker.cpp
index ea1f2c1..bd78e0a 100644
--- a/services/camera/libcameraservice/device3/StatusTracker.cpp
+++ b/services/camera/libcameraservice/device3/StatusTracker.cpp
@@ -172,6 +172,7 @@
}
}
+ bool waitForIdleFence = false;
// After new pending states appear, or timeout, check if we're idle. Even
// with timeout, need to check to account for fences that may still be
// clearing out
@@ -196,6 +197,7 @@
ssize_t idx = mStates.indexOfKey(newState.id);
// Ignore notices for unknown components
if (idx >= 0) {
+ bool validFence = newState.fence != Fence::NO_FENCE;
// Update single component state
mStates.replaceValueAt(idx, newState.state);
mIdleFence = Fence::merge(String8("idleFence"),
@@ -204,6 +206,8 @@
ComponentState newState = getDeviceStateLocked();
if (newState != prevState) {
mStateTransitions.add(newState);
+ } else if (validFence && !waitForIdleFence) {
+ waitForIdleFence = true;
}
prevState = newState;
}
@@ -227,6 +231,13 @@
}
mStateTransitions.clear();
+ if (waitForIdleFence) {
+ auto ret = mIdleFence->wait(kWaitDuration);
+ if (ret == NO_ERROR) {
+ mComponentsChanged = true;
+ }
+ }
+
return true;
}