When user space queues a buffer using VIDIOC_QBUF, the kernel
should set flags in struct v4l2_buffer as specified in the V4L2
documentation.
---
drivers/media/video/videobuf-core.c | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/drivers/media/video/videobuf-core.c
b/drivers/media/video/videobuf-core.c
index b7b0584..1322056 100644
--- a/drivers/media/video/videobuf-core.c
+++ b/drivers/media/video/videobuf-core.c
@@ -477,6 +477,7 @@ int videobuf_qbuf(struct videobuf_queue *q,
struct videobuf_buffer *buf;
enum v4l2_field field;
unsigned long flags = 0;
+ __u32 buffer_flags = b->flags;
int retval;
MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
@@ -531,6 +532,8 @@ int videobuf_qbuf(struct videobuf_queue *q,
"but buffer addr is zero!\n");
goto done;
}
+ buffer_flags |= V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_QUEUED;
+ buffer_flags &= ~V4L2_BUF_FLAG_DONE;
break;
case V4L2_MEMORY_USERPTR:
if (b->length < buf->bsize) {
@@ -541,6 +544,8 @@ int videobuf_qbuf(struct videobuf_queue *q,
buf->baddr != b->m.userptr)
q->ops->buf_release(q, buf);
buf->baddr = b->m.userptr;
+ buffer_flags |= V4L2_BUF_FLAG_QUEUED;
+ buffer_flags &= ~(V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_DONE);
break;
case V4L2_MEMORY_OVERLAY:
buf->boff = b->m.offset;
@@ -564,6 +569,8 @@ int videobuf_qbuf(struct videobuf_queue *q,
q->ops->buf_queue(q, buf);
spin_unlock_irqrestore(q->irqlock, flags);
}
+
+ b->flags = buffer_flags;
dprintk(1, "qbuf: succeded\n");
retval = 0;
wake_up_interruptible_sync(&q->wait);
--
1.5.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html