v4l2-compliance: really fix the RDS and V4L2_CAP_READWRITE tests
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 8 Apr 2013 19:04:23 +0000 (21:04 +0200)
committerHans Verkuil <hans.verkuil@cisco.com>
Mon, 8 Apr 2013 19:13:52 +0000 (21:13 +0200)
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
utils/v4l2-compliance/v4l2-compliance.cpp
utils/v4l2-compliance/v4l2-test-input-output.cpp

index 799b624..0d0d65e 100644 (file)
@@ -317,10 +317,15 @@ static int testCap(struct node *node)
                if (dcaps & output_caps)
                        fail_on_test(dcaps & input_caps);
        }
-       if (node->can_capture || node->can_output)
-               fail_on_test(!(dcaps & io_caps));
-       else
+       if (node->can_capture || node->can_output) {
+               // whether io_caps need to be set for RDS capture/output is
+               // checked elsewhere as that depends on the tuner/modulator
+               // capabilities.
+               if (!(dcaps & (V4L2_CAP_RDS_CAPTURE | V4L2_CAP_RDS_OUTPUT)))
+                       fail_on_test(!(dcaps & io_caps));
+       } else {
                fail_on_test(dcaps & io_caps);
+       }
        // having both mplane and splane caps is not allowed (at least for now)
        fail_on_test((dcaps & mplane_caps) && (dcaps & splane_caps));
 
index ed5acff..7528a81 100644 (file)
@@ -120,6 +120,9 @@ static int checkTuner(struct node *node, const struct v4l2_tuner &tuner,
        if ((tuner.capability & V4L2_TUNER_CAP_RDS_BLOCK_IO) &&
                        !(node->caps & V4L2_CAP_READWRITE))
                return fail("V4L2_TUNER_CAP_RDS_BLOCK_IO is set, but not V4L2_CAP_READWRITE\n");
+       if (!tv && !(tuner.capability & V4L2_TUNER_CAP_RDS_BLOCK_IO) &&
+                       (node->caps & V4L2_CAP_READWRITE))
+               return fail("V4L2_TUNER_CAP_RDS_BLOCK_IO is not set, but V4L2_CAP_READWRITE is\n");
        if (std == V4L2_STD_NTSC_M && (tuner.rxsubchans & V4L2_TUNER_SUB_LANG1))
                return fail("LANG1 subchan, but NTSC-M standard\n");
        if (tuner.audmode > V4L2_TUNER_MODE_LANG1_LANG2)
@@ -565,6 +568,9 @@ static int checkModulator(struct node *node, const struct v4l2_modulator &mod, u
        if ((mod.capability & V4L2_TUNER_CAP_RDS_BLOCK_IO) &&
                        !(node->caps & V4L2_CAP_READWRITE))
                return fail("V4L2_TUNER_CAP_RDS_BLOCK_IO is set, but not V4L2_CAP_READWRITE\n");
+       if (!(mod.capability & V4L2_TUNER_CAP_RDS_BLOCK_IO) &&
+                       (node->caps & V4L2_CAP_READWRITE))
+               return fail("V4L2_TUNER_CAP_RDS_BLOCK_IO is not set, but V4L2_CAP_READWRITE is\n");
        return checkEnumFreqBands(node, mod.index, V4L2_TUNER_RADIO, mod.capability);
 }