]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/media/video/cx18/cx18-fileops.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
[linux-2.6-omap-h63xx.git] / drivers / media / video / cx18 / cx18-fileops.c
index 5f9089907544c091f1e276eee7601a81a946ca77..425271a29517e91534e6762163ced38f61a0cbe7 100644 (file)
@@ -4,6 +4,7 @@
  *  Derived from ivtv-fileops.c
  *
  *  Copyright (C) 2007  Hans Verkuil <hverkuil@xs4all.nl>
+ *  Copyright (C) 2008  Andy Walls <awalls@radix.net>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -66,12 +67,11 @@ static int cx18_claim_stream(struct cx18_open_id *id, int type)
        }
        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;
@@ -185,8 +185,10 @@ static struct cx18_buffer *cx18_get_buffer(struct cx18_stream *s, int non_block,
                            !test_bit(CX18_F_S_APPL_IO, &s_vbi->s_flags)) {
                                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_enqueue(s_vbi, buf, &s_vbi->q_free);
+                                       cx18_process_vbi_data(cx, buf,
+                                                             s_vbi->dma_pts,
+                                                             s_vbi->type);
+                                       cx18_stream_put_buf_fw(s_vbi, buf);
                                }
                        }
                        buf = &cx->vbi.sliced_mpeg_buf;
@@ -194,11 +196,6 @@ static struct cx18_buffer *cx18_get_buffer(struct cx18_stream *s, int non_block,
                                return buf;
                }
 
-               /* do we have leftover data? */
-               buf = cx18_dequeue(s, &s->q_io);
-               if (buf)
-                       return buf;
-
                /* do we have new data? */
                buf = cx18_dequeue(s, &s->q_full);
                if (buf) {
@@ -262,7 +259,7 @@ static size_t cx18_copy_buf_to_user(struct cx18_stream *s,
        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;
@@ -337,8 +334,7 @@ static ssize_t cx18_read(struct cx18_stream *s, char __user *ubuf,
        /* 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 (;;) {
@@ -365,16 +361,10 @@ static ssize_t cx18_read(struct cx18_stream *s, char __user *ubuf,
                                tot_count - tot_written);
 
                if (buf != &cx->vbi.sliced_mpeg_buf) {
-                       if (buf->readpos == buf->bytesused) {
-                               cx18_buf_sync_for_device(s, buf);
-                               cx18_enqueue(s, buf, &s->q_free);
-                               cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5,
-                                       s->handle,
-                                       (void __iomem *)&cx->scb->cpu_mdl[buf->id] -
-                                         cx->enc_mem,
-                                       1, buf->id, s->buf_size);
-                       } else
-                               cx18_enqueue(s, buf, &s->q_io);
+                       if (buf->readpos == buf->bytesused)
+                               cx18_stream_put_buf_fw(s, buf);
+                       else
+                               cx18_push(s, buf, &s->q_full);
                } else if (buf->readpos == buf->bytesused) {
                        int idx = cx->vbi.inserted_frame % CX18_VBI_FRAMES;
 
@@ -518,7 +508,7 @@ unsigned int cx18_v4l2_enc_poll(struct file *filp, poll_table *wait)
        CX18_DEBUG_HI_FILE("Encoder poll\n");
        poll_wait(filp, &s->waitq, wait);
 
-       if (atomic_read(&s->q_full.buffers) || atomic_read(&s->q_io.buffers))
+       if (atomic_read(&s->q_full.buffers))
                return POLLIN | POLLRDNORM;
        if (eof)
                return POLLHUP;