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 13:12:40 +0200
commit414688289ecac10fb3557b1fb2b9df90a23eac72 (patch)
tree3f6497e1bc501f6d963eb3a22a42f9740f5b1c98
parent0e68af2d5acba683157a8098bb65d53b4950ae68 (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.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;