diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 4b938edee4..32952cc12c 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -5443,6 +5443,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(); @@ -6370,8 +6374,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; @@ -6387,15 +6392,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; } @@ -6405,7 +6407,6 @@ void Camera3Device::RequestBufferStateMachine::onRequestSubmitted() { mInflightMapEmpty = false; if (mStatus == RB_STATUS_STOPPED) { mStatus = RB_STATUS_READY; - notifyTrackerLocked(/*active*/true); } return; } @@ -6450,7 +6451,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;