[libcamera-devel] [PATCH v2 7/7] android: function flush() waits for all requests completed before return
Han-Lin Chen
hanlinchen at chromium.org
Fri Aug 12 11:08:38 CEST 2022
Android requires that flush() only returns when there are no more outstanding
buffers or requests left in the HAL. Add a contition variable to wait for all
pending requests are completed before returning the call.
Signed-off-by: Han-Lin Chen <hanlinchen at chromium.org>
---
src/android/camera_device.cpp | 23 ++++++++++++++++++++---
src/android/camera_device.h | 2 ++
2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index c999b198..2672a5eb 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -428,8 +428,20 @@ void CameraDevice::flush()
camera_->stop();
- MutexLocker stateLock(stateMutex_);
- state_ = State::Stopped;
+ {
+ MutexLocker locker(pendingRequestMutex_);
+ pendingRequestsCv_.wait(
+ locker,
+ [&]() LIBCAMERA_TSA_REQUIRES(pendingRequestMutex_) {
+ return pendingRequests_.empty();
+ });
+ ASSERT(pendingRequests_.empty());
+ }
+
+ {
+ MutexLocker stateLock(stateMutex_);
+ state_ = State::Stopped;
+ }
}
void CameraDevice::stop()
@@ -1480,7 +1492,6 @@ void CameraDevice::completeResultDescriptor(Camera3ResultDescriptor *result)
completeRequestDescriptor(result->request_);
}
-
/**
* \brief Complete the Camera3RequestDescriptor
* \param[in] descriptor The Camera3RequestDescriptor
@@ -1526,6 +1537,12 @@ void CameraDevice::completeRequestDescriptor(Camera3RequestDescriptor *request)
pendingRequests_.pop_front();
}
+
+ if (pendingRequests_.empty()) {
+ locker.unlock();
+ pendingRequestsCv_.notify_one();
+ return;
+ }
}
void CameraDevice::setBufferStatus(StreamBuffer &streamBuffer,
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 613e419f..aa976db2 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -135,6 +135,8 @@ private:
std::map<CameraStream *, std::list<StreamBuffer *>> pendingStreamBuffers_
LIBCAMERA_TSA_GUARDED_BY(pendingRequestMutex_);
+ libcamera::ConditionVariable pendingRequestsCv_;
+
std::string maker_;
std::string model_;
--
2.37.1.595.g718a3a8f04-goog
More information about the libcamera-devel
mailing list