diff options
-rw-r--r-- | src/gen-image.c | 75 |
1 files changed, 39 insertions, 36 deletions
diff --git a/src/gen-image.c b/src/gen-image.c index 50c1010..40773c8 100644 --- a/src/gen-image.c +++ b/src/gen-image.c @@ -106,10 +106,13 @@ struct image { void *data; }; -struct params { - unsigned int alpha; +struct csc_params { enum v4l2_ycbcr_encoding encoding; enum v4l2_quantization quantization; +}; + +struct pack_params { + unsigned int alpha; bool no_chroma_average; }; @@ -134,7 +137,8 @@ struct options { bool vflip; bool rotate; unsigned int compose; - struct params params; + struct csc_params csc_params; + struct pack_params pack_params; bool crop; struct image_rect inputcrop; enum histogram_type histo_type; @@ -461,7 +465,7 @@ static int image_write(const struct image *image, const char *filename) */ static void image_format_rgb8(const struct image *input, struct image *output, - const struct params *params) + const struct pack_params *params) { const uint8_t *idata = input->data; uint8_t *odata = output->data; @@ -484,7 +488,7 @@ static void image_format_rgb8(const struct image *input, struct image *output, } static void image_format_rgb16(const struct image *input, struct image *output, - const struct params *params) + const struct pack_params *params) { const struct format_info *format = output->format; const uint8_t *idata = input->data; @@ -508,7 +512,7 @@ static void image_format_rgb16(const struct image *input, struct image *output, } static void image_format_rgb24(const struct image *input, struct image *output, - const struct params *params) + const struct pack_params *params) { struct color_rgb24 { unsigned int value:24; @@ -540,7 +544,7 @@ static void image_format_rgb24(const struct image *input, struct image *output, } static void image_format_rgb32(const struct image *input, struct image *output, - const struct params *params) + const struct pack_params *params) { const struct format_info *format = output->format; const uint8_t *idata = input->data; @@ -564,13 +568,13 @@ static void image_format_rgb32(const struct image *input, struct image *output, } static void image_format_hsv24(const struct image *input, struct image *output, - const struct params *params) + const struct pack_params *params) { memcpy(output->data, input->data, input->width * input->height * 3); } static void image_format_hsv32(const struct image *input, struct image *output, - const struct params *params) + const struct pack_params *params) { const struct format_info *format = output->format; const uint8_t *idata = input->data; @@ -598,7 +602,7 @@ static void image_format_hsv32(const struct image *input, struct image *output, * chroma components of the two pixels to match the hardware behaviour. */ static void image_format_yuv_packed(const struct image *input, struct image *output, - const struct params *params) + const struct pack_params *params) { const struct format_info *format = output->format; const uint8_t *idata = input->data; @@ -637,7 +641,7 @@ static void image_format_yuv_packed(const struct image *input, struct image *out } static void image_format_yuv_planar(const struct image *input, struct image *output, - const struct params *params) + const struct pack_params *params) { const struct format_info *format = output->format; const uint8_t *idata; @@ -797,7 +801,7 @@ static void colorspace_rgb2ycbcr(int m[3][3], static void image_colorspace_rgb_to_yuv(const struct image *input, struct image *output, const struct format_info *format, - const struct params *params) + const struct csc_params *params) { int matrix[3][3]; const uint8_t *idata = input->data; @@ -942,7 +946,7 @@ static void hst_rgb_to_hsv(const uint8_t rgb[3], uint8_t hsv[3]) static void image_rgb_to_hsv(const struct image *input, struct image *output, - const struct params *params) + const struct csc_params *params) { const uint8_t *idata = input->data; uint8_t *odata = output->data; @@ -999,8 +1003,7 @@ static void image_scale_bilinear(const struct image *input, struct image *output #undef _C2 } -static void image_scale(const struct image *input, struct image *output, - const struct params *params) +static void image_scale(const struct image *input, struct image *output) { image_scale_bilinear(input, output); } @@ -1564,7 +1567,7 @@ static int process(const struct options *options) } image_colorspace_rgb_to_yuv(input, yuv, options->input_format, - &options->params); + &options->csc_params); image_delete(input); input = yuv; } else if (options->input_format->rgb.bpp < 24) { @@ -1604,7 +1607,7 @@ static int process(const struct options *options) goto done; } - image_scale(input, scaled, &options->params); + image_scale(input, scaled); image_delete(input); input = scaled; } @@ -1715,9 +1718,9 @@ static int process(const struct options *options) if (options->output_format->type == FORMAT_YUV) image_colorspace_rgb_to_yuv(input, converted, format, - &options->params); + &options->csc_params); else - image_rgb_to_hsv(input, converted, &options->params); + image_rgb_to_hsv(input, converted, &options->csc_params); image_delete(input); input = converted; @@ -1733,16 +1736,16 @@ static int process(const struct options *options) case FORMAT_RGB: switch (output->format->rgb.bpp) { case 8: - image_format_rgb8(input, output, &options->params); + image_format_rgb8(input, output, &options->pack_params); break; case 16: - image_format_rgb16(input, output, &options->params); + image_format_rgb16(input, output, &options->pack_params); break; case 24: - image_format_rgb24(input, output, &options->params); + image_format_rgb24(input, output, &options->pack_params); break; case 32: - image_format_rgb32(input, output, &options->params); + image_format_rgb32(input, output, &options->pack_params); break; default: ret = -EINVAL; @@ -1753,10 +1756,10 @@ static int process(const struct options *options) case FORMAT_HSV: switch (output->format->hsv.bpp) { case 24: - image_format_hsv24(input, output, &options->params); + image_format_hsv24(input, output, &options->pack_params); break; case 32: - image_format_hsv32(input, output, &options->params); + image_format_hsv32(input, output, &options->pack_params); break; default: ret = -EINVAL; @@ -1767,11 +1770,11 @@ static int process(const struct options *options) case FORMAT_YUV: switch (output->format->yuv.num_planes) { case 1: - image_format_yuv_packed(input, output, &options->params); + image_format_yuv_packed(input, output, &options->pack_params); break; case 2: case 3: - image_format_yuv_planar(input, output, &options->params); + image_format_yuv_planar(input, output, &options->pack_params); break; default: ret = -EINVAL; @@ -2002,9 +2005,9 @@ static int parse_args(struct options *options, int argc, char *argv[]) memset(options, 0, sizeof(*options)); options->input_format = format_by_name("RGB24"); options->output_format = format_by_name("RGB24"); - options->params.alpha = 255; - options->params.encoding = V4L2_YCBCR_ENC_601; - options->params.quantization = V4L2_QUANTIZATION_LIM_RANGE; + options->pack_params.alpha = 255; + options->csc_params.encoding = V4L2_YCBCR_ENC_601; + options->csc_params.quantization = V4L2_QUANTIZATION_LIM_RANGE; options->histo_type = HISTOGRAM_HGO; opterr = 0; @@ -2031,7 +2034,7 @@ static int parse_args(struct options *options, int argc, char *argv[]) return 1; } - options->params.alpha = alpha; + options->pack_params.alpha = alpha; break; } @@ -2044,14 +2047,14 @@ static int parse_args(struct options *options, int argc, char *argv[]) break; case 'C': - options->params.no_chroma_average = true; + options->pack_params.no_chroma_average = true; break; case 'e': if (!strcmp(optarg, "BT.601")) { - options->params.encoding = V4L2_YCBCR_ENC_601; + options->csc_params.encoding = V4L2_YCBCR_ENC_601; } else if (!strcmp(optarg, "REC.709")) { - options->params.encoding = V4L2_YCBCR_ENC_709; + options->csc_params.encoding = V4L2_YCBCR_ENC_709; } else { printf("Invalid encoding value '%s'\n", optarg); return 1; @@ -2108,9 +2111,9 @@ static int parse_args(struct options *options, int argc, char *argv[]) case 'q': if (!strcmp(optarg, "limited")) { - options->params.quantization = V4L2_QUANTIZATION_LIM_RANGE; + options->csc_params.quantization = V4L2_QUANTIZATION_LIM_RANGE; } else if (!strcmp(optarg, "full")) { - options->params.quantization = V4L2_QUANTIZATION_FULL_RANGE; + options->csc_params.quantization = V4L2_QUANTIZATION_FULL_RANGE; } else { printf("Invalid quantization value '%s'\n", optarg); return 1; |