call v4l2_m2m_buf_copy_metadata also if decoding/encoding
ends with status VB2_BUF_STATE_ERROR.

Signed-off-by: Dafna Hirschfeld <daf...@gmail.com>
---
 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 324ce566478e..9a6ee593ae19 100644
--- a/drivers/media/platform/vicodec/vicodec-core.c
+++ b/drivers/media/platform/vicodec/vicodec-core.c
@@ -165,12 +165,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
@@ -192,8 +190,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;
@@ -204,11 +204,6 @@ static int device_process(struct vicodec_ctx *ctx,
 
                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;
 }
 
@@ -282,16 +277,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.17.1

Reply via email to