From 8a4ccb0274032d23fccae6469cf2e5ca81597ffc Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Fri, 16 Nov 2018 15:43:36 -0800 Subject: [PATCH 1/2] 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; From 110342bd776c2a96a8a7a168a34dbca91843ee16 Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Mon, 19 Nov 2018 11:47:46 -0800 Subject: [PATCH 2/2] Camera: check stream state in useHalBufManager mode Test: Surface abandon CTS test fixed. Bug: 109829698 Change-Id: Ic2684098e129702f0ad8d8ce0af04a5195f29881 --- services/camera/libcameraservice/device3/Camera3Device.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index d8fbaf53f9..732164d482 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -5398,6 +5398,10 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { } if (mUseHalBufManager) { + if (outputStream->isAbandoned()) { + ALOGE("%s: stream %d is abandoned.", __FUNCTION__, streamId); + return TIMED_OUT; + } // HAL will request buffer through requestStreamBuffer API camera3_stream_buffer_t& buffer = outputBuffers->editItemAt(j); buffer.stream = outputStream->asHalStream();