
From: Gerd Knorr <kraxel@bytesex.org>

This patch updates the video-buf module to support the per-frame input
switching added by the v4l2 API patch.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/media/video/video-buf.c |   14 ++++++++++++++
 25-akpm/include/media/video-buf.h       |    6 +++++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff -puN drivers/media/video/video-buf.c~v4l-update-video-buf-for-per-frame-input-switching drivers/media/video/video-buf.c
--- 25/drivers/media/video/video-buf.c~v4l-update-video-buf-for-per-frame-input-switching	2004-06-19 13:57:58.047114760 -0700
+++ 25-akpm/drivers/media/video/video-buf.c	2004-06-19 13:57:58.053113848 -0700
@@ -491,6 +491,11 @@ videobuf_status(struct v4l2_buffer *b, s
 		break;
 	}
 
+	if (vb->input != UNSET) {
+		b->flags |= V4L2_BUF_FLAG_INPUT;
+		b->input  = vb->input;
+	}
+
 	b->field     = vb->field;
 	b->timestamp = vb->ts;
 	b->bytesused = vb->size;
@@ -574,6 +579,14 @@ videobuf_qbuf(struct file *file, struct 
 	    buf->state == STATE_ACTIVE)
 		goto done;
 
+	if (b->flags & V4L2_BUF_FLAG_INPUT) {
+		if (b->input >= q->inputs)
+			goto done;
+		buf->input = b->input;
+	} else {
+		buf->input = UNSET;
+	}
+
 	switch (b->memory) {
 	case V4L2_MEMORY_MMAP:
 		if (0 == buf->baddr)
@@ -1075,6 +1088,7 @@ int videobuf_mmap_setup(struct file *fil
 	for (i = 0; i < bcount; i++) {
 		q->bufs[i] = videobuf_alloc(q->msize);
 		q->bufs[i]->i      = i;
+		q->bufs[i]->input  = UNSET;
 		q->bufs[i]->memory = memory;
 		q->bufs[i]->bsize  = bsize;
 		switch (memory) {
diff -puN include/media/video-buf.h~v4l-update-video-buf-for-per-frame-input-switching include/media/video-buf.h
--- 25/include/media/video-buf.h~v4l-update-video-buf-for-per-frame-input-switching	2004-06-19 13:57:58.048114608 -0700
+++ 25-akpm/include/media/video-buf.h	2004-06-19 13:57:58.053113848 -0700
@@ -18,6 +18,8 @@
 
 #include <linux/videodev.h>
 
+#define UNSET (-1U)
+
 /* --------------------------------------------------------------------- */
 
 /*
@@ -140,6 +142,7 @@ struct videobuf_buffer {
 	unsigned int            height;
 	unsigned int            bytesperline; /* use only if != 0 */
 	unsigned long           size;
+	unsigned int            input;
 	enum v4l2_field         field;
 	enum videobuf_state     state;
 	struct videobuf_dmabuf  dma;
@@ -174,9 +177,10 @@ struct videobuf_queue {
 	struct pci_dev             *pci;
 
 	enum v4l2_buf_type         type;
+	unsigned int               inputs; /* for V4L2_BUF_FLAG_INPUT */
 	unsigned int               msize;
 	enum v4l2_field            field;
-	enum v4l2_field            last; /* for field=V4L2_FIELD_ALTERNATE */
+	enum v4l2_field            last;   /* for field=V4L2_FIELD_ALTERNATE */
 	struct videobuf_buffer     *bufs[VIDEO_MAX_FRAME];
 	struct videobuf_queue_ops  *ops;
 
_
