diff options
author | Jason Garrett-Glaser <darkshikari@gmail.com> | 2010-08-02 05:20:38 +0000 |
---|---|---|
committer | Jason Garrett-Glaser <darkshikari@gmail.com> | 2010-08-02 05:20:38 +0000 |
commit | 10bf2eebbe285ca7d8a2a28dda76f44f6f77efb7 (patch) | |
tree | 7b98799499f4bca7002f80823ae882722bbf12bc /libavcodec | |
parent | 9c87c037793c79bf52352516c211ab556c4bc93e (diff) | |
download | ffmpeg-10bf2eebbe285ca7d8a2a28dda76f44f6f77efb7.tar.gz |
VP8: simplify token_prob handling
~1.5% faster decode_block_coeffs
Originally committed as revision 24659 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/vp8.c | 10 | ||||
-rw-r--r-- | 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 }; |