[libcamera-devel] [PATCH v2 1/7] libcamera: ipu3: imgu: Update BDS calculation process

Niklas Söderlund niklas.soderlund at ragnatech.se
Mon May 3 12:56:00 CEST 2021


Hi Jacopo,

Thanks for your work.

On 2021-05-03 11:26:59 +0200, Jacopo Mondi wrote:
> Apply the last three hunks of commit 243d134 ("Fix some bug for some
> resolutions") from https://github.com/intel/intel-ipu3-pipecfg.git
> to the BDS calculation procedure.
> 
> The BDS calculation is now perfomed by scaling both width and height,
> and repeated by scaling width first.
> 
> Tested-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>

Acked-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>

> ---
>  src/libcamera/pipeline/ipu3/imgu.cpp | 34 ++++++++++++++++++++++++----
>  1 file changed, 29 insertions(+), 5 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
> index d5cf05b0c421..8373dc165a61 100644
> --- a/src/libcamera/pipeline/ipu3/imgu.cpp
> +++ b/src/libcamera/pipeline/ipu3/imgu.cpp
> @@ -394,19 +394,43 @@ ImgUDevice::PipeConfig ImgUDevice::calculatePipeConfig(Pipe *pipe)
>  	const Size &in = pipe->input;
>  	Size gdc = calculateGDC(pipe);
>  
> -	unsigned int ifWidth = utils::alignUp(in.width, IF_ALIGN_W);
> -	unsigned int ifHeight = in.height;
> -	unsigned int minIfWidth = in.width - IF_CROP_MAX_W;
>  	float bdsSF = static_cast<float>(in.width) / gdc.width;
>  	float sf = findScaleFactor(bdsSF, bdsScalingFactors, true);
>  
> +	/* Populate the configurations vector by scaling width and height. */
> +	unsigned int ifWidth = utils::alignUp(in.width, IF_ALIGN_W);
> +	unsigned int ifHeight = utils::alignUp(in.height, IF_ALIGN_H);
> +	unsigned int minIfWidth = in.width - IF_CROP_MAX_W;
> +	unsigned int minIfHeight = in.height - IF_CROP_MAX_H;
>  	while (ifWidth >= minIfWidth) {
> -		Size iif{ ifWidth, ifHeight };
> -		calculateBDS(pipe, iif, gdc, sf);
> +		while (ifHeight >= minIfHeight) {
> +			Size iif{ ifWidth, ifHeight };
> +			calculateBDS(pipe, iif, gdc, sf);
> +			ifHeight -= IF_ALIGN_H;
> +		}
>  
>  		ifWidth -= IF_ALIGN_W;
>  	}
>  
> +	/* Repeat search by scaling width first. */
> +	ifWidth = utils::alignUp(in.width, IF_ALIGN_W);
> +	ifHeight = utils::alignUp(in.height, IF_ALIGN_H);
> +	minIfWidth = in.width - IF_CROP_MAX_W;
> +	minIfHeight = in.height - IF_CROP_MAX_H;
> +	while (ifHeight >= minIfHeight) {
> +		/*
> +		 * \todo This procedure is probably broken:
> +		 * https://github.com/intel/intel-ipu3-pipecfg/issues/2
> +		 */
> +		while (ifWidth >= minIfWidth) {
> +			Size iif{ ifWidth, ifHeight };
> +			calculateBDS(pipe, iif, gdc, sf);
> +			ifWidth -= IF_ALIGN_W;
> +		}
> +
> +		ifHeight -= IF_ALIGN_H;
> +	}
> +
>  	if (pipeConfigs.size() == 0) {
>  		LOG(IPU3, Error) << "Failed to calculate pipe configuration";
>  		return {};
> -- 
> 2.31.1
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list