libcamera: ipu3: imgu: Update BDS calculation process
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>
This commit is contained in:
@@ -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 {};
|
||||
|
||||
Reference in New Issue
Block a user