[libcamera-devel] [PATCH v3 4/4] pipeline: raspberrypi: Update the lens shading control in-place

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Feb 21 14:06:46 CET 2021


Hi Naush,

Thank you for the patch.

On Thu, Feb 18, 2021 at 12:48:24PM +0000, Naushir Patuck wrote:
> Only update the lens shading control if it is present in the
> ControlList.
> 
> Add the dmabuf file descriptor to the lens shading control in-place
> rather than taking a copy.
> 
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> ---
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 21 +++++++++----------
>  1 file changed, 10 insertions(+), 11 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index acf2d56cddb2..a60415d93705 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1338,17 +1338,16 @@ void RPiCameraData::embeddedComplete(uint32_t bufferId)
>  
>  void RPiCameraData::setIspControls(const ControlList &controls)
>  {
> -	ControlList ctrls = controls;
> -
> -	Span<const uint8_t> s =
> -		ctrls.get(V4L2_CID_USER_BCM2835_ISP_LENS_SHADING).data();
> -	bcm2835_isp_lens_shading ls =
> -		*reinterpret_cast<const bcm2835_isp_lens_shading *>(s.data());
> -	ls.dmabuf = lsTable_.fd();
> -
> -	ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&ls),
> -					    sizeof(ls) });
> -	ctrls.set(V4L2_CID_USER_BCM2835_ISP_LENS_SHADING, c);
> +	ControlList ctrls = std::move(controls);

std::move() won't have the expected effect here. controls is a const
reference, so ctrls will be a copy. It's a bit annoying that the
compiler doesn't warn us :-/

The code will run fine, but I think avoiding std::move() would be more
explicit as it's easy to overlook the fact that a copy is created
otherwise. No need to change this now, but if you get the chance at some
point, it would be nice.

> +
> +	if (ctrls.contains(V4L2_CID_USER_BCM2835_ISP_LENS_SHADING)) {
> +		ControlValue &value =
> +			const_cast<ControlValue &>(ctrls.get(V4L2_CID_USER_BCM2835_ISP_LENS_SHADING));

The const_cast is not nice. If we want to support this kind of usage, we
should extend the ControlList API to return a non-const ControlValue.

> +		Span<uint8_t> s = value.data();
> +		bcm2835_isp_lens_shading *ls =
> +			reinterpret_cast<bcm2835_isp_lens_shading *>(s.data());
> +		ls->dmabuf = lsTable_.fd();
> +	}
>  
>  	isp_[Isp::Input].dev()->setControls(&ctrls);
>  	handleState();

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list