[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