media: coda: only set the stream end flags if there are no more pending output buffers
authorPhilipp Zabel <p.zabel@pengutronix.de>
Tue, 18 Jun 2019 16:45:25 +0000 (12:45 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 24 Jun 2019 18:36:55 +0000 (14:36 -0400)
If there are still queued output buffers pending to be copied into the
bitstream ring buffer, setting the stream end flag should be deferred
until the marked last output buffer is written into the bitstream ring
buffer.

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-common.c

index b35e6ea704246a5079ddea7ef3a9f7b023455cff..a1277d321aa31eb808171aad2359ab07b3cb447f 100644 (file)
@@ -1098,16 +1098,20 @@ static int coda_decoder_cmd(struct file *file, void *fh,
                        /* 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;
-               v4l2_m2m_try_schedule(ctx->fh.m2m_ctx);
+               if (v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) == 0) {
+                       /* Set the stream-end flag on this context */
+                       coda_bit_stream_end_flag(ctx);
+                       ctx->hold = false;
+                       v4l2_m2m_try_schedule(ctx->fh.m2m_ctx);
 
-               flush_work(&ctx->pic_run_work);
+                       flush_work(&ctx->pic_run_work);
+
+                       /* If there is no buffer in flight, wake up */
+                       if (!ctx->streamon_out ||
+                           ctx->qsequence == ctx->osequence)
+                               coda_wake_up_capture_queue(ctx);
+               }
 
-               /* If there is no buffer in flight, wake up */
-               if (!ctx->streamon_out || ctx->qsequence == ctx->osequence)
-                       coda_wake_up_capture_queue(ctx);
                break;
        default:
                return -EINVAL;