From 93a2497b58303eed421f0eac617c807dfde9266f Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Fri, 21 Jan 2011 17:17:54 +0100 Subject: [PATCH] v4l2-compliance: add G/S_STD tests Signed-off-by: Hans Verkuil --- utils/v4l2-compliance/v4l2-test-io-config.cpp | 54 +++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/utils/v4l2-compliance/v4l2-test-io-config.cpp b/utils/v4l2-compliance/v4l2-test-io-config.cpp index 9bce007..54079cc 100644 --- a/utils/v4l2-compliance/v4l2-test-io-config.cpp +++ b/utils/v4l2-compliance/v4l2-test-io-config.cpp @@ -31,7 +31,61 @@ #include #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; } -- 2.7.4