diff options
author | Philipp Zabel <p.zabel@pengutronix.de> | 2018-11-05 18:25:01 +0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | 2018-11-23 13:26:24 +0300 |
commit | 51407c2da0b7baac581d0d9fbfc297d10b7d0424 (patch) | |
tree | 6897d63239c5792b443f8eaf8cdce1a6a4ac2b32 /drivers/media/platform/coda/coda-common.c | |
parent | 6c0f5d236fd0205a8dca24b82cfad1b1c6c0a1e0 (diff) | |
download | linux-51407c2da0b7baac581d0d9fbfc297d10b7d0424.tar.xz |
media: coda: always hold back decoder jobs until we have enough bitstream payload
The bitstream prefetch unit reads data in 256 byte blocks with some kind
of queueing. For the decoder to see data up to a desired position in the
next run, the bitstream has to be filled for 2 256 byte blocks past that
position aligned up to the next 256 byte boundary.
This should make sure we never run into a buffer underrun condition if
userspace does not supply new input buffers fast enough.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Hans Verkuil <hansverk@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Diffstat (limited to 'drivers/media/platform/coda/coda-common.c')
-rw-r--r-- | drivers/media/platform/coda/coda-common.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c index fbb8967dd2aa..e8b380f876b6 100644 --- a/drivers/media/platform/coda/coda-common.c +++ b/drivers/media/platform/coda/coda-common.c @@ -1273,6 +1273,7 @@ static int coda_job_ready(void *m2m_priv) bool stream_end = ctx->bit_stream_param & CODA_BIT_STREAM_END_FLAG; int num_metas = ctx->num_metas; + struct coda_buffer_meta *meta; unsigned int count; count = hweight32(ctx->frm_dis_flg); @@ -1293,16 +1294,18 @@ static int coda_job_ready(void *m2m_priv) if (!stream_end && (num_metas + src_bufs) < 2) { v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev, - "%d: not ready: need 2 buffers available (%d, %d)\n", + "%d: not ready: need 2 buffers available (queue:%d + bitstream:%d)\n", ctx->idx, num_metas, src_bufs); return 0; } - if (!src_bufs && !stream_end && - (coda_get_bitstream_payload(ctx) < 512)) { + meta = list_first_entry(&ctx->buffer_meta_list, + struct coda_buffer_meta, list); + if (!coda_bitstream_can_fetch_past(ctx, meta->end) && + !stream_end) { v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev, - "%d: not ready: not enough bitstream data (%d).\n", - ctx->idx, coda_get_bitstream_payload(ctx)); + "not ready: not enough bitstream data to read past %u (%u)\n", + meta->end, ctx->bitstream_fifo.kfifo.in); return 0; } } |