|
@@ -1645,7 +1645,7 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking)
|
|
* Will sleep if required for nonblocking == false.
|
|
* Will sleep if required for nonblocking == false.
|
|
*/
|
|
*/
|
|
static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb,
|
|
static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb,
|
|
- int nonblocking)
|
|
|
|
|
|
+ void *pb, int nonblocking)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
int ret;
|
|
int ret;
|
|
@@ -1666,10 +1666,10 @@ static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb,
|
|
/*
|
|
/*
|
|
* Only remove the buffer from done_list if v4l2_buffer can handle all
|
|
* Only remove the buffer from done_list if v4l2_buffer can handle all
|
|
* the planes.
|
|
* the planes.
|
|
- * Verifying planes is NOT necessary since it already has been checked
|
|
|
|
- * before the buffer is queued/prepared. So it can never fail.
|
|
|
|
*/
|
|
*/
|
|
- list_del(&(*vb)->done_entry);
|
|
|
|
|
|
+ ret = call_bufop(q, verify_planes_array, *vb, pb);
|
|
|
|
+ if (!ret)
|
|
|
|
+ list_del(&(*vb)->done_entry);
|
|
spin_unlock_irqrestore(&q->done_lock, flags);
|
|
spin_unlock_irqrestore(&q->done_lock, flags);
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
@@ -1748,7 +1748,7 @@ int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb,
|
|
struct vb2_buffer *vb = NULL;
|
|
struct vb2_buffer *vb = NULL;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- ret = __vb2_get_done_vb(q, &vb, nonblocking);
|
|
|
|
|
|
+ ret = __vb2_get_done_vb(q, &vb, pb, nonblocking);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
return ret;
|
|
return ret;
|
|
|
|
|