1 #include "v4l2-ctl.h"
2
3 static struct v4l2_audio vaudio; /* list audio inputs */
4 static struct v4l2_audioout vaudout; /* audio outputs */
5 static int input; /* set_input/get_input */
6 static int output; /* set_output/get_output */
7
io_usage()8 void io_usage()
9 {
10 printf("\nInput/Output options:\n"
11 " -I, --get-input query the video input [VIDIOC_G_INPUT]\n"
12 " -i, --set-input <num>\n"
13 " set the video input to <num> [VIDIOC_S_INPUT]\n"
14 " -N, --list-outputs display video outputs [VIDIOC_ENUMOUTPUT]\n"
15 " -n, --list-inputs display video inputs [VIDIOC_ENUMINPUT]\n"
16 " -O, --get-output query the video output [VIDIOC_G_OUTPUT]\n"
17 " -o, --set-output <num>\n"
18 " set the video output to <num> [VIDIOC_S_OUTPUT]\n"
19 " --set-audio-output <num>\n"
20 " set the audio output to <num> [VIDIOC_S_AUDOUT]\n"
21 " --get-audio-input query the audio input [VIDIOC_G_AUDIO]\n"
22 " --set-audio-input <num>\n"
23 " set the audio input to <num> [VIDIOC_S_AUDIO]\n"
24 " --get-audio-output query the audio output [VIDIOC_G_AUDOUT]\n"
25 " --set-audio-output <num>\n"
26 " set the audio output to <num> [VIDIOC_S_AUDOUT]\n"
27 " --list-audio-outputs\n"
28 " display audio outputs [VIDIOC_ENUMAUDOUT]\n"
29 " --list-audio-inputs\n"
30 " display audio inputs [VIDIOC_ENUMAUDIO]\n"
31 );
32 }
33
inputtype2s(__u32 type)34 static const char *inputtype2s(__u32 type)
35 {
36 switch (type) {
37 case V4L2_INPUT_TYPE_TUNER:
38 return "Tuner";
39 case V4L2_INPUT_TYPE_CAMERA:
40 return "Camera";
41 case V4L2_INPUT_TYPE_TOUCH:
42 return "Touch";
43 default:
44 return "Unknown";
45 }
46 }
47
outputtype2s(__u32 type)48 static const char *outputtype2s(__u32 type)
49 {
50 switch (type) {
51 case V4L2_OUTPUT_TYPE_MODULATOR:
52 return "Modulator";
53 case V4L2_OUTPUT_TYPE_ANALOG:
54 return "Analog";
55 case V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY:
56 return "Analog VGA Overlay";
57 default:
58 return "Unknown";
59 }
60 }
61
io_cmd(int ch,char * optarg)62 void io_cmd(int ch, char *optarg)
63 {
64 switch (ch) {
65 case OptSetInput:
66 input = strtol(optarg, nullptr, 0);
67 break;
68 case OptSetOutput:
69 output = strtol(optarg, nullptr, 0);
70 break;
71 case OptSetAudioInput:
72 vaudio.index = strtol(optarg, nullptr, 0);
73 break;
74 case OptSetAudioOutput:
75 vaudout.index = strtol(optarg, nullptr, 0);
76 break;
77 }
78 }
79
io_set(cv4l_fd & _fd)80 void io_set(cv4l_fd &_fd)
81 {
82 int fd = _fd.g_fd();
83
84 if (options[OptSetInput]) {
85 if (doioctl(fd, VIDIOC_S_INPUT, &input) == 0) {
86 struct v4l2_input vin;
87
88 printf("Video input set to %d", input);
89 vin.index = input;
90 if (test_ioctl(fd, VIDIOC_ENUMINPUT, &vin) >= 0)
91 printf(" (%s: %s, %s)", vin.name,
92 inputtype2s(vin.type),
93 in_status2s(vin.status).c_str());
94 printf("\n");
95 }
96 }
97
98 if (options[OptSetOutput]) {
99 if (doioctl(fd, VIDIOC_S_OUTPUT, &output) == 0)
100 printf("Output set to %d\n", output);
101 }
102
103 if (options[OptSetAudioInput]) {
104 if (doioctl(fd, VIDIOC_S_AUDIO, &vaudio) == 0)
105 printf("Audio input set to %d\n", vaudio.index);
106 }
107
108 if (options[OptSetAudioOutput]) {
109 if (doioctl(fd, VIDIOC_S_AUDOUT, &vaudout) == 0)
110 printf("Audio output set to %d\n", vaudout.index);
111 }
112 }
113
io_get(cv4l_fd & _fd)114 void io_get(cv4l_fd &_fd)
115 {
116 int fd = _fd.g_fd();
117
118 if (options[OptGetInput]) {
119 if (doioctl(fd, VIDIOC_G_INPUT, &input) == 0) {
120 struct v4l2_input vin;
121
122 printf("Video input : %d", input);
123 vin.index = input;
124 if (test_ioctl(fd, VIDIOC_ENUMINPUT, &vin) >= 0)
125 printf(" (%s: %s)", vin.name, in_status2s(vin.status).c_str());
126 printf("\n");
127 }
128 }
129
130 if (options[OptGetOutput]) {
131 if (doioctl(fd, VIDIOC_G_OUTPUT, &output) == 0) {
132 struct v4l2_output vout;
133
134 printf("Video output: %d", output);
135 vout.index = output;
136 if (test_ioctl(fd, VIDIOC_ENUMOUTPUT, &vout) >= 0) {
137 printf(" (%s)", vout.name);
138 }
139 printf("\n");
140 }
141 }
142
143 if (options[OptGetAudioInput]) {
144 if (doioctl(fd, VIDIOC_G_AUDIO, &vaudio) == 0)
145 printf("Audio input : %d (%s)\n", vaudio.index, vaudio.name);
146 }
147
148 if (options[OptGetAudioOutput]) {
149 if (doioctl(fd, VIDIOC_G_AUDOUT, &vaudout) == 0)
150 printf("Audio output: %d (%s)\n", vaudout.index, vaudout.name);
151 }
152 }
153
io_list(cv4l_fd & _fd)154 void io_list(cv4l_fd &_fd)
155 {
156 int fd = _fd.g_fd();
157
158 if (options[OptListInputs]) {
159 struct v4l2_input vin;
160
161 vin.index = 0;
162 printf("ioctl: VIDIOC_ENUMINPUT\n");
163 while (test_ioctl(fd, VIDIOC_ENUMINPUT, &vin) >= 0) {
164 if (vin.index)
165 printf("\n");
166 printf("\tInput : %d\n", vin.index);
167 printf("\tName : %s\n", vin.name);
168 printf("\tType : 0x%08X (%s)\n", vin.type, inputtype2s(vin.type));
169 printf("\tAudioset : 0x%08X\n", vin.audioset);
170 printf("\tTuner : 0x%08X\n", vin.tuner);
171 printf("\tStandard : 0x%016llX (%s)\n", static_cast<unsigned long long>(vin.std),
172 std2s(vin.std).c_str());
173 printf("\tStatus : 0x%08X (%s)\n", vin.status, in_status2s(vin.status).c_str());
174 printf("\tCapabilities: 0x%08X (%s)\n", vin.capabilities, input_cap2s(vin.capabilities).c_str());
175 vin.index++;
176 }
177 }
178
179 if (options[OptListOutputs]) {
180 struct v4l2_output vout;
181
182 vout.index = 0;
183 printf("ioctl: VIDIOC_ENUMOUTPUT\n");
184 while (test_ioctl(fd, VIDIOC_ENUMOUTPUT, &vout) >= 0) {
185 if (vout.index)
186 printf("\n");
187 printf("\tOutput : %d\n", vout.index);
188 printf("\tName : %s\n", vout.name);
189 printf("\tType : 0x%08X (%s)\n", vout.type, outputtype2s(vout.type));
190 printf("\tAudioset : 0x%08X\n", vout.audioset);
191 printf("\tStandard : 0x%016llX (%s)\n", static_cast<unsigned long long>(vout.std),
192 std2s(vout.std).c_str());
193 printf("\tCapabilities: 0x%08X (%s)\n", vout.capabilities, output_cap2s(vout.capabilities).c_str());
194 vout.index++;
195 }
196 }
197
198 if (options[OptListAudioInputs]) {
199 struct v4l2_audio vaudio; /* list audio inputs */
200 vaudio.index = 0;
201 printf("ioctl: VIDIOC_ENUMAUDIO\n");
202 while (test_ioctl(fd, VIDIOC_ENUMAUDIO, &vaudio) >= 0) {
203 if (vaudio.index)
204 printf("\n");
205 printf("\tInput : %d\n", vaudio.index);
206 printf("\tName : %s\n", vaudio.name);
207 vaudio.index++;
208 }
209 }
210
211 if (options[OptListAudioOutputs]) {
212 struct v4l2_audioout vaudio; /* list audio outputs */
213 vaudio.index = 0;
214 printf("ioctl: VIDIOC_ENUMAUDOUT\n");
215 while (test_ioctl(fd, VIDIOC_ENUMAUDOUT, &vaudio) >= 0) {
216 if (vaudio.index)
217 printf("\n");
218 printf("\tOutput : %d\n", vaudio.index);
219 printf("\tName : %s\n", vaudio.name);
220 vaudio.index++;
221 }
222 }
223 }
224