V4L2 subdev frame interval support
[media-ctl.git] / options.c
1 /*
2  * Media controller test application
3  *
4  * Copyright (C) 2010 Ideas on board SPRL <laurent.pinchart@ideasonboard.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  */
19
20 #include <stdlib.h>
21 #include <getopt.h>
22 #include <stdio.h>
23 #include <unistd.h>
24
25 #include "options.h"
26
27 #define MEDIA_DEVNAME_DEFAULT           "/dev/media0"
28
29 struct media_options media_opts = {
30         .devname = MEDIA_DEVNAME_DEFAULT,
31 };
32
33 static void usage(const char *argv0, int verbose)
34 {
35         printf("%s [options] device\n", argv0);
36         printf("-d, --device dev        Media device name (default: %s)\n", MEDIA_DEVNAME_DEFAULT);
37         printf("-e, --entity name       Print the device name associated with the given entity\n");
38         printf("-f, --formats           Comma-separated list of formats to setup\n");
39         printf("-h, --help              Show verbose help and exit\n");
40         printf("-i, --interactive       Modify links interactively\n");
41         printf("-l, --links             Comma-separated list of links descriptors to setup\n");
42         printf("-p, --print-topology    Print the device topology (implies -v)\n");
43         printf("    --print-dot         Print the device topology as a dot graph (implies -v)\n");
44         printf("-r, --reset             Reset all links to inactive\n");
45         printf("-v, --verbose           Be verbose\n");
46
47         if (!verbose)
48                 return;
49
50         printf("\n");
51         printf("Links and formats are defined as\n");
52         printf("\tlink            = pad, '->', pad, '[', flags, ']' ;\n");
53         printf("\tformat          = pad, '[', fcc, ' ', size, [ ' ', crop ], [ ' ', '@', frame interval ], ']' ;\n");
54         printf("\tpad             = entity, ':', pad number ;\n");
55         printf("\tentity          = entity number | ( '\"', entity name, '\"' ) ;\n");
56         printf("\tsize            = width, 'x', height ;\n");
57         printf("\tcrop            = left, ',', top, '/', size ;\n");
58         printf("\tframe interval  = numerator, '/', denominator ;\n");
59         printf("where the fields are\n");
60         printf("\tentity number   Entity numeric identifier\n");
61         printf("\tentity name     Entify name (string) \n");
62         printf("\tpad number      Pad numeric identifier\n");
63         printf("\tflags           Link flags (0: inactive, 1: active)\n");
64         printf("\tfcc             Format FourCC\n");
65         printf("\twidth           Image width in pixels\n");
66         printf("\theight          Image height in pixels\n");
67         printf("\tnumerator       Frame interval numerator\n");
68         printf("\tdenominator     Frame interval denominator\n");
69 }
70
71 #define OPT_PRINT_DOT   256
72
73 static struct option opts[] = {
74         {"device", 1, 0, 'd'},
75         {"entity", 1, 0, 'e'},
76         {"formats", 1, 0, 'f'},
77         {"help", 0, 0, 'h'},
78         {"interactive", 0, 0, 'i'},
79         {"links", 1, 0, 'l'},
80         {"print-dot", 0, 0, OPT_PRINT_DOT},
81         {"print-topology", 0, 0, 'p'},
82         {"reset", 0, 0, 'r'},
83         {"verbose", 0, 0, 'v'},
84 };
85
86 int parse_cmdline(int argc, char **argv)
87 {
88         int opt;
89
90         if (argc == 1) {
91                 usage(argv[0], 0);
92                 return 1;
93         }
94
95         /* parse options */
96         while ((opt = getopt_long(argc, argv, "d:e:f:hil:prv", opts, NULL)) != -1) {
97                 switch (opt) {
98                 case 'd':
99                         media_opts.devname = optarg;
100                         break;
101
102                 case 'e':
103                         media_opts.entity = optarg;
104                         break;
105
106                 case 'f':
107                         media_opts.formats = optarg;
108                         break;
109
110                 case 'h':
111                         usage(argv[0], 1);
112                         exit(0);
113
114                 case 'i':
115                         media_opts.interactive = 1;
116                         break;
117
118                 case 'l':
119                         media_opts.links = optarg;
120                         break;
121
122                 case 'p':
123                         media_opts.print = 1;
124                         media_opts.verbose = 1;
125                         break;
126
127                 case 'r':
128                         media_opts.reset = 1;
129                         break;
130
131                 case 'v':
132                         media_opts.verbose = 1;
133                         break;
134
135                 case OPT_PRINT_DOT:
136                         media_opts.print_dot = 1;
137                         break;
138
139                 default:
140                         printf("Invalid option -%c\n", opt);
141                         printf("Run %s -h for help.\n", argv[0]);
142                         return 1;
143                 }
144         }
145
146         return 0;
147 }
148