summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2016-09-13 00:16:20 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2016-09-13 00:39:15 +0300
commit8fb25dd94a574db88a24d3351bca1b8c0e47455d (patch)
treed42540a194d5c6147b9f7d1bd8db0b8478b36279
parentb64f268dd3ad448286b5c13741b208b0055869d5 (diff)
gen-image: Add -C argument to disable chroma averaging on output
gen-image averages consecutive chroma values when subsampling chroma horizontally. This matches the hardware behaviour, but isn't desired to produce test input frames in subsampled formats as otherwise the hardware will average the values a second time in the RPF to interpolate missing chroma components. Add a -C argument to disable chroma averaging on output, to be used to generate test input frames. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/gen-image.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/gen-image.c b/src/gen-image.c
index 4ba8b1a..a389f77 100644
--- a/src/gen-image.c
+++ b/src/gen-image.c
@@ -92,6 +92,7 @@ struct params {
unsigned int alpha;
enum v4l2_ycbcr_encoding encoding;
enum v4l2_quantization quantization;
+ bool no_chroma_average;
};
struct options {
@@ -539,8 +540,14 @@ static void image_format_yuv_packed(const struct image *input, struct image *out
for (x = 0; x < output->width; x += 2) {
o_y[2*x] = idata[3*x];
o_y[2*x + 2] = idata[3*x + 3];
- o_c[2*x + u_offset] = (idata[3*x + 1] + idata[3*x + 4]) / 2;
- o_c[2*x + v_offset] = (idata[3*x + 2] + idata[3*x + 5]) / 2;
+
+ if (params->no_chroma_average) {
+ o_c[2*x + u_offset] = idata[3*x + 1];
+ o_c[2*x + v_offset] = idata[3*x + 2];
+ } else {
+ o_c[2*x + u_offset] = (idata[3*x + 1] + idata[3*x + 4]) / 2;
+ o_c[2*x + v_offset] = (idata[3*x + 2] + idata[3*x + 5]) / 2;
+ }
}
o_y += input->width * 2;
@@ -587,7 +594,7 @@ static void image_format_yuv_planar(const struct image *input, struct image *out
idata = input->data;
for (y = 0; y < output->height / ysub; ++y) {
- if (xsub == 1) {
+ if (xsub == 1 || params->no_chroma_average) {
for (x = 0; x < output->width; x += xsub) {
o_u[x*c_stride/xsub] = idata[3*x + 1];
o_v[x*c_stride/xsub] = idata[3*x + 2];
@@ -1372,6 +1379,7 @@ static void usage(const char *argv0)
printf(" point values ([0.0 - 1.0]), fixed point values ([0-255])\n");
printf(" or percentages ([0%% - 100%%]). Defaults to 1.0\n");
printf("-c, --compose n Compose n copies of the image offset by (50,50) over a black background\n");
+ printf("-C, --no-chroma-average Disable chroma averaging for odd pixels on output\n");
printf("-e, --encoding enc Set the YCbCr encoding method. Valid values are\n");
printf(" BT.601, REC.709, BT.2020 and SMPTE240M\n");
printf("-f, --format format Set the output image format\n");
@@ -1416,6 +1424,7 @@ static struct option opts[] = {
{"histogram", 1, 0, 'H'},
{"in-format", 1, 0, 'i'},
{"lut", 1, 0, 'l'},
+ {"no-chroma-average", 1, 0, 'C'},
{"output", 1, 0, 'o'},
{"quantization", 1, 0, 'q'},
{"rotate", 0, 0, 'r'},
@@ -1442,7 +1451,7 @@ static int parse_args(struct options *options, int argc, char *argv[])
options->params.quantization = V4L2_QUANTIZATION_LIM_RANGE;
opterr = 0;
- while ((c = getopt_long(argc, argv, "a:c:e:f:hH:i:l:L:o:q:rs:", opts, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "a:c:Ce:f:hH:i:l:L:o:q:rs:", opts, NULL)) != -1) {
switch (c) {
case 'a': {
@@ -1477,6 +1486,10 @@ static int parse_args(struct options *options, int argc, char *argv[])
}
break;
+ case 'C':
+ options->params.no_chroma_average = true;
+ break;
+
case 'e':
if (!strcmp(optarg, "BT.601")) {
options->params.encoding = V4L2_YCBCR_ENC_601;