|
@@ -285,8 +285,10 @@ static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
|
|
case VIDEOBUF_ACTIVE:
|
|
case VIDEOBUF_ACTIVE:
|
|
b->flags |= V4L2_BUF_FLAG_QUEUED;
|
|
b->flags |= V4L2_BUF_FLAG_QUEUED;
|
|
break;
|
|
break;
|
|
- case VIDEOBUF_DONE:
|
|
|
|
case VIDEOBUF_ERROR:
|
|
case VIDEOBUF_ERROR:
|
|
|
|
+ b->flags |= V4L2_BUF_FLAG_ERROR;
|
|
|
|
+ /* fall through */
|
|
|
|
+ case VIDEOBUF_DONE:
|
|
b->flags |= V4L2_BUF_FLAG_DONE;
|
|
b->flags |= V4L2_BUF_FLAG_DONE;
|
|
break;
|
|
break;
|
|
case VIDEOBUF_NEEDS_INIT:
|
|
case VIDEOBUF_NEEDS_INIT:
|
|
@@ -670,6 +672,7 @@ int videobuf_dqbuf(struct videobuf_queue *q,
|
|
|
|
|
|
MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
|
|
MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
|
|
|
|
|
|
|
|
+ memset(b, 0, sizeof(*b));
|
|
mutex_lock(&q->vb_lock);
|
|
mutex_lock(&q->vb_lock);
|
|
|
|
|
|
retval = stream_next_buffer(q, &buf, nonblocking);
|
|
retval = stream_next_buffer(q, &buf, nonblocking);
|
|
@@ -681,23 +684,20 @@ int videobuf_dqbuf(struct videobuf_queue *q,
|
|
switch (buf->state) {
|
|
switch (buf->state) {
|
|
case VIDEOBUF_ERROR:
|
|
case VIDEOBUF_ERROR:
|
|
dprintk(1, "dqbuf: state is error\n");
|
|
dprintk(1, "dqbuf: state is error\n");
|
|
- retval = -EIO;
|
|
|
|
- CALL(q, sync, q, buf);
|
|
|
|
- buf->state = VIDEOBUF_IDLE;
|
|
|
|
break;
|
|
break;
|
|
case VIDEOBUF_DONE:
|
|
case VIDEOBUF_DONE:
|
|
dprintk(1, "dqbuf: state is done\n");
|
|
dprintk(1, "dqbuf: state is done\n");
|
|
- CALL(q, sync, q, buf);
|
|
|
|
- buf->state = VIDEOBUF_IDLE;
|
|
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
dprintk(1, "dqbuf: state invalid\n");
|
|
dprintk(1, "dqbuf: state invalid\n");
|
|
retval = -EINVAL;
|
|
retval = -EINVAL;
|
|
goto done;
|
|
goto done;
|
|
}
|
|
}
|
|
- list_del(&buf->stream);
|
|
|
|
- memset(b, 0, sizeof(*b));
|
|
|
|
|
|
+ CALL(q, sync, q, buf);
|
|
videobuf_status(q, b, buf, q->type);
|
|
videobuf_status(q, b, buf, q->type);
|
|
|
|
+ list_del(&buf->stream);
|
|
|
|
+ buf->state = VIDEOBUF_IDLE;
|
|
|
|
+ b->flags &= ~V4L2_BUF_FLAG_DONE;
|
|
done:
|
|
done:
|
|
mutex_unlock(&q->vb_lock);
|
|
mutex_unlock(&q->vb_lock);
|
|
return retval;
|
|
return retval;
|