v4l2-compliance: add G/S_STD tests
authorHans Verkuil <hverkuil@xs4all.nl>
Fri, 21 Jan 2011 16:17:54 +0000 (17:17 +0100)
committerHans Verkuil <hverkuil@xs4all.nl>
Fri, 21 Jan 2011 16:17:54 +0000 (17:17 +0100)
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
utils/v4l2-compliance/v4l2-test-io-config.cpp

index 9bce007..54079cc 100644 (file)
 #include <sys/ioctl.h>
 #include "v4l2-compliance.h"
 
+static int checkStd(struct node *node, bool has_std, v4l2_std_id mask)
+{
+       v4l2_std_id std;
+       int ret;
+
+       ret = doioctl(node, VIDIOC_G_STD, &std);
+       if (ret && has_std)
+               return fail("STD cap set, but could not get standard\n");
+       if (!ret && !has_std)
+               return fail("STD cap not set, but could still get a standard\n");
+       if (!ret && has_std) {
+               if (std & ~mask)
+                       warn("current standard is invalid according to the input standard mask\n");
+               if (std == 0)
+                       return fail("Standard == 0?!\n");
+       }
+       ret = doioctl(node, VIDIOC_S_STD, &std);
+       if (ret && has_std)
+               return fail("STD cap set, but could not set standard\n");
+       if (!ret && !has_std)
+               return fail("STD cap not set, but could still set a standard\n");
+       return 0;
+}
+
 int testStd(struct node *node)
 {
+       int ret;
+       unsigned i, o;
+
+       for (i = 0; i < node->inputs; i++) {
+               struct v4l2_input input;
+
+               input.index = i;
+               ret = doioctl(node, VIDIOC_ENUMINPUT, &input);
+               if (ret)
+                       return fail("could not enumerate input %d?!\n", i);
+               ret = doioctl(node, VIDIOC_S_INPUT, &input.index);
+               if (ret)
+                       return fail("could not select input %d.\n", i);
+               if (checkStd(node, input.capabilities & V4L2_IN_CAP_STD, input.std))
+                       return fail("STD failed for input %d.\n", i);
+       }
+
+       for (o = 0; o < node->outputs; o++) {
+               struct v4l2_output output;
+
+               output.index = o;
+               ret = doioctl(node, VIDIOC_ENUMOUTPUT, &output);
+               if (ret)
+                       return fail("could not enumerate output %d?!\n", o);
+               ret = doioctl(node, VIDIOC_S_OUTPUT, &output.index);
+               if (ret)
+                       return fail("could not select output %d.\n", o);
+               if (checkStd(node, output.capabilities & V4L2_OUT_CAP_STD, output.std))
+                       return fail("STD failed for output %d.\n", o);
+       }
        return 0;
 }