From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Cc: linux-renesas-soc@vger.kernel.org, kieran.bingham@ideasonboard.com
Subject: Re: [PATCH v2 2/4] gen-image: Implement option to parse an input crop
Date: Sun, 12 Feb 2017 23:39:58 +0200 [thread overview]
Message-ID: <3915589.zqSAYW8KOv@avalon> (raw)
In-Reply-To: <aba1b1a68c194a9d79af351c74d803822274beda.1486733302.git-series.kieran.bingham@ideasonboard.com>
Hi Kieran,
Thank you for the patch.
On Friday 10 Feb 2017 13:30:06 Kieran Bingham wrote:
> From: Kieran Bingham <kieran.bingham@ideasonboard.com>
>
> Allow the user to specify an input crop in the form (X,Y)/WxH
>
> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> ---
> src/gen-image.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 132 insertions(+)
>
> diff --git a/src/gen-image.c b/src/gen-image.c
> index 31d42e0211db..088e8b26f648 100644
> --- a/src/gen-image.c
> +++ b/src/gen-image.c
> @@ -95,6 +95,13 @@ struct format_info {
> struct format_yuv_info yuv;
> };
>
> +struct image_rect {
> + int left;
> + int top;
> + unsigned int width;
> + unsigned int height;
> +};
> +
> struct image {
> const struct format_info *format;
> unsigned int width;
> @@ -127,6 +134,8 @@ struct options {
> bool rotate;
> unsigned int compose;
> struct params params;
> + bool crop;
> + struct image_rect inputcrop;
> };
>
> /* ------------------------------------------------------------------------
> @@ -1076,6 +1085,25 @@ static void image_flip(const struct image *input,
> struct image *output, }
>
> /* ------------------------------------------------------------------------
> + * Image Cropping
> + */
> +
> +static void image_crop(const struct image *input, const struct image
> *output,
> + const struct image_rect *crop)
> +{
> + unsigned int offset = (crop->top * input->width + crop->left) * 3;
> + const uint8_t *idata = input->data + offset;
> + uint8_t *odata = output->data;
> + unsigned int y;
> +
> + for (y = 0; y < output->height; ++y) {
> + memcpy(odata, idata, output->width * 3);
> + odata += output->width * 3;
> + idata += input->width * 3;
> + }
> +}
> +
> +/* ------------------------------------------------------------------------
> * Look Up Table
> */
>
> @@ -1363,6 +1391,21 @@ static int process(const struct options *options)
> input = rgb;
> }
>
> + 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;
> @@ -1596,6 +1639,7 @@ static void usage(const char *argv0)
> 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(" --crop (X,Y)/WxH Crop the input image\n");
The alignment is incorrect.
> 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");
> @@ -1628,11 +1672,13 @@ static void list_formats(void)
>
> #define OPT_HFLIP 256
> #define OPT_VFLIP 257
> +#define OPT_CROP 260
>
> static struct option opts[] = {
> {"alpha", 1, 0, 'a'},
> {"clu", 1, 0, 'L'},
> {"compose", 1, 0, 'c'},
> + {"crop", 1, 0, OPT_CROP},
> {"encoding", 1, 0, 'e'},
> {"format", 1, 0, 'f'},
> {"help", 0, 0, 'h'},
> @@ -1649,6 +1695,84 @@ static struct option opts[] = {
> {0, 0, 0, 0}
> };
>
> +static int parse_crop(struct image_rect *crop, char *optarg, char **endp)
The optarg argument should be made const. I would also rename it to value as
it might not come from an option.
> +{
> + /* (X,Y)/WxH */
> + char *endptr = optarg;
> +
> + if (*endptr != '(') {
> + printf("Invalid crop argument\n");
How about "Invalid crop format, expected '('\n" to clearly indicate what's
wrong ?
> + *endp = endptr;
> + return 1;
> + }
> +
> + crop->left = strtol(endptr + 1, &endptr, 10);
> + if (*endptr != ',') {
> + printf("Invalid crop position\n");
> + *endp = endptr;
> + return 1;
> + }
> +
> + if (crop->left < 0) {
> + printf("Invalid negative crop\n");
> + *endp = endptr - 1;
> + return 1;
> + }
> +
> + crop->top = strtol(endptr + 1, &endptr, 10);
> + if (*endptr != ')') {
> + printf("Invalid crop position\n");
> + *endp = endptr;
> + return 1;
> + }
> +
> + if (crop->top < 0) {
> + printf("Invalid negative crop\n");
> + *endp = endptr - 1;
> + return 1;
> + }
> +
> + endptr++;
> +
> + if (*endptr != '/') {
> + printf("Invalid crop argument\n");
> + *endp = endptr;
> + return 1;
> + }
> +
> + crop->width = strtol(endptr + 1, &endptr, 10);
> + if (*endptr != 'x') {
> + printf("Invalid crop size\n");
> + *endp = endptr;
> + return 1;
> + }
> +
> + crop->height = strtol(endptr + 1, &endptr, 10);
> + if (*endptr != 0) {
> + printf("Invalid crop size\n");
> + *endp = endptr;
> + return 1;
> + }
> +
> + return 0;
> +}
> +
> +void print_streampos(const char *p, const char *end)
This function should be static. I would rename it to parser_print_error(),
"streampos" not being very explicit.
> +{
> + int pos;
> +
> + pos = end - p + 1;
> +
> + if (pos < 0)
> + pos = 0;
> + if (pos > (int) strlen(p))
> + pos = strlen(p);
> +
> + printf("\n");
> + printf(" %s\n", p);
> + printf(" %*s\n", pos, "^");
> +}
> +
> static int parse_args(struct options *options, int argc, char *argv[])
> {
> char *endptr;
> @@ -1809,6 +1933,14 @@ static int parse_args(struct options *options, int
> argc, char *argv[]) options->vflip = true;
> break;
>
> + case OPT_CROP:
> + if (parse_crop(&options->inputcrop, optarg, &endptr))
{
> + print_streampos(optarg, endptr);
I would move this inside parse_crop().
I'll fix while applying, no need to resend.
> + return 1;
> + }
> + options->crop = true;
> + break;
> +
> default:
> printf("Invalid option -%c\n", c);
> printf("Run %s -h for help.\n", argv[0]);
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2017-02-12 21:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-10 13:30 [PATCH v2 0/4] vsp-tests: Implement RPF cropping tests Kieran Bingham
2017-02-10 13:30 ` [PATCH v2 1/4] vsp-lib: Filter non-filesystem regular characters Kieran Bingham
2017-02-12 21:05 ` Laurent Pinchart
2017-02-10 13:30 ` [PATCH v2 2/4] gen-image: Implement option to parse an input crop Kieran Bingham
2017-02-12 21:39 ` Laurent Pinchart [this message]
2017-02-10 13:30 ` [PATCH v2 3/4] vsp-lib: Support RPF frame cropping Kieran Bingham
2017-02-12 21:46 ` Laurent Pinchart
2017-02-10 13:30 ` [PATCH v2 4/4] tests: Add RPF cropping test Kieran Bingham
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3915589.zqSAYW8KOv@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=kieran.bingham+renesas@ideasonboard.com \
--cc=kieran.bingham@ideasonboard.com \
--cc=linux-renesas-soc@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.