summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-02-28 13:02:44 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-02-28 14:38:33 +0200
commit2daa93772354ff0824f2366b5a1141533fa2333d (patch)
tree3f6497e1bc501f6d963eb3a22a42f9740f5b1c98
parente4c152de7a4ee1822dfa7abfaa5789ef2032e415 (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> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
-rw-r--r--src/gen-image.c33
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;