[libcamera-devel,v3,2/5] libcamera: ipu3: Register FrameDurations control
diff mbox series

Message ID 20210222105222.393677-3-jacopo@jmondi.org
State Accepted
Headers show
Series
  • android: Report frame durations
Related show

Commit Message

Jacopo Mondi Feb. 22, 2021, 10:52 a.m. UTC
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@jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 33 +++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

Comments

Laurent Pinchart March 8, 2021, 11:35 p.m. UTC | #1
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@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@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.
>  	 *

Patch
diff mbox series

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.
+	 *
+	 * 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.
 	 *