[media] media: vb2: fix incorrect v4l2_buffer->flags handling
Videobuf2 core assumes that driver doesn't set any buffer flags. This is correct for buffer state flags that videobuf2 manages, but the other flags like V4L2_BUF_FLAG_{KEY,P,B}FRAME, V4L2_BUF_FLAG_TIMECODE and V4L2_BUF_FLAG_INPUT should be passed from or to the driver. Reported-by: Jonghun Han <jonghun.han@samsung.com> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> CC: Pawel Osciak <pawel@osciak.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
89582654ee
commit
ea42c8ecb2
|
@ -37,6 +37,9 @@ module_param(debug, int, 0644);
|
||||||
#define call_qop(q, op, args...) \
|
#define call_qop(q, op, args...) \
|
||||||
(((q)->ops->op) ? ((q)->ops->op(args)) : 0)
|
(((q)->ops->op) ? ((q)->ops->op(args)) : 0)
|
||||||
|
|
||||||
|
#define V4L2_BUFFER_STATE_FLAGS (V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_QUEUED | \
|
||||||
|
V4L2_BUF_FLAG_DONE | V4L2_BUF_FLAG_ERROR)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __vb2_buf_mem_alloc() - allocate video memory for the given buffer
|
* __vb2_buf_mem_alloc() - allocate video memory for the given buffer
|
||||||
*/
|
*/
|
||||||
|
@ -284,7 +287,7 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b)
|
||||||
struct vb2_queue *q = vb->vb2_queue;
|
struct vb2_queue *q = vb->vb2_queue;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
/* Copy back data such as timestamp, input, etc. */
|
/* Copy back data such as timestamp, flags, input, etc. */
|
||||||
memcpy(b, &vb->v4l2_buf, offsetof(struct v4l2_buffer, m));
|
memcpy(b, &vb->v4l2_buf, offsetof(struct v4l2_buffer, m));
|
||||||
b->input = vb->v4l2_buf.input;
|
b->input = vb->v4l2_buf.input;
|
||||||
b->reserved = vb->v4l2_buf.reserved;
|
b->reserved = vb->v4l2_buf.reserved;
|
||||||
|
@ -313,7 +316,10 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b)
|
||||||
b->m.userptr = vb->v4l2_planes[0].m.userptr;
|
b->m.userptr = vb->v4l2_planes[0].m.userptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
b->flags = 0;
|
/*
|
||||||
|
* Clear any buffer state related flags.
|
||||||
|
*/
|
||||||
|
b->flags &= ~V4L2_BUFFER_STATE_FLAGS;
|
||||||
|
|
||||||
switch (vb->state) {
|
switch (vb->state) {
|
||||||
case VB2_BUF_STATE_QUEUED:
|
case VB2_BUF_STATE_QUEUED:
|
||||||
|
@ -715,6 +721,8 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b,
|
||||||
|
|
||||||
vb->v4l2_buf.field = b->field;
|
vb->v4l2_buf.field = b->field;
|
||||||
vb->v4l2_buf.timestamp = b->timestamp;
|
vb->v4l2_buf.timestamp = b->timestamp;
|
||||||
|
vb->v4l2_buf.input = b->input;
|
||||||
|
vb->v4l2_buf.flags = b->flags & ~V4L2_BUFFER_STATE_FLAGS;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue