This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/v4l-utils.git tree:

Subject: v4l2-compliance: improve DV timings checks.
Author:  Hans Verkuil <[email protected]>
Date:    Wed Jul 11 14:06:56 2012 +0200

Add tests for ENUM_DV_TIMINGS, QUERY_DV_TIMINGS and DV_TIMINGS_CAP.

Signed-off-by: Hans Verkuil <[email protected]>
(cherry picked from commit 434c09aed0b653ae5f2672f019b5b532bdb1b199)

Signed-off-by: Gregor Jasny <[email protected]>

 utils/v4l2-compliance/v4l2-compliance.cpp     |    4 +-
 utils/v4l2-compliance/v4l2-compliance.h       |    1 +
 utils/v4l2-compliance/v4l2-test-io-config.cpp |   97 +++++++++++++++++++++++--
 3 files changed, 93 insertions(+), 9 deletions(-)

---

http://git.linuxtv.org/v4l-utils.git?a=commitdiff;h=d1cdc253faab68bbce600f244e1289c69b4de5c5

diff --git a/utils/v4l2-compliance/v4l2-compliance.cpp 
b/utils/v4l2-compliance/v4l2-compliance.cpp
index a4925b2..4c0af17 100644
--- a/utils/v4l2-compliance/v4l2-compliance.cpp
+++ b/utils/v4l2-compliance/v4l2-compliance.cpp
@@ -616,7 +616,8 @@ int main(int argc, char **argv)
        printf("Input/Output configuration ioctls:\n");
        printf("\ttest VIDIOC_ENUM/G/S/QUERY_STD: %s\n", ok(testStd(&node)));
        printf("\ttest VIDIOC_ENUM/G/S/QUERY_DV_PRESETS: %s\n", 
ok(testPresets(&node)));
-       printf("\ttest VIDIOC_G/S_DV_TIMINGS: %s\n", 
ok(testCustomTimings(&node)));
+       printf("\ttest VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: %s\n", 
ok(testCustomTimings(&node)));
+       printf("\ttest VIDIOC_DV_TIMINGS_CAP: %s\n", ok(testTimingsCap(&node)));
        printf("\n");
 
        /* Format ioctls */
@@ -644,7 +645,6 @@ int main(int argc, char **argv)
           VIDIOC_G_ENC_INDEX
           VIDIOC_QBUF/DQBUF/QUERYBUF/PREPARE_BUFS
           VIDIOC_STREAMON/OFF
-
           */
 
        /* Final test report */
diff --git a/utils/v4l2-compliance/v4l2-compliance.h 
b/utils/v4l2-compliance/v4l2-compliance.h
index 0e50a63..e40f509 100644
--- a/utils/v4l2-compliance/v4l2-compliance.h
+++ b/utils/v4l2-compliance/v4l2-compliance.h
@@ -176,6 +176,7 @@ int testJpegComp(struct node *node);
 int testStd(struct node *node);
 int testPresets(struct node *node);
 int testCustomTimings(struct node *node);
+int testTimingsCap(struct node *node);
 
 // Format ioctl tests
 int testEnumFormats(struct node *node);
diff --git a/utils/v4l2-compliance/v4l2-test-io-config.cpp 
b/utils/v4l2-compliance/v4l2-test-io-config.cpp
index 257d4d1..22cf4d4 100644
--- a/utils/v4l2-compliance/v4l2-test-io-config.cpp
+++ b/utils/v4l2-compliance/v4l2-test-io-config.cpp
@@ -231,23 +231,44 @@ int testPresets(struct node *node)
                if (checkPresets(node, output.capabilities & 
V4L2_OUT_CAP_PRESETS))
                        return fail("Presets check failed for output %d.\n", o);
        }
+       if (has_presets)
+               warn("Presets are deprecated, use DV-TIMINGS instead\n");
        return has_presets ? 0 : ENOTTY;
 }
 
 static int checkTimings(struct node *node, bool has_timings)
 {
+       struct v4l2_enum_dv_timings enumtimings;
        struct v4l2_dv_timings timings;
        int ret;
+       unsigned i;
 
        memset(&timings, 0xff, sizeof(timings));
        ret = doioctl(node, VIDIOC_G_DV_TIMINGS, &timings);
        if (ret && has_timings)
-               return fail("TIMINGS cap set, but could not get current custom 
timings\n");
+               return fail("TIMINGS cap set, but could not get current 
timings\n");
+       if (!ret && !has_timings)
+               return fail("TIMINGS cap not set, but could still get 
timings\n");
+
+       for (i = 0; ; i++) {
+               memset(&enumtimings, 0xff, sizeof(enumtimings));
+
+               enumtimings.index = i;
+               ret = doioctl(node, VIDIOC_ENUM_DV_TIMINGS, &enumtimings);
+               if (ret)
+                       break;
+               if (check_0(enumtimings.reserved, sizeof(enumtimings.reserved)))
+                       return fail("reserved not zeroed\n");
+               if (enumtimings.index != i)
+                       return fail("index changed!\n");
+       }
+       if (i == 0 && has_timings)
+               return fail("TIMINGS cap set, but no timings can be 
enumerated\n");
+       if (i && !has_timings)
+               return fail("TIMINGS cap was not set, but timings can be 
enumerated\n");
+       ret = doioctl(node, VIDIOC_QUERY_DV_TIMINGS, &timings);
        if (!ret && !has_timings)
-               return fail("TIMINGS cap not set, but could still get custom 
timings\n");
-       /* I can't really test anything else here since due to the nature of 
these
-          ioctls there isn't anything 'generic' that I can test. If you use 
this,
-          then you are supposed to know what you are doing. */
+               return fail("TIMINGS cap was not set, but could still query 
timings\n");
        return 0;
 }
 
@@ -270,7 +291,7 @@ int testCustomTimings(struct node *node)
                if (input.capabilities & V4L2_IN_CAP_CUSTOM_TIMINGS)
                        has_timings = true;
                if (checkTimings(node, input.capabilities & 
V4L2_IN_CAP_CUSTOM_TIMINGS))
-                       return fail("Custom timings failed for input %d.\n", i);
+                       return fail("Timings failed for input %d.\n", i);
        }
 
        for (o = 0; o < node->outputs; o++) {
@@ -286,7 +307,69 @@ int testCustomTimings(struct node *node)
                if (output.capabilities & V4L2_OUT_CAP_CUSTOM_TIMINGS)
                        has_timings = true;
                if (checkTimings(node, output.capabilities & 
V4L2_OUT_CAP_CUSTOM_TIMINGS))
-                       return fail("Custom timings check failed for output 
%d.\n", o);
+                       return fail("Timings check failed for output %d.\n", o);
+       }
+       return has_timings ? 0 : ENOTTY;
+}
+
+static int checkTimingsCap(struct node *node, bool has_timings)
+{
+       struct v4l2_dv_timings_cap timingscap;
+       int ret;
+
+       memset(&timingscap, 0xff, sizeof(timingscap));
+       ret = doioctl(node, VIDIOC_DV_TIMINGS_CAP, &timingscap);
+       if (ret && has_timings)
+               return fail("TIMINGS cap set, but could not get timings 
caps\n");
+       if (!ret && !has_timings)
+               return fail("TIMINGS cap not set, but could still get timings 
caps\n");
+       if (check_0(timingscap.reserved, sizeof(timingscap.reserved)))
+               return fail("reserved not zeroed\n");
+       fail_on_test(timingscap.type != V4L2_DV_BT_656_1120);
+       if (check_0(timingscap.bt.reserved, sizeof(timingscap.bt.reserved)))
+               return fail("reserved not zeroed\n");
+       fail_on_test(timingscap.bt.min_width > timingscap.bt.max_width);
+       fail_on_test(timingscap.bt.min_height > timingscap.bt.max_height);
+       fail_on_test(timingscap.bt.min_pixelclock > 
timingscap.bt.max_pixelclock);
+       return 0;
+}
+
+int testTimingsCap(struct node *node)
+{
+       int ret;
+       unsigned i, o;
+       bool has_timings = false;
+
+       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 (input.capabilities & V4L2_IN_CAP_CUSTOM_TIMINGS)
+                       has_timings = true;
+               if (checkTimingsCap(node, input.capabilities & 
V4L2_IN_CAP_CUSTOM_TIMINGS))
+                       return fail("Timings cap 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 (output.capabilities & V4L2_OUT_CAP_CUSTOM_TIMINGS)
+                       has_timings = true;
+               if (checkTimingsCap(node, output.capabilities & 
V4L2_OUT_CAP_CUSTOM_TIMINGS))
+                       return fail("Timings cap check failed for output 
%d.\n", o);
        }
        return has_timings ? 0 : ENOTTY;
 }

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to