Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (c) 2015-2016 Dmitry V. Levin <ldv (at) 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
     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
    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
    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