v4l2-compliance: add tests for VIDIOC_S_HW_FREQ_SEEK.
authorHans Verkuil <hans.verkuil@cisco.com>
Fri, 27 Apr 2012 21:38:23 +0000 (23:38 +0200)
committerHans Verkuil <hans.verkuil@cisco.com>
Fri, 27 Apr 2012 21:38:23 +0000 (23:38 +0200)
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
utils/v4l2-compliance/v4l2-compliance.cpp
utils/v4l2-compliance/v4l2-compliance.h
utils/v4l2-compliance/v4l2-test-input-output.cpp

index 9de3df4..1b4a816 100644 (file)
@@ -565,6 +565,7 @@ int main(int argc, char **argv)
        printf("Input ioctls:\n");
        printf("\ttest VIDIOC_G/S_TUNER: %s\n", ok(testTuner(&node)));
        printf("\ttest VIDIOC_G/S_FREQUENCY: %s\n", ok(testTunerFreq(&node)));
+       printf("\ttest VIDIOC_S_HW_FREQ_SEEK: %s\n", ok(testTunerHwSeek(&node)));
        printf("\ttest VIDIOC_ENUMAUDIO: %s\n", ok(testEnumInputAudio(&node)));
        printf("\ttest VIDIOC_G/S/ENUMINPUT: %s\n", ok(testInput(&node)));
        printf("\ttest VIDIOC_G/S_AUDIO: %s\n", ok(testInputAudio(&node)));
@@ -618,7 +619,6 @@ int main(int argc, char **argv)
           VIDIOC_S/TRY_FMT
           VIDIOC_G/S_PARM
           VIDIOC_G/S_JPEGCOMP
-          VIDIOC_S_HW_FREQ_SEEK
           VIDIOC_(TRY_)ENCODER_CMD
           VIDIOC_G_ENC_INDEX
           VIDIOC_REQBUFS/QBUF/DQBUF/QUERYBUF
index b22011c..46cabb6 100644 (file)
@@ -136,6 +136,7 @@ int testLogStatus(struct node *node);
 // Input ioctl tests
 int testTuner(struct node *node);
 int testTunerFreq(struct node *node);
+int testTunerHwSeek(struct node *node);
 int testEnumInputAudio(struct node *node);
 int testInput(struct node *node);
 int testInputAudio(struct node *node);
index efb9bd0..500d2ce 100644 (file)
@@ -239,6 +239,40 @@ int testTunerFreq(struct node *node)
        return node->tuners ? 0 : ENOTTY;
 }
 
+int testTunerHwSeek(struct node *node)
+{
+       struct v4l2_hw_freq_seek seek;
+       int ret;
+
+       memset(&seek, 0, sizeof(seek));
+       seek.type = V4L2_TUNER_RADIO;
+       ret = doioctl(node, VIDIOC_S_HW_FREQ_SEEK, &seek);
+       if (!(node->caps & V4L2_CAP_HW_FREQ_SEEK) && ret != ENOTTY)
+               return fail("hw seek supported but capability not set\n");
+       if (!node->is_radio && ret != ENOTTY)
+               return fail("hw seek supported on a non-radio node?!\n");
+       if (!node->is_radio || !(node->caps & V4L2_CAP_HW_FREQ_SEEK))
+               return ENOTTY;
+       seek.type = V4L2_TUNER_ANALOG_TV;
+       ret = doioctl(node, VIDIOC_S_HW_FREQ_SEEK, &seek);
+       if (ret != EINVAL)
+               return fail("hw seek accepted TV tuner\n");
+       seek.type = V4L2_TUNER_RADIO;
+       seek.seek_upward = 1;
+       ret = doioctl(node, VIDIOC_S_HW_FREQ_SEEK, &seek);
+       if (ret == EINVAL) {
+               seek.wrap_around = 1;
+               ret = doioctl(node, VIDIOC_S_HW_FREQ_SEEK, &seek);
+       }
+       if (ret == EINVAL)
+               return fail("neither wrap_around value was accepted\n");
+       if (ret)
+               return fail("hw seek failed with error %d\n", ret);
+       if (check_0(seek.reserved, sizeof(seek.reserved)))
+               return fail("non-zero reserved fields\n");
+       return 0;
+}
+
 static int checkInput(struct node *node, const struct v4l2_input &descr, unsigned i)
 {
        __u32 mask = (1 << node->audio_inputs) - 1;