[libcamera-devel] [PATCH v2 13/13] libcamera: ipu3: imgu: Use unique_ptr for video and subdevices

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Jun 28 09:04:42 CEST 2020


Hi Niklas,

Thank you for the patch.

On Sun, Jun 28, 2020 at 02:15:32AM +0200, Niklas Söderlund wrote:
> Instead of manually deleting the video and subdevices in the destructor
> use std::unique_ptr.
> 
> Suggested-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
>  src/libcamera/pipeline/ipu3/imgu.cpp | 24 ++++++++++++++-------
>  src/libcamera/pipeline/ipu3/imgu.h   | 32 ++++++++--------------------
>  2 files changed, 25 insertions(+), 31 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
> index 6a721d47cdacf3d6..4f11dc0dbb5fe94a 100644
> --- a/src/libcamera/pipeline/ipu3/imgu.cpp
> +++ b/src/libcamera/pipeline/ipu3/imgu.cpp
> @@ -44,28 +44,36 @@ int ImgUDevice::init(MediaDevice *media, unsigned int index)
>  	 * by the match() function: no need to check for newly created
>  	 * video devices and subdevice validity here.
>  	 */
> -	imgu_ = V4L2Subdevice::fromEntityName(media, name_);
> +	imgu_ = std::unique_ptr<V4L2Subdevice>(
> +			V4L2Subdevice::fromEntityName(media, name_));

How about

	imgu_.reset(V4L2Subdevice::fromEntityName(media, name_));

and similarly below ?

I'm considering a patch on top of this to make
V4L2Subdevice::fromEntityName() return a unique_ptr.

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

>  	ret = imgu_->open();
>  	if (ret)
>  		return ret;
>  
> -	input_ = V4L2VideoDevice::fromEntityName(media, name_ + " input");
> +	input_ = std::unique_ptr<V4L2VideoDevice>(
> +			V4L2VideoDevice::fromEntityName(media,
> +							name_ + " input"));
>  	ret = input_->open();
>  	if (ret)
>  		return ret;
>  
> -	output_ = V4L2VideoDevice::fromEntityName(media, name_ + " output");
> +	output_ = std::unique_ptr<V4L2VideoDevice>(
> +			V4L2VideoDevice::fromEntityName(media,
> +							name_ + " output"));
>  	ret = output_->open();
>  	if (ret)
>  		return ret;
>  
> -	viewfinder_ = V4L2VideoDevice::fromEntityName(media,
> -						      name_ + " viewfinder");
> +	viewfinder_ = std::unique_ptr<V4L2VideoDevice>(
> +			V4L2VideoDevice::fromEntityName(media,
> +							name_ + " viewfinder"));
>  	ret = viewfinder_->open();
>  	if (ret)
>  		return ret;
>  
> -	stat_ = V4L2VideoDevice::fromEntityName(media, name_ + " 3a stat");
> +	stat_ = std::unique_ptr<V4L2VideoDevice>(
> +			V4L2VideoDevice::fromEntityName(media,
> +							name_ + " 3a stat"));
>  	ret = stat_->open();
>  	if (ret)
>  		return ret;
> @@ -150,7 +158,7 @@ int ImgUDevice::configureVideoDevice(V4L2VideoDevice *dev, unsigned int pad,
>  		return ret;
>  
>  	/* No need to apply format to the stat node. */
> -	if (dev == stat_)
> +	if (dev == stat_.get())
>  		return 0;
>  
>  	*outputFormat = {};
> @@ -162,7 +170,7 @@ int ImgUDevice::configureVideoDevice(V4L2VideoDevice *dev, unsigned int pad,
>  	if (ret)
>  		return ret;
>  
> -	const char *name = dev == output_ ? "output" : "viewfinder";
> +	const char *name = dev == output_.get() ? "output" : "viewfinder";
>  	LOG(IPU3, Debug) << "ImgU " << name << " format = "
>  			 << outputFormat->toString();
>  
> diff --git a/src/libcamera/pipeline/ipu3/imgu.h b/src/libcamera/pipeline/ipu3/imgu.h
> index 7be25e40957fcb03..308bf26ee56e4e82 100644
> --- a/src/libcamera/pipeline/ipu3/imgu.h
> +++ b/src/libcamera/pipeline/ipu3/imgu.h
> @@ -24,21 +24,6 @@ struct StreamConfiguration;
>  class ImgUDevice
>  {
>  public:
> -	ImgUDevice()
> -		: imgu_(nullptr), input_(nullptr), output_(nullptr),
> -		  viewfinder_(nullptr), stat_(nullptr)
> -	{
> -	}
> -
> -	~ImgUDevice()
> -	{
> -		delete imgu_;
> -		delete input_;
> -		delete output_;
> -		delete viewfinder_;
> -		delete stat_;
> -	}
> -
>  	int init(MediaDevice *media, unsigned int index);
>  
>  	int configureInput(const Size &size, V4L2DeviceFormat *inputFormat);
> @@ -46,21 +31,22 @@ public:
>  	int configureOutput(const StreamConfiguration &cfg,
>  			    V4L2DeviceFormat *outputFormat)
>  	{
> -		return configureVideoDevice(output_, PAD_OUTPUT, cfg,
> +		return configureVideoDevice(output_.get(), PAD_OUTPUT, cfg,
>  					    outputFormat);
>  	}
>  
>  	int configureViewfinder(const StreamConfiguration &cfg,
>  				V4L2DeviceFormat *outputFormat)
>  	{
> -		return configureVideoDevice(viewfinder_, PAD_VF, cfg,
> +		return configureVideoDevice(viewfinder_.get(), PAD_VF, cfg,
>  					    outputFormat);
>  	}
>  
>  	int configureStat(const StreamConfiguration &cfg,
>  			  V4L2DeviceFormat *outputFormat)
>  	{
> -		return configureVideoDevice(stat_, PAD_STAT, cfg, outputFormat);
> +		return configureVideoDevice(stat_.get(), PAD_STAT, cfg,
> +					    outputFormat);
>  	}
>  
>  	int allocateBuffers(unsigned int bufferCount);
> @@ -71,11 +57,11 @@ public:
>  
>  	int enableLinks(bool enable);
>  
> -	V4L2Subdevice *imgu_;
> -	V4L2VideoDevice *input_;
> -	V4L2VideoDevice *output_;
> -	V4L2VideoDevice *viewfinder_;
> -	V4L2VideoDevice *stat_;
> +	std::unique_ptr<V4L2Subdevice> imgu_;
> +	std::unique_ptr<V4L2VideoDevice> input_;
> +	std::unique_ptr<V4L2VideoDevice> output_;
> +	std::unique_ptr<V4L2VideoDevice> viewfinder_;
> +	std::unique_ptr<V4L2VideoDevice> stat_;
>  	/* \todo Add param video device for 3A tuning */
>  
>  private:

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list