From 8a4ccb0274032d23fccae6469cf2e5ca81597ffc Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Fri, 16 Nov 2018 15:43:36 -0800 Subject: [PATCH] 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 --- .../camera/libcameraservice/device3/Camera3Device.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 8360d76876..d8fbaf53f9 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -6325,8 +6325,9 @@ status_t Camera3Device::RequestBufferStateMachine::initialize( bool Camera3Device::RequestBufferStateMachine::startRequestBuffer() { std::lock_guard 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 @@ void Camera3Device::RequestBufferStateMachine::endRequestBuffer() { if (mStatus == RB_STATUS_PENDING_STOP) { checkSwitchToStopLocked(); } + notifyTrackerLocked(/*active*/false); } void Camera3Device::RequestBufferStateMachine::onStreamsConfigured() { std::lock_guard lock(mLock); - RequestBufferState oldStatus = mStatus; mStatus = RB_STATUS_READY; - if (oldStatus != RB_STATUS_READY) { - notifyTrackerLocked(/*active*/true); - } return; } @@ -6360,7 +6358,6 @@ void Camera3Device::RequestBufferStateMachine::onRequestSubmitted() { mInflightMapEmpty = false; if (mStatus == RB_STATUS_STOPPED) { mStatus = RB_STATUS_READY; - notifyTrackerLocked(/*active*/true); } return; } @@ -6405,7 +6402,6 @@ void Camera3Device::RequestBufferStateMachine::notifyTrackerLocked(bool active) bool Camera3Device::RequestBufferStateMachine::checkSwitchToStopLocked() { if (mInflightMapEmpty && mRequestThreadPaused && !mRequestBufferOngoing) { mStatus = RB_STATUS_STOPPED; - notifyTrackerLocked(/*active*/false); return true; } return false;