1 /* 2 * v4l-test: Test environment for Video For Linux Two API 3 * 4 * 7 May 2009 0.2 show_v4l2_*() function extracted to v4l2_show.c 5 * 29 Apr 2009 0.1 First release 6 * 7 * Written by Mrton Nmeth <nm127 (at) freemail.hu> 8 * Released under GPL 9 */ 10 11 #include <stdio.h> 12 #include <sys/types.h> 13 #include <sys/stat.h> 14 #include <fcntl.h> 15 #include <unistd.h> 16 #include <sys/ioctl.h> 17 #include <errno.h> 18 #include <string.h> 19 20 #include <linux/videodev2.h> 21 #include <linux/errno.h> 22 23 #include <CUnit/CUnit.h> 24 25 #include "v4l2_test.h" 26 #include "v4l2_show.h" 27 #include "dev_video.h" 28 #include "video_limits.h" 29 30 #include "test_VIDIOC_REQBUFS.h" 31 32 static void do_VIDIOC_REQBUFS_capture_mmap(__u32 count) 33 { 34 int ret_cap, errno_cap; 35 int ret_req, errno_req; 36 struct v4l2_capability cap; 37 struct v4l2_requestbuffers reqbuf; 38 struct v4l2_requestbuffers reqbuf2; 39 40 memset(&cap, 0, sizeof(cap)); 41 42 ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap); 43 errno_cap = errno; 44 45 memset(&reqbuf, 0xff, sizeof(reqbuf)); 46 reqbuf.count = count; 47 reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 48 reqbuf.memory = V4L2_MEMORY_MMAP; 49 50 ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf); 51 errno_req = errno; 52 53 dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n", 54 __FILE__, __LINE__, count, ret_req, errno_req); 55 56 if (ret_cap == 0 && 57 (cap.capabilities & V4L2_CAP_STREAMING) && 58 (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { 59 60 CU_ASSERT_EQUAL(ret_cap, 0); 61 CU_ASSERT(cap.capabilities & V4L2_CAP_STREAMING); 62 63 CU_ASSERT_EQUAL(ret_req, 0); 64 //CU_ASSERT_EQUAL(reqbuf.count, ???); 65 CU_ASSERT_EQUAL(reqbuf.type, V4L2_BUF_TYPE_VIDEO_CAPTURE); 66 CU_ASSERT_EQUAL(reqbuf.memory, V4L2_MEMORY_MMAP); 67 CU_ASSERT_EQUAL(reqbuf.reserved[0], 0); 68 CU_ASSERT_EQUAL(reqbuf.reserved[1], 0); 69 70 } else { 71 CU_ASSERT_EQUAL(ret_req, -1); 72 CU_ASSERT_EQUAL(errno_req, EINVAL); 73 74 memset(&reqbuf2, 0xff, sizeof(reqbuf2)); 75 reqbuf2.count = count; 76 reqbuf2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 77 reqbuf2.memory = V4L2_MEMORY_MMAP; 78 79 CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0); 80 } 81 82 if (ret_req == 0) { 83 show_v4l2_requestbuffers(&reqbuf); 84 } 85 86 } 87 88 void test_VIDIOC_REQBUFS_capture_mmap() 89 { 90 do_VIDIOC_REQBUFS_capture_mmap(0); 91 do_VIDIOC_REQBUFS_capture_mmap(1); 92 do_VIDIOC_REQBUFS_capture_mmap(2); 93 do_VIDIOC_REQBUFS_capture_mmap(3); 94 do_VIDIOC_REQBUFS_capture_mmap(4); 95 do_VIDIOC_REQBUFS_capture_mmap((__u32) S16_MIN); 96 do_VIDIOC_REQBUFS_capture_mmap((__u32) S16_MAX); 97 do_VIDIOC_REQBUFS_capture_mmap(U32_MAX); 98 do_VIDIOC_REQBUFS_capture_mmap(0); 99 } 100 101 static void do_VIDIOC_REQBUFS_capture_userptr(__u32 count) 102 { 103 int ret_cap, errno_cap; 104 int ret_req, errno_req; 105 struct v4l2_capability cap; 106 struct v4l2_requestbuffers reqbuf; 107 struct v4l2_requestbuffers reqbuf2; 108 109 memset(&cap, 0, sizeof(cap)); 110 111 ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap); 112 errno_cap = errno; 113 114 memset(&reqbuf, 0xff, sizeof(reqbuf)); 115 reqbuf.count = count; 116 reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 117 reqbuf.memory = V4L2_MEMORY_USERPTR; 118 119 ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf); 120 errno_req = errno; 121 122 dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n", 123 __FILE__, __LINE__, count, ret_req, errno_req); 124 125 if (ret_cap == 0 && 126 (cap.capabilities & V4L2_CAP_STREAMING) && 127 (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) && ret_req == 0) { 128 CU_ASSERT_EQUAL(ret_cap, 0); 129 CU_ASSERT(cap.capabilities & V4L2_CAP_STREAMING); 130 131 CU_ASSERT_EQUAL(ret_req, 0); 132 //CU_ASSERT_EQUAL(reqbuf.count, ???); 133 CU_ASSERT_EQUAL(reqbuf.type, V4L2_BUF_TYPE_VIDEO_CAPTURE); 134 CU_ASSERT_EQUAL(reqbuf.memory, V4L2_MEMORY_USERPTR); 135 CU_ASSERT_EQUAL(reqbuf.reserved[0], 0); 136 CU_ASSERT_EQUAL(reqbuf.reserved[1], 0); 137 138 } else { 139 CU_ASSERT_EQUAL(ret_req, -1); 140 CU_ASSERT_EQUAL(errno_req, EINVAL); 141 142 memset(&reqbuf2, 0xff, sizeof(reqbuf2)); 143 reqbuf2.count = count; 144 reqbuf2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 145 reqbuf2.memory = V4L2_MEMORY_USERPTR; 146 147 CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0); 148 } 149 150 if (ret_req == 0) { 151 show_v4l2_requestbuffers(&reqbuf); 152 } 153 154 } 155 156 void test_VIDIOC_REQBUFS_capture_userptr() 157 { 158 do_VIDIOC_REQBUFS_capture_userptr(0); 159 do_VIDIOC_REQBUFS_capture_userptr(1); 160 do_VIDIOC_REQBUFS_capture_userptr((__u32) S16_MIN); 161 do_VIDIOC_REQBUFS_capture_userptr((__u32) S16_MAX); 162 do_VIDIOC_REQBUFS_capture_userptr(U32_MAX); 163 do_VIDIOC_REQBUFS_capture_userptr(0); 164 } 165 166 static void do_VIDIOC_REQBUFS_output_mmap(__u32 count) 167 { 168 int ret_cap, errno_cap; 169 int ret_req, errno_req; 170 struct v4l2_capability cap; 171 struct v4l2_requestbuffers reqbuf; 172 struct v4l2_requestbuffers reqbuf2; 173 174 memset(&cap, 0, sizeof(cap)); 175 176 ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap); 177 errno_cap = errno; 178 179 memset(&reqbuf, 0xff, sizeof(reqbuf)); 180 reqbuf.count = count; 181 reqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; 182 reqbuf.memory = V4L2_MEMORY_MMAP; 183 184 ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf); 185 errno_req = errno; 186 187 dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n", 188 __FILE__, __LINE__, count, ret_req, errno_req); 189 190 if (ret_cap == 0 && 191 (cap.capabilities & V4L2_CAP_STREAMING) && 192 (cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) { 193 194 CU_ASSERT_EQUAL(ret_cap, 0); 195 CU_ASSERT(cap.capabilities & V4L2_CAP_STREAMING); 196 197 CU_ASSERT_EQUAL(ret_req, 0); 198 //CU_ASSERT_EQUAL(reqbuf.count, ???); 199 CU_ASSERT_EQUAL(reqbuf.type, V4L2_BUF_TYPE_VIDEO_OUTPUT); 200 CU_ASSERT_EQUAL(reqbuf.memory, V4L2_MEMORY_MMAP); 201 CU_ASSERT_EQUAL(reqbuf.reserved[0], 0); 202 CU_ASSERT_EQUAL(reqbuf.reserved[1], 0); 203 204 } else { 205 CU_ASSERT_EQUAL(ret_req, -1); 206 CU_ASSERT_EQUAL(errno_req, EINVAL); 207 208 memset(&reqbuf2, 0xff, sizeof(reqbuf2)); 209 reqbuf2.count = count; 210 reqbuf2.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; 211 reqbuf2.memory = V4L2_MEMORY_MMAP; 212 213 CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0); 214 } 215 216 if (ret_req == 0) { 217 show_v4l2_requestbuffers(&reqbuf); 218 } 219 220 } 221 222 void test_VIDIOC_REQBUFS_output_mmap() 223 { 224 do_VIDIOC_REQBUFS_output_mmap(0); 225 do_VIDIOC_REQBUFS_output_mmap(1); 226 do_VIDIOC_REQBUFS_output_mmap(2); 227 do_VIDIOC_REQBUFS_output_mmap(3); 228 do_VIDIOC_REQBUFS_output_mmap(4); 229 do_VIDIOC_REQBUFS_output_mmap((__u32) S16_MIN); 230 do_VIDIOC_REQBUFS_output_mmap((__u32) S16_MAX); 231 do_VIDIOC_REQBUFS_output_mmap(U32_MAX); 232 do_VIDIOC_REQBUFS_output_mmap(0); 233 } 234 235 static void do_VIDIOC_REQBUFS_output_userptr(__u32 count) 236 { 237 int ret_cap, errno_cap; 238 int ret_req, errno_req; 239 struct v4l2_capability cap; 240 struct v4l2_requestbuffers reqbuf; 241 struct v4l2_requestbuffers reqbuf2; 242 243 memset(&cap, 0, sizeof(cap)); 244 245 ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap); 246 errno_cap = errno; 247 248 memset(&reqbuf, 0xff, sizeof(reqbuf)); 249 reqbuf.count = count; 250 reqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; 251 reqbuf.memory = V4L2_MEMORY_USERPTR; 252 253 ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf); 254 errno_req = errno; 255 256 dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n", 257 __FILE__, __LINE__, count, ret_req, errno_req); 258 259 if (ret_cap == 0 && 260 (cap.capabilities & V4L2_CAP_STREAMING) && 261 (cap.capabilities & V4L2_CAP_VIDEO_OUTPUT) && ret_req == 0) { 262 CU_ASSERT_EQUAL(ret_cap, 0); 263 CU_ASSERT(cap.capabilities & V4L2_CAP_STREAMING); 264 265 CU_ASSERT_EQUAL(ret_req, 0); 266 //CU_ASSERT_EQUAL(reqbuf.count, ???); 267 CU_ASSERT_EQUAL(reqbuf.type, V4L2_BUF_TYPE_VIDEO_OUTPUT); 268 CU_ASSERT_EQUAL(reqbuf.memory, V4L2_MEMORY_USERPTR); 269 CU_ASSERT_EQUAL(reqbuf.reserved[0], 0); 270 CU_ASSERT_EQUAL(reqbuf.reserved[1], 0); 271 272 } else { 273 CU_ASSERT_EQUAL(ret_req, -1); 274 CU_ASSERT_EQUAL(errno_req, EINVAL); 275 276 memset(&reqbuf2, 0xff, sizeof(reqbuf2)); 277 reqbuf2.count = count; 278 reqbuf2.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; 279 reqbuf2.memory = V4L2_MEMORY_USERPTR; 280 281 CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0); 282 } 283 284 if (ret_req == 0) { 285 show_v4l2_requestbuffers(&reqbuf); 286 } 287 288 } 289 290 void test_VIDIOC_REQBUFS_output_userptr() 291 { 292 do_VIDIOC_REQBUFS_output_userptr(0); 293 do_VIDIOC_REQBUFS_output_userptr(1); 294 do_VIDIOC_REQBUFS_output_userptr((__u32) S16_MIN); 295 do_VIDIOC_REQBUFS_output_userptr((__u32) S16_MAX); 296 do_VIDIOC_REQBUFS_output_userptr(U32_MAX); 297 do_VIDIOC_REQBUFS_output_userptr(0); 298 } 299 300 static void do_VIDIOC_REQBUFS_invalid_memory(enum v4l2_buf_type type, 301 enum v4l2_memory memory) 302 { 303 int ret_req, errno_req; 304 struct v4l2_requestbuffers reqbuf; 305 struct v4l2_requestbuffers reqbuf2; 306 307 memset(&reqbuf, 0xff, sizeof(reqbuf)); 308 reqbuf.count = 0; 309 reqbuf.type = type; 310 reqbuf.memory = memory; 311 312 ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf); 313 errno_req = errno; 314 315 dprintf("\t%s:%u: VIDIOC_REQBUF, type=0%x, ret_req=%i, errno_req=%i\n", 316 __FILE__, __LINE__, type, ret_req, errno_req); 317 318 CU_ASSERT_EQUAL(ret_req, -1); 319 CU_ASSERT_EQUAL(errno_req, EINVAL); 320 321 memset(&reqbuf2, 0xff, sizeof(reqbuf2)); 322 reqbuf2.count = 0; 323 reqbuf2.type = type; 324 reqbuf2.memory = memory; 325 326 CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0); 327 328 if (ret_req == 0) { 329 show_v4l2_requestbuffers(&reqbuf); 330 } 331 332 } 333 334 void test_VIDIOC_REQBUFS_invalid_memory_capture() 335 { 336 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, SINT_MIN); 337 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, 0); 338 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, 339 V4L2_MEMORY_OVERLAY); 340 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, 341 V4L2_MEMORY_OVERLAY + 1); 342 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, SINT_MAX); 343 } 344 345 void test_VIDIOC_REQBUFS_invalid_memory_output() 346 { 347 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, SINT_MIN); 348 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, 0); 349 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, 350 V4L2_MEMORY_OVERLAY); 351 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, 352 V4L2_MEMORY_OVERLAY + 1); 353 do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, SINT_MAX); 354 } 355 356 static void do_VIDIOC_REQBUFS_invalid_type(enum v4l2_memory memory, 357 enum v4l2_buf_type type) 358 { 359 int ret_req, errno_req; 360 struct v4l2_requestbuffers reqbuf; 361 struct v4l2_requestbuffers reqbuf2; 362 __u32 count; 363 364 count = 1; 365 366 memset(&reqbuf, 0xff, sizeof(reqbuf)); 367 reqbuf.count = count; 368 reqbuf.type = type; 369 reqbuf.memory = memory; 370 371 ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf); 372 errno_req = errno; 373 374 dprintf 375 ("\t%s:%u: VIDIOC_REQBUF, type=0x%x, memory=%i, ret_req=%i, errno_req=%i\n", 376 __FILE__, __LINE__, type, memory, ret_req, errno_req); 377 378 CU_ASSERT_EQUAL(ret_req, -1); 379 CU_ASSERT_EQUAL(errno_req, EINVAL); 380 381 memset(&reqbuf2, 0xff, sizeof(reqbuf2)); 382 reqbuf2.count = count; 383 reqbuf2.type = type; 384 reqbuf2.memory = memory; 385 386 CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0); 387 388 if (ret_req == 0) { 389 show_v4l2_requestbuffers(&reqbuf); 390 } 391 } 392 393 void test_VIDIOC_REQUBUFS_invalid_type_mmap() 394 { 395 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 0); 396 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 397 V4L2_BUF_TYPE_VIDEO_OVERLAY); 398 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 399 V4L2_BUF_TYPE_VBI_CAPTURE); 400 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 401 V4L2_BUF_TYPE_VBI_OUTPUT); 402 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 403 V4L2_BUF_TYPE_SLICED_VBI_CAPTURE); 404 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 405 V4L2_BUF_TYPE_SLICED_VBI_OUTPUT); 406 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 407 V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY); 408 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 409 V4L2_BUF_TYPE_PRIVATE - 1); 410 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_PRIVATE); 411 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 412 V4L2_BUF_TYPE_PRIVATE + 1); 413 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, S32_MAX); 414 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 415 (__s32) ((__u32) S32_MAX + 1)); 416 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, U32_MAX - 1); 417 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, U32_MAX); 418 419 } 420 421 void test_VIDIOC_REQUBUFS_invalid_type_userptr() 422 { 423 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 0); 424 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 425 V4L2_BUF_TYPE_VIDEO_OVERLAY); 426 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 427 V4L2_BUF_TYPE_VBI_CAPTURE); 428 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 429 V4L2_BUF_TYPE_VBI_OUTPUT); 430 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 431 V4L2_BUF_TYPE_SLICED_VBI_CAPTURE); 432 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 433 V4L2_BUF_TYPE_SLICED_VBI_OUTPUT); 434 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 435 V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY); 436 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 437 V4L2_BUF_TYPE_PRIVATE - 1); 438 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 439 V4L2_BUF_TYPE_PRIVATE); 440 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 441 V4L2_BUF_TYPE_PRIVATE + 1); 442 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, S32_MAX); 443 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 444 (__s32) ((__u32) S32_MAX + 1)); 445 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, U32_MAX - 1); 446 do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, U32_MAX); 447 448 } 449