summaryrefslogtreecommitdiffstats
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorPhilipp Zabel2019-06-18 18:45:25 +0200
committerMauro Carvalho Chehab2019-06-24 20:36:55 +0200
commita02f6ca3367e1fd3cbd14e8798af90b8b667bbbe (patch)
tree228300c121c16f88d36c9126ca4edeed92762e06 /drivers/media/platform
parentmedia: coda: mark the last output buffer on decoder stop command (diff)
downloadkernel-qcow2-linux-a02f6ca3367e1fd3cbd14e8798af90b8b667bbbe.tar.gz
kernel-qcow2-linux-a02f6ca3367e1fd3cbd14e8798af90b8b667bbbe.tar.xz
kernel-qcow2-linux-a02f6ca3367e1fd3cbd14e8798af90b8b667bbbe.zip
media: coda: only set the stream end flags if there are no more pending output buffers
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>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/coda/coda-common.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c
index b35e6ea70424..a1277d321aa3 100644
--- a/drivers/media/platform/coda/coda-common.c
+++ b/drivers/media/platform/coda/coda-common.c
@@ -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;