[libcamera-devel] [PATCH v3 1/8] libcamera: ipu3: imgu: Update BDS calculation process
Hirokazu Honda
hiroh at chromium.org
Mon May 17 05:57:38 CEST 2021
Hi Jacopo, thank you for the patch.
On Fri, May 14, 2021 at 12:20 AM Jacopo Mondi <jacopo at jmondi.org> 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.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> Tested-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> Acked-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>
Reviewed-by: Hirokazu Honda <hiroh at chromium.org>
>
> ---
> src/libcamera/pipeline/ipu3/imgu.cpp | 36 ++++++++++++++++++++++++----
> 1 file changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp
> b/src/libcamera/pipeline/ipu3/imgu.cpp
> index d5cf05b0c421..acc625ab0fac 100644
> --- a/src/libcamera/pipeline/ipu3/imgu.cpp
> +++ b/src/libcamera/pipeline/ipu3/imgu.cpp
> @@ -394,19 +394,45 @@ 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 = std::min(IF_ALIGN_W,
> + in.width - IF_CROP_MAX_W);
> + unsigned int minIfHeight = std::min(IF_ALIGN_H,
> + 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 = std::min(IF_ALIGN_W, in.width - IF_CROP_MAX_W);
> + minIfHeight = std::min(IF_ALIGN_H, 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20210517/26baf906/attachment.htm>
More information about the libcamera-devel
mailing list