Home | History | Annotate | Download | only in user_space
      1 /*
      2  * v4l-test: Test environment for Video For Linux Two API
      3  *
      4  * 19 Jul 2009  0.4  More V4L2_PIX_FMT_* formats added to valid_poxelformat()
      5  * 18 Apr 2009  0.3  Type added to debug printouts
      6  * 15 Apr 2009  0.2  Added test case for VIDIOC_S_FMT
      7  *  4 Apr 2009  0.1  First release
      8  *
      9  * Written by Mrton Nmeth <nm127 (at) freemail.hu>
     10  * Released under GPL
     11  */
     12 
     13 #include <stdio.h>
     14 #include <sys/types.h>
     15 #include <sys/stat.h>
     16 #include <fcntl.h>
     17 #include <unistd.h>
     18 #include <sys/ioctl.h>
     19 #include <errno.h>
     20 #include <string.h>
     21 
     22 #include <linux/videodev2.h>
     23 #include <linux/errno.h>
     24 
     25 #include <CUnit/CUnit.h>
     26 #include <CUnit/Basic.h>
     27 
     28 #include "v4l2_test.h"
     29 #include "dev_video.h"
     30 #include "video_limits.h"
     31 
     32 #include "test_VIDIOC_FMT.h"
     33 
     34 int valid_pixelformat(__u32 pixelformat)
     35 {
     36 	int valid = 0;
     37 
     38 	switch (pixelformat) {
     39 	case V4L2_PIX_FMT_RGB332:
     40 	case V4L2_PIX_FMT_RGB444:
     41 	case V4L2_PIX_FMT_RGB555:
     42 	case V4L2_PIX_FMT_RGB565:
     43 	case V4L2_PIX_FMT_RGB555X:
     44 	case V4L2_PIX_FMT_RGB565X:
     45 	case V4L2_PIX_FMT_BGR24:
     46 	case V4L2_PIX_FMT_RGB24:
     47 	case V4L2_PIX_FMT_BGR32:
     48 	case V4L2_PIX_FMT_RGB32:
     49 	case V4L2_PIX_FMT_GREY:
     50 	case V4L2_PIX_FMT_Y16:
     51 	case V4L2_PIX_FMT_PAL8:
     52 	case V4L2_PIX_FMT_YVU410:
     53 	case V4L2_PIX_FMT_YVU420:
     54 	case V4L2_PIX_FMT_YUYV:
     55 	case V4L2_PIX_FMT_UYVY:
     56 	case V4L2_PIX_FMT_YUV422P:
     57 	case V4L2_PIX_FMT_YUV411P:
     58 	case V4L2_PIX_FMT_Y41P:
     59 	case V4L2_PIX_FMT_YUV444:
     60 	case V4L2_PIX_FMT_YUV555:
     61 	case V4L2_PIX_FMT_YUV565:
     62 	case V4L2_PIX_FMT_YUV32:
     63 	case V4L2_PIX_FMT_NV12:
     64 	case V4L2_PIX_FMT_NV21:
     65 	case V4L2_PIX_FMT_YUV410:
     66 	case V4L2_PIX_FMT_YUV420:
     67 	case V4L2_PIX_FMT_YYUV:
     68 	case V4L2_PIX_FMT_HI240:
     69 	case V4L2_PIX_FMT_HM12:
     70 	case V4L2_PIX_FMT_SBGGR8:
     71 	case V4L2_PIX_FMT_SBGGR16:
     72 	case V4L2_PIX_FMT_MJPEG:
     73 	case V4L2_PIX_FMT_JPEG:
     74 	case V4L2_PIX_FMT_DV:
     75 	case V4L2_PIX_FMT_MPEG:
     76 	case V4L2_PIX_FMT_WNVA:
     77 	case V4L2_PIX_FMT_SN9C10X:
     78 	case V4L2_PIX_FMT_PWC1:
     79 	case V4L2_PIX_FMT_PWC2:
     80 	case V4L2_PIX_FMT_ET61X251:
     81 
     82 		/* formats from Linux kernel 2.6.31-rc2 */
     83 
     84 #ifdef V4L2_PIX_FMT_VYUY
     85 	case V4L2_PIX_FMT_VYUY:
     86 #endif
     87 
     88 #ifdef V4L2_PIX_FMT_NV16
     89 	case V4L2_PIX_FMT_NV16:
     90 #endif
     91 
     92 #ifdef V4L2_PIX_FMT_NV61
     93 	case V4L2_PIX_FMT_NV61:
     94 #endif
     95 
     96 #ifdef V4L2_PIX_FMT_SGBRG8
     97 	case V4L2_PIX_FMT_SGBRG8:
     98 #endif
     99 
    100 #ifdef V4L2_PIX_FMT_SGRBG8
    101 	case V4L2_PIX_FMT_SGRBG8:
    102 #endif
    103 
    104 #ifdef V4L2_PIX_FMT_SGRBG10
    105 	case V4L2_PIX_FMT_SGRBG10:
    106 #endif
    107 
    108 #ifdef V4L2_PIX_FMT_SGRBG10DPCM8
    109 	case V4L2_PIX_FMT_SGRBG10DPCM8:
    110 #endif
    111 
    112 #ifdef V4L2_PIX_FMT_SPCA501
    113 	case V4L2_PIX_FMT_SPCA501:
    114 #endif
    115 
    116 #ifdef V4L2_PIX_FMT_SPCA505
    117 	case V4L2_PIX_FMT_SPCA505:
    118 #endif
    119 
    120 #ifdef V4L2_PIX_FMT_SPCA508
    121 	case V4L2_PIX_FMT_SPCA508:
    122 #endif
    123 
    124 #ifdef V4L2_PIX_FMT_SPCA561
    125 	case V4L2_PIX_FMT_SPCA561:
    126 #endif
    127 
    128 #ifdef V4L2_PIX_FMT_PAC207
    129 	case V4L2_PIX_FMT_PAC207:
    130 #endif
    131 
    132 #ifdef V4L2_PIX_FMT_MR97310A
    133 	case V4L2_PIX_FMT_MR97310A:
    134 #endif
    135 
    136 #ifdef V4L2_PIX_FMT_SQ905C
    137 	case V4L2_PIX_FMT_SQ905C:
    138 #endif
    139 
    140 #ifdef V4L2_PIX_FMT_PJPG
    141 	case V4L2_PIX_FMT_PJPG:
    142 #endif
    143 
    144 #ifdef V4L2_PIX_FMT_YVYU
    145 	case V4L2_PIX_FMT_YVYU:
    146 #endif
    147 
    148 #ifdef V4L2_PIX_FMT_OV511
    149 	case V4L2_PIX_FMT_OV511:
    150 #endif
    151 
    152 #ifdef V4L2_PIX_FMT_OV518
    153 	case V4L2_PIX_FMT_OV518:
    154 #endif
    155 
    156 		valid = 1;
    157 		break;
    158 	default:
    159 		valid = 0;
    160 	}
    161 
    162 	return valid;
    163 }
    164 
    165 int valid_colorspace(enum v4l2_colorspace colorspace)
    166 {
    167 	int valid = 0;
    168 
    169 	switch (colorspace) {
    170 	case V4L2_COLORSPACE_SMPTE170M:
    171 	case V4L2_COLORSPACE_SMPTE240M:
    172 	case V4L2_COLORSPACE_REC709:
    173 	case V4L2_COLORSPACE_BT878:
    174 	case V4L2_COLORSPACE_470_SYSTEM_M:
    175 	case V4L2_COLORSPACE_470_SYSTEM_BG:
    176 	case V4L2_COLORSPACE_JPEG:
    177 	case V4L2_COLORSPACE_SRGB:
    178 		valid = 1;
    179 		break;
    180 	default:
    181 		valid = 0;
    182 	}
    183 
    184 	return valid;
    185 }
    186 
    187 static void do_get_formats(enum v4l2_buf_type type)
    188 {
    189 	int ret_get, errno_get;
    190 	struct v4l2_format format;
    191 	struct v4l2_format format2;
    192 	unsigned int j;
    193 
    194 	memset(&format, 0xff, sizeof(format));
    195 	format.type = type;
    196 
    197 	ret_get = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    198 	errno_get = errno;
    199 
    200 	dprintf("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_get=%i, errno_get=%i\n",
    201 		__FILE__, __LINE__, type, ret_get, errno_get);
    202 	if (ret_get == 0) {
    203 		CU_ASSERT_EQUAL(ret_get, 0);
    204 		CU_ASSERT_EQUAL(format.type, type);
    205 
    206 		switch (format.type) {
    207 		case V4L2_BUF_TYPE_VIDEO_CAPTURE:
    208 		case V4L2_BUF_TYPE_VIDEO_OUTPUT:
    209 			dprintf("\tformat = {.type=0x%X, .fmt.pix = { "
    210 				".width=%u, "
    211 				".height=%u, "
    212 				".pixelformat=0x%X, "
    213 				".field=%i, "
    214 				".bytesperline=%i, "
    215 				".sizeimage=%u, "
    216 				".colorspace=%i, "
    217 				".priv=0x%X "
    218 				" } }\n",
    219 				format.type,
    220 				format.fmt.pix.width,
    221 				format.fmt.pix.height,
    222 				format.fmt.pix.pixelformat,
    223 				format.fmt.pix.field,
    224 				format.fmt.pix.bytesperline,
    225 				format.fmt.pix.sizeimage,
    226 				format.fmt.pix.colorspace, format.fmt.pix.priv);
    227 			if (sizeof(format.fmt.pix) <
    228 			    sizeof(format.fmt.raw_data)) {
    229 				dprintf1
    230 				    ("\tformat = { ..., .fmt.raw_data[] = { ...");
    231 				for (j = sizeof(format.fmt.pix);
    232 				     j < sizeof(format.fmt.raw_data); j++) {
    233 					dprintf(", 0x%x",
    234 						format.fmt.raw_data[j]);
    235 				}
    236 				dprintf1(" }}\n");
    237 			}
    238 
    239 			/* TODO: check different fields */
    240 			//CU_ASSERT_EQUAL(format.fmt.pix.width, ???);
    241 			//CU_ASSERT_EQUAL(format.fmt.pix.height, ???);
    242 			//CU_ASSERT_EQUAL(format.fmt.pix.pixelformat, ???);
    243 			CU_ASSERT(valid_pixelformat
    244 				  (format.fmt.pix.pixelformat));
    245 
    246 			//CU_ASSERT_EQUAL(format.fmt.pix.field, ???);
    247 			//CU_ASSERT_EQUAL(format.fmt.pix.bytesperline, ???);
    248 			//CU_ASSERT_EQUAL(format.fmt.pix.sizeimage, ???);
    249 			//CU_ASSERT_EQUAL(format.fmt.pix.colorspace, ???);
    250 			CU_ASSERT(valid_colorspace(format.fmt.pix.colorspace));
    251 			//CU_ASSERT_EQUAL(format.fmt.pix.priv, ???);
    252 
    253 			/* Check whether the remaining bytes of rawdata is set to zero */
    254 			memset(&format2, 0, sizeof(format2));
    255 			CU_ASSERT_EQUAL(memcmp
    256 					(format.fmt.raw_data +
    257 					 sizeof(format.fmt.pix),
    258 					 format2.fmt.raw_data +
    259 					 sizeof(format2.fmt.pix),
    260 					 sizeof(format.fmt.raw_data) -
    261 					 sizeof(format.fmt.pix)), 0);
    262 			break;
    263 
    264 		case V4L2_BUF_TYPE_VIDEO_OVERLAY:
    265 		case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
    266 			dprintf("\tformat = {.type=0x%X, .fmt.win={ "
    267 				".w = { .left=%i, .top=%i, .width=%i, .height=%i, }, "
    268 				".field = %i, "
    269 				".chromakey = 0x%X, "
    270 				".clips = %p, "
    271 				".clipcount = %u, "
    272 				".bitmap = %p, "
    273 				".global_alpha = %u "
    274 				"} }\n",
    275 				format.type,
    276 				format.fmt.win.w.left,
    277 				format.fmt.win.w.top,
    278 				format.fmt.win.w.width,
    279 				format.fmt.win.w.height,
    280 				format.fmt.win.field,
    281 				format.fmt.win.chromakey,
    282 				format.fmt.win.clips,
    283 				format.fmt.win.clipcount,
    284 				format.fmt.win.bitmap,
    285 				format.fmt.win.global_alpha);
    286 			if (sizeof(format.fmt.win) <
    287 			    sizeof(format.fmt.raw_data)) {
    288 				dprintf1
    289 				    ("\tformat = { ..., .fmt.raw_data[] = { ...");
    290 				for (j = sizeof(format.fmt.win);
    291 				     j < sizeof(format.fmt.raw_data); j++) {
    292 					dprintf(", 0x%x",
    293 						format.fmt.raw_data[j]);
    294 				}
    295 				dprintf1(" }}\n");
    296 			}
    297 
    298 			/* TODO: check different fields */
    299 			//CU_ASSERT_EQUAL(format.fmt.win.w.left, ???);
    300 			//CU_ASSERT_EQUAL(format.fmt.win.w.top, ???);
    301 			//CU_ASSERT_EQUAL(format.fmt.win.w.width, ???);
    302 			//CU_ASSERT_EQUAL(format.fmt.win.w.height, ???);
    303 			//CU_ASSERT_EQUAL(format.fmt.win.field, ???);
    304 			//CU_ASSERT_EQUAL(format.fmt.win.chromakey, ???);
    305 			//CU_ASSERT_EQUAL(format.fmt.win.clips, ???);
    306 			//CU_ASSERT_EQUAL(format.fmt.win.clipcount, ???);
    307 			//CU_ASSERT_EQUAL(format.fmt.win.bitmap, ???);
    308 			//CU_ASSERT_EQUAL(format.fmt.win.global_alpha ???);
    309 
    310 			/* Check whether the remaining bytes of raw_data is set to zero */
    311 			memset(&format2, 0, sizeof(format2));
    312 			CU_ASSERT_EQUAL(memcmp
    313 					(format.fmt.raw_data +
    314 					 sizeof(format.fmt.win),
    315 					 format2.fmt.raw_data +
    316 					 sizeof(format2.fmt.win),
    317 					 sizeof(format.fmt.raw_data) -
    318 					 sizeof(format.fmt.win)), 0);
    319 			break;
    320 
    321 		case V4L2_BUF_TYPE_VBI_CAPTURE:
    322 		case V4L2_BUF_TYPE_VBI_OUTPUT:
    323 			dprintf("\tformat = {.type=0x%X, .fmt.vbi={ "
    324 				".sampling_rate=%u, "
    325 				".offset=%u, "
    326 				".samples_per_line=%u "
    327 				".sample_format=0x%X "
    328 				".start = { %u, %u }, "
    329 				".count = { %u, %u }, "
    330 				".flags = 0x%X, "
    331 				".reserved = { 0x%X, 0x%X } "
    332 				"} }\n",
    333 				format.type,
    334 				format.fmt.vbi.sampling_rate,
    335 				format.fmt.vbi.offset,
    336 				format.fmt.vbi.samples_per_line,
    337 				format.fmt.vbi.sample_format,
    338 				format.fmt.vbi.start[0],
    339 				format.fmt.vbi.start[1],
    340 				format.fmt.vbi.count[0],
    341 				format.fmt.vbi.count[1],
    342 				format.fmt.vbi.flags,
    343 				format.fmt.vbi.reserved[0],
    344 				format.fmt.vbi.reserved[1]
    345 			    );
    346 			if (sizeof(format.fmt.vbi) <
    347 			    sizeof(format.fmt.raw_data)) {
    348 				dprintf1
    349 				    ("\tformat = { ..., .fmt.raw_data[] = { ...");
    350 				for (j = sizeof(format.fmt.vbi);
    351 				     j < sizeof(format.fmt.raw_data); j++) {
    352 					dprintf(", 0x%x",
    353 						format.fmt.raw_data[j]);
    354 				}
    355 				dprintf1(" }}\n");
    356 			}
    357 
    358 			/* TODO: check different fields */
    359 			//CU_ASSERT_EQUAL(format.fmt.vbi.sampling_rate, ???);
    360 			//CU_ASSERT_EQUAL(format.fmt.vbi.offset, ???);
    361 			//CU_ASSERT_EQUAL(format.fmt.vbi.samples_per_line, ???);
    362 			//CU_ASSERT_EQUAL(format.fmt.vbi.sample_format, ???);
    363 			//CU_ASSERT_EQUAL(format.fmt.vbi.start[0], ???);
    364 			//CU_ASSERT_EQUAL(format.fmt.vbi.start[1], ???);
    365 			//CU_ASSERT_EQUAL(format.fmt.vbi.count[0], ???);
    366 			//CU_ASSERT_EQUAL(format.fmt.vbi.count[1], ???);
    367 			//CU_ASSERT_EQUAL(format.fmt.vbi.flags, ???);
    368 			CU_ASSERT_EQUAL(format.fmt.vbi.reserved[0], 0);
    369 			CU_ASSERT_EQUAL(format.fmt.vbi.reserved[1], 0);
    370 
    371 			/* Check whether the remaining bytes of raw_data is set to zero */
    372 			memset(&format2, 0, sizeof(format2));
    373 			CU_ASSERT_EQUAL(memcmp
    374 					(format.fmt.raw_data +
    375 					 sizeof(format.fmt.vbi),
    376 					 format2.fmt.raw_data +
    377 					 sizeof(format2.fmt.vbi),
    378 					 sizeof(format.fmt.raw_data) -
    379 					 sizeof(format.fmt.vbi)), 0);
    380 			break;
    381 
    382 		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
    383 		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
    384 			dprintf("\tformat = {.type=0x%X, "
    385 				".fmt.sliced = { .service_set = 0x%X, "
    386 				".service_lines = { ... }, "
    387 				".io_size = %u, "
    388 				".reserved[0] = 0x%X, "
    389 				".reserved[1] = 0x%X "
    390 				"} }\n",
    391 				format.type, format.fmt.sliced.service_set,
    392 				//format.fmt.sliced.service_lines[][],
    393 				format.fmt.sliced.io_size,
    394 				format.fmt.sliced.reserved[0],
    395 				format.fmt.sliced.reserved[1]
    396 			    );
    397 			if (sizeof(format.fmt.sliced) <
    398 			    sizeof(format.fmt.raw_data)) {
    399 				dprintf1
    400 				    ("\tformat = { ..., .fmt.raw_data[] = { ...");
    401 				for (j = sizeof(format.fmt.sliced);
    402 				     j < sizeof(format.fmt.raw_data); j++) {
    403 					dprintf(", 0x%x",
    404 						format.fmt.raw_data[j]);
    405 				}
    406 				dprintf1(" }}\n");
    407 			}
    408 
    409 			/* TODO: check different fields */
    410 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_set, ???);
    411 			CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][0],
    412 					0);
    413 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][1], ???);
    414 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][2], ???);
    415 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][3], ???);
    416 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][4], ???);
    417 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][5], ???);
    418 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][6], ???);
    419 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][7], ???);
    420 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][8], ???);
    421 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][9], ???);
    422 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][10], ???);
    423 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][11], ???);
    424 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][12], ???);
    425 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][13], ???);
    426 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][14], ???);
    427 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][15], ???);
    428 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][16], ???);
    429 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][17], ???);
    430 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][18], ???);
    431 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][19], ???);
    432 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][20], ???);
    433 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][21], ???);
    434 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][22], ???);
    435 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[0][23], ???);
    436 			CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][0],
    437 					0);
    438 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][1], ???);
    439 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][2], ???);
    440 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][3], ???);
    441 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][4], ???);
    442 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][5], ???);
    443 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][6], ???);
    444 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][7], ???);
    445 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][8], ???);
    446 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][9], ???);
    447 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][10], ???);
    448 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][11], ???);
    449 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][12], ???);
    450 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][13], ???);
    451 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][14], ???);
    452 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][15], ???);
    453 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][16], ???);
    454 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][17], ???);
    455 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][18], ???);
    456 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][19], ???);
    457 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][20], ???);
    458 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][21], ???);
    459 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][22], ???);
    460 			//CU_ASSERT_EQUAL(format.fmt.sliced.service_lines[1][23], ???);
    461 			//CU_ASSERT_EQUAL(format.fmt.sliced.io_size, ???);
    462 			CU_ASSERT_EQUAL(format.fmt.sliced.reserved[0], 0);
    463 			CU_ASSERT_EQUAL(format.fmt.sliced.reserved[1], 0);
    464 
    465 			/* Check whether the remaining bytes of raw_data is set to zero */
    466 			memset(&format2, 0, sizeof(format2));
    467 			CU_ASSERT_EQUAL(memcmp
    468 					(format.fmt.raw_data +
    469 					 sizeof(format.fmt.sliced),
    470 					 format2.fmt.raw_data +
    471 					 sizeof(format2.fmt.sliced),
    472 					 sizeof(format.fmt.raw_data) -
    473 					 sizeof(format.fmt.sliced)), 0);
    474 			break;
    475 
    476 		case V4L2_BUF_TYPE_PRIVATE:
    477 			dprintf("\tformat = {.type=0x%X, ... }\n", format.type);
    478 			/* TODO: check different fields */
    479 		}
    480 
    481 	} else {
    482 		CU_ASSERT_EQUAL(ret_get, -1);
    483 		CU_ASSERT_EQUAL(errno_get, EINVAL);
    484 
    485 		memset(&format2, 0xff, sizeof(format2));
    486 		format2.type = type;
    487 		CU_ASSERT_EQUAL(memcmp(&format, &format2, sizeof(format)), 0);
    488 
    489 	}
    490 
    491 }
    492 
    493 void test_VIDIOC_G_FMT()
    494 {
    495 	do_get_formats(V4L2_BUF_TYPE_VIDEO_CAPTURE);
    496 	do_get_formats(V4L2_BUF_TYPE_VIDEO_OUTPUT);
    497 	do_get_formats(V4L2_BUF_TYPE_VIDEO_OVERLAY);
    498 	do_get_formats(V4L2_BUF_TYPE_VBI_CAPTURE);
    499 	do_get_formats(V4L2_BUF_TYPE_VBI_OUTPUT);
    500 	do_get_formats(V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
    501 	do_get_formats(V4L2_BUF_TYPE_SLICED_VBI_OUTPUT);
    502 	do_get_formats(V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
    503 	do_get_formats(V4L2_BUF_TYPE_PRIVATE);
    504 }
    505 
    506 static void do_get_format_invalid(enum v4l2_buf_type type)
    507 {
    508 	int ret_get, errno_get;
    509 	struct v4l2_format format;
    510 	struct v4l2_format format2;
    511 
    512 	memset(&format, 0xff, sizeof(format));
    513 	format.type = type;
    514 	ret_get = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    515 	errno_get = errno;
    516 
    517 	dprintf("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_get=%i, errno_get=%i\n",
    518 		__FILE__, __LINE__, type, ret_get, errno_get);
    519 
    520 	CU_ASSERT_EQUAL(ret_get, -1);
    521 	CU_ASSERT_EQUAL(errno_get, EINVAL);
    522 
    523 	/* Check whether the original format struct is untouched */
    524 	memset(&format2, 0xff, sizeof(format2));
    525 	format2.type = type;
    526 	CU_ASSERT_EQUAL(memcmp(&format, &format2, sizeof(format)), 0);
    527 }
    528 
    529 void test_VIDIOC_G_FMT_invalid_type()
    530 {
    531 	int i;
    532 
    533 	/* In this test case the .index is valid (0) and only the .type
    534 	 * is invalid. The .type filed is an enum which is stored in an 'int'.
    535 	 */
    536 
    537 	/* test invalid .type=0 */
    538 	do_get_format_invalid(0);
    539 
    540 	/* test invalid .type=SINT_MIN */
    541 	do_get_format_invalid(SINT_MIN);
    542 
    543 	/* test invalid .type=-1 */
    544 	do_get_format_invalid(-1);
    545 
    546 	/* test invalid .type= 8..0x7F */
    547 	for (i = V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY + 1;
    548 	     i < V4L2_BUF_TYPE_PRIVATE; i++) {
    549 		do_get_format_invalid(i);
    550 	}
    551 
    552 	/* .type = 0x80..0x7FFF FFFF is the private range */
    553 
    554 	/* Assume that 0x7FFF FFFF is invalid in the private range.
    555 	 * This might be a wrong assumption, but let's have a test case like
    556 	 * this for now.
    557 	 */
    558 	do_get_format_invalid(SINT_MAX);
    559 
    560 }
    561 
    562 void test_VIDIOC_G_FMT_NULL()
    563 {
    564 	int ret_capture, errno_capture;
    565 	int ret_output, errno_output;
    566 	int ret_video_overlay, errno_video_overlay;
    567 	int ret_vbi_capture, errno_vbi_capture;
    568 	int ret_vbi_output, errno_vbi_output;
    569 	int ret_sliced_vbi_capture, errno_sliced_vbi_capture;
    570 	int ret_sliced_vbi_output, errno_sliced_vbi_output;
    571 	int ret_video_output_overlay, errno_video_output_overlay;
    572 	int ret_private, errno_private;
    573 	int ret_null, errno_null;
    574 	struct v4l2_format format;
    575 	enum v4l2_buf_type type;
    576 
    577 	type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    578 	memset(&format, 0xff, sizeof(format));
    579 	format.type = type;
    580 	ret_capture = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    581 	errno_capture = errno;
    582 
    583 	dprintf
    584 	    ("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_capture=%i, errno_capture=%i\n",
    585 	     __FILE__, __LINE__, type, ret_capture, errno_capture);
    586 
    587 	type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
    588 	memset(&format, 0xff, sizeof(format));
    589 	format.type = type;
    590 	ret_output = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    591 	errno_output = errno;
    592 
    593 	dprintf
    594 	    ("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_output=%i, errno_output=%i\n",
    595 	     __FILE__, __LINE__, type, ret_output, errno_output);
    596 
    597 	type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
    598 	memset(&format, 0xff, sizeof(format));
    599 	format.type = type;
    600 	ret_video_overlay = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    601 	errno_video_overlay = errno;
    602 
    603 	dprintf
    604 	    ("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_video_overlay=%i, errno_video_overlay=%i\n",
    605 	     __FILE__, __LINE__, type, ret_video_overlay, errno_video_overlay);
    606 
    607 	type = V4L2_BUF_TYPE_VBI_CAPTURE;
    608 	memset(&format, 0xff, sizeof(format));
    609 	format.type = type;
    610 	ret_vbi_capture = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    611 	errno_vbi_capture = errno;
    612 
    613 	dprintf
    614 	    ("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_vbi_capture=%i, errno_vbi_capture=%i\n",
    615 	     __FILE__, __LINE__, type, ret_vbi_capture, errno_vbi_capture);
    616 
    617 	type = V4L2_BUF_TYPE_VBI_OUTPUT;
    618 	memset(&format, 0xff, sizeof(format));
    619 	format.type = type;
    620 	ret_vbi_output = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    621 	errno_vbi_output = errno;
    622 
    623 	dprintf
    624 	    ("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_vbi_output=%i, errno_vbi_output=%i\n",
    625 	     __FILE__, __LINE__, type, ret_vbi_output, errno_vbi_output);
    626 
    627 	type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
    628 	memset(&format, 0xff, sizeof(format));
    629 	format.type = type;
    630 	ret_sliced_vbi_capture = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    631 	errno_sliced_vbi_capture = errno;
    632 
    633 	dprintf
    634 	    ("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_sliced_vbi_capture=%i, errno_sliced_vbi_capture=%i\n",
    635 	     __FILE__, __LINE__, type, ret_sliced_vbi_capture,
    636 	     errno_sliced_vbi_capture);
    637 
    638 	type = V4L2_BUF_TYPE_SLICED_VBI_OUTPUT;
    639 	memset(&format, 0xff, sizeof(format));
    640 	format.type = type;
    641 	ret_sliced_vbi_output = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    642 	errno_sliced_vbi_output = errno;
    643 
    644 	dprintf
    645 	    ("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_sliced_vbi_output=%i, errno_sliced_vbi_output=%i\n",
    646 	     __FILE__, __LINE__, type, ret_sliced_vbi_output,
    647 	     errno_sliced_vbi_output);
    648 
    649 	type = V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY;
    650 	memset(&format, 0xff, sizeof(format));
    651 	format.type = type;
    652 	ret_video_output_overlay = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    653 	errno_video_output_overlay = errno;
    654 
    655 	dprintf
    656 	    ("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_video_output_overlay=%i, errno_video_output_overlay=%i\n",
    657 	     __FILE__, __LINE__, type, ret_video_output_overlay,
    658 	     errno_video_output_overlay);
    659 
    660 	type = V4L2_BUF_TYPE_PRIVATE;
    661 	memset(&format, 0xff, sizeof(format));
    662 	format.type = type;
    663 	ret_private = ioctl(get_video_fd(), VIDIOC_G_FMT, &format);
    664 	errno_private = errno;
    665 
    666 	dprintf
    667 	    ("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_private=%i, errno_private=%i\n",
    668 	     __FILE__, __LINE__, type, ret_private, errno_private);
    669 
    670 	ret_null = ioctl(get_video_fd(), VIDIOC_G_FMT, NULL);
    671 	errno_null = errno;
    672 
    673 	dprintf("\t%s:%u: VIDIOC_G_FMT, ret_null=%i, errno_null=%i\n",
    674 		__FILE__, __LINE__, ret_null, errno_null);
    675 
    676 	if (ret_capture == 0 || ret_output == 0 ||
    677 	    ret_video_overlay == 0 || ret_vbi_capture == 0 ||
    678 	    ret_vbi_output == 0 || ret_sliced_vbi_capture == 0 ||
    679 	    ret_sliced_vbi_output == 0 || ret_video_output_overlay == 0 ||
    680 	    ret_private == 0) {
    681 		CU_ASSERT_EQUAL(ret_null, -1);
    682 		CU_ASSERT_EQUAL(errno_null, EFAULT);
    683 	} else {
    684 		CU_ASSERT_EQUAL(ret_capture, -1);
    685 		CU_ASSERT_EQUAL(errno_null, EINVAL);
    686 		CU_ASSERT_EQUAL(ret_output, -1);
    687 		CU_ASSERT_EQUAL(errno_output, EINVAL);
    688 		CU_ASSERT_EQUAL(ret_video_overlay, -1);
    689 		CU_ASSERT_EQUAL(errno_video_overlay, EINVAL);
    690 		CU_ASSERT_EQUAL(ret_vbi_capture, -1);
    691 		CU_ASSERT_EQUAL(errno_vbi_capture, EINVAL);
    692 		CU_ASSERT_EQUAL(ret_vbi_output, -1);
    693 		CU_ASSERT_EQUAL(errno_vbi_output, EINVAL);
    694 		CU_ASSERT_EQUAL(ret_sliced_vbi_capture, -1);
    695 		CU_ASSERT_EQUAL(errno_sliced_vbi_capture, EINVAL);
    696 		CU_ASSERT_EQUAL(ret_sliced_vbi_output, -1);
    697 		CU_ASSERT_EQUAL(errno_sliced_vbi_output, EINVAL);
    698 		CU_ASSERT_EQUAL(ret_video_output_overlay, -1);
    699 		CU_ASSERT_EQUAL(errno_video_output_overlay, EINVAL);
    700 		CU_ASSERT_EQUAL(ret_private, -1);
    701 		CU_ASSERT_EQUAL(errno_private, EINVAL);
    702 		CU_ASSERT_EQUAL(ret_null, -1);
    703 		CU_ASSERT_EQUAL(errno_null, EINVAL);
    704 	}
    705 
    706 }
    707 
    708 static void do_set_formats_enum(enum v4l2_buf_type type)
    709 {
    710 	int ret_get, errno_get;
    711 	int ret_enum, errno_enum;
    712 	int ret_max, errno_max;
    713 	int ret_min, errno_min;
    714 	int ret_set, errno_set;
    715 	struct v4l2_format format_orig;
    716 	struct v4l2_format format_min;
    717 	struct v4l2_format format_max;
    718 	struct v4l2_format format_set;
    719 	struct v4l2_format format2;
    720 	struct v4l2_fmtdesc fmtdesc;
    721 	__u32 i;
    722 	unsigned int j;
    723 
    724 	memset(&format_orig, 0xff, sizeof(format_orig));
    725 	format_orig.type = type;
    726 
    727 	ret_get = ioctl(get_video_fd(), VIDIOC_G_FMT, &format_orig);
    728 	errno_get = errno;
    729 
    730 	dprintf("\t%s:%u: VIDIOC_G_FMT, type=%i, ret_get=%i, errno_get=%i\n",
    731 		__FILE__, __LINE__, type, ret_get, errno_get);
    732 
    733 	i = 0;
    734 	do {
    735 		memset(&fmtdesc, 0, sizeof(fmtdesc));
    736 		fmtdesc.index = i;
    737 		fmtdesc.type = type;
    738 
    739 		ret_enum = ioctl(get_video_fd(), VIDIOC_ENUM_FMT, &fmtdesc);
    740 		errno_enum = errno;
    741 
    742 		dprintf
    743 		    ("\t%s:%u: VIDIOC_ENUM_FMT, index=%u, type=%i, ret_enum=%i, errno_enum=%i\n",
    744 		     __FILE__, __LINE__, i, type, ret_enum, errno_enum);
    745 
    746 		switch (type) {
    747 		case V4L2_BUF_TYPE_VIDEO_CAPTURE:
    748 		case V4L2_BUF_TYPE_VIDEO_OUTPUT:
    749 			memset(&format_max, 0xff, sizeof(format_max));
    750 			format_max.type = type;
    751 			format_max.fmt.pix.pixelformat = fmtdesc.pixelformat;
    752 			format_max.fmt.pix.field = V4L2_FIELD_ANY;
    753 
    754 			ret_max =
    755 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_max);
    756 			errno_max = errno;
    757 
    758 			dprintf
    759 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_max=%i, errno_max=%i\n",
    760 			     __FILE__, __LINE__, type, ret_max, errno_max);
    761 
    762 			if (ret_max == 0) {
    763 				CU_ASSERT_EQUAL(ret_enum, 0);
    764 
    765 				dprintf
    766 				    ("\tformat_max = {.type=0x%X, .fmt.pix = { "
    767 				     ".width=%u, " ".height=%u, "
    768 				     ".pixelformat=0x%X, " ".field=%i, "
    769 				     ".bytesperline=%i, " ".sizeimage=%u, "
    770 				     ".colorspace=%i, " ".priv=0x%X " "} }\n",
    771 				     format_max.type, format_max.fmt.pix.width,
    772 				     format_max.fmt.pix.height,
    773 				     format_max.fmt.pix.pixelformat,
    774 				     format_max.fmt.pix.field,
    775 				     format_max.fmt.pix.bytesperline,
    776 				     format_max.fmt.pix.sizeimage,
    777 				     format_max.fmt.pix.colorspace,
    778 				     format_max.fmt.pix.priv);
    779 				if (sizeof(format_max.fmt.pix) <
    780 				    sizeof(format_max.fmt.raw_data)) {
    781 					dprintf1
    782 					    ("\tformat_max = { ..., .fmt.raw_data[] = { ...");
    783 					for (j = sizeof(format_max.fmt.pix);
    784 					     j <
    785 					     sizeof(format_max.fmt.raw_data);
    786 					     j++) {
    787 						dprintf(", 0x%x",
    788 							format_max.fmt.
    789 							raw_data[j]);
    790 					}
    791 					dprintf1(" }}\n");
    792 				}
    793 
    794 				CU_ASSERT_EQUAL(ret_max, 0);
    795 				CU_ASSERT(valid_pixelformat
    796 					  (format_max.fmt.pix.pixelformat));
    797 				CU_ASSERT_EQUAL(format_max.fmt.pix.pixelformat,
    798 						fmtdesc.pixelformat);
    799 				CU_ASSERT(0 < format_max.fmt.pix.width);
    800 				CU_ASSERT(0 < format_max.fmt.pix.height);
    801 				CU_ASSERT_NOT_EQUAL(format_max.fmt.pix.field,
    802 						    V4L2_FIELD_ANY);
    803 				CU_ASSERT(0 < format_max.fmt.pix.bytesperline);
    804 				CU_ASSERT(0 < format_max.fmt.pix.sizeimage);
    805 				CU_ASSERT(valid_colorspace
    806 					  (format_max.fmt.pix.colorspace));
    807 				//CU_ASSERT_EQUAL(format_max.fmt.pix.priv, ???);
    808 
    809 				/* Check whether the remaining bytes of rawdata is set to zero */
    810 				memset(&format2, 0, sizeof(format2));
    811 				CU_ASSERT_EQUAL(memcmp
    812 						(format_max.fmt.raw_data +
    813 						 sizeof(format_max.fmt.pix),
    814 						 format2.fmt.raw_data +
    815 						 sizeof(format2.fmt.pix),
    816 						 sizeof(format_max.fmt.
    817 							raw_data) -
    818 						 sizeof(format_max.fmt.pix)),
    819 						0);
    820 
    821 			} else {
    822 				CU_ASSERT_EQUAL(ret_max, -1);
    823 				CU_ASSERT_EQUAL(errno_max, EINVAL);
    824 			}
    825 
    826 			memset(&format_min, 0, sizeof(format_min));
    827 			format_min.type = type;
    828 			format_min.fmt.pix.pixelformat = fmtdesc.pixelformat;
    829 			format_min.fmt.pix.field = V4L2_FIELD_ANY;
    830 
    831 			ret_min =
    832 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_min);
    833 			errno_min = errno;
    834 
    835 			dprintf
    836 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_min=%i, errno_min=%i\n",
    837 			     __FILE__, __LINE__, type, ret_min, errno_min);
    838 
    839 			if (ret_min == 0) {
    840 				CU_ASSERT_EQUAL(ret_enum, 0);
    841 
    842 				dprintf
    843 				    ("\tformat_min = {.type=0x%X, .fmt.pix = { "
    844 				     ".width=%u, " ".height=%u, "
    845 				     ".pixelformat=0x%X, " ".field=%i, "
    846 				     ".bytesperline=%i, " ".sizeimage=%u, "
    847 				     ".colorspace=%i, " ".priv=0x%X " "} }\n",
    848 				     format_min.type, format_min.fmt.pix.width,
    849 				     format_min.fmt.pix.height,
    850 				     format_min.fmt.pix.pixelformat,
    851 				     format_min.fmt.pix.field,
    852 				     format_min.fmt.pix.bytesperline,
    853 				     format_min.fmt.pix.sizeimage,
    854 				     format_min.fmt.pix.colorspace,
    855 				     format_min.fmt.pix.priv);
    856 				if (sizeof(format_min.fmt.pix) <
    857 				    sizeof(format_min.fmt.raw_data)) {
    858 					dprintf1
    859 					    ("\tformat_min = { ..., .fmt.raw_data[] = { ...");
    860 					for (j = sizeof(format_min.fmt.pix);
    861 					     j <
    862 					     sizeof(format_min.fmt.raw_data);
    863 					     j++) {
    864 						dprintf(", 0x%x",
    865 							format_min.fmt.
    866 							raw_data[j]);
    867 					}
    868 					dprintf1(" }}\n");
    869 				}
    870 
    871 				CU_ASSERT_EQUAL(ret_min, 0);
    872 				CU_ASSERT(valid_pixelformat
    873 					  (format_min.fmt.pix.pixelformat));
    874 				CU_ASSERT_EQUAL(format_min.fmt.pix.pixelformat,
    875 						fmtdesc.pixelformat);
    876 				CU_ASSERT(0 < format_min.fmt.pix.width);
    877 				CU_ASSERT(0 < format_min.fmt.pix.height);
    878 				CU_ASSERT_NOT_EQUAL(format_min.fmt.pix.field,
    879 						    V4L2_FIELD_ANY);
    880 				CU_ASSERT(0 < format_min.fmt.pix.bytesperline);
    881 				CU_ASSERT(0 < format_min.fmt.pix.sizeimage);
    882 				CU_ASSERT(valid_colorspace
    883 					  (format_min.fmt.pix.colorspace));
    884 				//CU_ASSERT_EQUAL(format_min.fmt.pix.priv, ???);
    885 
    886 				/* Check whether the remaining bytes of rawdata is set to zero */
    887 				memset(&format2, 0, sizeof(format2));
    888 				CU_ASSERT_EQUAL(memcmp
    889 						(format_min.fmt.raw_data +
    890 						 sizeof(format_min.fmt.pix),
    891 						 format2.fmt.raw_data +
    892 						 sizeof(format2.fmt.pix),
    893 						 sizeof(format_min.fmt.
    894 							raw_data) -
    895 						 sizeof(format_min.fmt.pix)),
    896 						0);
    897 			} else {
    898 				CU_ASSERT_EQUAL(ret_min, -1);
    899 				CU_ASSERT_EQUAL(errno_min, EINVAL);
    900 			}
    901 
    902 			if (ret_max == 0 && ret_min == 0) {
    903 				CU_ASSERT(format_min.fmt.pix.width <=
    904 					  format_max.fmt.pix.width);
    905 				CU_ASSERT(format_min.fmt.pix.height <=
    906 					  format_max.fmt.pix.height);
    907 				CU_ASSERT_EQUAL(format_min.fmt.pix.colorspace,
    908 						format_max.fmt.pix.colorspace);
    909 
    910 				/* If priv equals zero then this field is not used and shall
    911 				 * be set to zero each case. Otherwise it can have any driver
    912 				 * specific value which cannot be checked here.
    913 				 */
    914 				if (format_min.fmt.pix.priv == 0) {
    915 					CU_ASSERT_EQUAL(format_min.fmt.pix.priv,
    916 							0);
    917 					CU_ASSERT_EQUAL(format_max.fmt.pix.priv,
    918 							0);
    919 				}
    920 			}
    921 
    922 			if (ret_max == -1 && ret_min == -1) {
    923 				CU_ASSERT_EQUAL(ret_enum, -1);
    924 				CU_ASSERT_EQUAL(errno_enum, EINVAL);
    925 			}
    926 
    927 			break;
    928 
    929 		case V4L2_BUF_TYPE_VIDEO_OVERLAY:
    930 		case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
    931 			memset(&format_max, 0xff, sizeof(format_max));
    932 			format_max.type = type;
    933 
    934 			ret_max =
    935 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_max);
    936 			errno_max = errno;
    937 
    938 			dprintf
    939 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_max=%i, errno_max=%i\n",
    940 			     __FILE__, __LINE__, type, ret_max, errno_max);
    941 
    942 			if (ret_max == 0) {
    943 				CU_ASSERT_EQUAL(ret_enum, 0);
    944 
    945 				dprintf
    946 				    ("\tformat_max = {.type=0x%X, .fmt.win={ "
    947 				     ".w = { .left=%i, .top=%i, .width=%i, .height=%i, }, "
    948 				     ".field = %i, " ".chromakey = 0x%X, "
    949 				     ".clips = %p, " ".clipcount = %u, "
    950 				     ".bitmap = %p, " ".global_alpha = %u "
    951 				     "} }\n", format_max.type,
    952 				     format_max.fmt.win.w.left,
    953 				     format_max.fmt.win.w.top,
    954 				     format_max.fmt.win.w.width,
    955 				     format_max.fmt.win.w.height,
    956 				     format_max.fmt.win.field,
    957 				     format_max.fmt.win.chromakey,
    958 				     format_max.fmt.win.clips,
    959 				     format_max.fmt.win.clipcount,
    960 				     format_max.fmt.win.bitmap,
    961 				     format_max.fmt.win.global_alpha);
    962 				if (sizeof(format_max.fmt.win) <
    963 				    sizeof(format_max.fmt.raw_data)) {
    964 					dprintf1
    965 					    ("\tformat_max = { ..., .fmt.raw_data[] = { ...");
    966 					for (j = sizeof(format_max.fmt.win);
    967 					     j <
    968 					     sizeof(format_max.fmt.raw_data);
    969 					     j++) {
    970 						dprintf(", 0x%x",
    971 							format_max.fmt.
    972 							raw_data[j]);
    973 					}
    974 					dprintf1(" }}\n");
    975 				}
    976 
    977 				/* TODO: check the different fields */
    978 				//CU_ASSERT_EQUAL(format.fmt.win.w.left, ???);
    979 				//CU_ASSERT_EQUAL(format.fmt.win.w.top, ???);
    980 				//CU_ASSERT_EQUAL(format.fmt.win.w.width, ???);
    981 				//CU_ASSERT_EQUAL(format.fmt.win.w.height, ???);
    982 				//CU_ASSERT_EQUAL(format.fmt.win.field, ???);
    983 				//CU_ASSERT_EQUAL(format.fmt.win.chromakey, ???);
    984 				//CU_ASSERT_EQUAL(format.fmt.win.clips, ???);
    985 				//CU_ASSERT_EQUAL(format.fmt.win.clipcount, ???);
    986 				//CU_ASSERT_EQUAL(format.fmt.win.bitmap, ???);
    987 				//CU_ASSERT_EQUAL(format.fmt.win.global_alpha ???);
    988 			} else {
    989 				CU_ASSERT_EQUAL(ret_max, -1);
    990 				CU_ASSERT_EQUAL(errno_max, EINVAL);
    991 			}
    992 
    993 			memset(&format_min, 0, sizeof(format_min));
    994 			format_min.type = type;
    995 			format_min.fmt.pix.pixelformat = fmtdesc.pixelformat;
    996 
    997 			ret_min =
    998 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_min);
    999 			errno_min = errno;
   1000 
   1001 			dprintf
   1002 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_min=%i, errno_min=%i\n",
   1003 			     __FILE__, __LINE__, type, ret_min, errno_min);
   1004 
   1005 			if (ret_min == 0) {
   1006 				CU_ASSERT_EQUAL(ret_enum, 0);
   1007 				dprintf
   1008 				    ("\tformat_min = {.type=0x%X, .fmt.win={ "
   1009 				     ".w = { .left=%i, .top=%i, .width=%i, .height=%i, }, "
   1010 				     ".field = %i, " ".chromakey = 0x%X, "
   1011 				     ".clips = %p, " ".clipcount = %u, "
   1012 				     ".bitmap = %p, " ".global_alpha = %u "
   1013 				     "} }\n", format_min.type,
   1014 				     format_min.fmt.win.w.left,
   1015 				     format_min.fmt.win.w.top,
   1016 				     format_min.fmt.win.w.width,
   1017 				     format_min.fmt.win.w.height,
   1018 				     format_min.fmt.win.field,
   1019 				     format_min.fmt.win.chromakey,
   1020 				     format_min.fmt.win.clips,
   1021 				     format_min.fmt.win.clipcount,
   1022 				     format_min.fmt.win.bitmap,
   1023 				     format_min.fmt.win.global_alpha);
   1024 				if (sizeof(format_min.fmt.win) <
   1025 				    sizeof(format_min.fmt.raw_data)) {
   1026 					dprintf1
   1027 					    ("\tformat_min = { ..., .fmt.raw_data[] = { ...");
   1028 					for (j = sizeof(format_min.fmt.win);
   1029 					     j <
   1030 					     sizeof(format_min.fmt.raw_data);
   1031 					     j++) {
   1032 						dprintf(", 0x%x",
   1033 							format_min.fmt.
   1034 							raw_data[j]);
   1035 					}
   1036 					dprintf1(" }}\n");
   1037 				}
   1038 
   1039 				/* TODO: check the different fields */
   1040 				//CU_ASSERT_EQUAL(format.fmt.win.w.left, ???);
   1041 				//CU_ASSERT_EQUAL(format.fmt.win.w.top, ???);
   1042 				//CU_ASSERT_EQUAL(format.fmt.win.w.width, ???);
   1043 				//CU_ASSERT_EQUAL(format.fmt.win.w.height, ???);
   1044 				//CU_ASSERT_EQUAL(format.fmt.win.field, ???);
   1045 				//CU_ASSERT_EQUAL(format.fmt.win.chromakey, ???);
   1046 				//CU_ASSERT_EQUAL(format.fmt.win.clips, ???);
   1047 				//CU_ASSERT_EQUAL(format.fmt.win.clipcount, ???);
   1048 				//CU_ASSERT_EQUAL(format.fmt.win.bitmap, ???);
   1049 				//CU_ASSERT_EQUAL(format.fmt.win.global_alpha ???);
   1050 
   1051 			} else {
   1052 				CU_ASSERT_EQUAL(ret_min, -1);
   1053 				CU_ASSERT_EQUAL(errno_min, EINVAL);
   1054 			}
   1055 
   1056 			if (ret_max == -1 && ret_min == -1) {
   1057 				CU_ASSERT_EQUAL(ret_enum, -1);
   1058 				CU_ASSERT_EQUAL(errno_enum, EINVAL);
   1059 			}
   1060 			break;
   1061 
   1062 		case V4L2_BUF_TYPE_VBI_CAPTURE:
   1063 		case V4L2_BUF_TYPE_VBI_OUTPUT:
   1064 			memset(&format_max, 0xff, sizeof(format_max));
   1065 			format_max.type = type;
   1066 
   1067 			ret_max =
   1068 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_max);
   1069 			errno_max = errno;
   1070 
   1071 			dprintf
   1072 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_max=%i, errno_max=%i\n",
   1073 			     __FILE__, __LINE__, type, ret_max, errno_max);
   1074 
   1075 			if (ret_max == 0) {
   1076 				CU_ASSERT_EQUAL(ret_enum, 0);
   1077 				dprintf
   1078 				    ("\tformat_max = {.type=0x%X, .fmt.vbi={ "
   1079 				     ".sampling_rate=%u, " ".offset=%u, "
   1080 				     ".samples_per_line=%u "
   1081 				     ".sample_format=0x%X "
   1082 				     ".start = { %u, %u }, "
   1083 				     ".count = { %u, %u }, " ".flags = 0x%X, "
   1084 				     ".reserved = { 0x%X, 0x%X } " "} }\n",
   1085 				     format_max.type,
   1086 				     format_max.fmt.vbi.sampling_rate,
   1087 				     format_max.fmt.vbi.offset,
   1088 				     format_max.fmt.vbi.samples_per_line,
   1089 				     format_max.fmt.vbi.sample_format,
   1090 				     format_max.fmt.vbi.start[0],
   1091 				     format_max.fmt.vbi.start[1],
   1092 				     format_max.fmt.vbi.count[0],
   1093 				     format_max.fmt.vbi.count[1],
   1094 				     format_max.fmt.vbi.flags,
   1095 				     format_max.fmt.vbi.reserved[0],
   1096 				     format_max.fmt.vbi.reserved[1]
   1097 				    );
   1098 				if (sizeof(format_max.fmt.vbi) <
   1099 				    sizeof(format_max.fmt.raw_data)) {
   1100 					dprintf1
   1101 					    ("\tformat_max = { ..., .fmt.raw_data[] = { ...");
   1102 					for (j = sizeof(format_max.fmt.vbi);
   1103 					     j <
   1104 					     sizeof(format_max.fmt.raw_data);
   1105 					     j++) {
   1106 						dprintf(", 0x%x",
   1107 							format_max.fmt.
   1108 							raw_data[j]);
   1109 					}
   1110 					dprintf1(" }}\n");
   1111 				}
   1112 
   1113 				/* TODO: check the different fields */
   1114 				//CU_ASSERT_EQUAL(format_max.fmt.vbi.sampling_rate, ???);
   1115 				//CU_ASSERT_EQUAL(format_max.fmt.vbi.offset, ???);
   1116 				//CU_ASSERT_EQUAL(format_max.fmt.vbi.samples_per_line, ???);
   1117 				//CU_ASSERT_EQUAL(format_max.fmt.vbi.sample_format, ???);
   1118 				//CU_ASSERT_EQUAL(format_max.fmt.vbi.start[0], ???);
   1119 				//CU_ASSERT_EQUAL(format_max.fmt.vbi.start[1], ???);
   1120 				//CU_ASSERT_EQUAL(format_max.fmt.vbi.count[0], ???);
   1121 				//CU_ASSERT_EQUAL(format_max.fmt.vbi.count[1], ???);
   1122 				//CU_ASSERT_EQUAL(format_max.fmt.vbi.flags, ???);
   1123 				CU_ASSERT_EQUAL(format_max.fmt.vbi.reserved[0],
   1124 						0);
   1125 				CU_ASSERT_EQUAL(format_max.fmt.vbi.reserved[1],
   1126 						0);
   1127 
   1128 			} else {
   1129 				CU_ASSERT_EQUAL(ret_max, -1);
   1130 				CU_ASSERT_EQUAL(errno_max, EINVAL);
   1131 			}
   1132 
   1133 			memset(&format_min, 0, sizeof(format_min));
   1134 			format_min.type = type;
   1135 			format_min.fmt.pix.pixelformat = fmtdesc.pixelformat;
   1136 
   1137 			ret_min =
   1138 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_min);
   1139 			errno_min = errno;
   1140 
   1141 			dprintf
   1142 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_min=%i, errno_min=%i\n",
   1143 			     __FILE__, __LINE__, type, ret_min, errno_min);
   1144 
   1145 			if (ret_min == 0) {
   1146 				CU_ASSERT_EQUAL(ret_enum, 0);
   1147 				dprintf
   1148 				    ("\tformat_min = {.type=0x%X, .fmt.vbi={ "
   1149 				     ".sampling_rate=%u, " ".offset=%u, "
   1150 				     ".samples_per_line=%u "
   1151 				     ".sample_format=0x%X "
   1152 				     ".start = { %u, %u }, "
   1153 				     ".count = { %u, %u }, " ".flags = 0x%X, "
   1154 				     ".reserved = { 0x%X, 0x%X } " "} }\n",
   1155 				     format_min.type,
   1156 				     format_min.fmt.vbi.sampling_rate,
   1157 				     format_min.fmt.vbi.offset,
   1158 				     format_min.fmt.vbi.samples_per_line,
   1159 				     format_min.fmt.vbi.sample_format,
   1160 				     format_min.fmt.vbi.start[0],
   1161 				     format_min.fmt.vbi.start[1],
   1162 				     format_min.fmt.vbi.count[0],
   1163 				     format_min.fmt.vbi.count[1],
   1164 				     format_min.fmt.vbi.flags,
   1165 				     format_min.fmt.vbi.reserved[0],
   1166 				     format_min.fmt.vbi.reserved[1]
   1167 				    );
   1168 				if (sizeof(format_min.fmt.vbi) <
   1169 				    sizeof(format_min.fmt.raw_data)) {
   1170 					dprintf1
   1171 					    ("\tformat_min = { ..., .fmt.raw_data[] = { ...");
   1172 					for (j = sizeof(format_min.fmt.vbi);
   1173 					     j <
   1174 					     sizeof(format_min.fmt.raw_data);
   1175 					     j++) {
   1176 						dprintf(", 0x%x",
   1177 							format_min.fmt.
   1178 							raw_data[j]);
   1179 					}
   1180 					dprintf1(" }}\n");
   1181 				}
   1182 
   1183 				/* TODO: check the different fields */
   1184 				//CU_ASSERT_EQUAL(format_min.fmt.vbi.sampling_rate, ???);
   1185 				//CU_ASSERT_EQUAL(format_min.fmt.vbi.offset, ???);
   1186 				//CU_ASSERT_EQUAL(format_min.fmt.vbi.samples_per_line, ???);
   1187 				//CU_ASSERT_EQUAL(format_min.fmt.vbi.sample_format, ???);
   1188 				//CU_ASSERT_EQUAL(format_min.fmt.vbi.start[0], ???);
   1189 				//CU_ASSERT_EQUAL(format_min.fmt.vbi.start[1], ???);
   1190 				//CU_ASSERT_EQUAL(format_min.fmt.vbi.count[0], ???);
   1191 				//CU_ASSERT_EQUAL(format_min.fmt.vbi.count[1], ???);
   1192 				//CU_ASSERT_EQUAL(format_min.fmt.vbi.flags, ???);
   1193 				CU_ASSERT_EQUAL(format_min.fmt.vbi.reserved[0],
   1194 						0);
   1195 				CU_ASSERT_EQUAL(format_min.fmt.vbi.reserved[1],
   1196 						0);
   1197 			} else {
   1198 				CU_ASSERT_EQUAL(ret_min, -1);
   1199 				CU_ASSERT_EQUAL(errno_min, EINVAL);
   1200 			}
   1201 
   1202 			if (ret_max == -1 && ret_min == -1) {
   1203 				CU_ASSERT_EQUAL(ret_enum, -1);
   1204 				CU_ASSERT_EQUAL(errno_enum, EINVAL);
   1205 			}
   1206 			break;
   1207 
   1208 		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
   1209 		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
   1210 			memset(&format_max, 0xff, sizeof(format_max));
   1211 			format_max.type = type;
   1212 
   1213 			ret_max =
   1214 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_max);
   1215 			errno_max = errno;
   1216 
   1217 			dprintf
   1218 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_max=%i, errno_max=%i\n",
   1219 			     __FILE__, __LINE__, type, ret_max, errno_max);
   1220 
   1221 			if (ret_max == 0) {
   1222 				CU_ASSERT_EQUAL(ret_enum, 0);
   1223 				dprintf("\tformat_max = {.type=0x%X, "
   1224 					".fmt.sliced = { .service_set = 0x%X, "
   1225 					".service_lines = { ... }, "
   1226 					".io_size = %u, "
   1227 					".reserved[0] = 0x%X, "
   1228 					".reserved[1] = 0x%X "
   1229 					"} }\n",
   1230 					format_max.type,
   1231 					format_max.fmt.sliced.service_set,
   1232 					//format_max.fmt.sliced.service_lines[][],
   1233 					format_max.fmt.sliced.io_size,
   1234 					format_max.fmt.sliced.reserved[0],
   1235 					format_max.fmt.sliced.reserved[1]
   1236 				    );
   1237 				if (sizeof(format_max.fmt.sliced) <
   1238 				    sizeof(format_max.fmt.raw_data)) {
   1239 					dprintf1
   1240 					    ("\tformat_max = { ..., .fmt.raw_data[] = { ...");
   1241 					for (j = sizeof(format_max.fmt.sliced);
   1242 					     j <
   1243 					     sizeof(format_max.fmt.raw_data);
   1244 					     j++) {
   1245 						dprintf(", 0x%x",
   1246 							format_max.fmt.
   1247 							raw_data[j]);
   1248 					}
   1249 					dprintf1(" }}\n");
   1250 				}
   1251 
   1252 				/* TODO: check the different fields */
   1253 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_set, ???);
   1254 				CU_ASSERT_EQUAL(format_max.fmt.sliced.
   1255 						service_lines[0][0], 0);
   1256 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][1], ???);
   1257 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][2], ???);
   1258 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][3], ???);
   1259 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][4], ???);
   1260 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][5], ???);
   1261 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][6], ???);
   1262 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][7], ???);
   1263 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][8], ???);
   1264 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][9], ???);
   1265 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][10], ???);
   1266 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][11], ???);
   1267 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][12], ???);
   1268 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][13], ???);
   1269 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][14], ???);
   1270 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][15], ???);
   1271 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][16], ???);
   1272 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][17], ???);
   1273 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][18], ???);
   1274 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][19], ???);
   1275 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][20], ???);
   1276 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][21], ???);
   1277 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][22], ???);
   1278 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[0][23], ???);
   1279 				CU_ASSERT_EQUAL(format_max.fmt.sliced.
   1280 						service_lines[1][0], 0);
   1281 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][1], ???);
   1282 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][2], ???);
   1283 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][3], ???);
   1284 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][4], ???);
   1285 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][5], ???);
   1286 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][6], ???);
   1287 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][7], ???);
   1288 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][8], ???);
   1289 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][9], ???);
   1290 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][10], ???);
   1291 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][11], ???);
   1292 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][12], ???);
   1293 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][13], ???);
   1294 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][14], ???);
   1295 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][15], ???);
   1296 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][16], ???);
   1297 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][17], ???);
   1298 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][18], ???);
   1299 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][19], ???);
   1300 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][20], ???);
   1301 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][21], ???);
   1302 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][22], ???);
   1303 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.service_lines[1][23], ???);
   1304 				//CU_ASSERT_EQUAL(format_max.fmt.sliced.io_size, ???);
   1305 				CU_ASSERT_EQUAL(format_max.fmt.sliced.
   1306 						reserved[0], 0);
   1307 				CU_ASSERT_EQUAL(format_max.fmt.sliced.
   1308 						reserved[1], 0);
   1309 
   1310 			} else {
   1311 				CU_ASSERT_EQUAL(ret_max, -1);
   1312 				CU_ASSERT_EQUAL(errno_max, EINVAL);
   1313 			}
   1314 
   1315 			memset(&format_min, 0, sizeof(format_min));
   1316 			format_min.type = type;
   1317 			format_min.fmt.pix.pixelformat = fmtdesc.pixelformat;
   1318 
   1319 			ret_min =
   1320 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_min);
   1321 			errno_min = errno;
   1322 
   1323 			dprintf
   1324 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_min=%i, errno_min=%i\n",
   1325 			     __FILE__, __LINE__, type, ret_min, errno_min);
   1326 
   1327 			if (ret_min == 0) {
   1328 				CU_ASSERT_EQUAL(ret_enum, 0);
   1329 				dprintf("\tformat_min = {.type=0x%X, "
   1330 					".fmt.sliced = { .service_set = 0x%X, "
   1331 					".service_lines = { ... }, "
   1332 					".io_size = %u, "
   1333 					".reserved[0] = 0x%X, "
   1334 					".reserved[1] = 0x%X "
   1335 					"} }\n",
   1336 					format_min.type,
   1337 					format_min.fmt.sliced.service_set,
   1338 					//format_min.fmt.sliced.service_lines[][],
   1339 					format_min.fmt.sliced.io_size,
   1340 					format_min.fmt.sliced.reserved[0],
   1341 					format_min.fmt.sliced.reserved[1]
   1342 				    );
   1343 				if (sizeof(format_min.fmt.sliced) <
   1344 				    sizeof(format_min.fmt.raw_data)) {
   1345 					dprintf1
   1346 					    ("\tformat_min = { ..., .fmt.raw_data[] = { ...");
   1347 					for (j = sizeof(format_min.fmt.sliced);
   1348 					     j <
   1349 					     sizeof(format_min.fmt.raw_data);
   1350 					     j++) {
   1351 						dprintf(", 0x%x",
   1352 							format_min.fmt.
   1353 							raw_data[j]);
   1354 					}
   1355 					dprintf1(" }}\n");
   1356 				}
   1357 
   1358 				/* TODO: check the different fields */
   1359 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_set, ???);
   1360 				CU_ASSERT_EQUAL(format_min.fmt.sliced.
   1361 						service_lines[0][0], 0);
   1362 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][1], ???);
   1363 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][2], ???);
   1364 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][3], ???);
   1365 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][4], ???);
   1366 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][5], ???);
   1367 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][6], ???);
   1368 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][7], ???);
   1369 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][8], ???);
   1370 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][9], ???);
   1371 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][10], ???);
   1372 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][11], ???);
   1373 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][12], ???);
   1374 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][13], ???);
   1375 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][14], ???);
   1376 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][15], ???);
   1377 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][16], ???);
   1378 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][17], ???);
   1379 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][18], ???);
   1380 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][19], ???);
   1381 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][20], ???);
   1382 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][21], ???);
   1383 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][22], ???);
   1384 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[0][23], ???);
   1385 				CU_ASSERT_EQUAL(format_min.fmt.sliced.
   1386 						service_lines[1][0], 0);
   1387 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][1], ???);
   1388 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][2], ???);
   1389 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][3], ???);
   1390 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][4], ???);
   1391 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][5], ???);
   1392 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][6], ???);
   1393 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][7], ???);
   1394 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][8], ???);
   1395 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][9], ???);
   1396 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][10], ???);
   1397 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][11], ???);
   1398 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][12], ???);
   1399 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][13], ???);
   1400 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][14], ???);
   1401 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][15], ???);
   1402 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][16], ???);
   1403 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][17], ???);
   1404 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][18], ???);
   1405 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][19], ???);
   1406 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][20], ???);
   1407 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][21], ???);
   1408 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][22], ???);
   1409 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.service_lines[1][23], ???);
   1410 				//CU_ASSERT_EQUAL(format_min.fmt.sliced.io_size, ???);
   1411 				CU_ASSERT_EQUAL(format_min.fmt.sliced.
   1412 						reserved[0], 0);
   1413 				CU_ASSERT_EQUAL(format_min.fmt.sliced.
   1414 						reserved[1], 0);
   1415 
   1416 			} else {
   1417 				CU_ASSERT_EQUAL(ret_min, -1);
   1418 				CU_ASSERT_EQUAL(errno_min, EINVAL);
   1419 			}
   1420 
   1421 			if (ret_max == -1 && ret_min == -1) {
   1422 				CU_ASSERT_EQUAL(ret_enum, -1);
   1423 				CU_ASSERT_EQUAL(errno_enum, EINVAL);
   1424 			}
   1425 			break;
   1426 
   1427 		case V4L2_BUF_TYPE_PRIVATE:
   1428 			memset(&format_max, 0xff, sizeof(format_max));
   1429 			format_max.type = type;
   1430 
   1431 			ret_max =
   1432 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_max);
   1433 			errno_max = errno;
   1434 
   1435 			dprintf
   1436 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_max=%i, errno_max=%i\n",
   1437 			     __FILE__, __LINE__, type, ret_max, errno_max);
   1438 
   1439 			if (ret_max == 0) {
   1440 				CU_ASSERT_EQUAL(ret_enum, 0);
   1441 				dprintf1
   1442 				    ("\tformat_max = { ..., .fmt.raw_data[] = { ");
   1443 				for (j = 0; j < sizeof(format_max.fmt.raw_data);
   1444 				     j++) {
   1445 					dprintf("0x%x",
   1446 						format_max.fmt.raw_data[j]);
   1447 					if (j < sizeof(format_max.fmt.raw_data)) {
   1448 						dprintf1(", ");
   1449 					}
   1450 				}
   1451 				dprintf1(" }}\n");
   1452 
   1453 				/* TODO: check the different fields */
   1454 
   1455 			} else {
   1456 				CU_ASSERT_EQUAL(ret_max, -1);
   1457 				CU_ASSERT_EQUAL(errno_max, EINVAL);
   1458 			}
   1459 
   1460 			memset(&format_min, 0, sizeof(format_min));
   1461 			format_min.type = type;
   1462 			format_min.fmt.pix.pixelformat = fmtdesc.pixelformat;
   1463 
   1464 			ret_min =
   1465 			    ioctl(get_video_fd(), VIDIOC_S_FMT, &format_min);
   1466 			errno_min = errno;
   1467 
   1468 			dprintf
   1469 			    ("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_min=%i, errno_min=%i\n",
   1470 			     __FILE__, __LINE__, type, ret_min, errno_min);
   1471 
   1472 			if (ret_min == 0) {
   1473 				CU_ASSERT_EQUAL(ret_enum, 0);
   1474 				dprintf1
   1475 				    ("\tformat_min = { ..., .fmt.raw_data[] = { ");
   1476 				for (j = 0; j < sizeof(format_min.fmt.raw_data);
   1477 				     j++) {
   1478 					dprintf("0x%x",
   1479 						format_min.fmt.raw_data[j]);
   1480 					if (j < sizeof(format_min.fmt.raw_data)) {
   1481 						dprintf1(", ");
   1482 					}
   1483 				}
   1484 				dprintf1(" }}\n");
   1485 
   1486 				/* TODO: check the different fields */
   1487 
   1488 			} else {
   1489 				CU_ASSERT_EQUAL(ret_min, -1);
   1490 				CU_ASSERT_EQUAL(errno_min, EINVAL);
   1491 			}
   1492 
   1493 			if (ret_max == -1 && ret_min == -1) {
   1494 				CU_ASSERT_EQUAL(ret_enum, -1);
   1495 				CU_ASSERT_EQUAL(errno_enum, EINVAL);
   1496 			}
   1497 			break;
   1498 		}
   1499 
   1500 		if (ret_enum == 0) {
   1501 			CU_ASSERT_EQUAL(ret_enum, 0);
   1502 		} else {
   1503 			CU_ASSERT_EQUAL(ret_enum, -1);
   1504 			CU_ASSERT_EQUAL(errno_enum, EINVAL);
   1505 		}
   1506 
   1507 		i++;
   1508 	} while (ret_enum == 0 && i != 0);
   1509 
   1510 	memset(&format_set, 0xff, sizeof(format_set));
   1511 	format_set = format_orig;
   1512 
   1513 	ret_set = ioctl(get_video_fd(), VIDIOC_S_FMT, &format_set);
   1514 	errno_set = errno;
   1515 
   1516 	dprintf("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_set=%i, errno_set=%i\n",
   1517 		__FILE__, __LINE__, format_orig.type, ret_set, errno_set);
   1518 
   1519 	if (ret_get == 0) {
   1520 		CU_ASSERT_EQUAL(ret_get, 0);
   1521 		CU_ASSERT_EQUAL(ret_set, 0);
   1522 
   1523 		CU_ASSERT_EQUAL(format_orig.type, type);
   1524 		CU_ASSERT_EQUAL(format_set.type, type);
   1525 	} else {
   1526 		CU_ASSERT_EQUAL(ret_get, -1);
   1527 		CU_ASSERT_EQUAL(errno_get, EINVAL);
   1528 		CU_ASSERT_EQUAL(ret_set, -1);
   1529 		CU_ASSERT_EQUAL(errno_set, EINVAL);
   1530 	}
   1531 
   1532 }
   1533 
   1534 void test_VIDIOC_S_FMT_enum()
   1535 {
   1536 	do_set_formats_enum(V4L2_BUF_TYPE_VIDEO_CAPTURE);
   1537 	do_set_formats_enum(V4L2_BUF_TYPE_VIDEO_OUTPUT);
   1538 	do_set_formats_enum(V4L2_BUF_TYPE_VIDEO_OVERLAY);
   1539 	do_set_formats_enum(V4L2_BUF_TYPE_VBI_CAPTURE);
   1540 	do_set_formats_enum(V4L2_BUF_TYPE_VBI_OUTPUT);
   1541 	do_set_formats_enum(V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
   1542 	do_set_formats_enum(V4L2_BUF_TYPE_SLICED_VBI_OUTPUT);
   1543 	do_set_formats_enum(V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
   1544 	do_set_formats_enum(V4L2_BUF_TYPE_PRIVATE);
   1545 }
   1546 
   1547 static void do_set_formats_type(enum v4l2_buf_type type)
   1548 {
   1549 	int ret_set, errno_set;
   1550 	struct v4l2_format format;
   1551 	struct v4l2_format format2;
   1552 
   1553 	memset(&format, 0, sizeof(format));
   1554 	format.type = type;
   1555 
   1556 	ret_set = ioctl(get_video_fd(), VIDIOC_S_FMT, &format);
   1557 	errno_set = errno;
   1558 
   1559 	dprintf("\t%s:%u: VIDIOC_S_FMT, type=%i, ret_set=%i, errno_set=%i\n",
   1560 		__FILE__, __LINE__, type, ret_set, errno_set);
   1561 
   1562 	CU_ASSERT_EQUAL(ret_set, -1);
   1563 	CU_ASSERT_EQUAL(errno_set, EINVAL);
   1564 
   1565 	/* Check whether the format structure is untouched */
   1566 	memset(&format2, 0, sizeof(format2));
   1567 	format2.type = type;
   1568 	CU_ASSERT_EQUAL(memcmp(&format, &format2, sizeof(format)), 0);
   1569 
   1570 }
   1571 
   1572 void test_VIDIOC_S_FMT_type()
   1573 {
   1574 	do_set_formats_type(0);
   1575 	do_set_formats_type(9);
   1576 	do_set_formats_type(V4L2_BUF_TYPE_PRIVATE - 1);
   1577 	do_set_formats_type(S16_MIN);
   1578 	do_set_formats_type(S16_MAX);
   1579 	do_set_formats_type(S32_MAX);
   1580 }
   1581 
   1582 /* TODO: test cases for VIDIOC_TRY_FMT */
   1583 
   1584 /*
   1585    TODO: test case for VIDIOC_TRY_FMT with invalid type
   1586 
   1587    TODO: test case for VIDIOC_S_FMT with type=V4L2_BUF_TYPE_VIDEO_CAPTURE and
   1588     V4L2_BUF_TYPE_VIDEO_OUTPUT
   1589         - with different field settings
   1590 */
   1591