Hi,

here is the v4l-test 0.14 version also.

Changes:
 Test cases added for VIDIOC_QUERYBUF;
 Debug functions separated

Signed-off-by: Márton Németh <[email protected]>

Regards,

        Márton Németh
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/doc/index.html ltp/testcases/kernel/device-drivers/v4l/user_space/doc/index.html
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/doc/index.html	2009-05-08 07:38:26.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/doc/index.html	2009-05-07 22:51:14.000000000 +0200
@@ -2,7 +2,7 @@
 <html>
 <head>
   <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
-  <title>v4l-test: Test environment for Video For Linux Two API</title>
+  <title>v4l-test: Test environment for Video For Linux Two (V4L2) API</title>
 </head>
 <body>
 <p>
@@ -18,7 +18,7 @@
 </p>
 <hr style="width: 100%; height: 2px;">
 
-<h1>v4l-test: Test environment for Video For Linux Two API</h1>
+<h1>v4l-test: Test environment for Video For Linux Two (V4L2) API</h1>
 <p>
 Download <a href="http://sourceforge.net/project/showfiles.php?group_id=247983";>v4l-test</a>
 or visit <a href="http://sourceforge.net/projects/v4l-test/";>v4l-test project page</a> at
@@ -390,7 +390,7 @@ implemented test cases.</p>
     </tr>
     <tr>
       <td>ioctl <a href="spec/r13022.htm">VIDIOC_QUERYBUF</a></td>
-      <td>no</td>
+      <td>yes, only when STREAM_OFF</td>
       <td>Opt.</td>
     </tr>
     <tr>
@@ -480,6 +480,10 @@ There migth be similar projects which al
 So far I could find the following:
 </p>
 <ul>
+  <li>A <a href="http://www.linuxtv.org/wiki/index.php/V4L_Test_Suite";>
+  list of V4L and V4L2 test drivers and applications</a> at
+  <a href="http://www.linuxtv.org/wiki/index.php/Main_Page";>LinuxTV Wiki</a>
+  </li>
   <li><a href="http://www.linuxowl.com/v4ltest.html";>v4ltest</a><br>
   </li>
   <li>test cases in <a href="http://linuxtv.org/hg/dvb-apps/file";>dvb-apps repository</a>, under /test directory
@@ -516,7 +520,7 @@ The following documents and articles are
 <p>Any feedbacks, comments, ideas, etc. are welcome at the author's email address.</p>
 <hr style="width: 100%; height: 2px;">
 <p>Last changed:
-Wed Apr 29 20:39:28 CEST 2009
+Thu May  7 22:51:07 CEST 2009
 </p>
 <p>
   <a href="http://validator.w3.org/check?uri=referer";><img
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/doc/results.html ltp/testcases/kernel/device-drivers/v4l/user_space/doc/results.html
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/doc/results.html	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/doc/results.html	2009-04-29 21:22:49.000000000 +0200
@@ -49,10 +49,23 @@ project or during developing it.
 	</li>
 
 	<li>
-	<a href="http://lkml.org/lkml/2009/4/18/104";>
+	<a href="http://marc.info/?l=linux-kernel&amp;m=124022459714644&amp;w=2";>
 	[PATCH]: uvcvideo: fill reserved fields with zero of VIDIOC_QUERYMENU
 	</a>
 	</li>
+
+	<li>
+	<a href="http://marc.info/?l=linux-kernel&amp;m=124103154820106&amp;w=2";>
+	[PATCH] v4l2: modify return value of VIDIOC_REQBUFS ioctl
+	</a>
+	</li>
+
+	<li>
+	<a href="http://marc.info/?l=linux-kernel&amp;m=124103154820111&amp;w=2";>
+	[PATCH] v4l2: fill the reserved fields of VIDIOC_REQBUFS ioctl
+	</a>
+	</li>
+
 </ul>
 
 <p>In the out-of-tree <a href="http://mcentral.de/hg/~mrec/em28xx-new";>em28xx-new driver</a>
@@ -81,7 +94,7 @@ the following problems were identified w
 
 <hr style="width: 100%; height: 2px;">
 <p>Last changed:
-Sun Apr 19 13:03:50 CEST 2009
+Wed Apr 29 21:21:38 CEST 2009
 </p>
 <p>
   <a href="http://validator.w3.org/check?uri=referer";><img
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/Makefile ltp/testcases/kernel/device-drivers/v4l/user_space/Makefile
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/Makefile	2009-05-08 07:38:26.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/Makefile	2009-05-07 21:22:50.000000000 +0200
@@ -1,6 +1,8 @@
 #
 # v4l-test: Test environment for Video For Linux Two API
 #
+#  7 May 2009  0.16 v4l2_show.c added
+#  5 May 2009  0.15 test_VIDIOC_QUERYBUF.c added
 # 25 Apr 2009  0.14 test_VIDIOC_REQBUFS.c added
 #  5 Apr 2009  0.13 test_VIDIOC_QUERYMENU.c added
 #  4 Apr 2009  0.12 test_VIDIOC_FMT.c added
@@ -62,7 +64,9 @@ OBJS = dev_video.o \
        test_VIDIOC_PARM.o \
        test_VIDIOC_FMT.o \
        test_VIDIOC_REQBUFS.o \
+       test_VIDIOC_QUERYBUF.o \
        test_invalid_ioctl.o \
+       v4l2_show.o \
        v4l2_test.o
 
 all: $(OBJS)
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/README ltp/testcases/kernel/device-drivers/v4l/user_space/README
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/README	2009-05-08 07:38:26.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/README	2009-05-07 22:53:53.000000000 +0200
@@ -3,6 +3,8 @@
 
 Release History
 ---------------
+ 7 May 2009  0.14 Test cases added for VIDIOC_QUERYBUF;
+                  Debug functions separated
 29 Apr 2009  0.13 Added string content validation;
                   Test cases added for VIDIOC_REQBUFS
 19 Apr 2009  0.12 Test cases added for VIDIOC_S_FMT;
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYBUF.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYBUF.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYBUF.c	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYBUF.c	2009-05-07 21:20:50.000000000 +0200
@@ -0,0 +1,427 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ *  5 May 2009  0.1  First release
+ *
+ * Written by Márton Németh <[email protected]>
+ * 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 "v4l2_show.h"
+#include "dev_video.h"
+#include "video_limits.h"
+
+#include "test_VIDIOC_REQBUFS.h"
+
+static void do_VIDIOC_QUERYBUF(enum v4l2_memory memory,
+		enum v4l2_buf_type type, __u32 count, int expected_ret_req) {
+	int ret_req, errno_req;
+	int ret_query, errno_query;
+	struct v4l2_requestbuffers reqbuf;
+	struct v4l2_buffer buf;
+	__u32 i;
+	unsigned int j;
+	const enum v4l2_buf_type buffer_types[] = {
+		0,
+		V4L2_BUF_TYPE_VIDEO_CAPTURE,
+		V4L2_BUF_TYPE_VIDEO_OUTPUT,
+		V4L2_BUF_TYPE_VIDEO_OVERLAY,
+		V4L2_BUF_TYPE_VBI_CAPTURE,
+		V4L2_BUF_TYPE_VBI_OUTPUT,
+		V4L2_BUF_TYPE_SLICED_VBI_CAPTURE,
+		V4L2_BUF_TYPE_SLICED_VBI_OUTPUT,
+		V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY,
+		V4L2_BUF_TYPE_PRIVATE-1,
+		V4L2_BUF_TYPE_PRIVATE,
+		V4L2_BUF_TYPE_PRIVATE+1,
+		S32_MAX,
+		(__s32)((__u32)S32_MAX+1),
+		U32_MAX-1,
+		U32_MAX
+	};
+
+	memset(&reqbuf, 0, sizeof(reqbuf));
+	reqbuf.count = count;
+	reqbuf.type = type;
+	reqbuf.memory = memory;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	if (expected_ret_req == 0) {
+		CU_ASSERT_EQUAL(ret_req, 0);
+	} else {
+		CU_ASSERT_EQUAL(ret_req, -1);
+		CU_ASSERT_EQUAL(errno_req, EINVAL);
+	}
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, type=%i, memory=%i, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, count, type, memory, ret_req, errno_req);
+
+	if (ret_req == 0) {
+		show_v4l2_requestbuffers(&reqbuf);
+	}
+
+	if (ret_req != 0) {
+		reqbuf.count = 0;
+	}
+
+	for (i = 0; i < reqbuf.count; i++) {
+		memset(&buf, 0xff, sizeof(buf));
+		buf.type = type;
+		buf.index = i;
+
+		ret_query = ioctl(get_video_fd(), VIDIOC_QUERYBUF, &buf);
+		errno_query = errno;
+
+		CU_ASSERT_EQUAL(buf.index, i);
+		CU_ASSERT_EQUAL(buf.type, type);
+		//CU_ASSERT_EQUAL(buf.bytesused, ???);
+		CU_ASSERT_EQUAL(buf.flags & ~(V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE), 0);
+		//CU_ASSERT_EQUAL(buf.field, ???);
+		//CU_ASSERT_EQUAL(buf.timestamp.tv_sec, ???);
+		//CU_ASSERT_EQUAL(buf.timestamp.tv_usec, ???);
+		//CU_ASSERT_EQUAL(buf.timecode.type, ???);
+		//CU_ASSERT_EQUAL(buf.timecode.flags, ???);
+		//CU_ASSERT_EQUAL(buf.timecode.frames, ???);
+		//CU_ASSERT_EQUAL(buf.timecode.seconds, ???);
+		//CU_ASSERT_EQUAL(buf.timecode.minutes, ???);
+		//CU_ASSERT_EQUAL(buf.timecode.hours, ???);
+		//CU_ASSERT_EQUAL(buf.timecode.userbits[0], ???);
+		//CU_ASSERT_EQUAL(buf.timecode.userbits[1], ???);
+		//CU_ASSERT_EQUAL(buf.timecode.userbits[2], ???);
+		//CU_ASSERT_EQUAL(buf.timecode.userbits[3], ???);
+		//CU_ASSERT_EQUAL(buf.sequence, ???);
+		CU_ASSERT_EQUAL(buf.memory, memory);
+		//CU_ASSERT_EQUAL(buf.m.userptr, ???);
+		//CU_ASSERT_EQUAL(buf.m.offset, ???);
+		CU_ASSERT(0 < buf.length);
+		//CU_ASSERT_EQUAL(buf.input, ???);
+		CU_ASSERT_EQUAL(buf.reserved, 0);
+
+		dprintf("\t%s:%u: VIDIOC_QUERYBUF, type=%i, index=%u, ret_query=%i, errno_query=%i\n",
+			__FILE__, __LINE__, buf.type, buf.index, ret_query, errno_query);
+		if (ret_query == 0)
+			show_v4l2_buffer(&buf);
+
+	}
+
+	/* Check for not buffer types which do not match the VIDIOC_REQBUF
+	 * buffer type
+	 */
+	for (i = 0; i < reqbuf.count; i++) {
+		for (j = 0; j < sizeof(buffer_types)/sizeof(*buffer_types); j++) {
+			if (buffer_types[j] != type) {
+				memset(&buf, 0xff, sizeof(buf));
+				buf.type = buffer_types[j];
+				buf.index = i;
+
+				ret_query = ioctl(get_video_fd(), VIDIOC_QUERYBUF, &buf);
+				errno_query = errno;
+
+				CU_ASSERT_EQUAL(ret_query, -1);
+				CU_ASSERT_EQUAL(errno_query, EINVAL);
+
+				dprintf("\t%s:%u: VIDIOC_QUERYBUF, type=%i, index=%u, ret_query=%i, errno_query=%i\n",
+					__FILE__, __LINE__, buf.type, buf.index, ret_query, errno_query);
+				if (ret_query == 0)
+					show_v4l2_buffer(&buf);
+			}
+		}
+	}
+
+	memset(&buf, 0xff, sizeof(buf));
+	buf.type = type;
+	buf.index = reqbuf.count;
+
+	ret_query = ioctl(get_video_fd(), VIDIOC_QUERYBUF, &buf);
+	errno_query = errno;
+
+	dprintf("\t%s:%u: VIDIOC_QUERYBUF, type=%i, index=%u, ret_query=%i, errno_query=%i\n",
+		__FILE__, __LINE__, buf.type, buf.index, ret_query, errno_query);
+
+	CU_ASSERT_EQUAL(ret_query, -1);
+	CU_ASSERT_EQUAL(errno_query, EINVAL);
+
+	if (reqbuf.count < (__u32)S16_MIN) {
+		memset(&buf, 0xff, sizeof(buf));
+		buf.type = type;
+		buf.index = (__u32)S16_MIN;
+
+		ret_query = ioctl(get_video_fd(), VIDIOC_QUERYBUF, &buf);
+		errno_query = errno;
+
+		dprintf("\t%s:%u: VIDIOC_QUERYBUF, type=%i, index=%u, ret_query=%i, errno_query=%i\n",
+			__FILE__, __LINE__, buf.type, buf.index, ret_query, errno_query);
+
+		CU_ASSERT_EQUAL(ret_query, -1);
+		CU_ASSERT_EQUAL(errno_query, EINVAL);
+	}
+
+	if (reqbuf.count < (__u32)S16_MAX) {
+		memset(&buf, 0xff, sizeof(buf));
+		buf.type = type;
+		buf.index = (__u32)S16_MAX;
+
+		ret_query = ioctl(get_video_fd(), VIDIOC_QUERYBUF, &buf);
+		errno_query = errno;
+
+		dprintf("\t%s:%u: VIDIOC_QUERYBUF, type=%i, index=%u, ret_query=%i, errno_query=%i\n",
+			__FILE__, __LINE__, buf.type, buf.index, ret_query, errno_query);
+
+		CU_ASSERT_EQUAL(ret_query, -1);
+		CU_ASSERT_EQUAL(errno_query, EINVAL);
+	}
+
+	if (reqbuf.count < U32_MAX) {
+		memset(&buf, 0xff, sizeof(buf));
+		buf.type = type;
+		buf.index = U32_MAX;
+
+		ret_query = ioctl(get_video_fd(), VIDIOC_QUERYBUF, &buf);
+		errno_query = errno;
+
+		dprintf("\t%s:%u: VIDIOC_QUERYBUF, type=%i, index=%u, ret_query=%i, errno_query=%i\n",
+			__FILE__, __LINE__, buf.type, buf.index, ret_query, errno_query);
+
+		CU_ASSERT_EQUAL(ret_query, -1);
+		CU_ASSERT_EQUAL(errno_query, EINVAL);
+	}
+
+
+
+	memset(&reqbuf, 0, sizeof(reqbuf));
+	reqbuf.count = 0;
+	reqbuf.type = type;
+	reqbuf.memory = V4L2_MEMORY_MMAP;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, count, ret_req, errno_req);
+
+	if (expected_ret_req == 0) {
+		CU_ASSERT_EQUAL(ret_req, 0);
+	} else {
+		CU_ASSERT_EQUAL(ret_req, -1);
+		CU_ASSERT_EQUAL(errno_req, EINVAL);
+	}
+	if (ret_req == 0) {
+		show_v4l2_requestbuffers(&reqbuf);
+	}
+}
+
+void test_VIDIOC_QUERYBUF_capture_mmap() {
+	int ret_cap, errno_cap;
+	struct v4l2_capability cap;
+	int expected_ret_req;
+
+	memset(&cap, 0, sizeof(cap));
+
+	ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap);
+	errno_cap = errno;
+
+	if (ret_cap == 0 &&
+	    (cap.capabilities & V4L2_CAP_STREAMING) &&
+	    (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
+		expected_ret_req = 0;
+	} else {
+		expected_ret_req = -1;
+	}
+
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_CAPTURE, 0, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_CAPTURE, 1, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_CAPTURE, 2, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_CAPTURE, 3, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_CAPTURE, 4, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_CAPTURE, (__u32)S16_MIN, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_CAPTURE, (__u32)S16_MAX, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_CAPTURE, U32_MAX, expected_ret_req);
+}
+
+void test_VIDIOC_QUERYBUF_capture_userptr() {
+	int ret_cap, errno_cap;
+	int ret_req, errno_req;
+	struct v4l2_capability cap;
+	struct v4l2_requestbuffers reqbuf;
+	int expected_ret_req;
+
+	memset(&cap, 0, sizeof(cap));
+
+	ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap);
+	errno_cap = errno;
+
+	memset(&reqbuf, 0, sizeof(reqbuf));
+	reqbuf.count = 2;
+	reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+	reqbuf.memory = V4L2_MEMORY_USERPTR;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, reqbuf.count, ret_req, errno_req);
+
+	if (ret_cap == 0 &&
+	    (cap.capabilities & V4L2_CAP_STREAMING) &&
+	    (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) &&
+	    ret_req == 0) {
+		expected_ret_req = 0;
+	} else {
+		expected_ret_req = -1;
+	}
+
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_CAPTURE, 0, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_CAPTURE, 1, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_CAPTURE, 2, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_CAPTURE, 3, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_CAPTURE, 4, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_CAPTURE, (__u32)S16_MIN, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_CAPTURE, (__u32)S16_MAX, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_CAPTURE, U32_MAX, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_CAPTURE, 0, expected_ret_req);
+}
+
+void test_VIDIOC_QUERYBUF_output_mmap() {
+	int ret_cap, errno_cap;
+	struct v4l2_capability cap;
+	int expected_ret_req;
+
+	memset(&cap, 0, sizeof(cap));
+
+	ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap);
+	errno_cap = errno;
+
+	if (ret_cap == 0 &&
+	    (cap.capabilities & V4L2_CAP_STREAMING) &&
+	    (cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) {
+		expected_ret_req = 0;
+	} else {
+		expected_ret_req = -1;
+	}
+
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT, 1, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT, 2, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT, 3, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT, 4, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT, (__u32)S16_MIN, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT, (__u32)S16_MAX, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT, U32_MAX, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0, expected_ret_req);
+}
+
+void test_VIDIOC_QUERYBUF_output_userptr() {
+	int ret_cap, errno_cap;
+	int ret_req, errno_req;
+	struct v4l2_capability cap;
+	struct v4l2_requestbuffers reqbuf;
+	int expected_ret_req;
+
+	memset(&cap, 0, sizeof(cap));
+
+	ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap);
+	errno_cap = errno;
+
+	memset(&reqbuf, 0, sizeof(reqbuf));
+	reqbuf.count = 2;
+	reqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+	reqbuf.memory = V4L2_MEMORY_USERPTR;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, reqbuf.count, ret_req, errno_req);
+
+	if (ret_cap == 0 &&
+	    (cap.capabilities & V4L2_CAP_STREAMING) &&
+	    (cap.capabilities & V4L2_CAP_VIDEO_OUTPUT) &&
+	    ret_req == 0) {
+		expected_ret_req = 0;
+	} else {
+		expected_ret_req = -1;
+	}
+
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT, 1, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT, 2, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT, 3, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT, 4, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT, (__u32)S16_MIN, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT, (__u32)S16_MAX, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT, U32_MAX, expected_ret_req);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0, expected_ret_req);
+}
+
+void test_VIDIOC_QUERYBUF_overlay_capture() {
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_OVERLAY, V4L2_BUF_TYPE_VIDEO_CAPTURE, 2, -1);
+}
+
+void test_VIDIOC_QUERYBUF_overlay_output() {
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_OVERLAY, V4L2_BUF_TYPE_VIDEO_OUTPUT, 2, -1);
+}
+
+void test_VIDIOC_QUERYBUF_invalid_memory_capture() {
+	do_VIDIOC_QUERYBUF(SINT_MIN, V4L2_BUF_TYPE_VIDEO_CAPTURE, 2, -1);
+	do_VIDIOC_QUERYBUF(0, V4L2_BUF_TYPE_VIDEO_CAPTURE, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_OVERLAY+1, V4L2_BUF_TYPE_VIDEO_CAPTURE, 2, -1);
+	do_VIDIOC_QUERYBUF(SINT_MAX, V4L2_BUF_TYPE_VIDEO_CAPTURE, 2, -1);
+}
+
+void test_VIDIOC_QUERYBUF_invalid_memory_output() {
+	do_VIDIOC_QUERYBUF(SINT_MIN, V4L2_BUF_TYPE_VIDEO_OUTPUT, 2, -1);
+	do_VIDIOC_QUERYBUF(0, V4L2_BUF_TYPE_VIDEO_OUTPUT, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_OVERLAY+1, V4L2_BUF_TYPE_VIDEO_OUTPUT, 2, -1);
+	do_VIDIOC_QUERYBUF(SINT_MAX, V4L2_BUF_TYPE_VIDEO_OUTPUT, 2, -1);
+}
+
+void test_VIDIOC_QUERYBUF_invalid_type_mmap() {
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, 0, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OVERLAY, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VBI_CAPTURE, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VBI_OUTPUT, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_SLICED_VBI_CAPTURE, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_SLICED_VBI_OUTPUT, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_PRIVATE-1, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_PRIVATE, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_PRIVATE+1, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, S32_MAX, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, (__s32)((__u32)S32_MAX+1), 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, U32_MAX-1, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_MMAP, U32_MAX, 2, -1);
+}
+
+void test_VIDIOC_QUERYBUF_invalid_type_userptr() {
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, 0, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OVERLAY, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VBI_CAPTURE, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VBI_OUTPUT, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_SLICED_VBI_CAPTURE, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_SLICED_VBI_OUTPUT, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_PRIVATE-1, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_PRIVATE, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_PRIVATE+1, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, S32_MAX, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, (__s32)((__u32)S32_MAX+1), 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, U32_MAX-1, 2, -1);
+	do_VIDIOC_QUERYBUF(V4L2_MEMORY_USERPTR, U32_MAX, 2, -1);
+}
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYBUF.h ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYBUF.h
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYBUF.h	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYBUF.h	2009-05-05 22:53:14.000000000 +0200
@@ -0,0 +1,19 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ *  5 May 2009  0.1  First release
+ *
+ * Written by Márton Németh <[email protected]>
+ * Released under GPL
+ */
+
+void test_VIDIOC_QUERYBUF_capture_mmap(void);
+void test_VIDIOC_QUERYBUF_capture_userptr(void);
+void test_VIDIOC_QUERYBUF_output_mmap(void);
+void test_VIDIOC_QUERYBUF_output_userptr(void);
+void test_VIDIOC_QUERYBUF_overlay_capture(void);
+void test_VIDIOC_QUERYBUF_overlay_output(void);
+void test_VIDIOC_QUERYBUF_invalid_memory_capture(void);
+void test_VIDIOC_QUERYBUF_invalid_memory_output(void);
+void test_VIDIOC_QUERYBUF_invalid_type_mmap(void);
+void test_VIDIOC_QUERYBUF_invalid_type_userptr(void);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.c	2009-05-08 07:38:26.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.c	2009-05-07 21:21:39.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  7 May 2009  0.2  show_v4l2_*() function extracted to v4l2_show.c
  * 29 Apr 2009  0.1  First release
  *
  * Written by Márton Németh <[email protected]>
@@ -22,26 +23,12 @@
 #include <CUnit/CUnit.h>
 
 #include "v4l2_test.h"
+#include "v4l2_show.h"
 #include "dev_video.h"
 #include "video_limits.h"
 
 #include "test_VIDIOC_REQBUFS.h"
 
-static void show_v4l2_requestbuffers(struct v4l2_requestbuffers *reqbuf) {
-	dprintf("\treqbuf = { "
-		".count=%u, "
-		".type=%i, "
-		".memory=%i, "
-		".reserved = { 0x%X, 0x%X } "
-		"}\n",
-		reqbuf->count,
-		reqbuf->type,
-		reqbuf->memory,
-		reqbuf->reserved[0],
-		reqbuf->reserved[1]
-	);
-}
-
 static void do_VIDIOC_REQBUFS_capture_mmap(__u32 count) {
 	int ret_cap, errno_cap;
 	int ret_req, errno_req;
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.c ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.c	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.c	2009-05-07 21:19:40.000000000 +0200
@@ -0,0 +1,116 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ *  7 May 2009  0.1  First release
+ *
+ * Written by Márton Németh <[email protected]>
+ * 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_REQBUFS.h"
+
+void show_v4l2_requestbuffers(struct v4l2_requestbuffers *reqbuf) {
+	dprintf("\treqbuf = { "
+		".count=%u, "
+		".type=%i, "
+		".memory=%i, "
+		".reserved = { 0x%X, 0x%X } "
+		"}\n",
+		reqbuf->count,
+		reqbuf->type,
+		reqbuf->memory,
+		reqbuf->reserved[0],
+		reqbuf->reserved[1]
+	);
+}
+
+void show_v4l2_buffer(struct v4l2_buffer *buf) {
+	unsigned int i;
+
+	dprintf("\tbuf = { "
+		".index=%u, "
+		".type=%i, "
+		".bytesused=%u, "
+		".flags=0x%x, "
+		".field=%i, "
+		".timestamp = { tv_sec=%lu, tv_usec=%lu }, "
+		".timecode = { "
+		".type=%u, "
+		".flags=0x%x, "
+		".frames=%u, "
+		".seconds=%u, "
+		".minutes=%u, "
+		".hours=%u, "
+		".userbits = { 0x%x, 0x%x, 0x%x, 0x%x } "
+		" }, "
+		".sequence=%u, "
+		".memory=%i, ",
+		buf->index,
+		buf->type,
+		buf->bytesused,
+		buf->flags,
+		buf->field,
+		buf->timestamp.tv_sec,
+		buf->timestamp.tv_usec,
+		buf->timecode.type,
+		buf->timecode.flags,
+		buf->timecode.frames,
+		buf->timecode.seconds,
+		buf->timecode.minutes,
+		buf->timecode.hours,
+		buf->timecode.userbits[0],
+		buf->timecode.userbits[1],
+		buf->timecode.userbits[2],
+		buf->timecode.userbits[3],
+		buf->sequence,
+		buf->memory
+	);
+
+	switch (buf->memory) {
+		case V4L2_MEMORY_USERPTR:
+			dprintf(".m.userptr=0x%lx, ",
+				buf->m.userptr);
+			for (i = sizeof(buf->m.userptr); i < sizeof(buf->m); i++) {
+				dprintf("((__u8*)&.m)[%u]=0x%x, ",
+					i, ((__u8*)&buf->m)[i]);
+			}
+			break;
+		case V4L2_MEMORY_MMAP:
+		case V4L2_MEMORY_OVERLAY:
+		default:
+			dprintf(".m.offset=%u, ",
+				buf->m.offset);
+			for (i = sizeof(buf->m.offset); i < sizeof(buf->m); i++) {
+				dprintf("((__u8*)&.m)[%u]=0x%x, ",
+					i, ((__u8*)&buf->m)[i]);
+			}
+	}
+
+	dprintf(".length=%u, "
+		".input=%u, "
+		".reserved=0x%x "
+		"}\n",
+		buf->length,
+		buf->input,
+		buf->reserved
+	);
+
+}
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.h ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.h
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.h	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.h	2009-05-07 21:20:25.000000000 +0200
@@ -0,0 +1,13 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ *  7 May 2009  0.1  First release
+ *
+ * Written by Márton Németh <[email protected]>
+ * Released under GPL
+ */
+
+#include <linux/videodev2.h>
+
+void show_v4l2_requestbuffers(struct v4l2_requestbuffers *reqbuf);
+void show_v4l2_buffer(struct v4l2_buffer *buf);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c	2009-05-08 07:38:26.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c	2009-05-07 21:17:56.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  5 May 2009  0.22 Test cases added for VIDIOC_QUERYBUF
  * 29 Apr 2009  0.21 Test cases added for VIDIOC_REQBUFS
  * 18 Apr 2009  0.20 NULL parameter test suite split to read only, write only
  *                   and write/read ioctl suite
@@ -83,6 +84,7 @@
 #include "test_VIDIOC_FMT.h"
 
 #include "test_VIDIOC_REQBUFS.h"
+#include "test_VIDIOC_QUERYBUF.h"
 
 #include "test_VIDIOC_LOG_STATUS.h"
 #include "test_invalid_ioctl.h"
@@ -247,6 +249,17 @@ static CU_TestInfo suite_buffs[] = {
   { "VIDIOC_REQBUFS with invalid type parameter, memory mapped i/o", test_VIDIOC_REQUBUFS_invalid_type_mmap },
   { "VIDIOC_REQBUFS with invalid type parameter, user pointer i/o", test_VIDIOC_REQUBUFS_invalid_type_userptr },
 
+  { "VIDIOC_QUERYBUF with memory map capture streaming i/o", test_VIDIOC_QUERYBUF_capture_mmap },
+  { "VIDIOC_QUERYBUF with user pointer capture streaming i/o", test_VIDIOC_QUERYBUF_capture_userptr },
+  { "VIDIOC_QUERYBUF with memory map output streaming i/o", test_VIDIOC_QUERYBUF_output_mmap },
+  { "VIDIOC_QUERYBUF with user pointer output streaming i/o", test_VIDIOC_QUERYBUF_output_userptr },
+  { "VIDIOC_QUERYBUF with overlay capture (invalid)", test_VIDIOC_QUERYBUF_overlay_capture },
+  { "VIDIOC_QUERYBUF with overlay output (invalid)", test_VIDIOC_QUERYBUF_overlay_output },
+  { "VIDIOC_QUERYBUF with invalid memory parameter, capture", test_VIDIOC_QUERYBUF_invalid_memory_capture },
+  { "VIDIOC_QUERYBUF with invalid memory parameter, output", test_VIDIOC_QUERYBUF_invalid_memory_output },
+  { "VIDIOC_QUERYBUF with invalid type parameter, memory mapped i/o", test_VIDIOC_QUERYBUF_invalid_type_mmap },
+  { "VIDIOC_QUERYBUF with invalid type parameter, user pointer i/o", test_VIDIOC_QUERYBUF_invalid_type_userptr },
+
   CU_TEST_INFO_NULL,
 };
 
------------------------------------------------------------------------------
The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
production scanning environment may not be a perfect world - but thanks to
Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
Series Scanner you'll get full speed at 300 dpi even with all image 
processing features enabled. http://p.sf.net/sfu/kodak-com
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to