linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sakari Ailus <sakari.ailus@iki.fi>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: linux-media@vger.kernel.org
Subject: Re: [media-ctl PATCH v2 1/2] New, more flexible syntax for format
Date: Tue, 08 May 2012 22:43:50 +0300	[thread overview]
Message-ID: <4FA97776.3030408@iki.fi> (raw)
In-Reply-To: <1529968.u1eeiRTNpn@avalon>

Hi Laurent,

Laurent Pinchart wrote:
> Hi Sakari,
> 
> Thanks for the patch.
> 
> On Monday 07 May 2012 16:46:35 Sakari Ailus wrote:
>> More flexible and extensible syntax for format which allows better usage
>> of the selection API.
>>
>> Signed-off-by: Sakari Ailus <sakari.ailus@iki.fi>
>> ---
>>  src/main.c       |   17 ++++++++++---
>>  src/options.c    |   27 +++++++++++++-------
>>  src/v4l2subdev.c |   70 ++++++++++++++++++++++++++++++++-------------------
>>  3 files changed, 74 insertions(+), 40 deletions(-)
> 
> [snip]
> 
>> diff --git a/src/options.c b/src/options.c
>> index 60cf6d5..46f6bef 100644
>> --- a/src/options.c
>> +++ b/src/options.c
>> @@ -37,8 +37,8 @@ static void usage(const char *argv0, int verbose)
>>  	printf("%s [options] device\n", argv0);
>>  	printf("-d, --device dev	Media device name (default: %s)\n",
>> MEDIA_DEVNAME_DEFAULT);
>> 	printf("-e, --entity name	Print the device name associated with the
>> given entity\n");
>> -	printf("-f, --set-format	Comma-separated list of formats to
>> setup\n");
>> -	printf("   --get-format pad	Print the active format on a given pad\n");
>> +	printf("-V, --set-v4l2 v4l2	Comma-separated list of formats to setup\n");
>> +	printf("   --get-v4l2 pad	Print the active format on a given pad\n");
> 
> I still need to think about the name change.
> 
>>  	printf("-h, --help		Show verbose help and exit\n");
>>  	printf("-i, --interactive	Modify links interactively\n");
>>  	printf("-l, --links		Comma-separated list of links descriptors to
>> setup\n");
>> @@ -52,13 +52,17 @@ static void usage(const char *argv0, int verbose)
>>
>>  	printf("\n");
>>  	printf("Links and formats are defined as\n");
>> -	printf("\tlink            = pad, '->', pad, '[', flags, ']' ;\n");
>> -	printf("\tformat          = pad, '[', fcc, ' ', size, [ ' ', crop ], [ '
>> ', '@', frame interval ], ']' ;\n"); -	printf("\tpad             = entity,
>> ':', pad number ;\n");
>> -	printf("\tentity          = entity number | ( '\"', entity name, '\"' )
>> ;\n"); -	printf("\tsize            = width, 'x', height ;\n");
>> -	printf("\tcrop            = '(', left, ',', top, ')', '/', size ;\n");
>> -	printf("\tframe interval  = numerator, '/', denominator ;\n");
>> +	printf("\tlink                = pad, '->', pad, '[', flags, ']' ;\n");
>> +	printf("\tv4l2                = pad, '[', v4l2-cfgs ']' ;\n");
>> +	printf("\tv4l2-cfgs           = v4l2-cfg [ ',' v4l2-cfg ] ;\n");
>> +	printf("\tv4l2-cfg            = v4l2-mbusfmt | v4l2-crop\n");
>> +	printf("\t                      | v4l2 frame interval ;\n");
>> +	printf("\tv4l2-mbusfmt        = 'fmt:', fcc, '/', size ;\n");
>> +	printf("\tpad                 = entity, ':', pad number ;\n");
>> +	printf("\tentity              = entity number | ( '\"', entity name, '\"'
>> ) ;\n"); +	printf("\tsize                = width, 'x', height ;\n");
>> +	printf("\tv4l2-crop           = 'crop:(', left, ',', top, ')/', size
>> ;\n"); +	printf("\tv4l2 frame interval = '@', numerator, '/', denominator
>> ;\n"); printf("where the fields are\n");
>>  	printf("\tentity number   Entity numeric identifier\n");
>>  	printf("\tentity name     Entity name (string) \n");
>> @@ -77,7 +81,9 @@ static void usage(const char *argv0, int verbose)
>>  static struct option opts[] = {
>>  	{"device", 1, 0, 'd'},
>>  	{"entity", 1, 0, 'e'},
>> +	{"set-v4l2", 1, 0, 'V'},
>>  	{"set-format", 1, 0, 'f'},
>> +	{"get-v4l2", 1, 0, OPT_GET_FORMAT},
>>  	{"get-format", 1, 0, OPT_GET_FORMAT},
>>  	{"help", 0, 0, 'h'},
>>  	{"interactive", 0, 0, 'i'},
>> @@ -98,7 +104,7 @@ int parse_cmdline(int argc, char **argv)
>>  	}
>>
>>  	/* parse options */
>> -	while ((opt = getopt_long(argc, argv, "d:e:f:hil:prv", opts, NULL)) != 
> -1)
>> { +	while ((opt = getopt_long(argc, argv, "d:e:V:f:hil:prv", opts, NULL))
>> != -1) { switch (opt) {
>>  		case 'd':
>>  			media_opts.devname = optarg;
>> @@ -108,6 +114,7 @@ int parse_cmdline(int argc, char **argv)
>>  			media_opts.entity = optarg;
>>  			break;
>>
>> +		case 'V':
>>  		case 'f':
>>  			media_opts.formats = optarg;
>>  			break;
>> diff --git a/src/v4l2subdev.c b/src/v4l2subdev.c
>> index a2ab0c4..6881553 100644
>> --- a/src/v4l2subdev.c
>> +++ b/src/v4l2subdev.c
>> @@ -233,13 +233,13 @@ static int v4l2_subdev_parse_format(struct
>> v4l2_mbus_framefmt *format, char *end;
>>
>>  	for (; isspace(*p); ++p);
>> -	for (end = (char *)p; !isspace(*end) && *end != '\0'; ++end);
>> +	for (end = (char *)p; *end != '/' && *end != '\0'; ++end);
> 
> I wouldn't change this to keep compatibility with the existing syntax.

Ok. How about allowing both '/' and ' '?

>>
>>  	code = v4l2_subdev_string_to_pixelcode(p, end - p);
>>  	if (code == (enum v4l2_mbus_pixelcode)-1)
>>  		return -EINVAL;
>>
>> -	for (p = end; isspace(*p); ++p);
>> +	p = end + 1;
>>  	width = strtoul(p, &end, 10);
>>  	if (*end != 'x')
>>  		return -EINVAL;
>> @@ -256,32 +256,32 @@ static int v4l2_subdev_parse_format(struct
>> v4l2_mbus_framefmt *format, return 0;
>>  }
>>
>> -static int v4l2_subdev_parse_crop(
>> -	struct v4l2_rect *crop, const char *p, char **endp)
>> +static int v4l2_subdev_parse_rectangle(
>> +	struct v4l2_rect *r, const char *p, char **endp)
>>  {
>>  	char *end;
>>
>>  	if (*p++ != '(')
>>  		return -EINVAL;
>>
>> -	crop->left = strtoul(p, &end, 10);
>> +	r->left = strtoul(p, &end, 10);
>>  	if (*end != ',')
>>  		return -EINVAL;
>>
>>  	p = end + 1;
>> -	crop->top = strtoul(p, &end, 10);
>> +	r->top = strtoul(p, &end, 10);
>>  	if (*end++ != ')')
>>  		return -EINVAL;
>>  	if (*end != '/')
>>  		return -EINVAL;
>>
>>  	p = end + 1;
>> -	crop->width = strtoul(p, &end, 10);
>> +	r->width = strtoul(p, &end, 10);
>>  	if (*end != 'x')
>>  		return -EINVAL;
>>
>>  	p = end + 1;
>> -	crop->height = strtoul(p, &end, 10);
>> +	r->height = strtoul(p, &end, 10);
>>  	*endp = end;
>>
>>  	return 0;
>> @@ -307,6 +307,17 @@ static int v4l2_subdev_parse_frame_interval(struct
>> v4l2_fract *interval, return 0;
>>  }
>>
>> +static int strhazit(const char *str, const char **p)
> 
> I would make the function return a bool, or, if you want to keep the int 
> return type, return 0 when there's no match and 1 when there's a match. I 
> suppose you prefer keeping strhazit over strmatch ? :-)

Bool is fine.

>> +{
>> +	int len = strlen(str);
> 
> strlen() returns a size_t.

Ok.

>> +
>> +	if (strncmp(str, *p, len))
>> +		return -ENOENT;
>> +
>> +	*p += len;
> 
> What about also skipping white spaces here ?

Fine with me.

>> +	return 0;
>> +}
>> +
>>  static struct media_pad *v4l2_subdev_parse_pad_format(
>>  	struct media_device *media, struct v4l2_mbus_framefmt *format,
>>  	struct v4l2_rect *crop, struct v4l2_fract *interval, const char *p,
>> @@ -326,30 +337,37 @@ static struct media_pad *v4l2_subdev_parse_pad_format(
>> if (*p++ != '[')
>>  		return NULL;
>>
>> -	for (; isspace(*p); ++p);
>> +	for (;;) {
>> +		for (; isspace(*p); p++);
>>
>> -	if (isalnum(*p)) {
>> -		ret = v4l2_subdev_parse_format(format, p, &end);
>> -		if (ret < 0)
>> -			return NULL;
>> +		if (!strhazit("fmt:", &p)) {
>> +			ret = v4l2_subdev_parse_format(format, p, &end);
>> +			if (ret < 0)
>> +				return NULL;
>>
>> -		for (p = end; isspace(*p); p++);
>> -	}
>> +			p = end;
>> +			continue;
>> +		}
> 
> I'd like to keep compatibility with the existing syntax here. Checking whether 
> this is the first argument and whether it starts with an uppercase letter 
> should be enough, would you be OK with that ?

Right. I may have missed something related to keeping the compatibility.

Capital letter might not be enough in the future; for now it's ok
though. How about this: if the string doesn't match with anything else,
interpret it as format?

Cheers,

-- 
Sakari Ailus
sakari.ailus@iki.fi

  reply	other threads:[~2012-05-08 19:43 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-07 13:46 [media-ctl PATCH v2 1/2] New, more flexible syntax for format Sakari Ailus
2012-05-07 13:46 ` [media-ctl PATCH v2 2/2] Compose rectangle support for libv4l2subdev Sakari Ailus
2012-05-08 19:33   ` Laurent Pinchart
2012-05-09  4:26     ` Sakari Ailus
2012-05-08 19:31 ` [media-ctl PATCH v2 1/2] New, more flexible syntax for format Laurent Pinchart
2012-05-08 19:43   ` Sakari Ailus [this message]
2012-05-08 20:21     ` Laurent Pinchart
2012-05-09  4:25       ` Sakari Ailus

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=4FA97776.3030408@iki.fi \
    --to=sakari.ailus@iki.fi \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-media@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).