[libcamera-devel] [PATCH 16/16] ipa: ipu3: Cap frame duration to 30 FPS

paul.elder at ideasonboard.com paul.elder at ideasonboard.com
Wed Sep 1 10:33:57 CEST 2021


Hi Jacopo,

On Fri, Aug 27, 2021 at 02:07:57PM +0200, Jacopo Mondi wrote:
> Limit the IPU3 frame rate to 30 FPS.
> 
> The reason to do is to bring the IPU3 IPA in par with the Intel
> HAL implementation on IPU3 platform, where 30FPS is the frame rate used
> to perform quality tuning in the closed-source IPA module and has been
> validated as the most efficient rate for the power/performace budget.
> 
> Compute the vertical blanking to maintain such frame rate and configure
> the sensor with that.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/ipa/ipu3/ipu3.cpp | 37 ++++++++++++++++++++++++++++++++-----
>  1 file changed, 32 insertions(+), 5 deletions(-)
> 
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index fc5f69ed5ddc..0e5d5e479e20 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -183,7 +183,7 @@ private:
>  	IPACameraSensorInfo sensorInfo_;
>  
>  	/* Camera sensor controls. */
> -	uint32_t defVBlank_;
> +	uint32_t vBlank_;
>  	uint32_t exposure_;
>  	uint32_t minExposure_;
>  	uint32_t maxExposure_;
> @@ -257,10 +257,39 @@ void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo,
>  		frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
>  	}
>  
> +	/*
> +	 * Cap minimum frame duration to 30FPS.
> +	 *
> +	 * 30 FPS has been validated in the closed source Intel 3A module as the
> +	 * most opportune frame rate for quality tuning, and power
> +	 * vs performances budget on Intel IPU3.
> +	 *
> +	 * Reduce the minimum achievable frame rate to 30 FPS and compute the

Since it's a "frame rate" should this be the "maximum achievable frame
rate"?

Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>

> +	 * vertical blanking to maintain that rate.
> +	 */
> +	int64_t *minFrameDuration = &frameDurations[0];
> +	if (*minFrameDuration < 1e6 / 30.0)
> +		*minFrameDuration = 1e6 / 30.0;
> +
>  	controls[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
>  							       frameDurations[1],
>  							       frameDurations[2]);
>  
> +	/*
> +	 * Adjust the vertical blanking to obtain the desired frame duration.
> +	 *
> +	 * Assume a fixed line length as horizontal blanking is seldom
> +	 * controllable.
> +	 *
> +	 * \todo Support making this overridable by the application through
> +	 * controls::FrameDuration.
> +	 *
> +	 * \todo Clamp exposure to frame duration.
> +	 */
> +	vBlank_ = *minFrameDuration * (sensorInfo.pixelRate / 1000000U);
> +	vBlank_ /= lineLength;
> +	vBlank_ -= sensorInfo.outputSize.height;
> +
>  	*ipaControls = ControlInfoMap(std::move(controls), controls::controls);
>  }
>  
> @@ -399,8 +428,6 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo,
>  	maxGain_ = itGain->second.max().get<int32_t>();
>  	gain_ = minGain_;
>  
> -	defVBlank_ = itVBlank->second.def().get<int32_t>();
> -
>  	/* Clean context at configuration */
>  	context_ = {};
>  
> @@ -511,8 +538,7 @@ void IPAIPU3::parseStatistics(unsigned int frame,
>  
>  	setControls(frame);
>  
> -	/* \todo Use VBlank value calculated from each frame exposure. */
> -	int64_t frameDuration = sensorInfo_.lineLength * (defVBlank_ + sensorInfo_.outputSize.height) /
> +	int64_t frameDuration = sensorInfo_.lineLength * (vBlank_ + sensorInfo_.outputSize.height) /
>  				(sensorInfo_.pixelRate / 1e6);
>  	ctrls.set(controls::FrameDuration, frameDuration);
>  
> @@ -534,6 +560,7 @@ void IPAIPU3::setControls(unsigned int frame)
>  	ControlList ctrls(ctrls_);
>  	ctrls.set(V4L2_CID_EXPOSURE, static_cast<int32_t>(exposure_));
>  	ctrls.set(V4L2_CID_ANALOGUE_GAIN, static_cast<int32_t>(gain_));
> +	ctrls.set(V4L2_CID_VBLANK, static_cast<int32_t>(vBlank_));
>  	op.controls = ctrls;
>  
>  	queueFrameAction.emit(frame, op);
> -- 
> 2.32.0
> 


More information about the libcamera-devel mailing list