[libcamera-devel] [PATCH 3/7] libcamera: ipu3: imgu: Fix BDS height calculation

Jacopo Mondi jacopo at jmondi.org
Wed Apr 21 14:57:56 CEST 2021


Hi Laurent,

On Tue, Apr 13, 2021 at 03:18:02AM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Thu, Mar 18, 2021 at 11:39:37AM +0100, Jacopo Mondi wrote:
> > The IF rectangle height is iteratively computed by first subtracting
> > the scaling factor to the estimated height, then in a successive loop
> > by adding the same scaling factor until the maximum IF size is not
> > reached.
> >
> > As the computed IF height is not cached in any variable, the second
> > loop over-writes the result of the first one, even if the BDS alignment
> > condition is not satisfied.
> >
> > Fix this by caching the result of the two iterations, and use the one
> > that produced any result, with a preference for the one produced by the
> > second loop, as implemented in the reference python script.
> >
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> >  src/libcamera/pipeline/ipu3/imgu.cpp | 13 +++++++++----
> >  1 file changed, 9 insertions(+), 4 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
> > index d9296ea3e674..11bb7cb95084 100644
> > --- a/src/libcamera/pipeline/ipu3/imgu.cpp
> > +++ b/src/libcamera/pipeline/ipu3/imgu.cpp
> > @@ -129,10 +129,10 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> >  	float bdsHeight;
> >
> >  	if (!isSameRatio(pipe->input, gdc)) {
> > +		unsigned int foundIfHeights[2] = { 0, 0 };
>
> You don't need two values, a single one will do, it can be overwritten
> in the second loop.

Correct, I got the same understanding but I would prefer to use the
same "style" as the python script, not to diverge...

What do you think ?

>
> With an updated commit message,
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Thanks
  j

>
> >  		float estIFHeight = (iif.width * gdc.height) /
> >  				    static_cast<float>(gdc.width);
> >  		estIFHeight = std::clamp<float>(estIFHeight, minIFHeight, iif.height);
> > -		bool found = false;
> >
> >  		ifHeight = utils::alignUp(estIFHeight, IF_ALIGN_H);
> >  		while (ifHeight >= minIFHeight && ifHeight / bdsSF >= minBDSHeight) {
> > @@ -142,7 +142,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> >  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> >
> >  				if (!(bdsIntHeight % BDS_ALIGN_H)) {
> > -					found = true;
> > +					foundIfHeights[0] = ifHeight;
> >  					break;
> >  				}
> >  			}
> > @@ -158,7 +158,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> >  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> >
> >  				if (!(bdsIntHeight % BDS_ALIGN_H)) {
> > -					found = true;
> > +					foundIfHeights[1] = ifHeight;
> >  					break;
> >  				}
> >  			}
> > @@ -166,7 +166,12 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> >  			ifHeight += IF_ALIGN_H;
> >  		}
> >
> > -		if (found) {
> > +		if (foundIfHeights[0])
> > +			ifHeight = foundIfHeights[0];
> > +		if (foundIfHeights[1])
> > +			ifHeight = foundIfHeights[1];
> > +
> > +		if (foundIfHeights[0] || foundIfHeights[1]) {
> >  			unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> >
> >  			pipeConfigs.push_back({ bdsSF, { iif.width, ifHeight },
>
> --
> Regards,
>
> Laurent Pinchart


More information about the libcamera-devel mailing list