[PATCH 2/3] gen-image: Crop input image before format conversion to YUV

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxxx>
---
 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 d9f92253af46..170d69490399 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;
-- 
Regards,

Laurent Pinchart




[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux