media: coda: fix V4L2_DEC_CMD_STOP when all buffers are already consumed
authorMarco Felsch <m.felsch@pengutronix.de>
Tue, 18 Jun 2019 16:45:13 +0000 (12:45 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 24 Jun 2019 18:22:08 +0000 (14:22 -0400)
When the DEC_CMD_STOP command is issued after the context has already
consumed all the queued buffers, we need to make sure to wake the
destination queue with last_buffer_dequeued set, to allow userspace to
make progress in its EOS handling.

As there might still be picture run workers pending at that point, we
need to synchronize with them, so the sequence number comparison reads
stable values.

 reword commit message]

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
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 095747ae1c40e194fcd80f865bb41a09621181e9..43820cfac76cbad6475118445e4fae4201434e49 100644 (file)
@@ -1071,6 +1071,12 @@ static int coda_decoder_cmd(struct file *file, void *fh,
                coda_bit_stream_end_flag(ctx);
                ctx->hold = false;
                v4l2_m2m_try_schedule(ctx->fh.m2m_ctx);
+
+               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);
                break;
        default:
                return -EINVAL;