From 2daa93772354ff0824f2366b5a1141533fa2333d Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Mon, 28 Feb 2022 13:02:44 +0200 Subject: 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 Reviewed-by: Kieran Bingham --- src/gen-image.c | 33 +++++++++++++++++---------------- 1 file 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; -- cgit v1.2.3