Hi Hans, On Mon, Jun 10, 2024 at 11:06:30AM +0200, Hans Verkuil wrote: > On 10/06/2024 11:00, Laurent Pinchart wrote: > > On Mon, Jun 10, 2024 at 09:14:59AM +0300, Tomi Valkeinen wrote: > >> On 10/06/2024 04:22, Laurent Pinchart wrote: > >>> Add a -W/--which argument to media-ctl to select which state to operate > >>> on. Default to the ACTIVE state to preserve the current behaviour. > >>> > >>> Despite the fact that all values set on the TRY state are lost when > >>> media-ctl terminates, support for the TRY state is useful in order to > >>> retrieve the default configuration of subdevs, or to try configurations. > >> > >> I think this is fine, but I'm curious why you chose such an argument. I > >> would have thought "-t/--try" (or even just --try) would have been > >> simpler to implement and to use. I think I would remember "--try" > >> easily, but "-W TRY", I fear I'll have to check the man page every time... > > > > There are a few reasons: > > > > - Be closer to the API (media-ctl is a low-level tool) > > - Support other values later if the kernel API evolves (no plan for > > that, but who knows ?) > > - I find it easier to propagate arguments in scripts this way. If a > > script that wraps media-ctl receives a nothing/--try argument, it's > > fairly easy to translate that to nothing/-W TRY. If it receives a > > --foo ACTIVE/TRY argument (on the command line, in an interactive > > prompt, as part of a string that tells what to do on a pad, ...), then > > translating that to '-W arg' is easier than to nothing/-W TRY. > > > >>> Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > >>> --- > >>> utils/media-ctl/media-ctl.c | 13 +++++++------ > >>> utils/media-ctl/options.c | 18 +++++++++++++++++- > >>> utils/media-ctl/options.h | 1 + > >>> 3 files changed, 25 insertions(+), 7 deletions(-) > >>> > >>> diff --git a/utils/media-ctl/media-ctl.c b/utils/media-ctl/media-ctl.c > >>> index 42b1bd9aaa6e..33df0880fd9b 100644 > >>> --- a/utils/media-ctl/media-ctl.c > >>> +++ b/utils/media-ctl/media-ctl.c > >>> @@ -600,7 +600,6 @@ static void media_print_topology_text(struct media_device *media, > >>> > >>> int main(int argc, char **argv) > >>> { > >>> - const enum v4l2_subdev_format_whence which = V4L2_SUBDEV_FORMAT_ACTIVE; > >>> struct media_device *media; > >>> struct media_entity *entity = NULL; > >>> int ret = -1; > >>> @@ -667,7 +666,8 @@ int main(int argc, char **argv) > >>> goto out; > >>> } > >>> > >>> - v4l2_subdev_print_format(pad->entity, pad->index, stream, which); > >>> + v4l2_subdev_print_format(pad->entity, pad->index, stream, > >>> + media_opts.which); > >>> } > >>> > >>> if (media_opts.get_dv_pad) { > >>> @@ -709,9 +709,10 @@ int main(int argc, char **argv) > >>> media_print_topology_dot(media); > >>> } else if (media_opts.print) { > >>> if (entity) > >>> - media_print_topology_text_entity(media, entity, which); > >>> + media_print_topology_text_entity(media, entity, > >>> + media_opts.which); > >>> else > >>> - media_print_topology_text(media, which); > >>> + media_print_topology_text(media, media_opts.which); > >>> } else if (entity) { > >>> const char *devname; > >>> > >>> @@ -741,7 +742,7 @@ int main(int argc, char **argv) > >>> } > >>> > >>> if (media_opts.routes) { > >>> - ret = v4l2_subdev_parse_setup_routes(media, which, > >>> + ret = v4l2_subdev_parse_setup_routes(media, media_opts.which, > >>> media_opts.routes); > >>> if (ret) { > >>> printf("Unable to setup routes: %s (%d)\n", > >>> @@ -751,7 +752,7 @@ int main(int argc, char **argv) > >>> } > >>> > >>> if (media_opts.formats) { > >>> - ret = v4l2_subdev_parse_setup_formats(media, which, > >>> + ret = v4l2_subdev_parse_setup_formats(media, media_opts.which, > >>> media_opts.formats); > >>> if (ret) { > >>> printf("Unable to setup formats: %s (%d)\n", > >>> diff --git a/utils/media-ctl/options.c b/utils/media-ctl/options.c > >>> index 3c408a1b9b06..3606525c33da 100644 > >>> --- a/utils/media-ctl/options.c > >>> +++ b/utils/media-ctl/options.c > >>> @@ -40,6 +40,7 @@ > >>> > >>> struct media_options media_opts = { > >>> .devname = MEDIA_DEVNAME_DEFAULT, > >>> + .which = V4L2_SUBDEV_FORMAT_ACTIVE, > >>> }; > >>> > >>> static void print_version() > >>> @@ -75,6 +76,7 @@ static void usage(const char *argv0) > >>> printf("-r, --reset Reset all links to inactive\n"); > >>> printf("-v, --verbose Be verbose\n"); > >>> printf(" --version Show version information\n"); > >>> + printf("-W, --which which Select the subdev state to operate on\n"); > >>> printf("\n"); > >>> printf("Links and formats are defined as\n"); > >>> printf("\tlinks = link { ',' link } ;\n"); > >>> @@ -140,6 +142,8 @@ static void usage(const char *argv0) > >>> for (i = V4L2_YCBCR_ENC_DEFAULT; i <= V4L2_YCBCR_ENC_SMPTE240M; i++) > >>> printf("\t %s\n", > >>> v4l2_subdev_ycbcr_encoding_to_string(i)); > >>> + > >>> + printf("\twhich Subdev state ('ACTIVE' or 'TRY')\n"); > >>> } > >>> > >>> #define OPT_PRINT_DOT 256 > >>> @@ -168,6 +172,7 @@ static struct option opts[] = { > >>> {"reset", 0, 0, 'r'}, > >>> {"verbose", 0, 0, 'v'}, > >>> {"version", 0, 0, OPT_VERSION}, > >>> + {"which", 1, 0, 'W'}, > >>> { }, > >>> }; > >>> > >>> @@ -244,7 +249,7 @@ int parse_cmdline(int argc, char **argv) > >>> } > >>> > >>> /* parse options */ > >>> - while ((opt = getopt_long(argc, argv, "d:e:f:hil:prvV:R:", > >>> + while ((opt = getopt_long(argc, argv, "d:e:f:hil:prvV:R:W:", > >>> opts, NULL)) != -1) { > >>> switch (opt) { > >>> case 'd': > >>> @@ -294,6 +299,17 @@ int parse_cmdline(int argc, char **argv) > >>> media_opts.routes = optarg; > >>> break; > >>> > >>> + case 'W': > >>> + if (!strcmp(optarg, "ACTIVE")) > >>> + media_opts.which = V4L2_SUBDEV_FORMAT_ACTIVE; > >>> + else if (!strcmp(optarg, "TRY")) > >>> + media_opts.which = V4L2_SUBDEV_FORMAT_TRY; > > I very much prefer lower case here since it is a pain to type otherwise. > Alternatively, make this a case-insensitive string compare, that's fine as well. I've tried to stick to the kernel API, the same way we use upper-case media bus codes. If it's generally preferred to use lower-case strings, or make the comparison case-insensitive, I can do that too. I generally dislike case-insensitivity though, it can easily lead to confusion. > >>> + else { > >>> + printf("Invalid 'which' value '%s'\n", optarg); > >>> + return 1; > >>> + } > >>> + break; > >>> + > >>> case OPT_PRINT_DOT: > >>> media_opts.print_dot = 1; > >>> break; > >>> diff --git a/utils/media-ctl/options.h b/utils/media-ctl/options.h > >>> index 753d09347585..095729b98014 100644 > >>> --- a/utils/media-ctl/options.h > >>> +++ b/utils/media-ctl/options.h > >>> @@ -37,6 +37,7 @@ struct media_options > >>> const char *get_dv_pad; > >>> const char *dv_pad; > >>> const char *routes; > >>> + enum v4l2_subdev_format_whence which; > >>> }; > >>> > >>> extern struct media_options media_opts; -- Regards, Laurent Pinchart