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 <[email protected]>
> ---
> 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);
>