media: coda: mark the last output buffer on decoder stop command
authorPhilipp Zabel <p.zabel@pengutronix.de>
Tue, 18 Jun 2019 16:45:24 +0000 (12:45 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 24 Jun 2019 18:36:14 +0000 (14:36 -0400)
Mark the last output buffer to be decoded and only copy pending queued
output buffers into the bitstream ring buffer in the BIT processor
decoder case.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/platform/coda/coda-bit.c
drivers/media/platform/coda/coda-common.c

index bfe6019e68a871865d1d0982e69b13d804be2468..cbcec571a014aea42c969b433549b8a351b9dd8c 100644 (file)
@@ -312,6 +312,9 @@ static bool coda_bitstream_try_queue(struct coda_ctx *ctx,
        if (ctx == v4l2_m2m_get_curr_priv(ctx->dev->m2m_dev))
                coda_kfifo_sync_to_device_write(ctx);
 
+       /* Set the stream-end flag after the last buffer is queued */
+       if (src_buf->flags & V4L2_BUF_FLAG_LAST)
+               coda_bit_stream_end_flag(ctx);
        ctx->hold = false;
 
        return true;
index 935e8c408febde2a3e63735f2e621ff46113d2c9..b35e6ea704246a5079ddea7ef3a9f7b023455cff 100644 (file)
@@ -1071,6 +1071,7 @@ static int coda_decoder_cmd(struct file *file, void *fh,
 {
        struct coda_ctx *ctx = fh_to_ctx(fh);
        struct coda_dev *dev = ctx->dev;
+       struct vb2_v4l2_buffer *buf;
        struct vb2_queue *dst_vq;
        int ret;
 
@@ -1092,6 +1093,11 @@ static int coda_decoder_cmd(struct file *file, void *fh,
                mutex_unlock(&ctx->bitstream_mutex);
                break;
        case V4L2_DEC_CMD_STOP:
+               buf = v4l2_m2m_last_src_buf(ctx->fh.m2m_ctx);
+               if (buf)
+                       /* Mark last buffer */
+                       buf->flags |= V4L2_BUF_FLAG_LAST;
+
                /* Set the stream-end flag on this context */
                coda_bit_stream_end_flag(ctx);
                ctx->hold = false;