Sometimes I just would like to query a video device for it's properties
without starting a stream to see what's supported and evt. make a
decision afterwards how to start the stream.

This diff adds the 'q' option to video(1) for this purpose to just
query the device, display the results, and quit.

Anyone else find this useful?


Index: video.1
===================================================================
RCS file: /cvs/xenocara/app/video/video.1,v
retrieving revision 1.12
diff -u -p -u -p -r1.12 video.1
--- video.1     31 May 2016 06:47:12 -0000      1.12
+++ video.1     3 Jun 2016 12:21:59 -0000
@@ -25,7 +25,7 @@
 .Sh SYNOPSIS
 .Nm
 .Bk -words
-.Op Fl \&gRv
+.Op Fl \&gqRv
 .Op Fl a Ar adaptor
 .Op Fl e Ar encoding
 .Op Fl f Ar file
@@ -133,6 +133,9 @@ If
 is
 .Ql - ,
 frames will be written to standard output.
+.It Fl q
+Query for encodings, frame sizes/rates, and controls.
+Display them and quit.
 .It Fl R
 Disable frame rate adjustment.
 .It Fl r Ar rate
Index: video.c
===================================================================
RCS file: /cvs/xenocara/app/video/video.c,v
retrieving revision 1.16
diff -u -p -u -p -r1.16 video.c
--- video.c     2 Jun 2016 08:53:32 -0000       1.16
+++ video.c     3 Jun 2016 12:21:59 -0000
@@ -169,6 +169,7 @@ struct video {
 #define M_OUT_XV       0x2
 #define M_IN_FILE      0x4
 #define M_OUT_FILE     0x8
+#define M_QUERY                0x10
        int              mode;
        int              verbose;
 };
@@ -186,6 +187,7 @@ int dev_get_sizes(struct video *);
 int dev_get_rates(struct video *);
 int dev_get_ctrls(struct video *);
 void dev_dump_info(struct video *);
+void dev_dump_query(struct video *);
 int dev_init(struct video *);
 void dev_set_ctrl(struct video *, int, int);
 void dev_reset_ctrls(struct video *);
@@ -213,7 +215,7 @@ extern char *__progname;
 void
 usage(void)
 {
-       fprintf(stderr, "usage: %s [-gRv] "
+       fprintf(stderr, "usage: %s [-gqRv] "
            "[-a adaptor] [-e encoding] [-f file] [-i input] [-O output]\n"
            "       %*s [-o output] [-r rate] [-s size]\n", __progname,
            (int)strlen(__progname), "");
@@ -1024,6 +1026,24 @@ dev_dump_info(struct video *vid)
        fprintf(stderr, "\n");
 }
 
+void
+dev_dump_query(struct video *vid)
+{
+       if (!dev_check_caps(vid))
+               return;
+       if (!dev_get_encs(vid))
+               return;
+       if (!choose_enc(vid))
+               return;
+       if (!dev_get_sizes(vid))
+               return;
+       if (!dev_get_rates(vid))
+               return;
+       if (!dev_get_ctrls(vid))
+               return;
+       dev_dump_info(vid);
+}
+
 int
 dev_init(struct video *vid)
 {
@@ -1757,7 +1777,7 @@ main(int argc, char *argv[])
        vid.mmap_on = 1; /* mmap method is default */
        wout = 1;
 
-       while ((ch = getopt(argc, argv, "gvRa:e:f:i:O:o:r:s:")) != -1) {
+       while ((ch = getopt(argc, argv, "gqRva:e:f:i:O:o:r:s:")) != -1) {
                switch (ch) {
                case 'a':
                        x->cur_adap = strtonum(optarg, 0, 4, &errstr);
@@ -1802,6 +1822,10 @@ main(int argc, char *argv[])
                                    optarg);
                        }
                        break;
+               case 'q':
+                       vid.mode |= M_QUERY;
+                       vid.mode &= ~M_OUT_XV;
+                       break;
                case 'R':
                        vid.nofps = 1;
                        break;
@@ -1831,6 +1855,11 @@ main(int argc, char *argv[])
        }
        argc -= optind;
        argv += optind;
+
+       if (vid.mode & M_QUERY) {
+               dev_dump_query(&vid);
+               cleanup(&vid, 0);
+       }
 
        if (vid.fps == 0)
                vid.nofps = 1;

Reply via email to