V4L/DVB (5183): Fix CC handling in VIDIOC_INT_G_VBI_DATA
authorHans Verkuil <hverkuil@xs4all.nl>
Sat, 3 Feb 2007 09:35:07 +0000 (06:35 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Wed, 21 Feb 2007 15:35:14 +0000 (13:35 -0200)
When capturing a 60 Hz input the internal field ID is inverted. The
VIDIOC_INT_G_VBI_DATA didn't take that into account and so returned
XDS instead of CC and vice versa.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/saa7115.c

index 7177721..c4f066d 100644 (file)
@@ -1388,6 +1388,9 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar
        {
                struct v4l2_sliced_vbi_data *data = arg;
 
+               /* Note: the internal field ID is inverted for NTSC,
+                  so data->field 0 maps to the saa7115 even field,
+                  whereas for PAL it maps to the saa7115 odd field. */
                switch (data->id) {
                case V4L2_SLICED_WSS_625:
                        if (saa711x_read(client, 0x6b) & 0xc0)
@@ -1398,17 +1401,17 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar
                case V4L2_SLICED_CAPTION_525:
                        if (data->field == 0) {
                                /* CC */
-                               if (saa711x_read(client, 0x66) & 0xc0)
+                               if (saa711x_read(client, 0x66) & 0x30)
                                        return -EIO;
-                               data->data[0] = saa711x_read(client, 0x67);
-                               data->data[1] = saa711x_read(client, 0x68);
+                               data->data[0] = saa711x_read(client, 0x69);
+                               data->data[1] = saa711x_read(client, 0x6a);
                                return 0;
                        }
                        /* XDS */
-                       if (saa711x_read(client, 0x66) & 0x30)
+                       if (saa711x_read(client, 0x66) & 0xc0)
                                return -EIO;
-                       data->data[0] = saa711x_read(client, 0x69);
-                       data->data[1] = saa711x_read(client, 0x6a);
+                       data->data[0] = saa711x_read(client, 0x67);
+                       data->data[1] = saa711x_read(client, 0x68);
                        return 0;
                default:
                        return -EINVAL;