mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-16 17:05:08 +03:00
libcamera: ipu3: imgu: Filter resolutions < IF_CROP_MAX
As reported in https://bugs.libcamera.org/show_bug.cgi?id=32 allowing resolutions < IF_CROP_MAX leads to a not manageable number configurations to be tested, slowing down the ImgU pipe configuration to a point which is not acceptable for production devices. Filter all resolutions < IF_CROP_MAX to maintain the run-time complexity acceptable and remove the safety check that was meant to avoid overflows when computing the IF rectangle sizes. Bug: https://bugs.libcamera.org/show_bug.cgi?id=32 Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
This commit is contained in:
parent
92411679b1
commit
1da35058ec
1 changed files with 15 additions and 6 deletions
|
@ -392,6 +392,17 @@ ImgUDevice::PipeConfig ImgUDevice::calculatePipeConfig(Pipe *pipe)
|
|||
LOG(IPU3, Debug) << "vf: " << pipe->viewfinder.toString();
|
||||
|
||||
const Size &in = pipe->input;
|
||||
|
||||
/*
|
||||
* \todo Filter out all resolutions < IF_CROP_MAX.
|
||||
* See https://bugs.libcamera.org/show_bug.cgi?id=32
|
||||
*/
|
||||
if (in.width < IF_CROP_MAX_W || in.height < IF_CROP_MAX_H) {
|
||||
LOG(IPU3, Error) << "Input resolution " << in.toString()
|
||||
<< " not supported";
|
||||
return {};
|
||||
}
|
||||
|
||||
Size gdc = calculateGDC(pipe);
|
||||
|
||||
float bdsSF = static_cast<float>(in.width) / gdc.width;
|
||||
|
@ -400,10 +411,8 @@ ImgUDevice::PipeConfig ImgUDevice::calculatePipeConfig(Pipe *pipe)
|
|||
/* 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);
|
||||
unsigned int minIfWidth = in.width - IF_CROP_MAX_W;
|
||||
unsigned int minIfHeight = in.height - IF_CROP_MAX_H;
|
||||
while (ifWidth >= minIfWidth) {
|
||||
while (ifHeight >= minIfHeight) {
|
||||
Size iif{ ifWidth, ifHeight };
|
||||
|
@ -417,8 +426,8 @@ ImgUDevice::PipeConfig ImgUDevice::calculatePipeConfig(Pipe *pipe)
|
|||
/* 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);
|
||||
minIfWidth = in.width - IF_CROP_MAX_W;
|
||||
minIfHeight = in.height - IF_CROP_MAX_H;
|
||||
while (ifHeight >= minIfHeight) {
|
||||
/*
|
||||
* \todo This procedure is probably broken:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue