Hi,

this is v4l-test 0.16 for LTP.

Changes:
Iterate through all available inputs in VIDIOC_G_STD and
VIDIOC_S_STD test cases

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

Regards,

        Márton Németh

---
v4l-test home page: http://v4l-test.sourceforge.net/
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-06-04 11:01:16.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/doc/index.html	2009-06-03 08:37:14.000000000 +0200
@@ -510,6 +510,18 @@ influence on the V4L2 API functions:</p>
       <td>Resume</td>
       <td>no</td>
     </tr>
+    <tr>
+      <td>Check for memory leak (e.g. analyze /proc/slab_allocators)</td>
+      <td>no</td>
+    </tr>
+    <tr>
+      <td>Opening /dev/video0 multiple times</td>
+      <td>no</td>
+    </tr>
+    <tr>
+      <td>Using /dev/video0 from a multi-threaded or multi-process environment paralell</td>
+      <td>no</td>
+    </tr>
   </tbody>
 </table>
 
@@ -555,12 +567,43 @@ The following documents and articles are
       writen by <a href="http://moinejf.free.fr/";>Jean-François Moine</a>
   </li>
 </ul>
+<p>
+For USB or V4L loopback testing:
+</p>
+<ul>
+  <li>
+  <a href="http://sourceforge.net/projects/usbip/";>USB/IP</a>
+  </li>
+  <li>
+  <a href="http://www.linux-usb.org/gadget/";>Linux-USB Gadget API Framework</a>
+  </li>
+  <li>
+  <a href="http://www.lavrsen.dk/twiki/bin/view/Motion/VideoFourLinuxLoopbackDevice";>
+  Video4Linux Loopback Device
+  </a>
+  </li>
+</ul>
+<p>
+And what else can we read if we are looking for webcam test ideas:
+</p>
+<ul>
+  <li>
+  <a href="http://www.microsoft.com/whdc/device/media/vidcap-drvtest.mspx";>
+  Testing Windows Video Capture Drivers
+  </a>
+  </li>
+  <li>
+  <a href="http://www.microsoft.com/whdc/device/media/WebCam_VidTests.mspx";>
+  Webcam Video Fidelity Tests
+  </a>
+</ul>
 
 <h2><a name="feedback">Feedbacks</a></h2>
-<p>Any feedbacks, comments, ideas, etc. are welcome at the author's email address.</p>
+<p>Any feedbacks, comments, ideas, etc. are welcome at the author's email address.
+You can find the email address in the source package in the README file.</p>
 <hr style="width: 100%; height: 2px;">
 <p>Last changed:
-Mon May 25 08:08:11 CEST 2009
+Wed Jun  3 08:35:10 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-06-04 11:01:15.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/Makefile	2009-07-06 08:34:22.000000000 +0200
@@ -1,6 +1,7 @@
 #
 # v4l-test: Test environment for Video For Linux Two API
 #
+#  5 Jul 2009  0.18 v4l2_foreach.c added
 # 19 May 2009  0.17 test_VIDIOC_EXT_CTRLS.c added
 #  7 May 2009  0.16 v4l2_show.c added
 #  5 May 2009  0.15 test_VIDIOC_QUERYBUF.c added
@@ -38,6 +39,7 @@ LDFLAGS = -lcunit
 
 OBJS = dev_video.o \
        v4l2_validator.o \
+       v4l2_foreach.o \
        test_VIDIOC_QUERYCAP.o \
        test_VIDIOC_ENUMAUDIO.o \
        test_VIDIOC_ENUMAUDOUT.o \
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-06-04 11:01:15.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/README	2009-07-06 08:37:33.000000000 +0200
@@ -3,6 +3,8 @@
 
 Release History
 ---------------
+ 6 Jul 2009  0.16 Iterate through all available inputs in VIDIOC_G_STD and
+                  VIDIOC_S_STD test cases
 25 May 2009  0.15 Test cases added for VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS
                   and VIDIOC_TRY_EXT_CTRLS
  7 May 2009  0.14 Test cases added for VIDIOC_QUERYBUF;
@@ -111,14 +113,9 @@ a USB video device or ask the user if a 
 See doc/index.html about how much of the specification is covered by the
 different test cases.
 
-Similar projects
-----------------
- - v4ltest: http://www.linuxowl.com/v4ltest.html
- - test cases in dvb-apps repository, under /test directory: http://linuxtv.org/hg/dvb-apps/file
- - test cases in v4l-dvb repository, under /v4l2-apps/test directory:
-http://linuxtv.org/hg/v4l-dvb/file
- - this test environment is also available under Linux Test Project (LTP),
-   under directory testcases/kernel/device-drivers/v4l/user_space: http://ltp.sourceforge.net/
+See also
+--------
+See also doc/index.html for further references and recommended readings.
 
 Feedbacks
 ---------
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMINPUT.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMINPUT.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMINPUT.c	2009-05-11 08:07:10.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMINPUT.c	2009-07-06 08:34:29.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  5 Jul 2009  0.10 show_v4l2_input() introduced
  * 20 Apr 2009  0.9  Added string content validation
  * 19 Apr 2009  0.8  Also check std field
  * 18 Apr 2009  0.7  More strict check for strings
@@ -35,6 +36,7 @@
 #include "dev_video.h"
 #include "video_limits.h"
 #include "v4l2_validator.h"
+#include "v4l2_show.h"
 
 #include "test_VIDIOC_ENUMINPUT.h"
 
@@ -86,23 +88,7 @@ void test_VIDIOC_ENUMINPUT() {
 			input2.status = input.status;
 			CU_ASSERT_EQUAL(memcmp(&input, &input2, sizeof(input)), 0);
 
-			dprintf("\tinput = {.index=%u, .name=\"%s\", "
-				".type=0x%X, .audioset=0x%X, .tuner=0x%X, "
-				".std=%llX, "
-				".status=0x%X, "
-				".reserved[]={ 0x%X, 0x%X, 0x%X, 0x%X } }\n",
-				input.index,
-				input.name,
-				input.type,
-				input.audioset,
-				input.tuner,
-				input.std,
-				input.status,
-				input.reserved[0],
-				input.reserved[1],
-				input.reserved[2],
-				input.reserved[3]
-				);
+			show_v4l2_input(&input);
 
 		} else {
 			CU_ASSERT_EQUAL(ret_enum, -1);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c	2009-05-11 08:07:10.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c	2009-07-06 08:34:17.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  5 Jul 2009  0.9  Iterate through all possible inputs
  * 18 Apr 2009  0.8  Typo corrected
  * 27 Mar 2009  0.7  Cleanup ret and errno variable names and dprintf() outputs;
  *                   Make VIDIOC_S_STD tests independent from VIDIOC_G_STD
@@ -34,79 +35,153 @@
 #include "dev_video.h"
 #include "video_limits.h"
 #include "v4l2_validator.h"
+#include "v4l2_foreach.h"
 
 #include "test_VIDIOC_STD.h"
 
-void test_VIDIOC_G_STD() {
-	int ret_get, errno_get;
+static void do_test_VIDIOC_G_STD(int ret_input_enum, int errno_input_enum, struct v4l2_input* input) {
 	v4l2_std_id std_id;
+	int ret_std_get, errno_std_get;
+	int f;
 
-	/* TODO: Iterate trough all inputs and all outputs
-	 * with VIDIOC_ENUMINPUT and VIDIOC_ENUMOUTPUT.
+	/* Iterate trough all inputs with VIDIOC_ENUMINPUT.
 	 * Also ensure tahat VIDIC_G_STD is called at least
-	 * once even if VIDIOC_ENUMINPUT and VIDIOC_ENUMOUTPUT
-	 * always return EINVAL.
+	 * once even if VIDIOC_ENUMINPUT always return EINVAL.
 	 *
 	 * V4L2 API specification rev. 0.24, Chapter 1.7.
 	 * "Video Standards" specifies if the std field
-	 * of v4l2_input and v4l2_output is zero then
-	 * VIDIOC_G_STD shall always return EINVAL.
+	 * of v4l2_input or v4l2_output is zero when
+	 * executing VIDIOC_ENUMINPUT or VIDIOC_ENUMOUTPUT,
+	 * respectively, then VIDIOC_G_STD shall always
+	 * return EINVAL.
+	 */
+
+	/* TODO: Iterate trough all outputs VIDIOC_ENUMOUTPUT.
+	 * Also ensure tahat VIDIC_G_STD is called at least
+	 * once even if VIDIOC_ENUMOUTPUT always return EINVAL.
+	 *
+	 * TODO: What shall happen when changing output? The
+	 * VIDIOC_G_STD only deals with current input.
 	 */
 
+	f = get_video_fd();
+
 	memset(&std_id, 0xff, sizeof(std_id));
-	ret_get = ioctl(get_video_fd(), VIDIOC_G_STD, &std_id);
-	errno_get = errno;
+	ret_std_get = ioctl(f, VIDIOC_G_STD, &std_id);
+	errno_std_get = errno;
 
-	dprintf("\t%s:%u: VIDIOC_G_STD, ret_get=%i, errno_get=%i, std_id=0x%llX\n",
-		__FILE__, __LINE__, ret_get, errno_get, std_id);
+	dprintf("\t%s:%u: VIDIOC_G_STD, ret_std_get=%i, errno_std_get=%i, std_id=0x%llX\n",
+		__FILE__, __LINE__, ret_std_get, errno_std_get, std_id);
 
-	if (ret_get == 0) {
-		CU_ASSERT_EQUAL(ret_get, 0);
-		CU_ASSERT(valid_v4l2_std_id(std_id));
+	if (ret_input_enum == 0) {
+		CU_ASSERT_EQUAL(ret_input_enum, 0);
+		if (input->std == 0) {
+			CU_ASSERT_EQUAL(ret_std_get, -1);
+			CU_ASSERT_EQUAL(errno_std_get, EINVAL);
+		} else {
+			if (ret_std_get == 0) {
+				CU_ASSERT_EQUAL(ret_std_get, 0);
+				CU_ASSERT(valid_v4l2_std_id(std_id));
+			} else {
+				CU_ASSERT_EQUAL(ret_std_get, -1);
+				CU_ASSERT_EQUAL(errno_std_get, EINVAL);
+			}
+		}
 	} else {
-		CU_ASSERT_EQUAL(ret_get, -1);
-		CU_ASSERT_EQUAL(errno_get, EINVAL);
+		CU_ASSERT_EQUAL(ret_input_enum, -1);
+		CU_ASSERT_EQUAL(errno_input_enum, EINVAL);
+		if (ret_std_get == 0) {
+			CU_ASSERT_EQUAL(ret_std_get, 0);
+			CU_ASSERT(valid_v4l2_std_id(std_id));
+		} else {
+			CU_ASSERT_EQUAL(ret_std_get, -1);
+			CU_ASSERT_EQUAL(errno_std_get, EINVAL);
+		}
 	}
+}
+
+void test_VIDIOC_G_STD() {
+
+	/* Iterate trough all inputs with VIDIOC_ENUMINPUT.
+	 * Also ensure tahat VIDIC_G_STD is called at least
+	 * once even if VIDIOC_ENUMINPUT always return EINVAL.
+	 *
+	 * V4L2 API specification rev. 0.24, Chapter 1.7.
+	 * "Video Standards" specifies if the std field
+	 * of v4l2_input or v4l2_output is zero when
+	 * executing VIDIOC_ENUMINPUT or VIDIOC_ENUMOUTPUT,
+	 * respectively, then VIDIOC_G_STD shall always
+	 * return EINVAL.
+	 */
+
+	foreach_input(do_test_VIDIOC_G_STD);
+
+
+	/* TODO: Iterate trough all outputs VIDIOC_ENUMOUTPUT.
+	 * Also ensure tahat VIDIC_G_STD is called at least
+	 * once even if VIDIOC_ENUMOUTPUT always return EINVAL.
+	 *
+	 * TODO: What shall happen when changing output? The
+	 * VIDIOC_G_STD only deals with current input.
+	 */
+
 
 }
 
-static int do_set_video_standard(int f, v4l2_std_id id) {
-	int ret_set, errno_set;
-	int ret_get, errno_get;
+static int do_set_video_standard(int f, v4l2_std_id id,
+		int ret_input_enum, int errno_input_enum, struct v4l2_input* input) {
+	int ret_std_set, errno_std_set;
+	int ret_std_get, errno_std_get;
 	v4l2_std_id std_id;
 
 	std_id = id;
-	ret_set = ioctl(f, VIDIOC_S_STD, &std_id);
-	errno_set = errno;
+	ret_std_set = ioctl(f, VIDIOC_S_STD, &std_id);
+	errno_std_set = errno;
 
-	dprintf("\t%s:%u: ret_set=%i, errno_set=%i, std_id=0x%llX, id=0x%llX\n",
-		__FILE__, __LINE__, ret_set, errno_set, std_id, id);
+	dprintf("\t%s:%u: VIDIOC_S_STD: ret_std_set=%i, errno_std_set=%i, std_id=0x%llX, id=0x%llX\n",
+		__FILE__, __LINE__, ret_std_set, errno_std_set, std_id, id);
 
-	if (ret_set == 0) {
-		CU_ASSERT_EQUAL(ret_set, 0);
-		memset(&std_id, 0xff, sizeof(std_id));
-		ret_get = ioctl(f, VIDIOC_G_STD, &std_id);
-		errno_get = errno;
+	memset(&std_id, 0xff, sizeof(std_id));
+	ret_std_get = ioctl(f, VIDIOC_G_STD, &std_id);
+	errno_std_get = errno;
 
-		CU_ASSERT_EQUAL(ret_get, 0);
-		if (ret_get == 0) {
-			CU_ASSERT( (id & std_id) == id);
+	dprintf("\t%s:%u: VIDIOC_G_STD: ret_std_get=%i, errno_std_get=%i, std_id=0x%llX\n",
+		__FILE__, __LINE__, ret_std_get, errno_std_get, std_id);
 
-			if (std_id != id) {
-				dprintf("\t%s:%u: ret_get=%i, errno_get=%i, std_id=0x%llX, id=0x%llX\n",
-					__FILE__, __LINE__, ret_get, errno_get, std_id, id);
+	if (ret_input_enum == 0) {
+		CU_ASSERT_EQUAL(ret_input_enum, 0);
+		if (input->std == 0) {
+			CU_ASSERT_EQUAL(ret_std_get, -1);
+			CU_ASSERT_EQUAL(errno_std_get, EINVAL);
+			CU_ASSERT_EQUAL(ret_std_set, -1);
+			CU_ASSERT_EQUAL(errno_std_set, EINVAL);
+		} else {
+			if (ret_std_set == 0) {
+				CU_ASSERT_EQUAL(ret_std_set, 0);
+				CU_ASSERT_EQUAL(ret_std_get, 0);
+				CU_ASSERT(valid_v4l2_std_id(std_id));
+			} else {
+				CU_ASSERT_EQUAL(ret_std_set, -1);
+				CU_ASSERT_EQUAL(errno_std_set, EINVAL);
 			}
-
 		}
 	} else {
-		CU_ASSERT_EQUAL(ret_set, -1);
-		CU_ASSERT_EQUAL(errno_set, EINVAL);
+		CU_ASSERT_EQUAL(ret_input_enum, -1);
+		CU_ASSERT_EQUAL(errno_input_enum, EINVAL);
+			if (ret_std_set == 0) {
+				CU_ASSERT_EQUAL(ret_std_set, 0);
+				CU_ASSERT_EQUAL(ret_std_get, 0);
+				CU_ASSERT(valid_v4l2_std_id(std_id));
+			} else {
+				CU_ASSERT_EQUAL(ret_std_set, -1);
+				CU_ASSERT_EQUAL(errno_std_set, EINVAL);
+			}
 	}
 
-	return ret_set;
+	return ret_std_set;
 }
 
-void test_VIDIOC_S_STD() {
+static void do_test_VIDIOC_S_STD(int ret_input_enum, int errno_input_enum, struct v4l2_input* input) {
 	int ret_get, errno_get;
 	int ret_set, errno_set;
 	v4l2_std_id std_id_orig;
@@ -121,37 +196,37 @@ void test_VIDIOC_S_STD() {
 	dprintf("\t%s:%u: VIDIOC_G_STD: ret_get=%i, errno_get=%i, std_id_orig=0x%llX\n",
 		__FILE__, __LINE__, ret_get, errno_get, std_id_orig);
 
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_B);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_B1);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_G);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_H);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_I);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_D);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_D1);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_K);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_M);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_N);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_Nc);
-	ret_set = do_set_video_standard(f, V4L2_STD_PAL_60);
-	ret_set = do_set_video_standard(f, V4L2_STD_NTSC_M);
-	ret_set = do_set_video_standard(f, V4L2_STD_NTSC_M_JP);
-	ret_set = do_set_video_standard(f, V4L2_STD_NTSC_443);
-	ret_set = do_set_video_standard(f, V4L2_STD_NTSC_M_KR);
-	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_B);
-	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_D);
-	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_G);
-	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_H);
-	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_K);
-	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_K1);
-	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_L);
-	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_LC);
-	ret_set = do_set_video_standard(f, V4L2_STD_ATSC_8_VSB);
-	ret_set = do_set_video_standard(f, V4L2_STD_ATSC_16_VSB);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_B, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_B1, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_G, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_H, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_I, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_D, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_D1, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_K, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_M, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_N, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_Nc, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_PAL_60, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_NTSC_M, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_NTSC_M_JP, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_NTSC_443, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_NTSC_M_KR, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_B, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_D, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_G, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_H, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_K, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_K1, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_L, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_SECAM_LC, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_ATSC_8_VSB, ret_input_enum, errno_input_enum, input);
+	ret_set = do_set_video_standard(f, V4L2_STD_ATSC_16_VSB, ret_input_enum, errno_input_enum, input);
 
 	if (ret_get == 0) {
 		CU_ASSERT_EQUAL(ret_get, 0);
 		/* Setting the original std_id should not fail */
-		ret_set = do_set_video_standard(f, std_id_orig);
+		ret_set = do_set_video_standard(f, std_id_orig, ret_input_enum, errno_input_enum, input);
 		errno_set = errno;
 
 		CU_ASSERT_EQUAL(ret_set, 0);
@@ -162,7 +237,11 @@ void test_VIDIOC_S_STD() {
 
 }
 
-void test_VIDIOC_S_STD_from_enum() {
+void test_VIDIOC_S_STD() {
+	foreach_input(do_test_VIDIOC_S_STD);
+}
+
+static void do_test_VIDIOC_S_STD_from_enum(int ret_input_enum, int errno_input_enum, struct v4l2_input* input) {
 	int ret_get, errno_get;
 	int ret_enum, errno_enum;
 	int ret_set, errno_set;
@@ -192,7 +271,7 @@ void test_VIDIOC_S_STD_from_enum() {
 			__FILE__, __LINE__, i, ret_enum, errno_enum, std.id);
 
 		if (ret_enum == 0) {
-			ret_set = do_set_video_standard(f, std.id);
+			ret_set = do_set_video_standard(f, std.id, ret_input_enum, errno_input_enum, input);
 			CU_ASSERT_EQUAL(ret_set, 0);
 		}
 		i++;
@@ -202,7 +281,7 @@ void test_VIDIOC_S_STD_from_enum() {
 		CU_ASSERT_EQUAL(ret_get, 0);
 
 		/* Setting the original std_id should not fail */
-		ret_set = do_set_video_standard(f, std_id_orig);
+		ret_set = do_set_video_standard(f, std_id_orig, ret_input_enum, errno_input_enum, input);
 		errno_set = errno;
 		dprintf("\t%s:%u: VIDIOC_S_STD: ret_set=%i (expected %i), errno=%i\n",
 			__FILE__, __LINE__, ret_set, 0, errno);
@@ -214,8 +293,11 @@ void test_VIDIOC_S_STD_from_enum() {
 
 }
 
+void test_VIDIOC_S_STD_from_enum() {
+	foreach_input(do_test_VIDIOC_S_STD_from_enum);
+}
 
-void test_VIDIOC_S_STD_invalid_standard() {
+static void do_test_VIDIOC_S_STD_invalid_standard(int ret_input_enum, int errno_input_enum, struct v4l2_input* input) {
 	int ret_get, errno_get;
 	int ret_set, errno_set;
 	v4l2_std_id std_id_orig;
@@ -235,7 +317,7 @@ void test_VIDIOC_S_STD_invalid_standard(
 	std_id = 1;
 	while (std_id != 0) {
 		if (!valid_v4l2_std_id(std_id)) {
-			ret_set = do_set_video_standard(f, std_id);
+			ret_set = do_set_video_standard(f, std_id, ret_input_enum, errno_input_enum, input);
 			errno_set = errno;
 
 			CU_ASSERT_EQUAL(ret_set, -1);
@@ -250,7 +332,7 @@ void test_VIDIOC_S_STD_invalid_standard(
 		CU_ASSERT_EQUAL(ret_get, 0);
 
 		/* Setting the original std_id should not fail */
-		ret_set = do_set_video_standard(f, std_id_orig);
+		ret_set = do_set_video_standard(f, std_id_orig, ret_input_enum, errno_input_enum, input);
 		errno_set = errno;
 
 		dprintf("\t%s:%u: VIDIOC_S_STD: ret_set=%i (expected 0), errno=%i\n",
@@ -262,7 +344,11 @@ void test_VIDIOC_S_STD_invalid_standard(
 	}
 }
 
-void test_VIDIOC_G_STD_NULL() {
+void test_VIDIOC_S_STD_invalid_standard() {
+	foreach_input(do_test_VIDIOC_S_STD_invalid_standard);
+}
+
+static void do_test_VIDIOC_G_STD_NULL(int ret_input_enum, int errno_input_enum, struct v4l2_input* input) {
 	int ret_get, errno_get;
 	int ret_null, errno_null;
 	v4l2_std_id std_id;
@@ -280,20 +366,49 @@ void test_VIDIOC_G_STD_NULL() {
 	dprintf("\t%s:%u: VIDIOC_G_STD: ret_null=%i, errno_null=%i\n",
 		__FILE__, __LINE__, ret_null, errno_null);
 
-	if (ret_get == 0) {
-		CU_ASSERT_EQUAL(ret_get, 0);
-		CU_ASSERT_EQUAL(ret_null, -1);
-		CU_ASSERT_EQUAL(errno_null, EFAULT);
+	if (ret_input_enum == 0) {
+		CU_ASSERT_EQUAL(ret_input_enum, 0);
+		if (input->std == 0) {
+			CU_ASSERT_EQUAL(ret_get, -1);
+			CU_ASSERT_EQUAL(errno_get, EINVAL);
+			CU_ASSERT_EQUAL(ret_null, -1);
+			CU_ASSERT_EQUAL(errno_null, EINVAL);
+		} else {
+			if (ret_get == 0) {
+				CU_ASSERT_EQUAL(ret_get, 0);
+				CU_ASSERT_EQUAL(ret_null, -1);
+				CU_ASSERT_EQUAL(errno_null, EFAULT);
+			} else {
+				CU_ASSERT_EQUAL(ret_get, -1);
+				CU_ASSERT_EQUAL(errno_get, EINVAL);
+				CU_ASSERT_EQUAL(ret_null, -1);
+				CU_ASSERT_EQUAL(errno_null, EINVAL);
+			}
+		}
 	} else {
-		CU_ASSERT_EQUAL(ret_get, -1);
-		CU_ASSERT_EQUAL(errno_get, EINVAL);
-		CU_ASSERT_EQUAL(ret_null, -1);
-		CU_ASSERT_EQUAL(errno_null, EINVAL);
+		CU_ASSERT_EQUAL(ret_input_enum, -1);
+		CU_ASSERT_EQUAL(errno_input_enum, EINVAL);
+		if (ret_get == 0) {
+			CU_ASSERT_EQUAL(ret_get, 0);
+			CU_ASSERT_EQUAL(ret_null, -1);
+			CU_ASSERT_EQUAL(errno_null, EFAULT);
+		} else {
+			CU_ASSERT_EQUAL(ret_get, -1);
+			CU_ASSERT_EQUAL(errno_get, EINVAL);
+			CU_ASSERT_EQUAL(ret_null, -1);
+			CU_ASSERT_EQUAL(errno_null, EINVAL);
+		}
 	}
 
+
+
 }
 
-void test_VIDIOC_S_STD_NULL() {
+void test_VIDIOC_G_STD_NULL() {
+	foreach_input(do_test_VIDIOC_G_STD_NULL);
+}
+
+static void do_test_VIDIOC_S_STD_NULL(int ret_input_enum, int errno_input_enum, struct v4l2_input* input) {
 	int ret_null, errno_null;
 
 	/* TODO: check whether VIDIOC_S_STD is supported at all or not */
@@ -304,10 +419,23 @@ void test_VIDIOC_S_STD_NULL() {
 	dprintf("\t%s:%u: VIDIOC_S_STD: ret_null=%i, errno_null=%i\n",
 		__FILE__, __LINE__, ret_null, errno_null);
 
-	CU_ASSERT_EQUAL(ret_null, -1);
-	CU_ASSERT_EQUAL(errno_null, EFAULT);
-
+	if (ret_input_enum == 0) {
+		CU_ASSERT_EQUAL(ret_input_enum, 0);
+		if (input->std == 0) {
+			CU_ASSERT_EQUAL(ret_null, -1);
+			CU_ASSERT_EQUAL(errno_null, EINVAL);
+		} else {
+		}
+	} else {
+		CU_ASSERT_EQUAL(ret_input_enum, -1);
+		CU_ASSERT_EQUAL(errno_input_enum, EINVAL);
+		CU_ASSERT_EQUAL(ret_null, -1);
+		CU_ASSERT_EQUAL(errno_null, EFAULT);
+	}
 }
 
+void test_VIDIOC_S_STD_NULL() {
+    foreach_input(do_test_VIDIOC_S_STD_NULL);
+}
 
 /* TODO: VIDIOC_S_STD while STREAM_ON */
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_foreach.c ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_foreach.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_foreach.c	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_foreach.c	2009-07-06 08:34:33.000000000 +0200
@@ -0,0 +1,83 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ *  5 Jul 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 "v4l2_show.h"
+#include "v4l2_foreach.h"
+
+void foreach_input(V4L2InputTestFunc pFunc) {
+	__u32 input_index_orig;
+	struct v4l2_input input;
+	int ret_input_get, errno_input_get;
+	int ret_input_enum, errno_input_enum;
+	int ret_input_set, errno_input_set;
+	__u32 i;
+	int f;
+	char not_yet_called = 1;
+
+	f = get_video_fd();
+
+	memset(&input_index_orig, 0xff, sizeof(input_index_orig));
+	ret_input_get = ioctl(f, VIDIOC_G_INPUT, &input_index_orig);
+	errno_input_get = errno;
+	dprintf("\t%s:%u: VIDIOC_G_INPUT, ret_input_get=%i, errno_input_get=%i, input_index_orig=0x%X\n",
+		__FILE__, __LINE__, ret_input_get, errno_input_get, input_index_orig);
+
+	i = 0;
+	do {
+		memset(&input, 0xff, sizeof(input));
+		input.index = i;
+		ret_input_enum = ioctl(f, VIDIOC_ENUMINPUT, &input);
+		errno_input_enum = errno;
+
+		dprintf("\t%s:%u: VIDIOC_ENUMINPUT: i=%u, ret_input_enum=%i, errno_input_enum=%i\n",
+			__FILE__, __LINE__, i, ret_input_enum, errno_input_enum);
+
+		if (ret_input_enum == 0) {
+			show_v4l2_input(&input);
+			ret_input_set = ioctl(f, VIDIOC_S_INPUT, &input.index);
+			errno_input_set = errno;
+			dprintf("\t%s:%u: VIDIOC_S_INPUT: input.index=0x%X, ret_input_set=%i, errno_input_set=%i\n",
+				__FILE__, __LINE__, input.index, ret_input_set, errno_input_set);
+			CU_ASSERT_EQUAL(ret_input_set, 0);
+		}
+
+		/* Ensure that pFunc() is called at least once even if
+		 * everything else returned error before.
+		 */
+		if (not_yet_called || ret_input_enum == 0) {
+			pFunc(ret_input_enum, errno_input_enum, &input);
+			not_yet_called = 0;
+		}
+
+		i++;
+	} while (ret_input_enum == 0 && i != 0);
+
+	if (ret_input_get == 0) {
+		/* Setting the original input_id should not fail */
+		ret_input_set = ioctl(f, VIDIOC_S_INPUT, &input_index_orig);
+		errno_input_set = errno;
+		CU_ASSERT_EQUAL(ret_input_set, 0);
+	}
+}
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_foreach.h ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_foreach.h
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_foreach.h	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_foreach.h	2009-07-06 08:34:41.000000000 +0200
@@ -0,0 +1,14 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ *  5 Jul 2009  0.1  First release
+ *
+ * Written by Márton Németh <[email protected]>
+ * Released under GPL
+ */
+
+#include <linux/videodev2.h>
+
+typedef void (*V4L2InputTestFunc)(int ret_input_enum, int errno_input_enum, struct v4l2_input* input);
+
+void foreach_input(V4L2InputTestFunc pFunc);
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	2009-05-11 08:10:27.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.c	2009-07-06 08:34:44.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  5 Jul 2009  0.2  show_v4l2_input() introduced
  *  7 May 2009  0.1  First release
  *
  * Written by Márton Németh <[email protected]>
@@ -114,3 +115,23 @@ void show_v4l2_buffer(struct v4l2_buffer
 	);
 
 }
+
+void show_v4l2_input(struct v4l2_input *input) {
+	dprintf("\tinput = {.index=%u, .name=\"%s\", "
+		".type=0x%X, .audioset=0x%X, .tuner=0x%X, "
+		".std=%llX, "
+		".status=0x%X, "
+		".reserved[]={ 0x%X, 0x%X, 0x%X, 0x%X } }\n",
+		input->index,
+		input->name,
+		input->type,
+		input->audioset,
+		input->tuner,
+		input->std,
+		input->status,
+		input->reserved[0],
+		input->reserved[1],
+		input->reserved[2],
+		input->reserved[3]
+		);
+}
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	2009-05-11 08:10:27.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_show.h	2009-07-06 08:34:38.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  5 Jul 2009  0.2  show_v4l2_input() introduced
  *  7 May 2009  0.1  First release
  *
  * Written by Márton Németh <[email protected]>
@@ -11,3 +12,4 @@
 
 void show_v4l2_requestbuffers(struct v4l2_requestbuffers *reqbuf);
 void show_v4l2_buffer(struct v4l2_buffer *buf);
+void show_v4l2_input(struct v4l2_input *input);
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to