The patch number 9805 was added via Andy Walls <awa...@radix.net>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        v4l-dvb-maintai...@linuxtv.org

------

From: Andy Walls  <awa...@radix.net>
cx18: Port fix for raw/sliced VBI mixup from ivtv and cx25840


This is a port of the fixes Hans Verkuil made for ivtv/cx25840:
The service_set field was used to determine whether raw or sliced VBI was
desired. This is incorrect since it is perfectly valid to select sliced VBI
with a service_set of 0.

Instead the driver should check on VIDIOC_S_FMT whether the type
field matches the raw or sliced VBI type.

Updated the cx18 driver accordingly, including an additional check in
cx18_start_v4l2_encode_stream() that didn't exist in ivtv.

Priority: normal

Signed-off-by: Andy Walls <awa...@radix.net>


---

 linux/drivers/media/video/cx18/cx18-av-vbi.c  |    5 +++--
 linux/drivers/media/video/cx18/cx18-driver.c  |    2 +-
 linux/drivers/media/video/cx18/cx18-driver.h  |    6 ++++++
 linux/drivers/media/video/cx18/cx18-fileops.c |   10 ++++------
 linux/drivers/media/video/cx18/cx18-ioctl.c   |   11 +++++------
 linux/drivers/media/video/cx18/cx18-streams.c |    6 +++---
 linux/drivers/media/video/cx18/cx18-vbi.c     |    2 +-
 7 files changed, 23 insertions(+), 19 deletions(-)

diff -r 1d28cd950601 -r 5b2e8f510c34 
linux/drivers/media/video/cx18/cx18-av-vbi.c
--- a/linux/drivers/media/video/cx18/cx18-av-vbi.c      Fri Dec 12 13:50:27 
2008 -0500
+++ b/linux/drivers/media/video/cx18/cx18-av-vbi.c      Fri Dec 12 14:24:04 
2008 -0500
@@ -141,10 +141,11 @@ int cx18_av_vbi(struct cx18 *cx, unsigne
                u8 lcr[24];
 
                fmt = arg;
-               if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
+               if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE &&
+                   fmt->type != V4L2_BUF_TYPE_VBI_CAPTURE)
                        return -EINVAL;
                svbi = &fmt->fmt.sliced;
-               if (svbi->service_set == 0) {
+               if (fmt->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
                        /* raw VBI */
                        memset(svbi, 0, sizeof(*svbi));
 
diff -r 1d28cd950601 -r 5b2e8f510c34 
linux/drivers/media/video/cx18/cx18-driver.c
--- a/linux/drivers/media/video/cx18/cx18-driver.c      Fri Dec 12 13:50:27 
2008 -0500
+++ b/linux/drivers/media/video/cx18/cx18-driver.c      Fri Dec 12 14:24:04 
2008 -0500
@@ -599,7 +599,7 @@ static int __devinit cx18_init_struct1(s
        init_waitqueue_head(&cx->dma_waitq);
 
        /* VBI */
-       cx->vbi.in.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
+       cx->vbi.in.type = V4L2_BUF_TYPE_VBI_CAPTURE;
        cx->vbi.sliced_in = &cx->vbi.in.fmt.sliced;
        cx->vbi.raw_size = 1456;
        cx->vbi.raw_decoder_line_size = 1456;
diff -r 1d28cd950601 -r 5b2e8f510c34 
linux/drivers/media/video/cx18/cx18-driver.h
--- a/linux/drivers/media/video/cx18/cx18-driver.h      Fri Dec 12 13:50:27 
2008 -0500
+++ b/linux/drivers/media/video/cx18/cx18-driver.h      Fri Dec 12 14:24:04 
2008 -0500
@@ -504,4 +504,10 @@ void cx18_read_eeprom(struct cx18 *cx, s
 /* First-open initialization: load firmware, etc. */
 int cx18_init_on_first_open(struct cx18 *cx);
 
+/* Test if the current VBI mode is raw (1) or sliced (0) */
+static inline int cx18_raw_vbi(const struct cx18 *cx)
+{
+       return cx->vbi.in.type == V4L2_BUF_TYPE_VBI_CAPTURE;
+}
+
 #endif /* CX18_DRIVER_H */
diff -r 1d28cd950601 -r 5b2e8f510c34 
linux/drivers/media/video/cx18/cx18-fileops.c
--- a/linux/drivers/media/video/cx18/cx18-fileops.c     Fri Dec 12 13:50:27 
2008 -0500
+++ b/linux/drivers/media/video/cx18/cx18-fileops.c     Fri Dec 12 14:24:04 
2008 -0500
@@ -67,12 +67,11 @@ static int cx18_claim_stream(struct cx18
        }
        s->id = id->open_id;
 
-       /* CX18_DEC_STREAM_TYPE_MPG needs to claim CX18_DEC_STREAM_TYPE_VBI,
-          CX18_ENC_STREAM_TYPE_MPG needs to claim CX18_ENC_STREAM_TYPE_VBI
+       /* CX18_ENC_STREAM_TYPE_MPG needs to claim CX18_ENC_STREAM_TYPE_VBI
           (provided VBI insertion is on and sliced VBI is selected), for all
           other streams we're done */
        if (type == CX18_ENC_STREAM_TYPE_MPG &&
-                  cx->vbi.insert_mpeg && cx->vbi.sliced_in->service_set) {
+           cx->vbi.insert_mpeg && !cx18_raw_vbi(cx)) {
                vbi_type = CX18_ENC_STREAM_TYPE_VBI;
        } else {
                return 0;
@@ -296,7 +295,7 @@ static size_t cx18_copy_buf_to_user(stru
        if (len > ucount)
                len = ucount;
        if (cx->vbi.insert_mpeg && s->type == CX18_ENC_STREAM_TYPE_MPG &&
-           cx->vbi.sliced_in->service_set && buf != &cx->vbi.sliced_mpeg_buf) {
+           !cx18_raw_vbi(cx) && buf != &cx->vbi.sliced_mpeg_buf) {
                const char *start = buf->buf + buf->readpos;
                const char *p = start + 1;
                const u8 *q;
@@ -371,8 +370,7 @@ static ssize_t cx18_read(struct cx18_str
        /* Each VBI buffer is one frame, the v4l2 API says that for VBI the
           frames should arrive one-by-one, so make sure we never output more
           than one VBI frame at a time */
-       if (s->type == CX18_ENC_STREAM_TYPE_VBI &&
-           cx->vbi.sliced_in->service_set)
+       if (s->type == CX18_ENC_STREAM_TYPE_VBI && !cx18_raw_vbi(cx))
                single_frame = 1;
 
        for (;;) {
diff -r 1d28cd950601 -r 5b2e8f510c34 linux/drivers/media/video/cx18/cx18-ioctl.c
--- a/linux/drivers/media/video/cx18/cx18-ioctl.c       Fri Dec 12 13:50:27 
2008 -0500
+++ b/linux/drivers/media/video/cx18/cx18-ioctl.c       Fri Dec 12 14:24:04 
2008 -0500
@@ -284,13 +284,12 @@ static int cx18_s_fmt_vbi_cap(struct fil
        if (ret)
                return ret;
 
-       if (id->type == CX18_ENC_STREAM_TYPE_VBI &&
-                       cx->vbi.sliced_in->service_set &&
-                       atomic_read(&cx->ana_capturing) > 0)
+       if (!cx18_raw_vbi(cx) && atomic_read(&cx->ana_capturing) > 0)
                return -EBUSY;
 
        cx->vbi.sliced_in->service_set = 0;
-       cx18_av_cmd(cx, VIDIOC_S_FMT, &cx->vbi.in);
+       cx->vbi.in.type = V4L2_BUF_TYPE_VBI_CAPTURE;
+       cx18_av_cmd(cx, VIDIOC_S_FMT, fmt);
        return cx18_g_fmt_vbi_cap(file, fh, fmt);
 }
 
@@ -315,9 +314,9 @@ static int cx18_s_fmt_sliced_vbi_cap(str
        if (check_service_set(vbifmt, cx->is_50hz) == 0)
                return -EINVAL;
 
-       if (atomic_read(&cx->ana_capturing) > 0 &&
-                       cx->vbi.sliced_in->service_set == 0)
+       if (cx18_raw_vbi(cx) && atomic_read(&cx->ana_capturing) > 0)
                return -EBUSY;
+       cx->vbi.in.type =  V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
        cx18_av_cmd(cx, VIDIOC_S_FMT, fmt);
        memcpy(cx->vbi.sliced_in, vbifmt, sizeof(*cx->vbi.sliced_in));
        return 0;
diff -r 1d28cd950601 -r 5b2e8f510c34 
linux/drivers/media/video/cx18/cx18-streams.c
--- a/linux/drivers/media/video/cx18/cx18-streams.c     Fri Dec 12 13:50:27 
2008 -0500
+++ b/linux/drivers/media/video/cx18/cx18-streams.c     Fri Dec 12 14:24:04 
2008 -0500
@@ -340,7 +340,7 @@ static void cx18_vbi_setup(struct cx18_s
 static void cx18_vbi_setup(struct cx18_stream *s)
 {
        struct cx18 *cx = s->cx;
-       int raw = cx->vbi.sliced_in->service_set == 0;
+       int raw = cx18_raw_vbi(cx);
        u32 data[CX2341X_MBOX_MAX_DATA];
        int lines;
 
@@ -471,8 +471,8 @@ int cx18_start_v4l2_encode_stream(struct
                captype = CAPTURE_CHANNEL_TYPE_PCM;
                break;
        case CX18_ENC_STREAM_TYPE_VBI:
-               captype = cx->vbi.sliced_in->service_set ?
-                   CAPTURE_CHANNEL_TYPE_SLICED_VBI : CAPTURE_CHANNEL_TYPE_VBI;
+               captype = cx18_raw_vbi(cx) ?
+                    CAPTURE_CHANNEL_TYPE_VBI : CAPTURE_CHANNEL_TYPE_SLICED_VBI;
                cx->vbi.frame = 0;
                cx->vbi.inserted_frame = 0;
                memset(cx->vbi.sliced_mpeg_size,
diff -r 1d28cd950601 -r 5b2e8f510c34 linux/drivers/media/video/cx18/cx18-vbi.c
--- a/linux/drivers/media/video/cx18/cx18-vbi.c Fri Dec 12 13:50:27 2008 -0500
+++ b/linux/drivers/media/video/cx18/cx18-vbi.c Fri Dec 12 14:24:04 2008 -0500
@@ -160,7 +160,7 @@ void cx18_process_vbi_data(struct cx18 *
                return;
 
        /* Raw VBI data */
-       if (cx->vbi.sliced_in->service_set == 0) {
+       if (cx18_raw_vbi(cx)) {
                u8 type;
 
                cx18_buf_swap(buf);


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/5b2e8f510c3499593ebab883278443dff5228371

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to