From: Hans Verkuil <hans.verkuil@xxxxxxxxx> The vb2_qbuf_request() function will queue any buffers for the given request that are in state PREPARED. Useful when drivers have to implement the req_queue callback. Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> --- drivers/media/v4l2-core/videobuf2-v4l2.c | 31 +++++++++++++++++++++++++++++++ include/media/videobuf2-v4l2.h | 1 + 2 files changed, 32 insertions(+) diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c b/drivers/media/v4l2-core/videobuf2-v4l2.c index be0c0ff06979..bbbd8e1b1a99 100644 --- a/drivers/media/v4l2-core/videobuf2-v4l2.c +++ b/drivers/media/v4l2-core/videobuf2-v4l2.c @@ -120,6 +120,9 @@ static void __copy_timestamp(struct vb2_buffer *vb, const void *pb) struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); struct vb2_queue *q = vb->vb2_queue; + if (!pb) + return; + if (q->is_output) { /* * For output buffers copy the timestamp if needed, @@ -193,6 +196,9 @@ static void __fill_v4l2_buffer(struct vb2_buffer *vb, void *pb) struct vb2_queue *q = vb->vb2_queue; unsigned int plane; + if (!pb) + return; + /* Copy back data such as timestamp, flags, etc. */ b->index = vb->index; b->type = vb->type; @@ -622,6 +628,31 @@ int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b) } EXPORT_SYMBOL_GPL(vb2_qbuf); +int vb2_qbuf_request(struct vb2_queue *q, u16 request, struct vb2_buffer **p_buf) +{ + unsigned int buffer; + + for (buffer = 0; buffer < q->num_buffers; buffer++) { + struct vb2_buffer *vb = q->bufs[buffer]; + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + + if (vbuf->request == request && + vb->state == VB2_BUF_STATE_PREPARED) { + if (p_buf) + *p_buf = vb; + /* + * The buffer has already been prepared so we can skip + * the vb2_queue_or_prepare_buf() call in vb2_qbuf() and + * call the core function directly. + */ + return vb2_core_qbuf(q, vb->index, NULL); + } + } + + return -ENOENT; +} +EXPORT_SYMBOL_GPL(vb2_qbuf_request); + static int vb2_internal_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking) { diff --git a/include/media/videobuf2-v4l2.h b/include/media/videobuf2-v4l2.h index 0c5e47919607..ed1a5753adbd 100644 --- a/include/media/videobuf2-v4l2.h +++ b/include/media/videobuf2-v4l2.h @@ -57,6 +57,7 @@ int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create); int vb2_prepare_buf(struct vb2_queue *q, struct v4l2_buffer *b); int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b); +int vb2_qbuf_request(struct vb2_queue *q, u16 request, struct vb2_buffer **p_buf); int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb); int vb2_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking); -- 2.4.10