| /* |
| * v4l-test: Test environment for Video For Linux Two API |
| * |
| * 3 Apr 2009 0.6 Test case for with NULL parameter reworked |
| * 28 Mar 2009 0.5 Clean up ret and errno variable names and dprintf() output |
| * 7 Mar 2009 0.4 Typo corrected |
| * 9 Feb 2009 0.3 Modify test_VIDIOC_CROPCAP_enum_INPUT() to support drivers |
| * without any inputs |
| * 3 Feb 2009 0.2 Typo fixed |
| * 21 Dec 2008 0.1 First release |
| * |
| * Written by Márton Németh <nm127@freemail.hu> |
| * Released under GPL |
| */ |
| |
| #include <stdio.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <unistd.h> |
| #include <sys/ioctl.h> |
| #include <errno.h> |
| #include <string.h> |
| |
| #include <linux/videodev2.h> |
| #include <linux/errno.h> |
| |
| #include <CUnit/CUnit.h> |
| |
| #include "v4l2_test.h" |
| #include "dev_video.h" |
| #include "video_limits.h" |
| |
| #include "test_VIDIOC_CROPCAP.h" |
| |
| static void do_ioctl_VIDIOC_CROPCAP(enum v4l2_buf_type buf_type, int expected_ret) { |
| int ret_cap, errno_cap; |
| struct v4l2_cropcap cropcap; |
| struct v4l2_cropcap cropcap2; |
| |
| memset(&cropcap, 0xff, sizeof(cropcap)); |
| cropcap.type = buf_type; |
| ret_cap = ioctl(get_video_fd(), VIDIOC_CROPCAP, &cropcap); |
| errno_cap = errno; |
| |
| dprintf("\t%s:%u: type=%i, ret_cap=%i, errno_cap=%i, expected_ret=%i\n", |
| __FILE__, __LINE__, buf_type, ret_cap, errno_cap, expected_ret); |
| |
| if (expected_ret != 0) { |
| CU_ASSERT_EQUAL(ret_cap, expected_ret); |
| } |
| if (ret_cap == 0) { |
| CU_ASSERT_EQUAL(ret_cap, 0); |
| CU_ASSERT_EQUAL(cropcap.type, buf_type); |
| |
| /* | left x */ |
| /* ----+----+--------------------------------------> */ |
| /* | : */ |
| /* top + +-------- cropcap ------------+ ^ */ |
| /* | | | | */ |
| /* | | +------- defrect ---------+ | | */ |
| /* | | | | | | */ |
| /* | | | | | | */ |
| /* | | | | | | height */ |
| /* | | +-------------------------+ | | */ |
| /* | | | | */ |
| /* | | | | */ |
| /* | +-----------------------------+ v */ |
| /* | : : */ |
| /* | <---------- width ------------> */ |
| /* | */ |
| /* v y */ |
| |
| /* top left corner */ |
| CU_ASSERT(cropcap.bounds.left <= cropcap.defrect.left); |
| CU_ASSERT(cropcap.bounds.top <= cropcap.defrect.top); |
| |
| /* size of default cropping rectangle should be smaller or */ |
| /* equal to the cropping bounds */ |
| CU_ASSERT(cropcap.defrect.width <= cropcap.bounds.width); |
| CU_ASSERT(cropcap.defrect.height <= cropcap.bounds.height); |
| |
| /* the right bottom corner should not exceed bounds */ |
| CU_ASSERT(cropcap.defrect.left + cropcap.defrect.width <= |
| cropcap.bounds.left + cropcap.bounds.width); |
| CU_ASSERT(cropcap.defrect.top + cropcap.defrect.height <= |
| cropcap.bounds.top + cropcap.bounds.height); |
| |
| //CU_ASSERT_EQUAL(cropcap.pixelaspect.numerator, ?); |
| CU_ASSERT_NOT_EQUAL(cropcap.pixelaspect.numerator, 0); |
| //CU_ASSERT_EQUAL(cropcap.pixelaspect.denominator, ?); |
| CU_ASSERT_NOT_EQUAL(cropcap.pixelaspect.denominator, 0); |
| |
| dprintf("\tcropcap = { .type = %i, " |
| ".bounds = { .left = %i, .top = %i, .width = %i, .height = %i }, " |
| ".defrect = { .left = %i, .top = %i, .width = %i, .height = %i }, " |
| ".pixelaspect = { .numerator = %u, .denominator = %u } " |
| "}\n", |
| cropcap.type, |
| |
| cropcap.bounds.left, |
| cropcap.bounds.top, |
| cropcap.bounds.width, |
| cropcap.bounds.height, |
| |
| cropcap.defrect.left, |
| cropcap.defrect.top, |
| cropcap.defrect.width, |
| cropcap.defrect.height, |
| |
| cropcap.pixelaspect.numerator, |
| cropcap.pixelaspect.denominator |
| ); |
| |
| } else { |
| CU_ASSERT_EQUAL(ret_cap, -1); |
| CU_ASSERT_EQUAL(errno_cap, EINVAL); |
| |
| memset(&cropcap2, 0xff, sizeof(cropcap2)); |
| cropcap2.type = buf_type; |
| CU_ASSERT_EQUAL(memcmp(&cropcap, &cropcap2, sizeof(cropcap)), 0); |
| |
| } |
| |
| } |
| |
| void test_VIDIOC_CROPCAP() { |
| |
| do_ioctl_VIDIOC_CROPCAP(0, -1); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_VIDEO_CAPTURE, 0); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_VIDEO_OUTPUT, 0); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_VIDEO_OVERLAY, 0); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_VBI_CAPTURE, -1); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_VBI_OUTPUT, -1); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_SLICED_VBI_CAPTURE, -1); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_SLICED_VBI_OUTPUT, -1); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, -1); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_PRIVATE-1, -1); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_PRIVATE, 0); |
| do_ioctl_VIDIOC_CROPCAP(V4L2_BUF_TYPE_PRIVATE+1, 0); |
| do_ioctl_VIDIOC_CROPCAP(S32_MAX, -1); |
| do_ioctl_VIDIOC_CROPCAP(((__u32)S32_MAX)+1, -1); |
| do_ioctl_VIDIOC_CROPCAP(U32_MAX-1, -1); |
| do_ioctl_VIDIOC_CROPCAP(U32_MAX, -1); |
| |
| } |
| |
| void test_VIDIOC_CROPCAP_enum_INPUT() { |
| int ret_get, errno_get; |
| int ret_set, errno_set; |
| int enum_ret; |
| __u32 input_index_orig; |
| struct v4l2_input input; |
| __u32 i; |
| int f; |
| |
| f = get_video_fd(); |
| |
| memset(&input_index_orig, 0xff, sizeof(input_index_orig)); |
| ret_get = ioctl(f, VIDIOC_G_INPUT, &input_index_orig); |
| errno_get = errno; |
| |
| if (ret_get == 0) { |
| CU_ASSERT_EQUAL(ret_get, 0); |
| i = 0; |
| do { |
| memset(&input, 0xff, sizeof(input)); |
| input.index = i; |
| enum_ret = ioctl(f, VIDIOC_ENUMINPUT, &input); |
| |
| dprintf("\t%s:%u: ENUMINPUT: i=%u, enum_ret=%i, errno=%i\n", |
| __FILE__, __LINE__, i, enum_ret, errno); |
| |
| if (enum_ret == 0) { |
| ret_set = ioctl(f, VIDIOC_S_INPUT, &input.index); |
| errno_set = errno; |
| |
| dprintf("\t%s:%u: input.index=0x%X, ret_set=%i, errno_set=%i\n", |
| __FILE__, __LINE__, input.index, ret_set, errno_set); |
| |
| CU_ASSERT_EQUAL(ret_set, 0); |
| if (ret_set == 0) { |
| test_VIDIOC_CROPCAP(); |
| } |
| |
| } |
| i++; |
| } while (enum_ret == 0 && i != 0); |
| |
| /* Setting the original input_id should not fail */ |
| ret_set = ioctl(f, VIDIOC_S_INPUT, &input_index_orig); |
| errno_set = errno; |
| |
| CU_ASSERT_EQUAL(ret_set, 0); |
| } else { |
| CU_ASSERT_EQUAL(ret_get, -1); |
| CU_ASSERT_EQUAL(errno_get, EINVAL); |
| } |
| } |
| |
| void test_VIDIOC_CROPCAP_NULL() { |
| int ret_capture, errno_capture; |
| int ret_output, errno_output; |
| int ret_overlay, errno_overlay; |
| int ret_private, errno_private; |
| int ret_private_1, errno_private_1; |
| int ret_null, errno_null; |
| struct v4l2_cropcap cropcap; |
| |
| memset(&cropcap, 0xff, sizeof(cropcap)); |
| cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
| ret_capture = ioctl(get_video_fd(), VIDIOC_CROPCAP, &cropcap); |
| errno_capture = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_CROPCAP, ret_capture=%i, errno_capture=%i\n", |
| __FILE__, __LINE__, ret_capture, errno_capture); |
| |
| memset(&cropcap, 0xff, sizeof(cropcap)); |
| cropcap.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; |
| ret_output = ioctl(get_video_fd(), VIDIOC_CROPCAP, &cropcap); |
| errno_output = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_CROPCAP, ret_output=%i, errno_output=%i\n", |
| __FILE__, __LINE__, ret_output, errno_output); |
| |
| memset(&cropcap, 0xff, sizeof(cropcap)); |
| cropcap.type = V4L2_BUF_TYPE_VIDEO_OVERLAY; |
| ret_overlay = ioctl(get_video_fd(), VIDIOC_CROPCAP, &cropcap); |
| errno_overlay = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_CROPCAP, ret_overlay=%i, errno_overlay=%i\n", |
| __FILE__, __LINE__, ret_overlay, errno_overlay); |
| |
| memset(&cropcap, 0xff, sizeof(cropcap)); |
| cropcap.type = V4L2_BUF_TYPE_PRIVATE; |
| ret_private = ioctl(get_video_fd(), VIDIOC_CROPCAP, &cropcap); |
| errno_private = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_CROPCAP, ret_private=%i, errno_private=%i\n", |
| __FILE__, __LINE__, ret_private, errno_private); |
| |
| memset(&cropcap, 0xff, sizeof(cropcap)); |
| cropcap.type = V4L2_BUF_TYPE_PRIVATE+1; |
| ret_private_1 = ioctl(get_video_fd(), VIDIOC_CROPCAP, &cropcap); |
| errno_private_1 = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_CROPCAP, ret_private_1=%i, errno_private_1=%i\n", |
| __FILE__, __LINE__, ret_private_1, errno_private_1); |
| |
| ret_null = ioctl(get_video_fd(), VIDIOC_CROPCAP, NULL); |
| errno_null = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_CROPCAP, ret_null=%i, errno_null=%i\n", |
| __FILE__, __LINE__, ret_null, errno_null); |
| |
| /* Check if at least one type was supported */ |
| if (ret_capture == 0 || ret_output == 0 || ret_overlay == 0 || |
| ret_private == 0 || ret_private_1 == 0) { |
| /* the parameter shall be validated */ |
| CU_ASSERT_EQUAL(ret_null, -1); |
| CU_ASSERT_EQUAL(errno_null, EFAULT); |
| } else { |
| /* VIDIOC_CROPCAP is not supported at all, the parameter |
| * shall also not be checked. |
| */ |
| CU_ASSERT_EQUAL(ret_capture, -1); |
| CU_ASSERT_EQUAL(errno_capture, EINVAL); |
| CU_ASSERT_EQUAL(ret_output, -1); |
| CU_ASSERT_EQUAL(errno_output, EINVAL); |
| CU_ASSERT_EQUAL(ret_overlay, -1); |
| CU_ASSERT_EQUAL(errno_overlay, EINVAL); |
| CU_ASSERT_EQUAL(ret_private, -1); |
| CU_ASSERT_EQUAL(errno_private, EINVAL); |
| CU_ASSERT_EQUAL(ret_private_1, -1); |
| CU_ASSERT_EQUAL(errno_private_1, EINVAL); |
| CU_ASSERT_EQUAL(ret_null, -1); |
| CU_ASSERT_EQUAL(errno_null, EINVAL); |
| } |
| |
| } |