From 10bf2eebbe285ca7d8a2a28dda76f44f6f77efb7 Mon Sep 17 00:00:00 2001 From: Jason Garrett-Glaser Date: Mon, 2 Aug 2010 05:20:38 +0000 Subject: [PATCH] VP8: simplify token_prob handling ~1.5% faster decode_block_coeffs Originally committed as revision 24659 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/vp8.c | 10 +++------- libavcodec/vp8data.h | 5 +++-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index c82c36bca6..9af92d5717 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -810,13 +810,11 @@ static int decode_block_coeffs(VP56RangeCoder *c, DCTELEM block[16], uint8_t probs[8][3][NUM_DCT_TOKENS-1], int i, int zero_nhood, int16_t qmul[2]) { - uint8_t *token_prob; + uint8_t *token_prob = probs[vp8_coeff_band[i]][zero_nhood]; int nonzero = 0; int coeff; do { - token_prob = probs[vp8_coeff_band[i]][zero_nhood]; - if (!vp56_rac_get_prob_branchy(c, token_prob[0])) // DCT_EOB return nonzero; @@ -824,17 +822,14 @@ skip_eob: if (!vp56_rac_get_prob_branchy(c, token_prob[1])) { // DCT_0 if (++i == 16) return nonzero; // invalid input; blocks should end with EOB - zero_nhood = 0; token_prob = probs[vp8_coeff_band[i]][0]; goto skip_eob; } if (!vp56_rac_get_prob_branchy(c, token_prob[2])) { // DCT_1 coeff = 1; - zero_nhood = 1; + token_prob = probs[vp8_coeff_band[i+1]][1]; } else { - zero_nhood = 2; - if (!vp56_rac_get_prob_branchy(c, token_prob[3])) { // DCT 2,3,4 coeff = vp56_rac_get_prob(c, token_prob[4]); if (coeff) @@ -858,6 +853,7 @@ skip_eob: coeff += vp8_rac_get_coeff(c, vp8_dct_cat_prob[cat]); } } + token_prob = probs[vp8_coeff_band[i+1]][2]; } // todo: full [16] qmat? load into register? diff --git a/libavcodec/vp8data.h b/libavcodec/vp8data.h index 28cc0b3403..67e8ef3f47 100644 --- a/libavcodec/vp8data.h +++ b/libavcodec/vp8data.h @@ -314,9 +314,10 @@ static const int8_t vp8_segmentid_tree[][2] = { -2, -3 }, // '10', '11' }; -static const uint8_t vp8_coeff_band[16] = +/* Padded by one byte to allow overreads */ +static const uint8_t vp8_coeff_band[17] = { - 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7 + 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0 }; static const uint8_t vp8_dct_cat1_prob[] = { 159, 0 };