[libcamera-devel,v3,1/8] libcamera: ipu3: imgu: Update BDS calculation process
diff mbox series

Message ID 20210513152116.17666-2-jacopo@jmondi.org
State Accepted
Commit 92411679b1197754e29dd4824de8533f482f7c07
Delegated to: Jacopo Mondi
Headers show
Series
  • ipu3: imgu: Improve ImgU calculation procedure
Related show

Commit Message

Jacopo Mondi May 13, 2021, 3:21 p.m. UTC
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@jmondi.org>
Tested-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
Acked-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 src/libcamera/pipeline/ipu3/imgu.cpp | 36 ++++++++++++++++++++++++----
 1 file changed, 31 insertions(+), 5 deletions(-)

Comments

Hirokazu Honda May 17, 2021, 3:57 a.m. UTC | #1
Hi Jacopo, thank you for the patch.

On Fri, May 14, 2021 at 12:20 AM Jacopo Mondi <jacopo@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@jmondi.org>
> Tested-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
> Acked-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
>

Reviewed-by: Hirokazu Honda <hiroh@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@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
>

Patch
diff mbox series

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 {};