This makes decoding a bit faster.

Signed-off-by: Mans Rullgard <[email protected]>
---
 libavcodec/dnxhddec.c |   38 ++++++++++++++++++++------------------
 1 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c
index 63ccd08..57ac78c 100644
--- a/libavcodec/dnxhddec.c
+++ b/libavcodec/dnxhddec.c
@@ -179,7 +179,7 @@ static av_always_inline void 
dnxhd_decode_dct_block(DNXHDContext *ctx,
                                                     int level_bias,
                                                     int level_shift)
 {
-    int i, j, index1, index2, len;
+    int i, j, k, index1, index2, len;
     int level, component, sign;
     const uint8_t *weight_matrix;
     OPEN_READER(bs, &ctx->gb);
@@ -204,17 +204,14 @@ static av_always_inline void 
dnxhd_decode_dct_block(DNXHDContext *ctx,
     block[0] = ctx->last_dc[component];
     //av_log(ctx->avctx, AV_LOG_DEBUG, "dc %d\n", block[0]);
 
-    for (i = 1; ; i++) {
-        UPDATE_CACHE(bs, &ctx->gb);
-        GET_VLC(index1, bs, &ctx->gb, ctx->ac_vlc.table,
-                DNXHD_VLC_BITS, 2);
-        //av_log(ctx->avctx, AV_LOG_DEBUG, "index %d\n", index1);
-        level = ctx->cid_table->ac_level[index1];
-        if (!level) { /* EOB */
-            //av_log(ctx->avctx, AV_LOG_DEBUG, "EOB\n");
-            break;
-        }
+    i = 0;
+
+    UPDATE_CACHE(bs, &ctx->gb);
+    GET_VLC(index1, bs, &ctx->gb, ctx->ac_vlc.table,
+            DNXHD_VLC_BITS, 2);
+    level = ctx->cid_table->ac_level[index1];
 
+    while (level && i < 63) {
         sign = SHOW_SBITS(bs, &ctx->gb, 1);
         SKIP_BITS(bs, &ctx->gb, 1);
 
@@ -230,24 +227,29 @@ static av_always_inline void 
dnxhd_decode_dct_block(DNXHDContext *ctx,
             i += ctx->cid_table->run[index2];
         }
 
-        if (i > 63) {
-            av_log(ctx->avctx, AV_LOG_ERROR, "ac tex damaged %d, %d\n", n, i);
-            break;
-        }
+        k = ++i & 63;
 
-        j = ctx->scantable.permutated[i];
+        j = ctx->scantable.permutated[k];
         //av_log(ctx->avctx, AV_LOG_DEBUG, "j %d\n", j);
         //av_log(ctx->avctx, AV_LOG_DEBUG, "level %d, weight %d\n", level, 
weight_matrix[i]);
-        level = (2*level+1) * qscale * weight_matrix[i];
-        if (level_bias < 32 || weight_matrix[i] != level_bias)
+        level = (2*level+1) * qscale * weight_matrix[k];
+        if (level_bias < 32 || weight_matrix[k] != level_bias)
             level += level_bias;
         level >>= level_shift;
 
         //av_log(NULL, AV_LOG_DEBUG, "i %d, j %d, end level %d\n", i, j, 
level);
         block[j] = (level^sign) - sign;
+
+        UPDATE_CACHE(bs, &ctx->gb);
+        GET_VLC(index1, bs, &ctx->gb, ctx->ac_vlc.table,
+                DNXHD_VLC_BITS, 2);
+        level = ctx->cid_table->ac_level[index1];
     }
 
     CLOSE_READER(bs, &ctx->gb);
+
+    if (i > 63)
+        av_log(ctx->avctx, AV_LOG_ERROR, "ac tex damaged %d, %d\n", n, i);
 }
 
 static void dnxhd_decode_dct_block_8(DNXHDContext *ctx, DCTELEM *block,
-- 
1.7.6

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to