Home | History | Annotate | Download | only in user_space
      1 /*
      2  * v4l-test: Test environment for Video For Linux Two API
      3  *
      4  * 16 Jun 2009  0.1  First release
      5  *
      6  * Written by Mrton Nmeth <nm127 (at) freemail.hu>
      7  * Released under GPL
      8  */
      9 
     10 #include <stdio.h>
     11 #include <sys/types.h>
     12 #include <sys/stat.h>
     13 #include <fcntl.h>
     14 #include <unistd.h>
     15 #include <sys/ioctl.h>
     16 #include <errno.h>
     17 #include <string.h>
     18 
     19 #include <linux/videodev2.h>
     20 #include <linux/errno.h>
     21 
     22 #include <CUnit/CUnit.h>
     23 
     24 #include "v4l2_test.h"
     25 #include "dev_video.h"
     26 #include "video_limits.h"
     27 #include "v4l2_validator.h"
     28 #include "v4l2_foreach.h"
     29 #include "v4l2_show.h"
     30 
     31 #include "test_VIDIOC_ENUM_FRAMESIZES.h"
     32 
     33 static int valid_framesize_type(__u32 type)
     34 {
     35 	int valid = 0;
     36 
     37 	if ((type == V4L2_FRMSIZE_TYPE_DISCRETE) ||
     38 	    (type == V4L2_FRMSIZE_TYPE_CONTINUOUS) ||
     39 	    (type == V4L2_FRMSIZE_TYPE_STEPWISE)) {
     40 		valid = 1;
     41 	} else {
     42 		valid = 0;
     43 	}
     44 	return valid;
     45 }
     46 
     47 static void do_test_VIDIOC_ENUM_FRAMESIZES(__u32 fmt)
     48 {
     49 	struct v4l2_frmsizeenum framesize;
     50 	int ret_frame, errno_frame;
     51 	__u32 i;
     52 	__u32 first_type;
     53 
     54 	i = 0;
     55 	first_type = 0;
     56 	do {
     57 		memset(&framesize, 0xff, sizeof(framesize));
     58 		framesize.index = i;
     59 		framesize.pixel_format = fmt;
     60 		ret_frame =
     61 		    ioctl(get_video_fd(), VIDIOC_ENUM_FRAMESIZES, &framesize);
     62 		errno_frame = errno;
     63 
     64 		dprintf
     65 		    ("\t%s:%u: VIDIOC_ENUM_FRAMESIZES, index=%u, pixel_format=0x%x, ret_frame=%i, errno_frame=%i\n",
     66 		     __FILE__, __LINE__, i, fmt, ret_frame, errno_frame);
     67 
     68 		if (i != 0 && first_type != V4L2_FRMSIZE_TYPE_DISCRETE) {
     69 			CU_ASSERT_EQUAL(ret_frame, -1);
     70 			CU_ASSERT_EQUAL(errno_frame, EINVAL);
     71 		}
     72 
     73 		if (ret_frame == 0) {
     74 			CU_ASSERT_EQUAL(ret_frame, 0);
     75 			CU_ASSERT_EQUAL(framesize.index, i);
     76 			CU_ASSERT_EQUAL(framesize.pixel_format, fmt);
     77 			CU_ASSERT(valid_framesize_type(framesize.type));
     78 
     79 			if (i == 0) {
     80 				first_type = framesize.type;
     81 			} else {
     82 				CU_ASSERT_EQUAL(framesize.type, first_type);
     83 			}
     84 
     85 			switch (framesize.type) {
     86 			case V4L2_FRMSIZE_TYPE_DISCRETE:
     87 				CU_ASSERT(0 < framesize.discrete.width);
     88 				CU_ASSERT(0 < framesize.discrete.height);
     89 				break;
     90 
     91 			case V4L2_FRMSIZE_TYPE_CONTINUOUS:
     92 				CU_ASSERT(0 < framesize.stepwise.min_width);
     93 				CU_ASSERT(0 < framesize.stepwise.max_width);
     94 				CU_ASSERT_EQUAL(framesize.stepwise.step_width,
     95 						1);
     96 
     97 				CU_ASSERT(framesize.stepwise.min_width <
     98 					  framesize.stepwise.max_width);
     99 
    100 				CU_ASSERT(0 < framesize.stepwise.min_height);
    101 				CU_ASSERT(0 < framesize.stepwise.max_height);
    102 				CU_ASSERT_EQUAL(framesize.stepwise.step_height,
    103 						1);
    104 
    105 				CU_ASSERT(framesize.stepwise.min_height <
    106 					  framesize.stepwise.max_height);
    107 				break;
    108 
    109 			case V4L2_FRMSIZE_TYPE_STEPWISE:
    110 				CU_ASSERT(0 < framesize.stepwise.min_width);
    111 				CU_ASSERT(0 < framesize.stepwise.max_width);
    112 				CU_ASSERT(0 < framesize.stepwise.step_width);
    113 
    114 				CU_ASSERT(framesize.stepwise.min_width <
    115 					  framesize.stepwise.max_width);
    116 
    117 				/* check if the given step is unambigous: min + n * step = max */
    118 				if (framesize.stepwise.step_width != 0) {
    119 					CU_ASSERT_EQUAL((framesize.stepwise.
    120 							 max_width -
    121 							 framesize.stepwise.
    122 							 min_width) %
    123 							framesize.stepwise.
    124 							step_width, 0);
    125 				}
    126 
    127 				CU_ASSERT(0 < framesize.stepwise.min_height);
    128 				CU_ASSERT(0 < framesize.stepwise.max_height);
    129 				CU_ASSERT(0 < framesize.stepwise.step_height);
    130 
    131 				CU_ASSERT(framesize.stepwise.min_height <
    132 					  framesize.stepwise.max_height);
    133 
    134 				/* check if the given step is unambigous: min + n * step = max */
    135 				if (framesize.stepwise.step_height != 0) {
    136 					CU_ASSERT_EQUAL((framesize.stepwise.
    137 							 max_height -
    138 							 framesize.stepwise.
    139 							 min_height) %
    140 							framesize.stepwise.
    141 							step_height, 0);
    142 				}
    143 
    144 				break;
    145 			}
    146 
    147 			CU_ASSERT_EQUAL(framesize.reserved[0], 0);
    148 			CU_ASSERT_EQUAL(framesize.reserved[1], 0);
    149 
    150 			show_v4l2_frmsizeenum(&framesize);
    151 
    152 		} else {
    153 			CU_ASSERT_EQUAL(ret_frame, -1);
    154 			CU_ASSERT_EQUAL(errno_frame, EINVAL);
    155 		}
    156 		i++;
    157 	} while (ret_frame == 0 && i != 0);
    158 
    159 }
    160 
    161 static void do_test_VIDIOC_ENUM_FRAMESIZES_type(enum v4l2_buf_type type)
    162 {
    163 	int ret_enum, errno_enum;
    164 	struct v4l2_fmtdesc format;
    165 	__u32 i;
    166 
    167 	i = 0;
    168 	do {
    169 		memset(&format, 0xff, sizeof(format));
    170 		format.index = i;
    171 		format.type = type;
    172 
    173 		ret_enum = ioctl(get_video_fd(), VIDIOC_ENUM_FMT, &format);
    174 		errno_enum = errno;
    175 
    176 		dprintf
    177 		    ("\t%s:%u: VIDIOC_ENUM_FMT, index=%u, type=%i, ret_enum=%i, errno_enum=%i\n",
    178 		     __FILE__, __LINE__, i, format.type, ret_enum, errno_enum);
    179 
    180 		/* Ensure that VIDIOC_ENUM_FRAMESIZES is called at least once
    181 		 * even if VIDIOC_ENUM_FMT returns error
    182 		 */
    183 		do_test_VIDIOC_ENUM_FRAMESIZES(format.pixelformat);
    184 
    185 		i++;
    186 	} while (ret_enum == 0 && i != 0);
    187 
    188 }
    189 
    190 void test_VIDIOC_ENUM_FRAMESIZES()
    191 {
    192 	do_test_VIDIOC_ENUM_FRAMESIZES_type(V4L2_BUF_TYPE_VIDEO_CAPTURE);
    193 	do_test_VIDIOC_ENUM_FRAMESIZES_type(V4L2_BUF_TYPE_VIDEO_OUTPUT);
    194 	do_test_VIDIOC_ENUM_FRAMESIZES_type(V4L2_BUF_TYPE_VIDEO_OVERLAY);
    195 	do_test_VIDIOC_ENUM_FRAMESIZES_type(V4L2_BUF_TYPE_PRIVATE);
    196 }
    197 
    198 static void do_test_VIDIOC_ENUM_FRAMESIZES_invalid_index(__u32 fmt)
    199 {
    200 	struct v4l2_frmsizeenum framesize;
    201 	int ret_frame, errno_frame;
    202 	__u32 i;
    203 	__u32 max_index;
    204 
    205 	i = 0;
    206 	do {
    207 		memset(&framesize, 0xff, sizeof(framesize));
    208 		framesize.index = i;
    209 		framesize.pixel_format = fmt;
    210 		ret_frame =
    211 		    ioctl(get_video_fd(), VIDIOC_ENUM_FRAMESIZES, &framesize);
    212 		errno_frame = errno;
    213 
    214 		dprintf
    215 		    ("\t%s:%u: VIDIOC_ENUM_FRAMESIZES, index=%u, pixel_format=0x%x, ret_frame=%i, errno_frame=%i\n",
    216 		     __FILE__, __LINE__, i, fmt, ret_frame, errno_frame);
    217 
    218 		i++;
    219 	} while (ret_frame == 0 && i != 0);
    220 
    221 	max_index = i - 1;
    222 
    223 	i = max_index + 1;
    224 	memset(&framesize, 0xff, sizeof(framesize));
    225 	framesize.index = i;
    226 	framesize.pixel_format = fmt;
    227 	ret_frame = ioctl(get_video_fd(), VIDIOC_ENUM_FRAMESIZES, &framesize);
    228 	errno_frame = errno;
    229 
    230 	dprintf
    231 	    ("\t%s:%u: VIDIOC_ENUM_FRAMESIZES, index=%u, pixel_format=0x%x, ret_frame=%i, errno_frame=%i\n",
    232 	     __FILE__, __LINE__, i, fmt, ret_frame, errno_frame);
    233 
    234 	CU_ASSERT_EQUAL(ret_frame, -1);
    235 	CU_ASSERT_EQUAL(errno_frame, EINVAL);
    236 
    237 	i = (__u32) S32_MIN;
    238 	if (max_index < i) {
    239 		memset(&framesize, 0xff, sizeof(framesize));
    240 		framesize.index = i;
    241 		framesize.pixel_format = fmt;
    242 		ret_frame =
    243 		    ioctl(get_video_fd(), VIDIOC_ENUM_FRAMESIZES, &framesize);
    244 		errno_frame = errno;
    245 
    246 		dprintf
    247 		    ("\t%s:%u: VIDIOC_ENUM_FRAMESIZES, index=0x%x, pixel_format=0x%x, ret_frame=%i, errno_frame=%i\n",
    248 		     __FILE__, __LINE__, i, fmt, ret_frame, errno_frame);
    249 
    250 		CU_ASSERT_EQUAL(ret_frame, -1);
    251 		CU_ASSERT_EQUAL(errno_frame, EINVAL);
    252 	}
    253 
    254 	i = (__u32) S32_MAX;
    255 	if (max_index < i) {
    256 		memset(&framesize, 0xff, sizeof(framesize));
    257 		framesize.index = i;
    258 		framesize.pixel_format = fmt;
    259 		ret_frame =
    260 		    ioctl(get_video_fd(), VIDIOC_ENUM_FRAMESIZES, &framesize);
    261 		errno_frame = errno;
    262 
    263 		dprintf
    264 		    ("\t%s:%u: VIDIOC_ENUM_FRAMESIZES, index=0x%x, pixel_format=0x%x, ret_frame=%i, errno_frame=%i\n",
    265 		     __FILE__, __LINE__, i, fmt, ret_frame, errno_frame);
    266 
    267 		CU_ASSERT_EQUAL(ret_frame, -1);
    268 		CU_ASSERT_EQUAL(errno_frame, EINVAL);
    269 	}
    270 
    271 	i = (__u32) U32_MAX;
    272 	if (max_index < i) {
    273 		memset(&framesize, 0xff, sizeof(framesize));
    274 		framesize.index = i;
    275 		framesize.pixel_format = fmt;
    276 		ret_frame =
    277 		    ioctl(get_video_fd(), VIDIOC_ENUM_FRAMESIZES, &framesize);
    278 		errno_frame = errno;
    279 
    280 		dprintf
    281 		    ("\t%s:%u: VIDIOC_ENUM_FRAMESIZES, index=0x%x, pixel_format=0x%x, ret_frame=%i, errno_frame=%i\n",
    282 		     __FILE__, __LINE__, i, fmt, ret_frame, errno_frame);
    283 
    284 		CU_ASSERT_EQUAL(ret_frame, -1);
    285 		CU_ASSERT_EQUAL(errno_frame, EINVAL);
    286 	}
    287 
    288 }
    289 
    290 static void do_test_VIDIOC_ENUM_FRAMESIZES_type_invalid_index(enum v4l2_buf_type
    291 							      type)
    292 {
    293 	int ret_enum, errno_enum;
    294 	struct v4l2_fmtdesc format;
    295 	__u32 i;
    296 
    297 	i = 0;
    298 	do {
    299 		memset(&format, 0xff, sizeof(format));
    300 		format.index = i;
    301 		format.type = type;
    302 
    303 		ret_enum = ioctl(get_video_fd(), VIDIOC_ENUM_FMT, &format);
    304 		errno_enum = errno;
    305 
    306 		dprintf
    307 		    ("\t%s:%u: VIDIOC_ENUM_FMT, index=%u, type=%i, ret_enum=%i, errno_enum=%i\n",
    308 		     __FILE__, __LINE__, i, format.type, ret_enum, errno_enum);
    309 
    310 		/* Ensure that VIDIOC_ENUM_FRAMESIZES is called at least once
    311 		 * even if VIDIOC_ENUM_FMT returns error
    312 		 */
    313 		do_test_VIDIOC_ENUM_FRAMESIZES_invalid_index(format.
    314 							     pixelformat);
    315 
    316 		i++;
    317 	} while (ret_enum == 0 && i != 0);
    318 
    319 }
    320 
    321 void test_VIDIOC_ENUM_FRAMESIZES_invalid_index()
    322 {
    323 	do_test_VIDIOC_ENUM_FRAMESIZES_type_invalid_index
    324 	    (V4L2_BUF_TYPE_VIDEO_CAPTURE);
    325 	do_test_VIDIOC_ENUM_FRAMESIZES_type_invalid_index
    326 	    (V4L2_BUF_TYPE_VIDEO_OUTPUT);
    327 	do_test_VIDIOC_ENUM_FRAMESIZES_type_invalid_index
    328 	    (V4L2_BUF_TYPE_VIDEO_OVERLAY);
    329 	do_test_VIDIOC_ENUM_FRAMESIZES_type_invalid_index
    330 	    (V4L2_BUF_TYPE_PRIVATE);
    331 }
    332 
    333 static int supported_pixel_format_type(enum v4l2_buf_type type,
    334 				       __u32 pixel_format)
    335 {
    336 	int ret_enum, errno_enum;
    337 	struct v4l2_fmtdesc format;
    338 	__u32 i;
    339 	int supported = 0;
    340 
    341 	i = 0;
    342 	do {
    343 		memset(&format, 0xff, sizeof(format));
    344 		format.index = i;
    345 		format.type = type;
    346 
    347 		ret_enum = ioctl(get_video_fd(), VIDIOC_ENUM_FMT, &format);
    348 		errno_enum = errno;
    349 
    350 		dprintf
    351 		    ("\t%s:%u: VIDIOC_ENUM_FMT, index=%u, type=%i, ret_enum=%i, errno_enum=%i\n",
    352 		     __FILE__, __LINE__, i, format.type, ret_enum, errno_enum);
    353 
    354 		i++;
    355 	} while (ret_enum == 0 && i != 0 && format.pixelformat != pixel_format);
    356 
    357 	if (ret_enum == 0 && i != 0 && format.pixelformat == pixel_format) {
    358 		supported = 1;
    359 	}
    360 
    361 	return supported;
    362 }
    363 
    364 static int supported_pixel_format(__u32 pixel_format)
    365 {
    366 	int supported = 0;
    367 
    368 	supported =
    369 	    supported_pixel_format_type(V4L2_BUF_TYPE_VIDEO_CAPTURE,
    370 					pixel_format);
    371 	if (!supported) {
    372 		supported =
    373 		    supported_pixel_format_type(V4L2_BUF_TYPE_VIDEO_OUTPUT,
    374 						pixel_format);
    375 		if (!supported) {
    376 			supported =
    377 			    supported_pixel_format_type
    378 			    (V4L2_BUF_TYPE_VIDEO_OVERLAY, pixel_format);
    379 			if (!supported) {
    380 				supported =
    381 				    supported_pixel_format_type
    382 				    (V4L2_BUF_TYPE_PRIVATE, pixel_format);
    383 			}
    384 		}
    385 	}
    386 
    387 	return supported;
    388 }
    389 
    390 static void do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(__u32 fmt)
    391 {
    392 	struct v4l2_frmsizeenum framesize;
    393 	int ret_frame, errno_frame;
    394 	__u32 i;
    395 
    396 	if (!supported_pixel_format(fmt)) {
    397 		i = 0;
    398 		memset(&framesize, 0xff, sizeof(framesize));
    399 		framesize.index = i;
    400 		framesize.pixel_format = fmt;
    401 		ret_frame =
    402 		    ioctl(get_video_fd(), VIDIOC_ENUM_FRAMESIZES, &framesize);
    403 		errno_frame = errno;
    404 
    405 		dprintf
    406 		    ("\t%s:%u: VIDIOC_ENUM_FRAMESIZES, index=%u, pixel_format=0x%x, ret_frame=%i, errno_frame=%i\n",
    407 		     __FILE__, __LINE__, i, fmt, ret_frame, errno_frame);
    408 
    409 		CU_ASSERT_EQUAL(ret_frame, -1);
    410 		CU_ASSERT_EQUAL(errno_frame, EINVAL);
    411 	}
    412 
    413 }
    414 
    415 void test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format()
    416 {
    417 
    418 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(U32_MIN);
    419 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format((__u32) S32_MIN);
    420 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format((__u32) S32_MAX);
    421 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(U32_MAX);
    422 
    423 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    424 	    (V4L2_PIX_FMT_RGB332);
    425 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    426 	    (V4L2_PIX_FMT_RGB444);
    427 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    428 	    (V4L2_PIX_FMT_RGB555);
    429 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    430 	    (V4L2_PIX_FMT_RGB565);
    431 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    432 	    (V4L2_PIX_FMT_RGB555X);
    433 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    434 	    (V4L2_PIX_FMT_RGB565X);
    435 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_BGR24);
    436 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_RGB24);
    437 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_BGR32);
    438 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_RGB32);
    439 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_GREY);
    440 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_Y16);
    441 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_PAL8);
    442 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    443 	    (V4L2_PIX_FMT_YVU410);
    444 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    445 	    (V4L2_PIX_FMT_YVU420);
    446 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_YUYV);
    447 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_UYVY);
    448 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    449 	    (V4L2_PIX_FMT_YUV422P);
    450 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    451 	    (V4L2_PIX_FMT_YUV411P);
    452 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_Y41P);
    453 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    454 	    (V4L2_PIX_FMT_YUV444);
    455 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    456 	    (V4L2_PIX_FMT_YUV555);
    457 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    458 	    (V4L2_PIX_FMT_YUV565);
    459 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_YUV32);
    460 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_NV12);
    461 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_NV21);
    462 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    463 	    (V4L2_PIX_FMT_YUV410);
    464 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    465 	    (V4L2_PIX_FMT_YUV420);
    466 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_YYUV);
    467 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_HI240);
    468 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_HM12);
    469 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    470 	    (V4L2_PIX_FMT_SBGGR8);
    471 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    472 	    (V4L2_PIX_FMT_SBGGR16);
    473 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_MJPEG);
    474 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_JPEG);
    475 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_DV);
    476 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_MPEG);
    477 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_WNVA);
    478 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    479 	    (V4L2_PIX_FMT_SN9C10X);
    480 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_PWC1);
    481 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_PWC2);
    482 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    483 	    (V4L2_PIX_FMT_ET61X251);
    484 
    485 #ifdef V4L2_PIX_FMT_VYUY
    486 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_VYUY);
    487 #endif
    488 
    489 #ifdef V4L2_PIX_FMT_NV16
    490 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_NV16);
    491 #endif
    492 
    493 #ifdef V4L2_PIX_FMT_NV61
    494 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_NV61);
    495 #endif
    496 
    497 #ifdef V4L2_PIX_FMT_SGBRG8
    498 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    499 	    (V4L2_PIX_FMT_SGBRG8);
    500 #endif
    501 
    502 #ifdef V4L2_PIX_FMT_SGRBG8
    503 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    504 	    (V4L2_PIX_FMT_SGRBG8);
    505 #endif
    506 
    507 #ifdef V4L2_PIX_FMT_SGRBG10
    508 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    509 	    (V4L2_PIX_FMT_SGRBG10);
    510 #endif
    511 
    512 #ifdef V4L2_PIX_FMT_SGRBG10DPCM8
    513 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    514 	    (V4L2_PIX_FMT_SGRBG10DPCM8);
    515 #endif
    516 
    517 #ifdef V4L2_PIX_FMT_SPCA501
    518 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    519 	    (V4L2_PIX_FMT_SPCA501);
    520 #endif
    521 
    522 #ifdef V4L2_PIX_FMT_SPCA505
    523 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    524 	    (V4L2_PIX_FMT_SPCA505);
    525 #endif
    526 
    527 #ifdef V4L2_PIX_FMT_SPCA508
    528 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    529 	    (V4L2_PIX_FMT_SPCA508);
    530 #endif
    531 
    532 #ifdef V4L2_PIX_FMT_SPCA561
    533 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    534 	    (V4L2_PIX_FMT_SPCA561);
    535 #endif
    536 
    537 #ifdef V4L2_PIX_FMT_PAC207
    538 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    539 	    (V4L2_PIX_FMT_PAC207);
    540 #endif
    541 
    542 #ifdef V4L2_PIX_FMT_MR97310A
    543 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    544 	    (V4L2_PIX_FMT_MR97310A);
    545 #endif
    546 
    547 #ifdef V4L2_PIX_FMT_SQ905C
    548 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format
    549 	    (V4L2_PIX_FMT_SQ905C);
    550 #endif
    551 
    552 #ifdef V4L2_PIX_FMT_PJPG
    553 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_PJPG);
    554 #endif
    555 
    556 #ifdef V4L2_PIX_FMT_YVYU
    557 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_YVYU);
    558 #endif
    559 
    560 #ifdef V4L2_PIX_FMT_OV511
    561 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_OV511);
    562 #endif
    563 
    564 #ifdef V4L2_PIX_FMT_OV518
    565 	do_test_VIDIOC_ENUM_FRAMESIZES_invalid_pixel_format(V4L2_PIX_FMT_OV518);
    566 #endif
    567 
    568 }
    569 
    570 void test_VIDIOC_ENUM_FRAMESIZES_NULL()
    571 {
    572 	struct v4l2_fmtdesc format_capture;
    573 	struct v4l2_fmtdesc format_output;
    574 	struct v4l2_fmtdesc format_overlay;
    575 	struct v4l2_fmtdesc format_private;
    576 	struct v4l2_frmsizeenum framesize;
    577 	int ret_fmt_capture, errno_fmt_capture;
    578 	int ret_fmt_output, errno_fmt_output;
    579 	int ret_fmt_overlay, errno_fmt_overlay;
    580 	int ret_fmt_private, errno_fmt_private;
    581 	int ret_size, errno_size;
    582 	int ret_null, errno_null;
    583 	__u32 fmt;
    584 
    585 	memset(&format_capture, 0xff, sizeof(format_capture));
    586 	format_capture.index = 0;
    587 	format_capture.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    588 
    589 	ret_fmt_capture =
    590 	    ioctl(get_video_fd(), VIDIOC_ENUM_FMT, &format_capture);
    591 	errno_fmt_capture = errno;
    592 
    593 	dprintf
    594 	    ("\t%s:%u: VIDIOC_ENUM_FMT, index=%u, type=%i, ret_fmt_capture=%i, errno_fmt_capture=%i\n",
    595 	     __FILE__, __LINE__, format_capture.index, format_capture.type,
    596 	     ret_fmt_capture, errno_fmt_capture);
    597 
    598 	memset(&format_output, 0xff, sizeof(format_output));
    599 	format_output.index = 0;
    600 	format_output.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
    601 
    602 	ret_fmt_output = ioctl(get_video_fd(), VIDIOC_ENUM_FMT, &format_output);
    603 	errno_fmt_output = errno;
    604 
    605 	dprintf
    606 	    ("\t%s:%u: VIDIOC_ENUM_FMT, index=%u, type=%i, ret_fmt_output=%i, errno_fmt_output=%i\n",
    607 	     __FILE__, __LINE__, format_output.index, format_output.type,
    608 	     ret_fmt_output, errno_fmt_output);
    609 
    610 	memset(&format_overlay, 0xff, sizeof(format_overlay));
    611 	format_overlay.index = 0;
    612 	format_overlay.type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
    613 
    614 	ret_fmt_overlay =
    615 	    ioctl(get_video_fd(), VIDIOC_ENUM_FMT, &format_overlay);
    616 	errno_fmt_overlay = errno;
    617 
    618 	dprintf
    619 	    ("\t%s:%u: VIDIOC_ENUM_FMT, index=%u, type=%i, ret_fmt_overlay=%i, errno_fmt_overlay=%i\n",
    620 	     __FILE__, __LINE__, format_overlay.index, format_overlay.type,
    621 	     ret_fmt_overlay, errno_fmt_overlay);
    622 
    623 	memset(&format_private, 0xff, sizeof(format_private));
    624 	format_private.index = 0;
    625 	format_private.type = V4L2_BUF_TYPE_PRIVATE;
    626 
    627 	ret_fmt_private =
    628 	    ioctl(get_video_fd(), VIDIOC_ENUM_FMT, &format_private);
    629 	errno_fmt_private = errno;
    630 
    631 	dprintf
    632 	    ("\t%s:%u: VIDIOC_ENUM_FMT, index=%u, type=%i, ret_fmt_private=%i, errno_fmt_private=%i\n",
    633 	     __FILE__, __LINE__, format_private.index, format_private.type,
    634 	     ret_fmt_private, errno_fmt_private);
    635 
    636 	if (ret_fmt_capture == 0) {
    637 		fmt = format_capture.pixelformat;
    638 	} else if (ret_fmt_output == 0) {
    639 		fmt = format_output.pixelformat;
    640 	} else if (ret_fmt_overlay == 0) {
    641 		fmt = format_overlay.pixelformat;
    642 	} else if (ret_fmt_private == 0) {
    643 		fmt = format_private.pixelformat;
    644 	} else {
    645 		fmt = 0;
    646 	}
    647 
    648 	memset(&framesize, 0xff, sizeof(framesize));
    649 	framesize.index = 0;
    650 	framesize.pixel_format = fmt;
    651 	ret_size = ioctl(get_video_fd(), VIDIOC_ENUM_FRAMESIZES, &framesize);
    652 	errno_size = errno;
    653 
    654 	dprintf
    655 	    ("\tVIDIOC_ENUM_FRAMESIZES, index=%u, pixel_format=0x%x, ret_size=%i, errno_size=%i\n",
    656 	     framesize.index, framesize.pixel_format, ret_size, errno_size);
    657 
    658 	ret_null = ioctl(get_video_fd(), VIDIOC_ENUM_FRAMESIZES, NULL);
    659 	errno_null = errno;
    660 
    661 	dprintf("\tVIDIOC_ENUM_FRAMESIZES, ret_null=%i, errno_null=%i\n",
    662 		ret_null, errno_null);
    663 
    664 	if (ret_size == 0) {
    665 		CU_ASSERT_EQUAL(ret_size, 0);
    666 		CU_ASSERT_EQUAL(ret_null, -1);
    667 		CU_ASSERT_EQUAL(errno_null, EFAULT);
    668 	} else {
    669 		CU_ASSERT_EQUAL(ret_size, -1);
    670 		CU_ASSERT_EQUAL(errno_size, EINVAL);
    671 		CU_ASSERT_EQUAL(ret_null, -1);
    672 		CU_ASSERT_EQUAL(errno_null, EINVAL);
    673 	}
    674 
    675 }
    676