| /* |
| * v4l-test: Test environment for Video For Linux Two API |
| * |
| * 3 Apr 2009 0.4 Minor style cleanup |
| * 7 Mar 2009 0.3 Test cases added for VIDIOC_S_CROP |
| * 13 Feb 2009 0.2 Test cases added for VIDIOC_G_CROP |
| * 7 Feb 2009 0.1 First release |
| * |
| * Written by Márton Németh <nm127@freemail.hu> |
| * Released under GPL |
| */ |
| |
| #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_CROP.h" |
| |
| void do_get_crop(enum v4l2_buf_type type) { |
| int ret1, errno1; |
| struct v4l2_crop crop; |
| |
| memset(&crop, 0xff, sizeof(crop)); |
| crop.type = type; |
| ret1 = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop); |
| errno1 = errno; |
| |
| dprintf("\tVIDIOC_G_CROP: type=%i, ret1=%i, errno1=%i\n", |
| type, ret1, errno1); |
| |
| if (ret1 == 0) { |
| CU_ASSERT_EQUAL(ret1, 0); |
| |
| } else { |
| CU_ASSERT_EQUAL(ret1, -1); |
| CU_ASSERT_EQUAL(errno1, EINVAL); |
| } |
| |
| } |
| |
| void test_VIDIOC_G_CROP() { |
| do_get_crop(V4L2_BUF_TYPE_VIDEO_CAPTURE); |
| do_get_crop(V4L2_BUF_TYPE_VIDEO_OUTPUT); |
| do_get_crop(V4L2_BUF_TYPE_VIDEO_OVERLAY); |
| } |
| |
| void do_get_crop_invalid(enum v4l2_buf_type type) { |
| int ret1, errno1; |
| struct v4l2_crop crop; |
| |
| memset(&crop, 0xff, sizeof(crop)); |
| crop.type = type; |
| ret1 = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop); |
| errno1 = errno; |
| |
| dprintf("\tVIDIOC_G_CROP: type=%i, ret1=%i, errno1=%i\n", |
| type, ret1, errno1); |
| |
| CU_ASSERT_EQUAL(ret1, -1); |
| CU_ASSERT_EQUAL(errno1, EINVAL); |
| } |
| |
| void test_VIDIOC_G_CROP_invalid() { |
| do_get_crop_invalid(0); |
| do_get_crop_invalid(V4L2_BUF_TYPE_VBI_CAPTURE); |
| do_get_crop_invalid(V4L2_BUF_TYPE_VBI_OUTPUT); |
| do_get_crop_invalid(V4L2_BUF_TYPE_SLICED_VBI_CAPTURE); |
| do_get_crop_invalid(V4L2_BUF_TYPE_SLICED_VBI_OUTPUT); |
| do_get_crop_invalid(V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY); |
| do_get_crop_invalid(V4L2_BUF_TYPE_PRIVATE); |
| do_get_crop_invalid(S32_MAX); |
| do_get_crop_invalid( ((__u32)S32_MAX)+1 ); |
| do_get_crop_invalid(U32_MAX); |
| } |
| |
| void test_VIDIOC_G_CROP_NULL() { |
| int ret_get1, errno_get1; |
| int ret_get2, errno_get2; |
| int ret_get3, errno_get3; |
| int ret_null, errno_null; |
| struct v4l2_crop crop; |
| |
| memset(&crop, 0, sizeof(crop)); |
| crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
| |
| ret_get1 = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop); |
| errno_get1 = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_G_CROP ret_get1=%i, errno_get1=%i\n", |
| __FILE__, __LINE__, ret_get1, errno_get1); |
| |
| memset(&crop, 0, sizeof(crop)); |
| crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; |
| |
| ret_get2 = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop); |
| errno_get2 = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_G_CROP ret_get2=%i, errno_get2=%i\n", |
| __FILE__, __LINE__, ret_get2, errno_get2); |
| |
| memset(&crop, 0, sizeof(crop)); |
| crop.type = V4L2_BUF_TYPE_VIDEO_OVERLAY; |
| |
| ret_get3 = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop); |
| errno_get3 = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_G_CROP ret_get3=%i, errno_get3=%i\n", |
| __FILE__, __LINE__, ret_get3, errno_get3); |
| |
| ret_null = ioctl(get_video_fd(), VIDIOC_G_CROP, NULL); |
| errno_null = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_G_CROP ret_null=%i, errno_null=%i\n", |
| __FILE__, __LINE__, ret_null, errno_null); |
| |
| if (ret_get1 == 0 || ret_get2 == 0 || ret_get3 == 0) { |
| CU_ASSERT_EQUAL(ret_null, -1); |
| CU_ASSERT_EQUAL(errno_null, EFAULT); |
| |
| } else { |
| CU_ASSERT_EQUAL(ret_get1, -1); |
| CU_ASSERT_EQUAL(errno_get1, EINVAL); |
| CU_ASSERT_EQUAL(ret_get2, -1); |
| CU_ASSERT_EQUAL(errno_get2, EINVAL); |
| CU_ASSERT_EQUAL(ret_get3, -1); |
| CU_ASSERT_EQUAL(errno_get3, EINVAL); |
| CU_ASSERT_EQUAL(ret_null, -1); |
| CU_ASSERT_EQUAL(errno_null, EINVAL); |
| |
| } |
| |
| } |
| |
| void do_set_crop(enum v4l2_buf_type type) { |
| int ret_orig, errno_orig; |
| int ret_set, errno_set; |
| int ret_new, errno_new; |
| int ret_cap, errno_cap; |
| struct v4l2_crop crop_orig; |
| struct v4l2_crop crop; |
| struct v4l2_crop crop_new; |
| struct v4l2_cropcap cropcap; |
| __s32 i; |
| |
| memset(&crop_orig, 0, sizeof(crop_orig)); |
| crop_orig.type = type; |
| ret_orig = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop_orig); |
| errno_orig = errno; |
| dprintf("\t%s:%u: VIDIOC_G_CROP, ret_orig=%i, errno_orig=%i, " |
| "crop_orig = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_orig, errno_orig, |
| crop_orig.type, |
| crop_orig.c.left, |
| crop_orig.c.top, |
| crop_orig.c.width, |
| crop_orig.c.height |
| ); |
| |
| memset(&cropcap, 0, sizeof(cropcap)); |
| cropcap.type = type; |
| ret_cap = ioctl(get_video_fd(), VIDIOC_CROPCAP, &cropcap); |
| errno_cap = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_CROPCAP, ret_cap=%i, errno_cap=%i, cropcap = { .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", |
| __FILE__, __LINE__, |
| ret_cap, errno_cap, |
| 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 |
| ); |
| |
| memset(&crop, 0xff, sizeof(crop)); |
| crop.type = type; |
| crop.c = cropcap.bounds; |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i, " |
| "crop = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_set, errno_set, |
| crop.type, |
| crop.c.left, |
| crop.c.top, |
| crop.c.width, |
| crop.c.height |
| ); |
| |
| memset(&crop_new, 0, sizeof(crop_new)); |
| crop_new.type = type; |
| ret_new = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop_new); |
| errno_new = errno; |
| dprintf("\t%s:%u: VIDIOC_G_CROP, ret_new=%i, errno_new=%i, " |
| "crop_new = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_new, errno_new, |
| crop_new.type, |
| crop_new.c.left, |
| crop_new.c.top, |
| crop_new.c.width, |
| crop_new.c.height |
| ); |
| |
| if (ret_cap == 0) { |
| CU_ASSERT_EQUAL(ret_cap, 0); |
| CU_ASSERT_EQUAL(ret_set, 0); |
| CU_ASSERT_EQUAL(ret_new, 0); |
| |
| if (ret_cap == 0 && ret_new == 0) { |
| |
| /* | left x */ |
| /* ----+----+--------------------------------------> */ |
| /* | : */ |
| /* top + +------ cropcap.bounds -------+ ^ */ |
| /* | | | | */ |
| /* | | +------- crop_new --------+ | | */ |
| /* | | | | | | */ |
| /* | | | | | | */ |
| /* | | | | | | height */ |
| /* | | +-------------------------+ | | */ |
| /* | | | | */ |
| /* | | | | */ |
| /* | +-----------------------------+ v */ |
| /* | : : */ |
| /* | <---------- width ------------> */ |
| /* | */ |
| /* v y */ |
| |
| CU_ASSERT(cropcap.bounds.left <= crop_new.c.left); |
| CU_ASSERT(cropcap.bounds.top <= crop_new.c.top); |
| |
| CU_ASSERT(crop_new.c.left+crop_new.c.width <= cropcap.bounds.left+cropcap.bounds.width); |
| CU_ASSERT(crop_new.c.top+crop_new.c.height <= cropcap.bounds.top+cropcap.bounds.height); |
| } |
| |
| } else { |
| CU_ASSERT_EQUAL(ret_cap, -1); |
| CU_ASSERT_EQUAL(errno_cap, EINVAL); |
| CU_ASSERT_EQUAL(ret_set, -1); |
| CU_ASSERT_EQUAL(errno_set, EINVAL); |
| CU_ASSERT_EQUAL(ret_new, -1); |
| CU_ASSERT_EQUAL(errno_new, EINVAL); |
| |
| } |
| |
| memset(&crop, 0xff, sizeof(crop)); |
| crop.type = type; |
| crop.c = cropcap.defrect; |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i, " |
| "crop = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_set, errno_set, |
| crop.type, |
| crop.c.left, |
| crop.c.top, |
| crop.c.width, |
| crop.c.height |
| ); |
| |
| memset(&crop_new, 0, sizeof(crop_new)); |
| crop_new.type = type; |
| ret_new = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop_new); |
| errno_new = errno; |
| dprintf("\t%s:%u: VIDIOC_G_CROP, ret_new=%i, errno_new=%i, " |
| "crop_new = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_new, errno_new, |
| crop_new.type, |
| crop_new.c.left, |
| crop_new.c.top, |
| crop_new.c.width, |
| crop_new.c.height |
| ); |
| |
| if (ret_cap == 0) { |
| CU_ASSERT_EQUAL(ret_cap, 0); |
| CU_ASSERT_EQUAL(ret_set, 0); |
| CU_ASSERT_EQUAL(ret_new, 0); |
| |
| if (ret_cap == 0 && ret_new == 0) { |
| |
| /* | left x */ |
| /* ----+----+--------------------------------------> */ |
| /* | : */ |
| /* top + +------ cropcap.defrect ------+ ^ */ |
| /* | | | | */ |
| /* | | +------- crop_new --------+ | | */ |
| /* | | | | | | */ |
| /* | | | | | | */ |
| /* | | | | | | height */ |
| /* | | +-------------------------+ | | */ |
| /* | | | | */ |
| /* | | | | */ |
| /* | +-----------------------------+ v */ |
| /* | : : */ |
| /* | <---------- width ------------> */ |
| /* | */ |
| /* v y */ |
| |
| CU_ASSERT(cropcap.defrect.left <= crop_new.c.left); |
| CU_ASSERT(cropcap.defrect.top <= crop_new.c.top); |
| |
| CU_ASSERT(crop_new.c.left+crop_new.c.width <= cropcap.defrect.left+cropcap.defrect.width); |
| CU_ASSERT(crop_new.c.top+crop_new.c.height <= cropcap.defrect.top+cropcap.defrect.height); |
| } |
| |
| } else { |
| CU_ASSERT_EQUAL(ret_cap, -1); |
| CU_ASSERT_EQUAL(errno_cap, EINVAL); |
| CU_ASSERT_EQUAL(ret_set, -1); |
| CU_ASSERT_EQUAL(errno_set, EINVAL); |
| CU_ASSERT_EQUAL(ret_new, -1); |
| CU_ASSERT_EQUAL(errno_new, EINVAL); |
| |
| } |
| |
| /* | left x */ |
| /* ----+----+--------------------------------------> */ |
| /* | : */ |
| /* top + +-------- crop.c -------------+ ^ */ |
| /* | | : | | */ |
| /* | | : | | */ |
| /* | | : | | */ |
| /* | | :<----| | */ |
| /* | | : | | height */ |
| /* | | : | | */ |
| /* | | : | | */ |
| /* | | : | | */ |
| /* | +-----------------------------+ v */ |
| /* | : : */ |
| /* | <---------- width ------------> */ |
| /* | */ |
| /* v y */ |
| for (i=0; i<cropcap.bounds.width; i++) { |
| memset(&crop, 0xff, sizeof(crop)); |
| crop.type = type; |
| crop.c.left = cropcap.bounds.left; |
| crop.c.top = cropcap.bounds.top; |
| crop.c.width = cropcap.bounds.width-i; |
| crop.c.height = cropcap.bounds.height; |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i, " |
| "crop = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_set, errno_set, |
| crop.type, |
| crop.c.left, |
| crop.c.top, |
| crop.c.width, |
| crop.c.height |
| ); |
| |
| memset(&crop_new, 0, sizeof(crop_new)); |
| crop_new.type = type; |
| ret_new = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop_new); |
| errno_new = errno; |
| dprintf("\t%s:%u: VIDIOC_G_CROP, ret_new=%i, errno_new=%i, " |
| "crop_new = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_new, errno_new, |
| crop_new.type, |
| crop_new.c.left, |
| crop_new.c.top, |
| crop_new.c.width, |
| crop_new.c.height |
| ); |
| |
| if (ret_cap == 0) { |
| CU_ASSERT_EQUAL(ret_cap, 0); |
| CU_ASSERT_EQUAL(ret_set, 0); |
| CU_ASSERT_EQUAL(ret_new, 0); |
| |
| if (ret_cap == 0 && ret_new == 0) { |
| |
| CU_ASSERT(cropcap.defrect.left <= crop_new.c.left); |
| CU_ASSERT(cropcap.defrect.top <= crop_new.c.top); |
| |
| CU_ASSERT(crop_new.c.left+crop_new.c.width <= cropcap.defrect.left+cropcap.defrect.width); |
| CU_ASSERT(crop_new.c.top+crop_new.c.height <= cropcap.defrect.top+cropcap.defrect.height); |
| } |
| |
| } else { |
| CU_ASSERT_EQUAL(ret_cap, -1); |
| CU_ASSERT_EQUAL(errno_cap, EINVAL); |
| CU_ASSERT_EQUAL(ret_set, -1); |
| CU_ASSERT_EQUAL(errno_set, EINVAL); |
| CU_ASSERT_EQUAL(ret_new, -1); |
| CU_ASSERT_EQUAL(errno_new, EINVAL); |
| } |
| } |
| |
| /* | left x */ |
| /* ----+----+--------------------------------------> */ |
| /* | : */ |
| /* top + +---------- crop.c -----------+ ^ */ |
| /* | | | | */ |
| /* | | | | */ |
| /* | | | | */ |
| /* | | | | */ |
| /* | |.............................| | height */ |
| /* | | ^ | | */ |
| /* | | | | | */ |
| /* | | | | | */ |
| /* | +-----------------------------+ v */ |
| /* | : : */ |
| /* | <---------- width ------------> */ |
| /* | */ |
| /* v y */ |
| for (i=0; i<cropcap.bounds.height; i++) { |
| memset(&crop, 0xff, sizeof(crop)); |
| crop.type = type; |
| crop.c.left = cropcap.bounds.left; |
| crop.c.top = cropcap.bounds.top; |
| crop.c.width = cropcap.bounds.width; |
| crop.c.height = cropcap.bounds.height-i; |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i, " |
| "crop = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_set, errno_set, |
| crop.type, |
| crop.c.left, |
| crop.c.top, |
| crop.c.width, |
| crop.c.height |
| ); |
| |
| memset(&crop_new, 0, sizeof(crop_new)); |
| crop_new.type = type; |
| ret_new = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop_new); |
| errno_new = errno; |
| dprintf("\t%s:%u: VIDIOC_G_CROP, ret_new=%i, errno_new=%i, " |
| "crop_new = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_new, errno_new, |
| crop_new.type, |
| crop_new.c.left, |
| crop_new.c.top, |
| crop_new.c.width, |
| crop_new.c.height |
| ); |
| |
| if (ret_cap == 0) { |
| CU_ASSERT_EQUAL(ret_cap, 0); |
| CU_ASSERT_EQUAL(ret_set, 0); |
| CU_ASSERT_EQUAL(ret_new, 0); |
| |
| if (ret_cap == 0 && ret_new == 0) { |
| |
| CU_ASSERT(cropcap.defrect.left <= crop_new.c.left); |
| CU_ASSERT(cropcap.defrect.top <= crop_new.c.top); |
| |
| CU_ASSERT(crop_new.c.left+crop_new.c.width <= cropcap.defrect.left+cropcap.defrect.width); |
| CU_ASSERT(crop_new.c.top+crop_new.c.height <= cropcap.defrect.top+cropcap.defrect.height); |
| } |
| |
| } else { |
| CU_ASSERT_EQUAL(ret_cap, -1); |
| CU_ASSERT_EQUAL(errno_cap, EINVAL); |
| CU_ASSERT_EQUAL(ret_set, -1); |
| CU_ASSERT_EQUAL(errno_set, EINVAL); |
| CU_ASSERT_EQUAL(ret_new, -1); |
| CU_ASSERT_EQUAL(errno_new, EINVAL); |
| } |
| } |
| |
| /* | left x */ |
| /* ----+----+--------------------------------------> */ |
| /* | : */ |
| /* top + +---------- crop.c -----------+ ^ */ |
| /* | | : | | */ |
| /* | | : | | */ |
| /* | | : | | */ |
| /* | |--->: | | */ |
| /* | | : | | height */ |
| /* | | : | | */ |
| /* | | : | | */ |
| /* | | : | | */ |
| /* | +-----------------------------+ v */ |
| /* | : : */ |
| /* | <---------- width ------------> */ |
| /* | */ |
| /* v y */ |
| for (i=0; i<cropcap.bounds.width; i++) { |
| memset(&crop, 0xff, sizeof(crop)); |
| crop.type = type; |
| crop.c.left = cropcap.bounds.left+i; |
| crop.c.top = cropcap.bounds.top; |
| crop.c.width = cropcap.bounds.width-i; |
| crop.c.height = cropcap.bounds.height; |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i, " |
| "crop = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_set, errno_set, |
| crop.type, |
| crop.c.left, |
| crop.c.top, |
| crop.c.width, |
| crop.c.height |
| ); |
| |
| memset(&crop_new, 0, sizeof(crop_new)); |
| crop_new.type = type; |
| ret_new = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop_new); |
| errno_new = errno; |
| dprintf("\t%s:%u: VIDIOC_G_CROP, ret_new=%i, errno_new=%i, " |
| "crop_new = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_new, errno_new, |
| crop_new.type, |
| crop_new.c.left, |
| crop_new.c.top, |
| crop_new.c.width, |
| crop_new.c.height |
| ); |
| |
| if (ret_cap == 0) { |
| CU_ASSERT_EQUAL(ret_cap, 0); |
| CU_ASSERT_EQUAL(ret_set, 0); |
| CU_ASSERT_EQUAL(ret_new, 0); |
| |
| if (ret_cap == 0 && ret_new == 0) { |
| |
| CU_ASSERT(cropcap.defrect.left <= crop_new.c.left); |
| CU_ASSERT(cropcap.defrect.top <= crop_new.c.top); |
| |
| CU_ASSERT(crop_new.c.left+crop_new.c.width <= cropcap.defrect.left+cropcap.defrect.width); |
| CU_ASSERT(crop_new.c.top+crop_new.c.height <= cropcap.defrect.top+cropcap.defrect.height); |
| } |
| |
| } else { |
| CU_ASSERT_EQUAL(ret_cap, -1); |
| CU_ASSERT_EQUAL(errno_cap, EINVAL); |
| CU_ASSERT_EQUAL(ret_set, -1); |
| CU_ASSERT_EQUAL(errno_set, EINVAL); |
| CU_ASSERT_EQUAL(ret_new, -1); |
| CU_ASSERT_EQUAL(errno_new, EINVAL); |
| } |
| } |
| |
| /* | left x */ |
| /* ----+----+--------------------------------------> */ |
| /* | : */ |
| /* top + +---------- crop.c -----------+ ^ */ |
| /* | | | | | */ |
| /* | | | | | */ |
| /* | | v | | */ |
| /* | |.............................| | */ |
| /* | | | | height */ |
| /* | | | | */ |
| /* | | | | */ |
| /* | | | | */ |
| /* | +-----------------------------+ v */ |
| /* | : : */ |
| /* | <---------- width ------------> */ |
| /* | */ |
| /* v y */ |
| for (i=0; i<cropcap.bounds.height; i++) { |
| memset(&crop, 0xff, sizeof(crop)); |
| crop.type = type; |
| crop.c.left = cropcap.bounds.left; |
| crop.c.top = cropcap.bounds.top+i; |
| crop.c.width = cropcap.bounds.width; |
| crop.c.height = cropcap.bounds.height-i; |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i, " |
| "crop = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_set, errno_set, |
| crop.type, |
| crop.c.left, |
| crop.c.top, |
| crop.c.width, |
| crop.c.height |
| ); |
| |
| memset(&crop_new, 0, sizeof(crop_new)); |
| crop_new.type = type; |
| ret_new = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop_new); |
| errno_new = errno; |
| dprintf("\t%s:%u: VIDIOC_G_CROP, ret_new=%i, errno_new=%i, " |
| "crop_new = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_new, errno_new, |
| crop_new.type, |
| crop_new.c.left, |
| crop_new.c.top, |
| crop_new.c.width, |
| crop_new.c.height |
| ); |
| |
| if (ret_cap == 0) { |
| CU_ASSERT_EQUAL(ret_cap, 0); |
| CU_ASSERT_EQUAL(ret_set, 0); |
| CU_ASSERT_EQUAL(ret_new, 0); |
| |
| if (ret_cap == 0 && ret_new == 0) { |
| |
| CU_ASSERT(cropcap.defrect.left <= crop_new.c.left); |
| CU_ASSERT(cropcap.defrect.top <= crop_new.c.top); |
| |
| CU_ASSERT(crop_new.c.left+crop_new.c.width <= cropcap.defrect.left+cropcap.defrect.width); |
| CU_ASSERT(crop_new.c.top+crop_new.c.height <= cropcap.defrect.top+cropcap.defrect.height); |
| } |
| |
| } else { |
| CU_ASSERT_EQUAL(ret_cap, -1); |
| CU_ASSERT_EQUAL(errno_cap, EINVAL); |
| CU_ASSERT_EQUAL(ret_set, -1); |
| CU_ASSERT_EQUAL(errno_set, EINVAL); |
| CU_ASSERT_EQUAL(ret_new, -1); |
| CU_ASSERT_EQUAL(errno_new, EINVAL); |
| } |
| } |
| |
| if (ret_orig == 0) { |
| /* it shall be possible to restore the original settings */ |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop_orig); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i\n", |
| __FILE__, __LINE__, ret_set, errno_set); |
| CU_ASSERT_EQUAL(ret_set, 0); |
| } |
| } |
| |
| void test_VIDIOC_S_CROP() { |
| |
| do_set_crop(V4L2_BUF_TYPE_VIDEO_CAPTURE); |
| do_set_crop(V4L2_BUF_TYPE_VIDEO_OUTPUT); |
| do_set_crop(V4L2_BUF_TYPE_VIDEO_OVERLAY); |
| do_set_crop(V4L2_BUF_TYPE_PRIVATE); |
| |
| } |
| |
| void do_set_crop_invalid(enum v4l2_buf_type type) { |
| int ret_set, errno_set; |
| int ret_new, errno_new; |
| int ret_cap, errno_cap; |
| struct v4l2_crop crop; |
| struct v4l2_crop crop_new; |
| struct v4l2_cropcap cropcap; |
| |
| memset(&cropcap, 0, sizeof(cropcap)); |
| cropcap.type = type; |
| ret_cap = ioctl(get_video_fd(), VIDIOC_CROPCAP, &cropcap); |
| errno_cap = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_CROPCAP, ret_cap=%i, errno_cap=%i, cropcap = { .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", |
| __FILE__, __LINE__, |
| ret_cap, errno_cap, |
| 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 |
| ); |
| |
| memset(&crop, 0xff, sizeof(crop)); |
| crop.type = type; |
| crop.c = cropcap.bounds; |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i, " |
| "crop = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_set, errno_set, |
| crop.type, |
| crop.c.left, |
| crop.c.top, |
| crop.c.width, |
| crop.c.height |
| ); |
| |
| memset(&crop_new, 0, sizeof(crop_new)); |
| crop_new.type = type; |
| ret_new = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop_new); |
| errno_new = errno; |
| dprintf("\t%s:%u: VIDIOC_G_CROP, ret_new=%i, errno_new=%i, " |
| "crop_new = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_new, errno_new, |
| crop_new.type, |
| crop_new.c.left, |
| crop_new.c.top, |
| crop_new.c.width, |
| crop_new.c.height |
| ); |
| |
| CU_ASSERT_EQUAL(ret_cap, -1); |
| CU_ASSERT_EQUAL(errno_cap, EINVAL); |
| CU_ASSERT_EQUAL(ret_set, -1); |
| CU_ASSERT_EQUAL(errno_set, EINVAL); |
| CU_ASSERT_EQUAL(ret_new, -1); |
| CU_ASSERT_EQUAL(errno_new, EINVAL); |
| |
| } |
| |
| void test_VIDIOC_S_CROP_invalid() { |
| do_set_crop_invalid(0); |
| do_set_crop_invalid(V4L2_BUF_TYPE_VBI_CAPTURE); |
| do_set_crop_invalid(V4L2_BUF_TYPE_VBI_OUTPUT); |
| do_set_crop_invalid(V4L2_BUF_TYPE_SLICED_VBI_CAPTURE); |
| do_set_crop_invalid(V4L2_BUF_TYPE_SLICED_VBI_OUTPUT); |
| do_set_crop_invalid(V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY); |
| do_set_crop_invalid(V4L2_BUF_TYPE_PRIVATE); |
| do_set_crop_invalid(S32_MAX); |
| do_set_crop_invalid( ((__u32)S32_MAX)+1 ); |
| do_set_crop_invalid(U32_MAX); |
| } |
| |
| void do_set_crop_null(enum v4l2_buf_type type) { |
| int ret_orig, errno_orig; |
| int ret_set, errno_set; |
| int ret_cap, errno_cap; |
| int ret_null, errno_null; |
| struct v4l2_crop crop; |
| struct v4l2_crop crop_orig; |
| struct v4l2_cropcap cropcap; |
| |
| memset(&crop_orig, 0, sizeof(crop_orig)); |
| crop_orig.type = type; |
| ret_orig = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop_orig); |
| errno_orig = errno; |
| dprintf("\t%s:%u: VIDIOC_G_CROP, ret_orig=%i, errno_orig=%i, " |
| "crop_orig = { .type=%i, .c={ .left=%i, .top=%i, .width=%i, .height=%i }}\n", |
| __FILE__, __LINE__, |
| ret_orig, errno_orig, |
| crop_orig.type, |
| crop_orig.c.left, |
| crop_orig.c.top, |
| crop_orig.c.width, |
| crop_orig.c.height |
| ); |
| |
| memset(&cropcap, 0, sizeof(cropcap)); |
| cropcap.type = type; |
| ret_cap = ioctl(get_video_fd(), VIDIOC_CROPCAP, &cropcap); |
| errno_cap = errno; |
| |
| dprintf("\t%s:%u: VIDIOC_CROPCAP, ret_cap=%i, errno_cap=%i, cropcap = { .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", |
| __FILE__, __LINE__, |
| ret_cap, errno_cap, |
| 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 |
| ); |
| |
| memset(&crop, 0, sizeof(crop)); |
| crop.type = type; |
| crop.c = cropcap.bounds; |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i\n", |
| __FILE__, __LINE__, ret_set, errno_set); |
| |
| ret_null = ioctl(get_video_fd(), VIDIOC_S_CROP, NULL); |
| errno_null = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_null=%i, errno_null=%i\n", |
| __FILE__, __LINE__, ret_null, errno_null); |
| |
| if (ret_set == 0) { |
| CU_ASSERT_EQUAL(ret_set, 0); |
| CU_ASSERT_EQUAL(ret_null, -1); |
| CU_ASSERT_EQUAL(errno_null, EFAULT); |
| |
| } else { |
| CU_ASSERT_EQUAL(ret_set, -1); |
| CU_ASSERT_EQUAL(errno_set, EINVAL); |
| CU_ASSERT_EQUAL(ret_null, -1); |
| CU_ASSERT_EQUAL(errno_null, EINVAL); |
| |
| } |
| |
| if (ret_orig == 0) { |
| /* it shall be possible to restore the original settings */ |
| ret_set = ioctl(get_video_fd(), VIDIOC_S_CROP, &crop_orig); |
| errno_set = errno; |
| dprintf("\t%s:%u: VIDIOC_S_CROP, ret_set=%i, errno_set=%i\n", |
| __FILE__, __LINE__, ret_set, errno_set); |
| CU_ASSERT_EQUAL(ret_set, 0); |
| } |
| |
| } |
| |
| void test_VIDIOC_S_CROP_NULL() { |
| |
| do_set_crop_null(V4L2_BUF_TYPE_VIDEO_CAPTURE); |
| do_set_crop_null(V4L2_BUF_TYPE_VIDEO_OUTPUT); |
| do_set_crop_null(V4L2_BUF_TYPE_VIDEO_OVERLAY); |
| do_set_crop_null(V4L2_BUF_TYPE_PRIVATE); |
| |
| } |