|
@@ -1943,6 +1943,11 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking)
|
|
|
return -EIO;
|
|
|
}
|
|
|
|
|
|
+ if (q->last_buffer_dequeued) {
|
|
|
+ dprintk(3, "last buffer dequeued already, will not wait for buffers\n");
|
|
|
+ return -EPIPE;
|
|
|
+ }
|
|
|
+
|
|
|
if (!list_empty(&q->done_list)) {
|
|
|
/*
|
|
|
* Found a buffer that we were waiting for.
|
|
@@ -2098,6 +2103,9 @@ static int vb2_internal_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool n
|
|
|
/* Remove from videobuf queue */
|
|
|
list_del(&vb->queued_entry);
|
|
|
q->queued_count--;
|
|
|
+ if (!V4L2_TYPE_IS_OUTPUT(q->type) &&
|
|
|
+ vb->v4l2_buf.flags & V4L2_BUF_FLAG_LAST)
|
|
|
+ q->last_buffer_dequeued = true;
|
|
|
/* go back to dequeued state */
|
|
|
__vb2_dqbuf(vb);
|
|
|
|
|
@@ -2311,6 +2319,7 @@ static int vb2_internal_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
|
|
|
*/
|
|
|
__vb2_queue_cancel(q);
|
|
|
q->waiting_for_buffers = !V4L2_TYPE_IS_OUTPUT(q->type);
|
|
|
+ q->last_buffer_dequeued = false;
|
|
|
|
|
|
dprintk(3, "successful\n");
|
|
|
return 0;
|
|
@@ -2653,8 +2662,16 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
|
|
|
if (V4L2_TYPE_IS_OUTPUT(q->type) && q->queued_count < q->num_buffers)
|
|
|
return res | POLLOUT | POLLWRNORM;
|
|
|
|
|
|
- if (list_empty(&q->done_list))
|
|
|
+ if (list_empty(&q->done_list)) {
|
|
|
+ /*
|
|
|
+ * If the last buffer was dequeued from a capture queue,
|
|
|
+ * return immediately. DQBUF will return -EPIPE.
|
|
|
+ */
|
|
|
+ if (q->last_buffer_dequeued)
|
|
|
+ return res | POLLIN | POLLRDNORM;
|
|
|
+
|
|
|
poll_wait(file, &q->done_wq, wait);
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Take first buffer available for dequeuing.
|