summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2021-03-17 14:06:30 +0100
committerJacopo Mondi <jacopo@jmondi.org>2021-05-20 10:58:52 +0200
commit630c83f82a6dfcac749469be62599b72c250b063 (patch)
tree21184972cf5b34ce354884e5a08e38f3d431ff88
parentc1b0e931a6f353d35d40f46e07832e8301f61a8a (diff)
libcamera: ipu3: imgu: Fix BDS height calculation
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@jmondi.org> Tested-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
-rw-r--r--src/libcamera/pipeline/ipu3/imgu.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
index d878a029..a325b787 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 foundIfHeight = 0;
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;
+ foundIfHeight = 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;
+ foundIfHeight = ifHeight;
break;
}
}
@@ -166,10 +166,10 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
ifHeight += IF_ALIGN_H;
}
- if (found) {
+ if (foundIfHeight) {
unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
- pipeConfigs.push_back({ bdsSF, { iif.width, ifHeight },
+ pipeConfigs.push_back({ bdsSF, { iif.width, foundIfHeight },
{ bdsWidth, bdsIntHeight }, gdc });
return;
}