From: Hans Verkuil Date: Sun, 23 Feb 2014 09:58:27 +0000 (+0100) Subject: v4l2-compliance: bypass libv4l2 for expbuf handling. X-Git-Tag: v4l-utils-1.2.0~181 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=26a1eb6a56035ceb0867779f240bdcbad55f89e3;p=platform%2Fupstream%2Fv4l-utils.git v4l2-compliance: bypass libv4l2 for expbuf handling. You don't want to go through libv4l2 for calling VIDIOC_EXPBUF, just use the low-level ioctl call for this. Also add a missing close() for the expbuf node. Signed-off-by: Hans Verkuil --- diff --git a/utils/v4l2-compliance/v4l2-compliance.cpp b/utils/v4l2-compliance/v4l2-compliance.cpp index f317138..a0fbd89 100644 --- a/utils/v4l2-compliance/v4l2-compliance.cpp +++ b/utils/v4l2-compliance/v4l2-compliance.cpp @@ -121,13 +121,17 @@ static void usage(void) exit(0); } -int doioctl_name(struct node *node, unsigned long int request, void *parm, const char *name) +int doioctl_name(struct node *node, unsigned long int request, void *parm, + const char *name, bool no_wrapper) { int retval; int e; errno = 0; - retval = test_ioctl(node->fd, request, parm); + if (no_wrapper) + retval = ioctl(node->fd, request, parm); + else + retval = test_ioctl(node->fd, request, parm); e = errno; if (options[OptTrace]) printf("\t\t%s returned %d (%s)\n", name, retval, strerror(e)); @@ -834,6 +838,8 @@ int main(int argc, char **argv) test_close(node.fd); if (node.node2) test_close(node.node2->fd); + if (expbuf_device) + close(expbuf_node.fd); printf("Total: %d, Succeeded: %d, Failed: %d, Warnings: %d\n", tests_total, tests_ok, tests_total - tests_ok, warnings); exit(app_result); diff --git a/utils/v4l2-compliance/v4l2-compliance.h b/utils/v4l2-compliance/v4l2-compliance.h index 2f78ec6..75635a3 100644 --- a/utils/v4l2-compliance/v4l2-compliance.h +++ b/utils/v4l2-compliance/v4l2-compliance.h @@ -138,8 +138,10 @@ static inline double fract2f(const struct v4l2_fract *f) return (double)f->numerator / (double)f->denominator; } -int doioctl_name(struct node *node, unsigned long int request, void *parm, const char *name); +int doioctl_name(struct node *node, unsigned long int request, void *parm, + const char *name, bool no_wrapper = false); #define doioctl(n, r, p) doioctl_name(n, r, p, #r) +#define doioctl_no_wrap(n, r, p) doioctl_name(n, r, p, #r, true) std::string cap2s(unsigned cap); std::string buftype2s(int type); diff --git a/utils/v4l2-compliance/v4l2-test-buffers.cpp b/utils/v4l2-compliance/v4l2-test-buffers.cpp index 4d74db3..c1ee33d 100644 --- a/utils/v4l2-compliance/v4l2-test-buffers.cpp +++ b/utils/v4l2-compliance/v4l2-test-buffers.cpp @@ -1116,7 +1116,7 @@ static int setupDmaBuf(struct node *expbuf_node, struct node *node, expbuf_bufs.count = bufs.count; expbuf_bufs.memory = V4L2_MEMORY_MMAP; expbuf_bufs.type = expbuf_type; - fail_on_test(doioctl(expbuf_node, VIDIOC_REQBUFS, &expbuf_bufs)); + fail_on_test(doioctl_no_wrap(expbuf_node, VIDIOC_REQBUFS, &expbuf_bufs)); fail_on_test(expbuf_bufs.count < bufs.count); memset(&expbuf_buf, 0, sizeof(expbuf_buf)); @@ -1126,7 +1126,7 @@ static int setupDmaBuf(struct node *expbuf_node, struct node *node, expbuf_buf.m.planes = expbuf_planes; expbuf_buf.length = VIDEO_MAX_PLANES; } - fail_on_test(doioctl(expbuf_node, VIDIOC_QUERYBUF, &expbuf_buf)); + fail_on_test(doioctl_no_wrap(expbuf_node, VIDIOC_QUERYBUF, &expbuf_buf)); for (unsigned i = 0; i < bufs.count; i++) { struct v4l2_plane planes[VIDEO_MAX_PLANES]; @@ -1166,7 +1166,7 @@ static int setupDmaBuf(struct node *expbuf_node, struct node *node, expbuf.index = i; expbuf.plane = p; expbuf.flags = O_RDWR; - fail_on_test(doioctl(expbuf_node, VIDIOC_EXPBUF, &expbuf)); + fail_on_test(doioctl_no_wrap(expbuf_node, VIDIOC_EXPBUF, &expbuf)); dmabufs[i][p] = expbuf.fd; @@ -1316,7 +1316,7 @@ int testDmaBuf(struct node *expbuf_node, struct node *node, unsigned frame_count memset(&expbuf_bufs, 0, sizeof(expbuf_bufs)); expbuf_bufs.memory = V4L2_MEMORY_MMAP; expbuf_bufs.type = expbuf_type; - fail_on_test(doioctl(expbuf_node, VIDIOC_REQBUFS, &expbuf_bufs)); + fail_on_test(doioctl_no_wrap(expbuf_node, VIDIOC_REQBUFS, &expbuf_bufs)); } return 0; }