[libcamera-devel] [PATCH 2/5] android: camera_device: Clear streams_ in stop()

Jacopo Mondi jacopo at jmondi.org
Mon Sep 6 16:01:49 CEST 2021


The CameraDevice::streams_ class member is populated at
configureStreams() time with one item per each stream requested to the
Camera device.

When a new configuration is applied to the Camera HAL the list of
requested streams has to be re-initialized and the streams_ vector needs
to be manually cleared in order to be populated from scratch.

As configureStreams() class CameraDevice::stop() at the very beginning,
centralize clearing the streams_ vector there even in the case the
camera has been stopped by a previous call to flush().

Suggested-by: Hirokazu Honda <hiroh at chromium.org>
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/android/camera_device.cpp | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index fda77db4540c..30c173a69720 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -448,8 +448,18 @@ void CameraDevice::flush()
 void CameraDevice::stop()
 {
 	MutexLocker stateLock(stateMutex_);
-	if (state_ == State::Stopped)
+	if (state_ == State::Stopped) {
+		/*
+		 * We get here if the list of streams requested by the camera
+		 * service has to be updated but the camera has been stopped
+		 * already, which happens if configureStreams() gets called
+		 * after a flush(). Clear the list of stream configurations,
+		 * no need to clear descriptors as stopping the camera completes
+		 * all the pending requests.
+		 */
+		streams_.clear();
 		return;
+	}
 
 	worker_.stop();
 	camera_->stop();
@@ -544,6 +554,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
 		LOG(HAL, Error) << "No streams in configuration";
 		return -EINVAL;
 	}
+	streams_.reserve(stream_list->num_streams);
 
 #if defined(OS_CHROMEOS)
 	if (!validateCropRotate(*stream_list))
@@ -560,14 +571,6 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
 		return -EINVAL;
 	}
 
-	/*
-	 * Clear and remove any existing configuration from previous calls, and
-	 * ensure the required entries are available without further
-	 * reallocation.
-	 */
-	streams_.clear();
-	streams_.reserve(stream_list->num_streams);
-
 	std::vector<Camera3StreamConfig> streamConfigs;
 	streamConfigs.reserve(stream_list->num_streams);
 
-- 
2.32.0



More information about the libcamera-devel mailing list