V4L/DVB (10440): cx18: Fix presentation timestamp (PTS) for VBI buffers
authorAndy Walls <awalls@radix.net>
Mon, 2 Feb 2009 00:42:12 +0000 (21:42 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:42:38 +0000 (12:42 -0300)
The old code from ivtv used a CX23415/6 PTS, which was simply left at 0 in the
cx18 driver.  Since the CX23418 gives us what I think is a PTS (or some other
90 kHz clock count) with each VBI buffer, this change has the cx18 driver use
that as a PTS.

Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx18/cx18-driver.h
drivers/media/video/cx18/cx18-fileops.c
drivers/media/video/cx18/cx18-vbi.c
drivers/media/video/cx18/cx18-vbi.h

index a41d9c4178f085c7a1172fcb15f67d58202fb3ae..c9b6df50ab27447625569f9d3b00e7aa6559bae7 100644 (file)
@@ -293,7 +293,6 @@ struct cx18_stream {
        int dma;                /* can be PCI_DMA_TODEVICE,
                                   PCI_DMA_FROMDEVICE or
                                   PCI_DMA_NONE */
-       u64 dma_pts;
        wait_queue_head_t waitq;
 
        /* Buffer Stats */
index 0b1dbc67e1ab89c13dca10a2fe740d2ee62b5707..68dd50ac4bfef97f39da3792c5a471111d521b95 100644 (file)
@@ -188,7 +188,6 @@ static struct cx18_buffer *cx18_get_buffer(struct cx18_stream *s, int non_block,
                                while ((buf = cx18_dequeue(s_vbi, &s_vbi->q_full))) {
                                        /* byteswap and process VBI data */
                                        cx18_process_vbi_data(cx, buf,
-                                                             s_vbi->dma_pts,
                                                              s_vbi->type);
                                        cx18_stream_put_buf_fw(s_vbi, buf);
                                }
@@ -209,8 +208,7 @@ static struct cx18_buffer *cx18_get_buffer(struct cx18_stream *s, int non_block,
                                cx18_buf_swap(buf);
                        else {
                                /* byteswap and process VBI data */
-                               cx18_process_vbi_data(cx, buf,
-                                               s->dma_pts, s->type);
+                               cx18_process_vbi_data(cx, buf, s->type);
                        }
                        return buf;
                }
index 38d26c42e4cb5399c2f795cef178cae360a701b0..d6e15e119582bf08216fff66e1208776c2ad47b0 100644 (file)
@@ -168,27 +168,28 @@ static u32 compress_sliced_buf(struct cx18 *cx, u32 line, u8 *buf,
 }
 
 void cx18_process_vbi_data(struct cx18 *cx, struct cx18_buffer *buf,
-                          u64 pts_stamp, int streamtype)
+                          int streamtype)
 {
        u8 *p = (u8 *) buf->buf;
+       u32 *q = (u32 *) buf->buf;
        u32 size = buf->bytesused;
+       u32 pts;
        int lines;
 
        if (streamtype != CX18_ENC_STREAM_TYPE_VBI)
                return;
 
+       cx18_buf_swap(buf);
+
        /*
-        * Note the CX23418 provides a 12 byte header, in it's raw VBI
-        * buffers to us, that we currently throw away:
-        * 0x3fffffff [4 bytes of something] [4 byte timestamp]
+        * The CX23418 provides a 12 byte header in it's raw VBI buffers to us:
+        * 0x3fffffff [4 bytes of something] [4 byte presentation time stamp?]
         */
 
        /* Raw VBI data */
        if (cx18_raw_vbi(cx)) {
                u8 type;
 
-               cx18_buf_swap(buf);
-
                /* Skip 12 bytes of header that gets stuffed in */
                size -= 12;
                memcpy(p, &buf->buf[12], size);
@@ -208,7 +209,8 @@ void cx18_process_vbi_data(struct cx18 *cx, struct cx18_buffer *buf,
        }
 
        /* Sliced VBI data with data insertion */
-       cx18_buf_swap(buf);
+
+       pts = (q[0] == 0x3fffffff) ? q[2] : 0;
 
        /* first field */
        /* compress_sliced_buf() will skip the 12 bytes of header */
@@ -230,6 +232,6 @@ void cx18_process_vbi_data(struct cx18 *cx, struct cx18_buffer *buf,
        memcpy(p, &cx->vbi.sliced_data[0], size);
 
        if (cx->vbi.insert_mpeg)
-               copy_vbi_data(cx, lines, pts_stamp);
+               copy_vbi_data(cx, lines, pts);
        cx->vbi.frame++;
 }
index c56ff7d28f20f60706c51ebab4ad53a55f5ab833..e7e1ae427f34592bff07fd00cce15c244919cc82 100644 (file)
@@ -22,5 +22,5 @@
  */
 
 void cx18_process_vbi_data(struct cx18 *cx, struct cx18_buffer *buf,
-                          u64 pts_stamp, int streamtype);
+                          int streamtype);
 int cx18_used_line(struct cx18 *cx, int line, int field);