[media] coda: fix job_ready debug reporting for bitstream decoding
authorPhilipp Zabel <p.zabel@pengutronix.de>
Fri, 23 Jan 2015 16:51:20 +0000 (13:51 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Mon, 2 Feb 2015 12:01:09 +0000 (10:01 -0200)
Clarify whether job_ready returns false because the context is on hold, waiting
for new input buffers, whether there are not enough input buffers to fill two
into the bitstream, or whether there is not enough data in the bitstream buffer
for the bitstream reader hardware to read a whole frame.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/coda/coda-common.c

index 8b4bd88af2904220852bf60ccafec850123f66b1..14953b4df586b9fa7b75af6e4c2e1af4c66b4c09 100644 (file)
@@ -939,15 +939,43 @@ static int coda_job_ready(void *m2m_priv)
                return 0;
        }
 
-       if (ctx->hold ||
-           ((ctx->inst_type == CODA_INST_DECODER) &&
-            !v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) &&
-            (coda_get_bitstream_payload(ctx) < 512) &&
-            !(ctx->bit_stream_param & CODA_BIT_STREAM_END_FLAG))) {
-               v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
-                        "%d: not ready: not enough bitstream data.\n",
-                        ctx->idx);
-               return 0;
+       if (ctx->inst_type == CODA_INST_DECODER) {
+               struct list_head *meta;
+               bool stream_end;
+               int num_metas;
+               int src_bufs;
+
+               if (ctx->hold && !v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx)) {
+                       v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
+                                "%d: not ready: on hold for more buffers.\n",
+                                ctx->idx);
+                       return 0;
+               }
+
+               stream_end = ctx->bit_stream_param &
+                            CODA_BIT_STREAM_END_FLAG;
+
+               num_metas = 0;
+               list_for_each(meta, &ctx->buffer_meta_list)
+                       num_metas++;
+
+               src_bufs = v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx);
+
+               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",
+                                ctx->idx, num_metas, src_bufs);
+                       return 0;
+               }
+
+
+               if (!v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) &&
+                   !stream_end && (coda_get_bitstream_payload(ctx) < 512)) {
+                       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));
+                       return 0;
+               }
        }
 
        if (ctx->aborting) {