From c300a07bf7cc4722540c9068ad5a23ded914ba38 Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Wed, 13 Feb 2019 14:56:57 -0800 Subject: [PATCH] Camera: fix signalStreamFlush logic 1. Fix off by one error in signalStreamFlush call 2. Make sure signalStreamFlush is called before we toggle request thread idle (which might cause another thread finishing waitUntilIdle() and thus start calling configureStreams) Test: Pixel 3 + camera CTS Bug: 120986771 Change-Id: Ifd6f77ef628ee200c024c7c6a05bde20937c745d --- .../device3/Camera3Device.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 7850e70f1e..865c3f6b01 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -4511,7 +4511,7 @@ void Camera3Device::HalInterface::signalPipelineDrain(const std::vector& st return; } - auto err = mHidlSession_3_5->signalStreamFlush(streamIds, mNextStreamConfigCounter); + auto err = mHidlSession_3_5->signalStreamFlush(streamIds, mNextStreamConfigCounter - 1); if (!err.isOk()) { ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str()); return; @@ -5833,16 +5833,16 @@ sp if (mPaused == false) { ALOGV("%s: RequestThread: Going idle", __FUNCTION__); mPaused = true; - // Let the tracker know - sp statusTracker = mStatusTracker.promote(); - if (statusTracker != 0) { - statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); - } if (mNotifyPipelineDrain) { mInterface->signalPipelineDrain(mStreamIdsToBeDrained); mNotifyPipelineDrain = false; mStreamIdsToBeDrained.clear(); } + // Let the tracker know + sp statusTracker = mStatusTracker.promote(); + if (statusTracker != 0) { + statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); + } sp parent = mParent.promote(); if (parent != nullptr) { parent->mRequestBufferSM.onRequestThreadPaused(); @@ -5926,16 +5926,16 @@ bool Camera3Device::RequestThread::waitIfPaused() { if (mPaused == false) { mPaused = true; ALOGV("%s: RequestThread: Paused", __FUNCTION__); - // Let the tracker know - sp statusTracker = mStatusTracker.promote(); - if (statusTracker != 0) { - statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); - } if (mNotifyPipelineDrain) { mInterface->signalPipelineDrain(mStreamIdsToBeDrained); mNotifyPipelineDrain = false; mStreamIdsToBeDrained.clear(); } + // Let the tracker know + sp statusTracker = mStatusTracker.promote(); + if (statusTracker != 0) { + statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); + } sp parent = mParent.promote(); if (parent != nullptr) { parent->mRequestBufferSM.onRequestThreadPaused();