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