On 2/15/19 2:05 PM, Dafna Hirschfeld wrote: > call v4l2_m2m_buf_copy_metadata also if decoding/encoding > ends with status VB2_BUF_STATE_ERROR. Is this a bug fix? Why is this needed? The commit log can use a bit more work :-) Also, I don't think this has anything to do with the stateless codec, so I would move this before patch 6 in the patch series. Regards, Hans > > Signed-off-by: Dafna Hirschfeld <dafna3@xxxxxxxxx> > --- > 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 e4139f6b0348..031aaf83839c 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); >