[libcamera-devel] [PATCH v3 10/11] android: camera_device: Set Encoder at construction

Niklas Söderlund niklas.soderlund at ragnatech.se
Thu Sep 10 13:06:05 CEST 2020


Hi Jacopo,

Thanks for your work.

On 2020-09-08 15:41:41 +0200, Jacopo Mondi wrote:
> Make the CameraStream encoder a private unique pointer and require its
> initialization at construction time. This ties the encoder lifetime to
> the CameraStream it has been created with, allowing to remove the
> CameraStream destructor.
> 
> This change dis-allow creating a CameraStream and set the Encoder later,
> which shall not happen now that we create CameraStream once we have all
> the required information in place.
> 
> No functional changes intended but this change aims to make the code
> more robust enforcing a stricter CameraStream interface.
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/android/camera_device.cpp | 22 +++++++++-------------
>  src/android/camera_device.h   |  8 ++++----
>  2 files changed, 13 insertions(+), 17 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index e0260c92246c..4c1416913d00 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -168,16 +168,11 @@ MappedCamera3Buffer::MappedCamera3Buffer(const buffer_handle_t camera3buffer,
>  	}
>  }
>  
> -CameraStream::CameraStream(PixelFormat f, Size s, unsigned int i)
> -	: format(f), size(s), jpeg(nullptr), index_(i)
> +CameraStream::CameraStream(PixelFormat f, Size s, unsigned int i, Encoder *encoder)

I would either name the argument 'e' or expand the other arguments to 
their full names mixing does not look nice.

> +	: format(f), size(s), index_(i), encoder_(encoder)
>  {
>  }
>  
> -CameraStream::~CameraStream()
> -{
> -	delete jpeg;
> -};
> -
>  /*
>   * \struct Camera3RequestDescriptor
>   *
> @@ -1271,20 +1266,21 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>  		}
>  
>  		StreamConfiguration &cfg = config_->at(index);
> -		CameraStream &cameraStream =
> -			streams_.emplace_back(formats::MJPEG, cfg.size, index);
> -		jpegStream->priv = static_cast<void *>(&cameraStream);
>  
>  		/*
>  		 * Construct a software encoder for MJPEG streams from the
>  		 * chosen libcamera source stream.
>  		 */
> -		cameraStream.jpeg = new EncoderLibJpeg();
> -		int ret = cameraStream.jpeg->configure(cfg);
> +		Encoder *encoder = new EncoderLibJpeg();
> +		int ret = encoder->configure(cfg);
>  		if (ret) {
>  			LOG(HAL, Error) << "Failed to configure encoder";
> +			delete encoder;
>  			return ret;
>  		}
> +
> +		streams_.emplace_back(formats::MJPEG, cfg.size, index, encoder);
> +		jpegStream->priv = static_cast<void *>(&streams_.back());

Same comment as in previous patch about pointer to vector member. As 
that should be sorted in that patch and I do like this change, with the 
arguments comment addressed above,

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

>  	}
>  
>  	switch (config_->validate()) {
> @@ -1473,7 +1469,7 @@ void CameraDevice::requestComplete(Request *request)
>  		if (cameraStream->format != formats::MJPEG)
>  			continue;
>  
> -		Encoder *encoder = cameraStream->jpeg;
> +		Encoder *encoder = cameraStream->encoder();
>  		if (!encoder) {
>  			LOG(HAL, Error) << "Failed to identify encoder";
>  			continue;
> diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> index f8f237203ce9..5ac8f05e5a07 100644
> --- a/src/android/camera_device.h
> +++ b/src/android/camera_device.h
> @@ -29,16 +29,15 @@ class CameraMetadata;
>  
>  struct CameraStream {
>  public:
> -	CameraStream(libcamera::PixelFormat, libcamera::Size, unsigned int i);
> -	~CameraStream();
> +	CameraStream(libcamera::PixelFormat, libcamera::Size, unsigned int i,
> +		     Encoder *encoder = nullptr);
>  
>  	unsigned int index() const { return index_; }
> +	Encoder *encoder() const { return encoder_.get(); }
>  
>  	libcamera::PixelFormat format;
>  	libcamera::Size size;
>  
> -	Encoder *jpeg;
> -
>  private:
>  	/*
>  	 * The index of the libcamera StreamConfiguration as added during
> @@ -46,6 +45,7 @@ private:
>  	 * one or more streams to the Android framework.
>  	 */
>  	unsigned int index_;
> +	std::unique_ptr<Encoder> encoder_;
>  };
>  
>  class CameraDevice : protected libcamera::Loggable
> -- 
> 2.28.0
> 
> _______________________________________________
> 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