@@ -424,13 +424,37 @@ int CameraDevice::open(const hw_module_t *hardwareModule)
void CameraDevice::close()
{
- streams_.clear();
-
stop();
+ streams_.clear();
+
camera_->release();
}
+void CameraDevice::stopCamera()
+{
+ /*
+ * Stopping the worker will prevent any new requests queued to
+ * libcamera::Camera.
+ */
+ worker_.stop();
+
+ /*
+ * libcamera::Camera::stop() will synchronously complete all requests
+ * thereby, ensuring requestComplete() signal handler is executed for
+ * all requests which are in-flight.
+ */
+ camera_->stop();
+
+ /*
+ * While libcamera::Camera::stop() is completing in-flight requests,
+ * some of those request might queue post-processing of a stream.
+ * Purge the post-processsing queue in this case so that the descriptors
+ * can be processed and get offloaded from descriptors_.
+ */
+ for (auto &stream : streams_)
+ stream.flush();
+}
void CameraDevice::flush()
{
{
@@ -441,8 +465,7 @@ void CameraDevice::flush()
state_ = State::Flushing;
}
- worker_.stop();
- camera_->stop();
+ stopCamera();
MutexLocker stateLock(stateMutex_);
state_ = State::Stopped;
@@ -454,8 +477,7 @@ void CameraDevice::stop()
if (state_ == State::Stopped)
return;
- worker_.stop();
- camera_->stop();
+ stopCamera();
descriptors_ = {};
@@ -115,6 +115,7 @@ private:
};
void stop();
+ void stopCamera();
std::unique_ptr<libcamera::FrameBuffer>
createFrameBuffer(const buffer_handle_t camera3buffer,
Synchronise a way where queued requests in descriptors_ do not end up with Camera3RequestDescriptor::Status::Pending forever. To ensure this, stop the camera worker first, which will not let any new requests queue up to the libcamera::Camera. It is then followed by libcamera::Camera::stop() which is synchronous and will ensure all requests in-flight gets completed (and requestComplete() handler is called for all of them). Since CameraDevice::requestComplete() handler can even queue post-processing requests to CameraStream::PostProcessorWorker, ensure the worker is stopped and all those post-processing requests too, are purged as per CameraStream::flush() implemented earlier. All this operations is encapsulated in a a helper function CameraDevice::stopCamera() which can be used in stop() and flush() scenarios. Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> --- src/android/camera_device.cpp | 34 ++++++++++++++++++++++++++++------ src/android/camera_device.h | 1 + 2 files changed, 29 insertions(+), 6 deletions(-)