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