diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2022-02-28 13:02:44 +0200 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2022-02-28 13:12:40 +0200 |
commit | 414688289ecac10fb3557b1fb2b9df90a23eac72 (patch) | |
tree | 3f6497e1bc501f6d963eb3a22a42f9740f5b1c98 | |
parent | 0e68af2d5acba683157a8098bb65d53b4950ae68 (diff) |
gen-image: Crop input image before format conversion to YUV
When converting the input image to a subsampled YUV format, chroma
components are averaged horizontally to emulate the VSP internal
conversion to YUV444. If the image is subsequently cropped to emulate
the RPF cropping, the edge chroma values end up effectively taking into
account pixels outside of the crop rectangle. This doesn't match the
hardware mode of operation which crops the image when reading it through
DMA, before performing any other operation.
Fix this by cropping the image just after reading it, before format
conversion.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r-- | src/gen-image.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/gen-image.c b/src/gen-image.c index d9f9225..170d694 100644 --- a/src/gen-image.c +++ b/src/gen-image.c @@ -1531,6 +1531,23 @@ static int process(const struct options *options) goto done; } + /* Crop */ + if (options->crop) { + struct image *cropped; + + cropped = image_new(format_by_name("RGB24"), + options->inputcrop.width, + options->inputcrop.height); + if (!cropped) { + ret = -ENOMEM; + goto done; + } + + image_crop(input, cropped, &options->inputcrop); + image_delete(input); + input = cropped; + } + /* Convert colorspace */ if (options->input_format->type == FORMAT_YUV) { struct image *yuv; @@ -1561,22 +1578,6 @@ static int process(const struct options *options) input = rgb; } - /* Crop */ - if (options->crop) { - struct image *cropped; - - cropped = image_new(input->format, options->inputcrop.width, - options->inputcrop.height); - if (!cropped) { - ret = -ENOMEM; - goto done; - } - - image_crop(input, cropped, &options->inputcrop); - image_delete(input); - input = cropped; - } - /* Scale */ if (options->output_width && options->output_height) { output_width = options->output_width; |