[libcamera-devel] [PATCH v3 6/8] android: camera_device: Maintain a vector of CameraStream

Niklas Söderlund niklas.soderlund at ragnatech.se
Fri Jul 3 17:08:32 CEST 2020


Hi Kieran,

Thanks for your work.

On 2020-07-03 13:39:17 +0100, Kieran Bingham wrote:
> Introduce a vector storing a CameraStream to track and maintain
> state between an Android stream (camera3_stream_t) and a libcamera
> Stream.
> 
> Only the index of the libcamera stream is stored, to facilitate identifying
> the correct index for both the StreamConfiguration and Stream vectors.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>

> ---
>  src/android/camera_device.cpp | 22 ++++++++++++++++++++--
>  src/android/camera_device.h   | 10 ++++++++++
>  2 files changed, 30 insertions(+), 2 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 4e77a92dbea5..28334751a26e 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -952,6 +952,20 @@ 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
> +	 * re-allcoation.
> +	 */
> +	streams_.clear();
> +	streams_.reserve(stream_list->num_streams);
> +
> +	/*
> +	 * Track actually created streams, as there may not be a 1:1 mapping of
> +	 * camera3 streams to libcamera streams.
> +	 */
> +	unsigned int streamIndex = 0;
> +
>  	for (unsigned int i = 0; i < stream_list->num_streams; ++i) {
>  		camera3_stream_t *stream = stream_list->streams[i];
>  
> @@ -974,6 +988,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>  		streamConfiguration.pixelFormat = format;
>  
>  		config_->addConfiguration(streamConfiguration);
> +
> +		/* Maintain internal state of all stream mappings. */
> +		streams_[i].index = streamIndex++;
>  	}
>  
>  	switch (config_->validate()) {
> @@ -991,10 +1008,11 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>  
>  	for (unsigned int i = 0; i < stream_list->num_streams; ++i) {
>  		camera3_stream_t *stream = stream_list->streams[i];
> -		StreamConfiguration &streamConfiguration = config_->at(i);
> +		CameraStream *cameraStream = &streams_[i];
> +		StreamConfiguration &cfg = config_->at(cameraStream->index);
>  
>  		/* Use the bufferCount confirmed by the validation process. */
> -		stream->max_buffers = streamConfiguration.bufferCount;
> +		stream->max_buffers = cfg.bufferCount;
>  	}
>  
>  	/*
> diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> index d7834d94f439..8e306c1f6d8b 100644
> --- a/src/android/camera_device.h
> +++ b/src/android/camera_device.h
> @@ -25,6 +25,15 @@
>  
>  class CameraMetadata;
>  
> +struct CameraStream {
> +	/*
> +	 * The index represents the index for libcamera stream parameters. This
> +	 * will differ from any index of the halStream, particularly for HAL
> +	 * only streams such as MJPEG.
> +	 */
> +	unsigned int index;
> +};
> +
>  class CameraDevice : protected libcamera::Loggable
>  {
>  public:
> @@ -90,6 +99,7 @@ private:
>  
>  	std::vector<Camera3StreamConfiguration> streamConfigurations_;
>  	std::map<int, libcamera::PixelFormat> formatsMap_;
> +	std::vector<CameraStream> streams_;
>  
>  	int facing_;
>  	int orientation_;
> -- 
> 2.25.1
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list