v4l2-compliance: bypass libv4l2 for expbuf handling.
authorHans Verkuil <hans.verkuil@cisco.com>
Sun, 23 Feb 2014 09:58:27 +0000 (10:58 +0100)
committerHans Verkuil <hans.verkuil@cisco.com>
Mon, 24 Feb 2014 15:41:02 +0000 (16:41 +0100)
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 <hans.verkuil@cisco.com>
utils/v4l2-compliance/v4l2-compliance.cpp
utils/v4l2-compliance/v4l2-compliance.h
utils/v4l2-compliance/v4l2-test-buffers.cpp

index f317138..a0fbd89 100644 (file)
@@ -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);
index 2f78ec6..75635a3 100644 (file)
@@ -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);
index 4d74db3..c1ee33d 100644 (file)
@@ -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;
 }