1 /*
2 * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
3 * Copyright (c) 2016-2017 The strace developers.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "tests.h"
30 #include <stdio.h>
31 #include <string.h>
32 #include <sys/ioctl.h>
33 #include <linux/types.h>
34 #include <linux/videodev2.h>
35
36 #if WORDS_BIGENDIAN
37 # define cc0(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 24))
38 # define cc1(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 16))
39 # define cc2(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 8))
40 # define cc3(arg) ((unsigned int) (unsigned char) (arg))
41 # define fourcc(a0, a1, a2, a3) \
42 ((unsigned int)(a3) | \
43 ((unsigned int)(a2) << 8) | \
44 ((unsigned int)(a1) << 16) | \
45 ((unsigned int)(a0) << 24))
46 #else
47 # define cc0(arg) ((unsigned int) (unsigned char) (arg))
48 # define cc1(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 8))
49 # define cc2(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 16))
50 # define cc3(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 24))
51 # define fourcc(a0, a1, a2, a3) \
52 ((unsigned int)(a0) | \
53 ((unsigned int)(a1) << 8) | \
54 ((unsigned int)(a2) << 16) | \
55 ((unsigned int)(a3) << 24))
56 #endif
57
58 static const unsigned int magic = 0xdeadbeef;
59
60 static void
init_v4l2_format(struct v4l2_format * const f,const unsigned int buf_type)61 init_v4l2_format(struct v4l2_format *const f,
62 const unsigned int buf_type)
63 {
64 memset(f, -1, sizeof(*f));
65 f->type = buf_type;
66 switch (buf_type) {
67 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
68 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
69 f->fmt.pix.width = 0x657b8160;
70 f->fmt.pix.height = 0x951c0047;
71 f->fmt.pix.pixelformat = magic;
72 f->fmt.pix.field = V4L2_FIELD_NONE;
73 f->fmt.pix.bytesperline = 0xdf20d185;
74 f->fmt.pix.sizeimage = 0x0cf7be41;
75 f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
76 break;
77 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
78 case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
79 case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: {
80 unsigned int i;
81
82 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
83 f->fmt.pix_mp.width = 0x1f3b774b;
84 f->fmt.pix_mp.height = 0xab96a8d6;
85 f->fmt.pix_mp.pixelformat = magic;
86 f->fmt.pix_mp.field = V4L2_FIELD_NONE;
87 f->fmt.pix_mp.colorspace = V4L2_COLORSPACE_JPEG;
88 struct v4l2_plane_pix_format *cur_pix =
89 f->fmt.pix_mp.plane_fmt;
90 for (i = 0;
91 i < ARRAY_SIZE(f->fmt.pix_mp.plane_fmt);
92 i++) {
93 cur_pix[i].sizeimage = 0x1e3c531c | i;
94 cur_pix[i].bytesperline = 0xa983d721 | i;
95 }
96 break;
97 }
98 #endif
99 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
100 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
101 #endif
102 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
103 f->fmt.win.w.left = 0xe8373662;
104 f->fmt.win.w.top = 0x0336d283;
105 f->fmt.win.w.width = 0x9235fe72;
106 f->fmt.win.w.height = 0xbbd886c8;
107 f->fmt.win.field = V4L2_FIELD_ANY;
108 f->fmt.win.chromakey = 0xdb1f991f;
109 f->fmt.win.clipcount = 2;
110 f->fmt.win.clips =
111 tail_alloc(sizeof(*f->fmt.win.clips) *
112 f->fmt.win.clipcount);
113 f->fmt.win.clips[0].c.left = 0x3313d36e;
114 f->fmt.win.clips[0].c.top = 0xcdffe510;
115 f->fmt.win.clips[0].c.width = 0x2064f3a8;
116 f->fmt.win.clips[0].c.height = 0xd06d314a;
117 f->fmt.win.clips[1].c.left = 0xd8c8a83f;
118 f->fmt.win.clips[1].c.top = 0x336e87ba;
119 f->fmt.win.clips[1].c.width = 0x9e3a6fb3;
120 f->fmt.win.clips[1].c.height = 0x05617b76;
121
122 f->fmt.win.bitmap = (void *) -2UL;
123 #ifdef HAVE_STRUCT_V4L2_WINDOW_GLOBAL_ALPHA
124 f->fmt.win.global_alpha = 0xce;
125 #endif
126 break;
127 case V4L2_BUF_TYPE_VBI_CAPTURE:
128 case V4L2_BUF_TYPE_VBI_OUTPUT:
129 f->fmt.vbi.sampling_rate = 0x3d9b5b79;
130 f->fmt.vbi.offset = 0x055b3a09;
131 f->fmt.vbi.samples_per_line = 0xf176d436;
132 f->fmt.vbi.sample_format = magic;
133 f->fmt.vbi.start[0] = 0x9858e2eb;
134 f->fmt.vbi.start[1] = 0x8a4dc8c1;
135 f->fmt.vbi.count[0] = 0x4bcf36a3;
136 f->fmt.vbi.count[1] = 0x97dff65f;
137 f->fmt.vbi.flags = V4L2_VBI_INTERLACED;
138 break;
139 #if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
140 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
141 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: {
142 unsigned int i;
143
144 f->fmt.sliced.service_set = V4L2_SLICED_VPS;
145 f->fmt.sliced.io_size = 0xd897925a;
146 for (i = 0;
147 i < ARRAY_SIZE(f->fmt.sliced.service_lines[0]);
148 i++) {
149 f->fmt.sliced.service_lines[0][i] = 0xc38e | i;
150 f->fmt.sliced.service_lines[1][i] = 0x3abb | i;
151 }
152 break;
153 }
154 #endif
155 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
156 case V4L2_BUF_TYPE_SDR_OUTPUT:
157 #endif
158 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
159 case V4L2_BUF_TYPE_SDR_CAPTURE:
160 f->fmt.sdr.pixelformat = magic;
161 #ifdef HAVE_STRUCT_V4L2_SDR_FORMAT_BUFFERSIZE
162 f->fmt.sdr.buffersize = 0x25afabfb;
163 #endif
164 break;
165 #endif
166 }
167 }
168
169 static void
dprint_ioctl_v4l2(struct v4l2_format * const f,const char * request,const unsigned int buf_type,const char * buf_type_string)170 dprint_ioctl_v4l2(struct v4l2_format *const f,
171 const char *request, const unsigned int buf_type,
172 const char *buf_type_string)
173 {
174 switch (buf_type) {
175 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
176 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
177 printf("ioctl(-1, %s, {type=%s"
178 ", fmt.pix={width=%u, height=%u, pixelformat="
179 "v4l2_fourcc('\\x%x', '\\x%x', '\\x%x', '\\x%x')"
180 ", field=V4L2_FIELD_NONE, bytesperline=%u, sizeimage=%u"
181 ", colorspace=V4L2_COLORSPACE_JPEG}}) = -1 EBADF (%m)\n",
182 request,
183 buf_type_string,
184 f->fmt.pix.width, f->fmt.pix.height,
185 cc0(magic), cc1(magic), cc2(magic), cc3(magic),
186 f->fmt.pix.bytesperline,
187 f->fmt.pix.sizeimage);
188 break;
189 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
190 case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
191 case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: {
192 unsigned int i;
193
194 printf("ioctl(-1, %s"
195 ", {type=%s"
196 ", fmt.pix_mp={width=%u, height=%u, pixelformat="
197 "v4l2_fourcc('\\x%x', '\\x%x', '\\x%x', '\\x%x')"
198 ", field=V4L2_FIELD_NONE, colorspace="
199 "V4L2_COLORSPACE_JPEG, plane_fmt=[",
200 request,
201 buf_type_string,
202 f->fmt.pix_mp.width, f->fmt.pix_mp.height,
203 cc0(magic), cc1(magic), cc2(magic), cc3(magic));
204 for (i = 0;
205 i < ARRAY_SIZE(f->fmt.pix_mp.plane_fmt);
206 ++i) {
207 if (i)
208 printf(", ");
209 printf("{sizeimage=%u, bytesperline=%u}",
210 f->fmt.pix_mp.plane_fmt[i].sizeimage,
211 f->fmt.pix_mp.plane_fmt[i].bytesperline);
212 }
213 printf("], num_planes=%u}}) = -1 EBADF (%m)\n",
214 f->fmt.pix_mp.num_planes);
215 break;
216 }
217 #endif
218 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
219 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
220 #endif
221 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
222 printf("ioctl(-1, %s, {type=%s"
223 ", fmt.win={left=%d, top=%d, width=%u, height=%u"
224 ", field=V4L2_FIELD_ANY, chromakey=%#x, clips="
225 "[{left=%d, top=%d, width=%u, height=%u}, "
226 "{left=%d, top=%d, width=%u, height=%u}]"
227 ", clipcount=%u, bitmap=%p"
228 #ifdef HAVE_STRUCT_V4L2_WINDOW_GLOBAL_ALPHA
229 ", global_alpha=%#x"
230 #endif
231 "}}) = -1 EBADF (%m)\n",
232 request,
233 buf_type_string,
234 f->fmt.win.w.left, f->fmt.win.w.top,
235 f->fmt.win.w.width, f->fmt.win.w.height,
236 f->fmt.win.chromakey,
237 f->fmt.win.clips[0].c.left,
238 f->fmt.win.clips[0].c.top,
239 f->fmt.win.clips[0].c.width,
240 f->fmt.win.clips[0].c.height,
241 f->fmt.win.clips[1].c.left,
242 f->fmt.win.clips[1].c.top,
243 f->fmt.win.clips[1].c.width,
244 f->fmt.win.clips[1].c.height,
245 f->fmt.win.clipcount, f->fmt.win.bitmap
246 #ifdef HAVE_STRUCT_V4L2_WINDOW_GLOBAL_ALPHA
247 , f->fmt.win.global_alpha
248 #endif
249 );
250 break;
251 case V4L2_BUF_TYPE_VBI_CAPTURE:
252 case V4L2_BUF_TYPE_VBI_OUTPUT:
253 printf("ioctl(-1, %s, {type=%s"
254 ", fmt.vbi={sampling_rate=%u, offset=%u"
255 ", samples_per_line=%u, sample_format="
256 "v4l2_fourcc('\\x%x', '\\x%x', '\\x%x', '\\x%x')"
257 ", start=[%u, %u], count=[%u, %u]"
258 ", flags=V4L2_VBI_INTERLACED}})"
259 " = -1 EBADF (%m)\n",
260 request,
261 buf_type_string,
262 f->fmt.vbi.sampling_rate, f->fmt.vbi.offset,
263 f->fmt.vbi.samples_per_line,
264 cc0(magic), cc1(magic), cc2(magic), cc3(magic),
265 f->fmt.vbi.start[0], f->fmt.vbi.start[1],
266 f->fmt.vbi.count[0], f->fmt.vbi.count[1]);
267 break;
268 #if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
269 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
270 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: {
271 unsigned int i, j;
272
273 printf("ioctl(-1, %s, {type=%s"
274 ", fmt.sliced={service_set=V4L2_SLICED_VPS"
275 ", io_size=%u, service_lines=[",
276 request,
277 buf_type_string,
278 f->fmt.sliced.io_size);
279 for (i = 0;
280 i < ARRAY_SIZE(f->fmt.sliced.service_lines);
281 i++) {
282 if (i > 0)
283 printf(", ");
284 printf("[");
285 for (j = 0;
286 j < ARRAY_SIZE(f->fmt.sliced.service_lines[0]);
287 j++) {
288 if (j > 0)
289 printf(", ");
290 printf("%#x",
291 f->fmt.sliced.service_lines[i][j]);
292 }
293 printf("]");
294 }
295 printf("]}}) = -1 EBADF (%m)\n");
296 break;
297 }
298 #endif
299 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
300 case V4L2_BUF_TYPE_SDR_OUTPUT:
301 #endif
302 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
303 case V4L2_BUF_TYPE_SDR_CAPTURE:
304 printf("ioctl(-1, %s, {type=%s"
305 ", fmt.sdr={pixelformat=v4l2_fourcc('\\x%x', '\\x%x',"
306 " '\\x%x', '\\x%x')"
307 #ifdef HAVE_STRUCT_V4L2_SDR_FORMAT_BUFFERSIZE
308 ", buffersize=%u"
309 #endif
310 "}}) = -1 EBADF (%m)\n",
311 request,
312 buf_type_string,
313 cc0(magic), cc1(magic), cc2(magic), cc3(magic)
314 #ifdef HAVE_STRUCT_V4L2_SDR_FORMAT_BUFFERSIZE
315 , f->fmt.sdr.buffersize
316 #endif
317 );
318 break;
319 #endif
320 }
321 }
322 #define print_ioctl_v4l2(v4l2_format, request, buf_type) \
323 dprint_ioctl_v4l2((v4l2_format), (request), (buf_type), #buf_type)
324
325 int
main(void)326 main(void)
327 {
328 const unsigned int size = get_page_size();
329 void *const page = tail_alloc(size);
330 fill_memory(page, size);
331
332 unsigned char cc[sizeof(int)] = { 'A', '\'', '\\', '\xfa' };
333
334 /* VIDIOC_QUERYCAP */
335 ioctl(-1, VIDIOC_QUERYCAP, 0);
336 printf("ioctl(-1, VIDIOC_QUERYCAP, NULL) = -1 EBADF (%m)\n");
337
338 ioctl(-1, VIDIOC_QUERYCAP, page);
339 printf("ioctl(-1, VIDIOC_QUERYCAP, %p) = -1 EBADF (%m)\n", page);
340
341 /* VIDIOC_ENUM_FMT */
342 ioctl(-1, VIDIOC_ENUM_FMT, 0);
343 printf("ioctl(-1, VIDIOC_ENUM_FMT, NULL) = -1 EBADF (%m)\n");
344
345 TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_fmtdesc, p_fmtdesc);
346 p_fmtdesc->index = magic;
347 p_fmtdesc->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
348 ioctl(-1, VIDIOC_ENUM_FMT, p_fmtdesc);
349 printf("ioctl(-1, VIDIOC_ENUM_FMT, {index=%u"
350 ", type=V4L2_BUF_TYPE_VIDEO_CAPTURE}) = -1 EBADF (%m)\n",
351 p_fmtdesc->index);
352
353 /* VIDIOC_G_FMT */
354 ioctl(-1, VIDIOC_G_FMT, 0);
355 printf("ioctl(-1, VIDIOC_G_FMT, NULL) = -1 EBADF (%m)\n");
356
357 TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_format, p_format);
358
359 p_format->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
360 ioctl(-1, VIDIOC_G_FMT, p_format);
361 printf("ioctl(-1, VIDIOC_G_FMT"
362 ", {type=V4L2_BUF_TYPE_VIDEO_CAPTURE}) = -1 EBADF (%m)\n");
363 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
364 p_format->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
365 ioctl(-1, VIDIOC_G_FMT, p_format);
366 printf("ioctl(-1, VIDIOC_G_FMT"
367 ", {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE}) ="
368 " -1 EBADF (%m)\n");
369 #endif
370 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
371 p_format->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY;
372 ioctl(-1, VIDIOC_G_FMT, p_format);
373 printf("ioctl(-1, VIDIOC_G_FMT"
374 ", {type=V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY}) ="
375 " -1 EBADF (%m)\n");
376 #endif
377 p_format->type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
378 ioctl(-1, VIDIOC_G_FMT, p_format);
379 printf("ioctl(-1, VIDIOC_G_FMT"
380 ", {type=V4L2_BUF_TYPE_VIDEO_OVERLAY}) ="
381 " -1 EBADF (%m)\n");
382
383 p_format->type = V4L2_BUF_TYPE_VBI_CAPTURE;
384 ioctl(-1, VIDIOC_G_FMT, p_format);
385 printf("ioctl(-1, VIDIOC_G_FMT"
386 ", {type=V4L2_BUF_TYPE_VBI_CAPTURE}) = -1 EBADF (%m)\n");
387 #if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
388 p_format->type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
389 ioctl(-1, VIDIOC_G_FMT, p_format);
390 printf("ioctl(-1, VIDIOC_G_FMT"
391 ", {type=V4L2_BUF_TYPE_SLICED_VBI_CAPTURE}) = -1 EBADF (%m)\n");
392 #endif
393 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
394 p_format->type = V4L2_BUF_TYPE_SDR_CAPTURE;
395 ioctl(-1, VIDIOC_G_FMT, p_format);
396 printf("ioctl(-1, VIDIOC_G_FMT"
397 ", {type=V4L2_BUF_TYPE_SDR_CAPTURE}) = -1 EBADF (%m)\n");
398 #endif
399 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
400 p_format->type = V4L2_BUF_TYPE_SDR_OUTPUT;
401 ioctl(-1, VIDIOC_G_FMT, p_format);
402 printf("ioctl(-1, VIDIOC_G_FMT"
403 ", {type=V4L2_BUF_TYPE_SDR_OUTPUT}) = -1 EBADF (%m)\n");
404 #endif
405 /* VIDIOC_S_FMT */
406 ioctl(-1, VIDIOC_S_FMT, 0);
407 printf("ioctl(-1, VIDIOC_S_FMT, NULL) = -1 EBADF (%m)\n");
408
409 init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OUTPUT);
410 ioctl(-1, VIDIOC_S_FMT, p_format);
411 print_ioctl_v4l2(p_format, "VIDIOC_S_FMT", V4L2_BUF_TYPE_VIDEO_OUTPUT);
412 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
413 init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
414 ioctl(-1, VIDIOC_S_FMT, p_format);
415 print_ioctl_v4l2(p_format, "VIDIOC_S_FMT",
416 V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
417 #endif
418 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
419 init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
420 ioctl(-1, VIDIOC_S_FMT, p_format);
421 print_ioctl_v4l2(p_format, "VIDIOC_S_FMT",
422 V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
423 #endif
424 init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OVERLAY);
425 ioctl(-1, VIDIOC_S_FMT, p_format);
426 print_ioctl_v4l2(p_format, "VIDIOC_S_FMT",
427 V4L2_BUF_TYPE_VIDEO_OVERLAY);
428
429 init_v4l2_format(p_format, V4L2_BUF_TYPE_VBI_CAPTURE);
430 ioctl(-1, VIDIOC_S_FMT, p_format);
431 print_ioctl_v4l2(p_format, "VIDIOC_S_FMT", V4L2_BUF_TYPE_VBI_CAPTURE);
432 #if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
433 init_v4l2_format(p_format, V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
434 ioctl(-1, VIDIOC_S_FMT, p_format);
435 print_ioctl_v4l2(p_format, "VIDIOC_S_FMT",
436 V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
437 #endif
438 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
439 init_v4l2_format(p_format, V4L2_BUF_TYPE_SDR_CAPTURE);
440 ioctl(-1, VIDIOC_S_FMT, p_format);
441 print_ioctl_v4l2(p_format, "VIDIOC_S_FMT", V4L2_BUF_TYPE_SDR_CAPTURE);
442 #endif
443 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
444 init_v4l2_format(p_format, V4L2_BUF_TYPE_SDR_OUTPUT);
445 ioctl(-1, VIDIOC_S_FMT, p_format);
446 print_ioctl_v4l2(p_format, "VIDIOC_S_FMT", V4L2_BUF_TYPE_SDR_OUTPUT);
447 #endif
448 /* VIDIOC_TRY_FMT */
449 ioctl(-1, VIDIOC_TRY_FMT, 0);
450 printf("ioctl(-1, VIDIOC_TRY_FMT, NULL) = -1 EBADF (%m)\n");
451
452 init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OUTPUT);
453 ioctl(-1, VIDIOC_TRY_FMT, p_format);
454 print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
455 V4L2_BUF_TYPE_VIDEO_OUTPUT);
456 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
457 init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
458 ioctl(-1, VIDIOC_TRY_FMT, p_format);
459 print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
460 V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
461 #endif
462 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
463 init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
464 ioctl(-1, VIDIOC_TRY_FMT, p_format);
465 print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
466 V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
467 #endif
468 init_v4l2_format(p_format, V4L2_BUF_TYPE_VIDEO_OVERLAY);
469 ioctl(-1, VIDIOC_TRY_FMT, p_format);
470 print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
471 V4L2_BUF_TYPE_VIDEO_OVERLAY);
472
473 init_v4l2_format(p_format, V4L2_BUF_TYPE_VBI_CAPTURE);
474 ioctl(-1, VIDIOC_TRY_FMT, p_format);
475 print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT", V4L2_BUF_TYPE_VBI_CAPTURE);
476 #if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
477 init_v4l2_format(p_format, V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
478 ioctl(-1, VIDIOC_TRY_FMT, p_format);
479 print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT",
480 V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
481 #endif
482 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
483 init_v4l2_format(p_format, V4L2_BUF_TYPE_SDR_CAPTURE);
484 ioctl(-1, VIDIOC_TRY_FMT, p_format);
485 print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT", V4L2_BUF_TYPE_SDR_CAPTURE);
486 #endif
487 #if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
488 init_v4l2_format(p_format, V4L2_BUF_TYPE_SDR_OUTPUT);
489 ioctl(-1, VIDIOC_TRY_FMT, p_format);
490 print_ioctl_v4l2(p_format, "VIDIOC_TRY_FMT", V4L2_BUF_TYPE_SDR_OUTPUT);
491 #endif
492 struct v4l2_format *const p_v4l2_format =
493 page + size - sizeof(*p_v4l2_format);
494 ioctl(-1, VIDIOC_TRY_FMT, p_v4l2_format);
495 printf("ioctl(-1, VIDIOC_TRY_FMT, {type=%#x /* V4L2_BUF_TYPE_??? */})"
496 " = -1 EBADF (%m)\n", p_v4l2_format->type);
497
498 /* VIDIOC_REQBUFS */
499 ioctl(-1, VIDIOC_REQBUFS, 0);
500 printf("ioctl(-1, VIDIOC_REQBUFS, NULL) = -1 EBADF (%m)\n");
501
502 struct v4l2_requestbuffers *const p_v4l2_requestbuffers =
503 page + size - sizeof(*p_v4l2_requestbuffers);
504 ioctl(-1, VIDIOC_REQBUFS, p_v4l2_requestbuffers);
505 printf("ioctl(-1, VIDIOC_REQBUFS, {type=%#x /* V4L2_BUF_TYPE_??? */, "
506 "memory=%#x /* V4L2_MEMORY_??? */, count=%u})"
507 " = -1 EBADF (%m)\n",
508 p_v4l2_requestbuffers->type,
509 p_v4l2_requestbuffers->memory,
510 p_v4l2_requestbuffers->count);
511
512 /* VIDIOC_QUERYBUF */
513 ioctl(-1, VIDIOC_QUERYBUF, 0);
514 printf("ioctl(-1, VIDIOC_QUERYBUF, NULL) = -1 EBADF (%m)\n");
515
516 struct v4l2_buffer *const p_v4l2_buffer =
517 page + size - sizeof(*p_v4l2_buffer);
518 ioctl(-1, VIDIOC_QUERYBUF, p_v4l2_buffer);
519 printf("ioctl(-1, VIDIOC_QUERYBUF, {type=%#x /* V4L2_BUF_TYPE_??? */"
520 ", index=%u}) = -1 EBADF (%m)\n",
521 p_v4l2_buffer->type, p_v4l2_buffer->index);
522
523 /* VIDIOC_QBUF */
524 ioctl(-1, VIDIOC_QBUF, 0);
525 printf("ioctl(-1, VIDIOC_QBUF, NULL) = -1 EBADF (%m)\n");
526
527 ioctl(-1, VIDIOC_QBUF, p_v4l2_buffer);
528 printf("ioctl(-1, VIDIOC_QBUF, {type=%#x /* V4L2_BUF_TYPE_??? */"
529 ", index=%u}) = -1 EBADF (%m)\n",
530 p_v4l2_buffer->type, p_v4l2_buffer->index);
531
532 /* VIDIOC_DQBUF */
533 ioctl(-1, VIDIOC_DQBUF, 0);
534 printf("ioctl(-1, VIDIOC_DQBUF, NULL) = -1 EBADF (%m)\n");
535
536 ioctl(-1, VIDIOC_DQBUF, p_v4l2_buffer);
537 printf("ioctl(-1, VIDIOC_DQBUF, {type=%#x"
538 " /* V4L2_BUF_TYPE_??? */}) = -1 EBADF (%m)\n",
539 p_v4l2_buffer->type);
540
541 /* VIDIOC_G_FBUF */
542 ioctl(-1, VIDIOC_G_FBUF, 0);
543 printf("ioctl(-1, VIDIOC_G_FBUF, NULL) = -1 EBADF (%m)\n");
544
545 ioctl(-1, VIDIOC_G_FBUF, page);
546 printf("ioctl(-1, VIDIOC_G_FBUF, %p) = -1 EBADF (%m)\n", page);
547
548 /* VIDIOC_S_FBUF */
549 ioctl(-1, VIDIOC_S_FBUF, 0);
550 printf("ioctl(-1, VIDIOC_S_FBUF, NULL) = -1 EBADF (%m)\n");
551
552 struct v4l2_framebuffer *const p_v4l2_framebuffer =
553 page + size - sizeof(*p_v4l2_framebuffer);
554 ioctl(-1, VIDIOC_S_FBUF, p_v4l2_framebuffer);
555 printf("ioctl(-1, VIDIOC_S_FBUF, {capability=%#x"
556 ", flags=%#x, base=%p}) = -1 EBADF (%m)\n",
557 p_v4l2_framebuffer->capability,
558 p_v4l2_framebuffer->flags,
559 p_v4l2_framebuffer->base);
560
561 /* VIDIOC_STREAMON */
562 ioctl(-1, VIDIOC_STREAMON, 0);
563 printf("ioctl(-1, VIDIOC_STREAMON, NULL) = -1 EBADF (%m)\n");
564
565 int *const p_int = page + size - sizeof(int);
566 ioctl(-1, VIDIOC_STREAMON, p_int);
567 printf("ioctl(-1, VIDIOC_STREAMON, [%#x /* V4L2_BUF_TYPE_??? */])"
568 " = -1 EBADF (%m)\n", *p_int);
569
570 /* VIDIOC_STREAMOFF */
571 ioctl(-1, VIDIOC_STREAMOFF, 0);
572 printf("ioctl(-1, VIDIOC_STREAMOFF, NULL) = -1 EBADF (%m)\n");
573
574 ioctl(-1, VIDIOC_STREAMOFF, p_int);
575 printf("ioctl(-1, VIDIOC_STREAMOFF, [%#x /* V4L2_BUF_TYPE_??? */])"
576 " = -1 EBADF (%m)\n", *p_int);
577
578 /* VIDIOC_G_PARM */
579 ioctl(-1, VIDIOC_G_PARM, 0);
580 printf("ioctl(-1, VIDIOC_G_PARM, NULL) = -1 EBADF (%m)\n");
581
582 struct v4l2_streamparm *const p_v4l2_streamparm =
583 page + size - sizeof(*p_v4l2_streamparm);
584 ioctl(-1, VIDIOC_G_PARM, p_v4l2_streamparm);
585 printf("ioctl(-1, VIDIOC_G_PARM, {type=%#x /* V4L2_BUF_TYPE_??? */})"
586 " = -1 EBADF (%m)\n", p_v4l2_streamparm->type);
587
588 /* VIDIOC_S_PARM */
589 ioctl(-1, VIDIOC_S_PARM, 0);
590 printf("ioctl(-1, VIDIOC_S_PARM, NULL) = -1 EBADF (%m)\n");
591
592 ioctl(-1, VIDIOC_S_PARM, p_v4l2_streamparm);
593 printf("ioctl(-1, VIDIOC_S_PARM, {type=%#x /* V4L2_BUF_TYPE_??? */})"
594 " = -1 EBADF (%m)\n", p_v4l2_streamparm->type);
595
596 TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_streamparm, p_streamparm);
597 p_streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
598 p_streamparm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
599 p_streamparm->parm.capture.capturemode = V4L2_MODE_HIGHQUALITY;
600 p_streamparm->parm.capture.timeperframe.numerator = 0xdeadbeef;
601 p_streamparm->parm.capture.timeperframe.denominator = 0xbadc0ded;
602 ioctl(-1, VIDIOC_S_PARM, p_streamparm);
603 printf("ioctl(-1, VIDIOC_S_PARM, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE"
604 ", parm.capture={capability=V4L2_CAP_TIMEPERFRAME"
605 ", capturemode=V4L2_MODE_HIGHQUALITY, timeperframe=%u/%u"
606 ", extendedmode=%u, readbuffers=%u}}) = -1 EBADF (%m)\n",
607 p_streamparm->parm.capture.timeperframe.numerator,
608 p_streamparm->parm.capture.timeperframe.denominator, -1U, -1U);
609
610 p_streamparm->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
611 p_streamparm->parm.output.outputmode = 0;
612 ioctl(-1, VIDIOC_S_PARM, p_streamparm);
613 printf("ioctl(-1, VIDIOC_S_PARM, {type=V4L2_BUF_TYPE_VIDEO_OUTPUT"
614 ", parm.output={capability=V4L2_CAP_TIMEPERFRAME"
615 ", outputmode=0, timeperframe=%u/%u"
616 ", extendedmode=%u, writebuffers=%u}}) = -1 EBADF (%m)\n",
617 p_streamparm->parm.output.timeperframe.numerator,
618 p_streamparm->parm.output.timeperframe.denominator, -1U, -1U);
619
620 /* VIDIOC_G_STD */
621 ioctl(-1, VIDIOC_G_STD, 0);
622 printf("ioctl(-1, VIDIOC_G_STD, NULL) = -1 EBADF (%m)\n");
623
624 ioctl(-1, VIDIOC_G_STD, page);
625 printf("ioctl(-1, VIDIOC_G_STD, %p) = -1 EBADF (%m)\n", page);
626
627 /* VIDIOC_S_STD */
628 ioctl(-1, VIDIOC_S_STD, 0);
629 printf("ioctl(-1, VIDIOC_S_STD, NULL) = -1 EBADF (%m)\n");
630
631 long long *const p_longlong = page + size - sizeof(*p_longlong);
632 ioctl(-1, VIDIOC_S_STD, p_longlong);
633 printf("ioctl(-1, VIDIOC_S_STD, [%#llx]) = -1 EBADF (%m)\n",
634 *p_longlong);
635
636 /* VIDIOC_ENUMSTD */
637 ioctl(-1, VIDIOC_ENUMSTD, 0);
638 printf("ioctl(-1, VIDIOC_ENUMSTD, NULL) = -1 EBADF (%m)\n");
639
640 struct v4l2_standard *const p_v4l2_standard =
641 page + size - sizeof(*p_v4l2_standard);
642 ioctl(-1, VIDIOC_ENUMSTD, p_v4l2_standard);
643 printf("ioctl(-1, VIDIOC_ENUMSTD, {index=%u}) = -1 EBADF (%m)\n",
644 p_v4l2_standard->index);
645
646 /* VIDIOC_ENUMINPUT */
647 ioctl(-1, VIDIOC_ENUMINPUT, 0);
648 printf("ioctl(-1, VIDIOC_ENUMINPUT, NULL) = -1 EBADF (%m)\n");
649
650 struct v4l2_input *const p_v4l2_input =
651 page + size - sizeof(*p_v4l2_input);
652 ioctl(-1, VIDIOC_ENUMINPUT, p_v4l2_input);
653 printf("ioctl(-1, VIDIOC_ENUMINPUT, {index=%u}) = -1 EBADF (%m)\n",
654 p_v4l2_input->index);
655
656 /* VIDIOC_G_CTRL */
657 ioctl(-1, VIDIOC_G_CTRL, 0);
658 printf("ioctl(-1, VIDIOC_G_CTRL, NULL) = -1 EBADF (%m)\n");
659
660 struct v4l2_control *const p_v4l2_control =
661 page + size - sizeof(*p_v4l2_control);
662 ioctl(-1, VIDIOC_G_CTRL, p_v4l2_control);
663 printf("ioctl(-1, VIDIOC_G_CTRL, {id=%#x /* V4L2_CID_??? */})"
664 " = -1 EBADF (%m)\n", p_v4l2_control->id);
665
666 /* VIDIOC_S_CTRL */
667 ioctl(-1, VIDIOC_S_CTRL, 0);
668 printf("ioctl(-1, VIDIOC_S_CTRL, NULL) = -1 EBADF (%m)\n");
669
670 ioctl(-1, VIDIOC_S_CTRL, p_v4l2_control);
671 printf("ioctl(-1, VIDIOC_S_CTRL, {id=%#x /* V4L2_CID_??? */"
672 ", value=%d}) = -1 EBADF (%m)\n",
673 p_v4l2_control->id, p_v4l2_control->value);
674
675 /* VIDIOC_G_TUNER */
676 ioctl(-1, VIDIOC_G_TUNER, 0);
677 printf("ioctl(-1, VIDIOC_G_TUNER, NULL) = -1 EBADF (%m)\n");
678
679 struct v4l2_tuner *const p_v4l2_tuner =
680 page + size - sizeof(*p_v4l2_tuner);
681 ioctl(-1, VIDIOC_G_TUNER, p_v4l2_tuner);
682 printf("ioctl(-1, VIDIOC_G_TUNER, {index=%u})"
683 " = -1 EBADF (%m)\n", p_v4l2_tuner->index);
684
685 /* VIDIOC_S_TUNER */
686 ioctl(-1, VIDIOC_S_TUNER, 0);
687 printf("ioctl(-1, VIDIOC_S_TUNER, NULL) = -1 EBADF (%m)\n");
688
689 TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_tuner, p_tuner);
690 p_tuner->index = 0x4fb6df39;
691 strcpy((char *) p_tuner->name, "cum tacent clamant");
692 p_tuner->type = V4L2_TUNER_RADIO;
693 p_tuner->capability = V4L2_TUNER_CAP_LOW;
694 p_tuner->rangelow = 0xa673bc29;
695 p_tuner->rangehigh = 0xbaf16d12;
696 p_tuner->rxsubchans = V4L2_TUNER_SUB_MONO;
697 p_tuner->audmode = V4L2_TUNER_MODE_MONO;
698 p_tuner->signal = 0x10bf92c8;
699 p_tuner->afc = 0x3bf7e18b;
700 ioctl(-1, VIDIOC_S_TUNER, p_tuner);
701 printf("ioctl(-1, VIDIOC_S_TUNER, {index=%u"
702 ", name=\"cum tacent clamant\""
703 ", type=V4L2_TUNER_RADIO, capability=V4L2_TUNER_CAP_LOW"
704 ", rangelow=%u, rangehigh=%u"
705 ", rxsubchans=V4L2_TUNER_SUB_MONO"
706 ", audmode=V4L2_TUNER_MODE_MONO, signal=%d, afc=%d"
707 "}) = -1 EBADF (%m)\n",
708 p_tuner->index, p_tuner->rangelow,
709 p_tuner->rangehigh, p_tuner->signal, p_tuner->afc);
710
711 /* VIDIOC_QUERYCTRL */
712 ioctl(-1, VIDIOC_QUERYCTRL, 0);
713 printf("ioctl(-1, VIDIOC_QUERYCTRL, NULL) = -1 EBADF (%m)\n");
714
715 struct v4l2_queryctrl *const p_v4l2_queryctrl =
716 page + size - sizeof(*p_v4l2_queryctrl);
717 ioctl(-1, VIDIOC_QUERYCTRL, p_v4l2_queryctrl);
718 # ifdef V4L2_CTRL_FLAG_NEXT_CTRL
719 printf("ioctl(-1, VIDIOC_QUERYCTRL, {id=V4L2_CTRL_FLAG_NEXT_CTRL"
720 "|%#x /* V4L2_CID_??? */}) = -1 EBADF (%m)\n",
721 p_v4l2_queryctrl->id & ~V4L2_CTRL_FLAG_NEXT_CTRL);
722 # else
723 printf("ioctl(-1, VIDIOC_QUERYCTRL, {id=%#x /* V4L2_CID_??? */})"
724 " = -1 EBADF (%m)\n", p_v4l2_queryctrl->id);
725 # endif
726
727 TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_queryctrl, p_queryctrl);
728 p_queryctrl->id = V4L2_CID_SATURATION;
729 ioctl(-1, VIDIOC_QUERYCTRL, p_queryctrl);
730 printf("ioctl(-1, VIDIOC_QUERYCTRL, {id=V4L2_CID_SATURATION})"
731 " = -1 EBADF (%m)\n");
732
733 /* VIDIOC_G_INPUT */
734 ioctl(-1, VIDIOC_G_INPUT, 0);
735 printf("ioctl(-1, VIDIOC_G_INPUT, NULL) = -1 EBADF (%m)\n");
736
737 ioctl(-1, VIDIOC_G_INPUT, page);
738 printf("ioctl(-1, VIDIOC_G_INPUT, %p) = -1 EBADF (%m)\n", page);
739
740 /* VIDIOC_S_INPUT */
741 ioctl(-1, VIDIOC_S_INPUT, 0);
742 printf("ioctl(-1, VIDIOC_S_INPUT, NULL) = -1 EBADF (%m)\n");
743
744 ioctl(-1, VIDIOC_S_INPUT, p_int);
745 printf("ioctl(-1, VIDIOC_S_INPUT, [%u]) = -1 EBADF (%m)\n", *p_int);
746
747 /* VIDIOC_CROPCAP */
748 ioctl(-1, VIDIOC_CROPCAP, 0);
749 printf("ioctl(-1, VIDIOC_CROPCAP, NULL) = -1 EBADF (%m)\n");
750
751 struct v4l2_cropcap *const p_v4l2_cropcap =
752 page + size - sizeof(*p_v4l2_cropcap);
753 ioctl(-1, VIDIOC_CROPCAP, p_v4l2_cropcap);
754 printf("ioctl(-1, VIDIOC_CROPCAP, {type=%#x /* V4L2_BUF_TYPE_??? */})"
755 " = -1 EBADF (%m)\n", p_v4l2_cropcap->type);
756
757 /* VIDIOC_G_CROP */
758 ioctl(-1, VIDIOC_G_CROP, 0);
759 printf("ioctl(-1, VIDIOC_G_CROP, NULL) = -1 EBADF (%m)\n");
760
761 struct v4l2_crop *const p_v4l2_crop =
762 page + size - sizeof(*p_v4l2_crop);
763 ioctl(-1, VIDIOC_G_CROP, p_v4l2_crop);
764 printf("ioctl(-1, VIDIOC_G_CROP, {type=%#x /* V4L2_BUF_TYPE_??? */})"
765 " = -1 EBADF (%m)\n", p_v4l2_crop->type);
766
767 /* VIDIOC_S_CROP */
768 ioctl(-1, VIDIOC_S_CROP, 0);
769 printf("ioctl(-1, VIDIOC_S_CROP, NULL) = -1 EBADF (%m)\n");
770
771 ioctl(-1, VIDIOC_S_CROP, p_v4l2_crop);
772 printf("ioctl(-1, VIDIOC_S_CROP, {type=%#x /* V4L2_BUF_TYPE_??? */"
773 ", c={left=%d, top=%d, width=%u, height=%u}}) = -1 EBADF (%m)\n",
774 p_v4l2_crop->type,
775 p_v4l2_crop->c.left,
776 p_v4l2_crop->c.top,
777 p_v4l2_crop->c.width,
778 p_v4l2_crop->c.height);
779
780 #ifdef VIDIOC_S_EXT_CTRLS
781 /* VIDIOC_S_EXT_CTRLS */
782 ioctl(-1, VIDIOC_S_EXT_CTRLS, 0);
783 printf("ioctl(-1, VIDIOC_S_EXT_CTRLS, NULL) = -1 EBADF (%m)\n");
784
785 TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_ext_controls, p_ext_controls);
786 p_ext_controls->ctrl_class = V4L2_CTRL_CLASS_USER;
787 p_ext_controls->count = 0;
788 p_ext_controls->controls = (void *) -2UL;
789 ioctl(-1, VIDIOC_S_EXT_CTRLS, p_ext_controls);
790 printf("ioctl(-1, VIDIOC_S_EXT_CTRLS, {ctrl_class=V4L2_CTRL_CLASS_USER"
791 ", count=%u}) = -1 EBADF (%m)\n", p_ext_controls->count);
792
793 p_ext_controls->ctrl_class = V4L2_CTRL_CLASS_MPEG;
794 p_ext_controls->count = magic;
795 ioctl(-1, VIDIOC_S_EXT_CTRLS, p_ext_controls);
796 printf("ioctl(-1, VIDIOC_S_EXT_CTRLS, {ctrl_class=V4L2_CTRL_CLASS_MPEG"
797 ", count=%u, controls=%p}) = -1 EBADF (%m)\n",
798 p_ext_controls->count, p_ext_controls->controls);
799
800 # if HAVE_DECL_V4L2_CTRL_TYPE_STRING
801 p_ext_controls->count = 2;
802 p_ext_controls->controls =
803 tail_alloc(sizeof(*p_ext_controls->controls) * p_ext_controls->count);
804 p_ext_controls->controls[0].id = V4L2_CID_BRIGHTNESS;
805 p_ext_controls->controls[0].size = 0;
806 p_ext_controls->controls[0].value64 = 0xfacefeeddeadbeefULL;
807 p_ext_controls->controls[1].id = V4L2_CID_CONTRAST;
808 p_ext_controls->controls[1].size = 2;
809 p_ext_controls->controls[1].string =
810 tail_alloc(p_ext_controls->controls[1].size);
811
812 ioctl(-1, VIDIOC_S_EXT_CTRLS, p_ext_controls);
813 printf("ioctl(-1, VIDIOC_S_EXT_CTRLS"
814 ", {ctrl_class=V4L2_CTRL_CLASS_MPEG, count=%u, controls="
815 "[{id=V4L2_CID_BRIGHTNESS, size=0, value=%d, value64=%lld}"
816 ", {id=V4L2_CID_CONTRAST, size=2, string=\"\\377\\377\"}"
817 "] => controls="
818 "[{id=V4L2_CID_BRIGHTNESS, size=0, value=%d, value64=%lld}"
819 ", {id=V4L2_CID_CONTRAST, size=2, string=\"\\377\\377\"}"
820 "], error_idx=%u}) = -1 EBADF (%m)\n",
821 p_ext_controls->count,
822 p_ext_controls->controls[0].value,
823 (long long) p_ext_controls->controls[0].value64,
824 p_ext_controls->controls[0].value,
825 (long long) p_ext_controls->controls[0].value64,
826 p_ext_controls->error_idx);
827
828 ++p_ext_controls->count;
829 ioctl(-1, VIDIOC_S_EXT_CTRLS, p_ext_controls);
830 printf("ioctl(-1, VIDIOC_S_EXT_CTRLS"
831 ", {ctrl_class=V4L2_CTRL_CLASS_MPEG, count=%u, controls="
832 "[{id=V4L2_CID_BRIGHTNESS, size=0, value=%d, value64=%lld}"
833 ", {id=V4L2_CID_CONTRAST, size=2, string=\"\\377\\377\"}"
834 ", %p]}) = -1 EBADF (%m)\n",
835 p_ext_controls->count,
836 p_ext_controls->controls[0].value,
837 (long long) p_ext_controls->controls[0].value64,
838 p_ext_controls->controls + 2);
839 # endif /* HAVE_DECL_V4L2_CTRL_TYPE_STRING */
840
841 /* VIDIOC_TRY_EXT_CTRLS */
842 ioctl(-1, VIDIOC_TRY_EXT_CTRLS, 0);
843 printf("ioctl(-1, VIDIOC_TRY_EXT_CTRLS, NULL) = -1 EBADF (%m)\n");
844
845 p_ext_controls->ctrl_class = V4L2_CTRL_CLASS_USER;
846 p_ext_controls->count = magic;
847 p_ext_controls->controls = (void *) -2UL;
848 ioctl(-1, VIDIOC_TRY_EXT_CTRLS, p_ext_controls);
849 printf("ioctl(-1, VIDIOC_TRY_EXT_CTRLS"
850 ", {ctrl_class=V4L2_CTRL_CLASS_USER, count=%u, controls=%p})"
851 " = -1 EBADF (%m)\n",
852 p_ext_controls->count, p_ext_controls->controls);
853
854 /* VIDIOC_G_EXT_CTRLS */
855 ioctl(-1, VIDIOC_G_EXT_CTRLS, 0);
856 printf("ioctl(-1, VIDIOC_G_EXT_CTRLS, NULL) = -1 EBADF (%m)\n");
857
858 ioctl(-1, VIDIOC_G_EXT_CTRLS, p_ext_controls);
859 printf("ioctl(-1, VIDIOC_G_EXT_CTRLS"
860 ", {ctrl_class=V4L2_CTRL_CLASS_USER, count=%u, controls=%p"
861 ", error_idx=%u}) = -1 EBADF (%m)\n",
862 p_ext_controls->count, p_ext_controls->controls,
863 p_ext_controls->error_idx);
864 #endif /* VIDIOC_S_EXT_CTRLS */
865
866 #ifdef VIDIOC_ENUM_FRAMESIZES
867 ioctl(-1, VIDIOC_ENUM_FRAMESIZES, 0);
868 printf("ioctl(-1, VIDIOC_ENUM_FRAMESIZES, NULL) = -1 EBADF (%m)\n");
869
870 TAIL_ALLOC_OBJECT_CONST_PTR(struct v4l2_frmsizeenum, p_frmsizeenum);
871 p_frmsizeenum->index = magic;
872 p_frmsizeenum->pixel_format = fourcc(cc[0], cc[1], cc[2], cc[3]);
873
874 ioctl(-1, VIDIOC_ENUM_FRAMESIZES, p_frmsizeenum);
875 printf("ioctl(-1, VIDIOC_ENUM_FRAMESIZES, {index=%u"
876 ", pixel_format=v4l2_fourcc('%c', '\\%c', '\\%c', '\\x%x')})"
877 " = -1 EBADF (%m)\n", p_frmsizeenum->index,
878 cc[0], cc[1], cc[2], cc[3]);
879 #endif /* VIDIOC_ENUM_FRAMESIZES */
880
881 #ifdef VIDIOC_ENUM_FRAMEINTERVALS
882 ioctl(-1, VIDIOC_ENUM_FRAMEINTERVALS, 0);
883 printf("ioctl(-1, VIDIOC_ENUM_FRAMEINTERVALS, NULL) = -1 EBADF (%m)\n");
884
885 struct v4l2_frmivalenum *const p_v4l2_frmivalenum =
886 page + size - sizeof(*p_v4l2_frmivalenum);
887 ioctl(-1, VIDIOC_ENUM_FRAMEINTERVALS, p_v4l2_frmivalenum);
888 printf("ioctl(-1, VIDIOC_ENUM_FRAMEINTERVALS, {index=%u"
889 ", pixel_format=v4l2_fourcc('\\x%x', '\\x%x', '\\x%x', '\\x%x')"
890 ", width=%u, height=%u}) = -1 EBADF (%m)\n",
891 p_v4l2_frmivalenum->index,
892 cc0(p_v4l2_frmivalenum->pixel_format),
893 cc1(p_v4l2_frmivalenum->pixel_format),
894 cc2(p_v4l2_frmivalenum->pixel_format),
895 cc3(p_v4l2_frmivalenum->pixel_format),
896 p_v4l2_frmivalenum->width,
897 p_v4l2_frmivalenum->height);
898 #endif /* VIDIOC_ENUM_FRAMEINTERVALS */
899
900 #ifdef VIDIOC_CREATE_BUFS
901 ioctl(-1, VIDIOC_CREATE_BUFS, 0);
902 printf("ioctl(-1, VIDIOC_CREATE_BUFS, NULL) = -1 EBADF (%m)\n");
903
904 struct v4l2_create_buffers *const p_v4l2_create_buffers =
905 page + size - sizeof(*p_v4l2_create_buffers);
906 ioctl(-1, VIDIOC_CREATE_BUFS, p_v4l2_create_buffers);
907 printf("ioctl(-1, VIDIOC_CREATE_BUFS, {count=%u, memory=%#x"
908 " /* V4L2_MEMORY_??? */, format={type=%#x"
909 " /* V4L2_BUF_TYPE_??? */}}) = -1 EBADF (%m)\n",
910 p_v4l2_create_buffers->count,
911 p_v4l2_create_buffers->memory,
912 p_v4l2_create_buffers->format.type);
913 #endif /* VIDIOC_CREATE_BUFS */
914
915 puts("+++ exited with 0 +++");
916 return 0;
917 }
918