[libcamera-devel] [PATCH v3 2/5] libcamera: ipu3: Register FrameDurations control

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Mar 9 00:35:10 CET 2021


Hi Jacopo,

Thank you for the patch.

On Mon, Feb 22, 2021 at 11:52:19AM +0100, Jacopo Mondi wrote:
> Register the FrameDurations control in the IPU3 pipeline handler
> computed using the vertical blanking limits and the sensor
> pixel rate as parameters.
> 
> The FrameDurations control limits should be updated everytime a new
> configuration is applied to the sensor.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 33 +++++++++++++++++++++++++++-
>  1 file changed, 32 insertions(+), 1 deletion(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index f867b5913b27..5c24f6a0c451 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -824,6 +824,7 @@ int PipelineHandlerIPU3::initControls(IPU3CameraData *data)
>  		return ret;
>  
>  	ControlInfoMap::Map controls = IPU3Controls;
> +	const ControlInfoMap &sensorControls = sensor->controls();
>  
>  	/*
>  	 * Compute exposure time limits.
> @@ -836,7 +837,6 @@ int PipelineHandlerIPU3::initControls(IPU3CameraData *data)
>  	 */
>  	double lineDuration = sensorInfo.lineLength
>  			    / (sensorInfo.pixelRate / 1e6);
> -	const ControlInfoMap &sensorControls = sensor->controls();
>  	const ControlInfo &v4l2Exposure = sensorControls.find(V4L2_CID_EXPOSURE)->second;
>  	int32_t minExposure = v4l2Exposure.min().get<int32_t>() * lineDuration;
>  	int32_t maxExposure = v4l2Exposure.max().get<int32_t>() * lineDuration;
> @@ -851,6 +851,37 @@ int PipelineHandlerIPU3::initControls(IPU3CameraData *data)
>  	controls[&controls::ExposureTime] = ControlInfo(minExposure, maxExposure,
>  							defExposure);
>  
> +	/*
> +	 * Compute the frame duration limits.
> +	 *
> +	 * \todo The frame duration limits depend on the sensor configuration.
> +	 * Initialize the control using the frame sizes and pixel rate of the
> +	 * current configuration.

Should this be dropped as it's now included in a comment added in patch
1/5 ?

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

> +	 *
> +	 * The frame length is computed assuming a fixed line length combined
> +	 * with the vertical frame sizes.
> +	 */
> +	const ControlInfo &v4l2HBlank = sensorControls.find(V4L2_CID_HBLANK)->second;
> +	uint32_t hblank = v4l2HBlank.def().get<int32_t>();
> +	uint32_t lineLength = sensorInfo.outputSize.width + hblank;
> +
> +	const ControlInfo &v4l2VBlank = sensorControls.find(V4L2_CID_VBLANK)->second;
> +	std::array<uint32_t, 3> frameHeights{
> +		v4l2VBlank.min().get<int32_t>() + sensorInfo.outputSize.height,
> +		v4l2VBlank.max().get<int32_t>() + sensorInfo.outputSize.height,
> +		v4l2VBlank.def().get<int32_t>() + sensorInfo.outputSize.height,
> +	};
> +
> +	std::array<int64_t, 3> frameDurations;
> +	for (unsigned int i = 0; i < frameHeights.size(); ++i) {
> +		uint64_t frameSize = lineLength * frameHeights[i];
> +		frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
> +	}
> +
> +	controls[&controls::FrameDurations] = ControlInfo(frameDurations[0],
> +							  frameDurations[1],
> +							  frameDurations[2]);
> +
>  	/*
>  	 * Compute the scaler crop limits.
>  	 *

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list