diff options
| author | Marek Szyprowski <m.szyprowski@samsung.com> | 2011-04-12 09:14:13 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-04-19 15:07:15 -0400 |
| commit | ea42c8ecb2ff998b8f71e0a5f9d2748a65cb8f04 (patch) | |
| tree | 51d6d122ada242bc86ea21b5a440a4dd779601e8 | |
| parent | 89582654ee3d1d76e153212c88daa6aa6c024fec (diff) | |
[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>
| -rw-r--r-- | drivers/media/video/videobuf2-core.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/media/video/videobuf2-core.c b/drivers/media/video/videobuf2-core.c index 71734a4da135..09d792d2edfd 100644 --- a/drivers/media/video/videobuf2-core.c +++ b/drivers/media/video/videobuf2-core.c | |||
| @@ -37,6 +37,9 @@ module_param(debug, int, 0644); | |||
| 37 | #define call_qop(q, op, args...) \ | 37 | #define call_qop(q, op, args...) \ |
| 38 | (((q)->ops->op) ? ((q)->ops->op(args)) : 0) | 38 | (((q)->ops->op) ? ((q)->ops->op(args)) : 0) |
| 39 | 39 | ||
| 40 | #define V4L2_BUFFER_STATE_FLAGS (V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_QUEUED | \ | ||
| 41 | V4L2_BUF_FLAG_DONE | V4L2_BUF_FLAG_ERROR) | ||
| 42 | |||
| 40 | /** | 43 | /** |
| 41 | * __vb2_buf_mem_alloc() - allocate video memory for the given buffer | 44 | * __vb2_buf_mem_alloc() - allocate video memory for the given buffer |
| 42 | */ | 45 | */ |
| @@ -284,7 +287,7 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b) | |||
| 284 | struct vb2_queue *q = vb->vb2_queue; | 287 | struct vb2_queue *q = vb->vb2_queue; |
| 285 | int ret = 0; | 288 | int ret = 0; |
| 286 | 289 | ||
| 287 | /* Copy back data such as timestamp, input, etc. */ | 290 | /* Copy back data such as timestamp, flags, input, etc. */ |
| 288 | memcpy(b, &vb->v4l2_buf, offsetof(struct v4l2_buffer, m)); | 291 | memcpy(b, &vb->v4l2_buf, offsetof(struct v4l2_buffer, m)); |
| 289 | b->input = vb->v4l2_buf.input; | 292 | b->input = vb->v4l2_buf.input; |
| 290 | b->reserved = vb->v4l2_buf.reserved; | 293 | b->reserved = vb->v4l2_buf.reserved; |
| @@ -313,7 +316,10 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b) | |||
| 313 | b->m.userptr = vb->v4l2_planes[0].m.userptr; | 316 | b->m.userptr = vb->v4l2_planes[0].m.userptr; |
| 314 | } | 317 | } |
| 315 | 318 | ||
| 316 | b->flags = 0; | 319 | /* |
| 320 | * Clear any buffer state related flags. | ||
| 321 | */ | ||
| 322 | b->flags &= ~V4L2_BUFFER_STATE_FLAGS; | ||
| 317 | 323 | ||
| 318 | switch (vb->state) { | 324 | switch (vb->state) { |
| 319 | case VB2_BUF_STATE_QUEUED: | 325 | case VB2_BUF_STATE_QUEUED: |
| @@ -715,6 +721,8 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b, | |||
| 715 | 721 | ||
| 716 | vb->v4l2_buf.field = b->field; | 722 | vb->v4l2_buf.field = b->field; |
| 717 | vb->v4l2_buf.timestamp = b->timestamp; | 723 | vb->v4l2_buf.timestamp = b->timestamp; |
| 724 | vb->v4l2_buf.input = b->input; | ||
| 725 | vb->v4l2_buf.flags = b->flags & ~V4L2_BUFFER_STATE_FLAGS; | ||
| 718 | 726 | ||
| 719 | return 0; | 727 | return 0; |
| 720 | } | 728 | } |
