[libcamera-devel] [PATCH v2 3/3] libcamera: pipeline: raspberrypi: Update sensor's V4L2_CID_NOTIFY_GAINS control

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Jan 5 11:19:31 CET 2022


Hi David,

Thank you for the patch.

On Wed, Jan 05, 2022 at 08:55:53AM +0000, David Plowman wrote:
> If the sensor exposes the V4L2_CID_NOTIFY_GAINS control, assume it
> means the sensor wants to be told the latest colour gains.
> 
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> ---
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 26 +++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index b5c687da..0d4b5a57 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1495,6 +1495,32 @@ void RPiCameraData::statsMetadataComplete(uint32_t bufferId, const ControlList &
>  	Request *request = requestQueue_.front();
>  	request->metadata().merge(controls);
>  
> +	/*
> +	 * If the sensor has the V4L2_CID_NOTIFY_GAIN control then it wants
> +	 * to be notified of the latest colour gains.
> +	 */
> +	auto it = sensor_->controls().find(V4L2_CID_NOTIFY_GAINS);

As this will not vary at runtime, this check could be done at init time,
with the unity value cached and a flag set to indicate notify gains
support. Up to you.

> +	if (it != sensor_->controls().end()) {
> +		if (controls.contains(libcamera::controls::ColourGains)) {
> +			libcamera::Span<const float> colourGains = controls.get(libcamera::controls::ColourGains);
> +			/*
> +			 * This control is a linear gain value where the default is
> +			 * defined to correspond to a gain of 1. The order of the gains
> +			 * is always B, Gb, Gr, R.
> +			 */
> +			int unity = it->second.def().get<int32_t>();
> +			ControlList ctrls(sensor_->controls());
> +			int32_t gains[4] = { static_cast<int32_t>(colourGains[1] * unity),
> +					     unity, unity,
> +					     static_cast<int32_t>(colourGains[0] * unity) };

std::array could be used too, up to you.

> +			ControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(gains),
> +							    sizeof(gains) });

I'm a bit surprised that you have to cast this to a uint8_t array, as
the control uses 32-bit integer array. Would

			ControlValue c(Span<const uint32_t>{ gains });

work ? It may even be possible to write

			ctrls.set(V4L2_CID_NOTIFY_GAINS, Span<const uint32_t>{ gains });

as the ControlValue constructor is implicit.

> +			ctrls.set(V4L2_CID_NOTIFY_GAINS, c);
> +
> +			sensor_->setControls(&ctrls);
> +		}
> +	}
> +
>  	state_ = State::IpaComplete;
>  	handleState();
>  }

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list