# HG changeset patch # User darkshikari # Date 1280726438 0 # Node ID e84378ff89ca1f9d47a0d4b593b07e0deae8416f # Parent 3ce688a83319c11f460f215f75e6e2f4fa764579 VP8: simplify token_prob handling ~1.5% faster decode_block_coeffs diff -r 3ce688a83319 -r e84378ff89ca vp8.c --- a/vp8.c Sun Aug 01 23:20:06 2010 +0000 +++ b/vp8.c Mon Aug 02 05:20:38 2010 +0000 @@ -810,13 +810,11 @@ 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 @@ 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 @@ 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 -r 3ce688a83319 -r e84378ff89ca vp8data.h --- a/vp8data.h Sun Aug 01 23:20:06 2010 +0000 +++ b/vp8data.h Mon Aug 02 05:20:38 2010 +0000 @@ -314,9 +314,10 @@ { -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 };