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
gugelfrei
Yin-Chia Yeh 6 years ago
parent 651fe2e9b4
commit 8a4ccb0274

@ -6325,8 +6325,9 @@ status_t Camera3Device::RequestBufferStateMachine::initialize(
bool Camera3Device::RequestBufferStateMachine::startRequestBuffer() {
std::lock_guard<std::mutex> 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<std::mutex> 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;

Loading…
Cancel
Save