| From 9f115f47474965f67c03dee03bd2e922e0829c8e Mon Sep 17 00:00:00 2001 |
| From: Dafna Hirschfeld <dafna3@gmail.com> |
| Date: Wed, 6 Mar 2019 16:13:28 -0500 |
| Subject: media: vicodec: bugfix - call v4l2_m2m_buf_copy_metadata also if |
| decoding fails |
| |
| [ Upstream commit 8eead25cbdf911e17cff321903bd3397bc6ea22c ] |
| |
| The function 'v4l2_m2m_buf_copy_metadata' should |
| be called even if decoding/encoding ends with |
| status VB2_BUF_STATE_ERROR, so that the metadata |
| is copied from the source buffer to the dest buffer. |
| |
| Signed-off-by: Dafna Hirschfeld <dafna3@gmail.com> |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/platform/vicodec/vicodec-core.c | 17 +++++++++-------- |
| 1 file changed, 9 insertions(+), 8 deletions(-) |
| |
| diff --git a/drivers/media/platform/vicodec/vicodec-core.c b/drivers/media/platform/vicodec/vicodec-core.c |
| index d7636fe9e1749..6b618452700c4 100644 |
| --- a/drivers/media/platform/vicodec/vicodec-core.c |
| +++ b/drivers/media/platform/vicodec/vicodec-core.c |
| @@ -159,12 +159,10 @@ static int device_process(struct vicodec_ctx *ctx, |
| struct vb2_v4l2_buffer *dst_vb) |
| { |
| struct vicodec_dev *dev = ctx->dev; |
| - struct vicodec_q_data *q_dst; |
| struct v4l2_fwht_state *state = &ctx->state; |
| u8 *p_src, *p_dst; |
| int ret; |
| |
| - q_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); |
| if (ctx->is_enc) |
| p_src = vb2_plane_vaddr(&src_vb->vb2_buf, 0); |
| else |
| @@ -186,8 +184,10 @@ static int device_process(struct vicodec_ctx *ctx, |
| return ret; |
| vb2_set_plane_payload(&dst_vb->vb2_buf, 0, ret); |
| } else { |
| + struct vicodec_q_data *q_dst; |
| unsigned int comp_frame_size = ntohl(ctx->state.header.size); |
| |
| + q_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); |
| if (comp_frame_size > ctx->comp_max_size) |
| return -EINVAL; |
| state->info = q_dst->info; |
| @@ -196,11 +196,6 @@ static int device_process(struct vicodec_ctx *ctx, |
| return ret; |
| vb2_set_plane_payload(&dst_vb->vb2_buf, 0, q_dst->sizeimage); |
| } |
| - |
| - dst_vb->sequence = q_dst->sequence++; |
| - dst_vb->flags &= ~V4L2_BUF_FLAG_LAST; |
| - v4l2_m2m_buf_copy_metadata(src_vb, dst_vb, !ctx->is_enc); |
| - |
| return 0; |
| } |
| |
| @@ -274,16 +269,22 @@ static void device_run(void *priv) |
| struct vicodec_ctx *ctx = priv; |
| struct vicodec_dev *dev = ctx->dev; |
| struct vb2_v4l2_buffer *src_buf, *dst_buf; |
| - struct vicodec_q_data *q_src; |
| + struct vicodec_q_data *q_src, *q_dst; |
| u32 state; |
| |
| src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); |
| dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); |
| q_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT); |
| + q_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); |
| |
| state = VB2_BUF_STATE_DONE; |
| if (device_process(ctx, src_buf, dst_buf)) |
| state = VB2_BUF_STATE_ERROR; |
| + else |
| + dst_buf->sequence = q_dst->sequence++; |
| + dst_buf->flags &= ~V4L2_BUF_FLAG_LAST; |
| + v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, !ctx->is_enc); |
| + |
| ctx->last_dst_buf = dst_buf; |
| |
| spin_lock(ctx->lock); |
| -- |
| 2.20.1 |
| |