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;

    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;



skip_eob:

        if (!vp56_rac_get_prob_branchy(c, token_prob[1])) { // DCT_0

            zero_nhood = 0;

            token_prob = probs[vp8_coeff_band[++i]][0];

            if (i < 16)

                goto skip_eob;

            return nonzero; // invalid input; blocks should end with EOB

        }



        if (!vp56_rac_get_prob_branchy(c, token_prob[2])) { // DCT_1

            coeff = 1;

            zero_nhood = 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)

                    coeff += vp56_rac_get_prob(c, token_prob[5]);

                coeff += 2;

            } else {

                // DCT_CAT*

                if (!vp56_rac_get_prob_branchy(c, token_prob[6])) {

                    if (!vp56_rac_get_prob_branchy(c, token_prob[7])) { // DCT_CAT1

                        coeff  = 5 + vp56_rac_get_prob(c, vp8_dct_cat1_prob[0]);

                    } else {                                    // DCT_CAT2

                        coeff  = 7;

                        coeff += vp56_rac_get_prob(c, vp8_dct_cat2_prob[0]) << 1;

                        coeff += vp56_rac_get_prob(c, vp8_dct_cat2_prob[1]);

                    }

                } else {    // DCT_CAT3 and up

                    int a = vp56_rac_get_prob(c, token_prob[8]);

                    int b = vp56_rac_get_prob(c, token_prob[9+a]);

                    int cat = (a<<1) + b;

                    coeff  = 3 + (8<<cat);

                    coeff += vp8_rac_get_coeff(c, vp8_dct_cat_prob[cat]);

                }

            }

        }



        // todo: full [16] qmat? load into register?

        block[zigzag_scan[i]] = (vp8_rac_get(c) ? -coeff : coeff) * qmul[!!i];

        nonzero = ++i;

    } while (i < 16);



    return nonzero;

}

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;

    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]))   

            return nonzero;



skip_eob:

        if (!vp56_rac_get_prob_branchy(c, token_prob[1])) { 

            zero_nhood = 0;

            token_prob = probs[vp8_coeff_band[++i]][0];

            if (i < 16)

                goto skip_eob;

            return nonzero; 

        }



        if (!vp56_rac_get_prob_branchy(c, token_prob[2])) { 

            coeff = 1;

            zero_nhood = 1;

        } else {

            zero_nhood = 2;



            if (!vp56_rac_get_prob_branchy(c, token_prob[3])) { 

                coeff = vp56_rac_get_prob(c, token_prob[4]);

                if (coeff)

                    coeff += vp56_rac_get_prob(c, token_prob[5]);

                coeff += 2;

            } else {

                

                if (!vp56_rac_get_prob_branchy(c, token_prob[6])) {

                    if (!vp56_rac_get_prob_branchy(c, token_prob[7])) { 

                        coeff  = 5 + vp56_rac_get_prob(c, vp8_dct_cat1_prob[0]);

                    } else {                                    

                        coeff  = 7;

                        coeff += vp56_rac_get_prob(c, vp8_dct_cat2_prob[0]) << 1;

                        coeff += vp56_rac_get_prob(c, vp8_dct_cat2_prob[1]);

                    }

                } else {    

                    int a = vp56_rac_get_prob(c, token_prob[8]);

                    int b = vp56_rac_get_prob(c, token_prob[9+a]);

                    int cat = (a<<1) + b;

                    coeff  = 3 + (8<<cat);

                    coeff += vp8_rac_get_coeff(c, vp8_dct_cat_prob[cat]);

                }

            }

        }



        

        block[zigzag_scan[i]] = (vp8_rac_get(c) ? -coeff : coeff) * qmul[!!i];

        nonzero = ++i;

    } while (i < 16);



    return nonzero;

}

static int FUNC_0(VP56RangeCoder *VAR_0, DCTELEM VAR_1[16],

                               uint8_t VAR_2[8][3][NUM_DCT_TOKENS-1],

                               int VAR_3, int VAR_4, int16_t VAR_5[2])

{

    uint8_t *token_prob;

    int VAR_6 = 0;

    int VAR_7;



    do {

        token_prob = VAR_2[vp8_coeff_band[VAR_3]][VAR_4];



        if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[0]))   

            return VAR_6;



skip_eob:

        if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[1])) { 

            VAR_4 = 0;

            token_prob = VAR_2[vp8_coeff_band[++VAR_3]][0];

            if (VAR_3 < 16)

                goto skip_eob;

            return VAR_6; 

        }



        if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[2])) { 

            VAR_7 = 1;

            VAR_4 = 1;

        } else {

            VAR_4 = 2;



            if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[3])) { 

                VAR_7 = vp56_rac_get_prob(VAR_0, token_prob[4]);

                if (VAR_7)

                    VAR_7 += vp56_rac_get_prob(VAR_0, token_prob[5]);

                VAR_7 += 2;

            } else {

                

                if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[6])) {

                    if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[7])) { 

                        VAR_7  = 5 + vp56_rac_get_prob(VAR_0, vp8_dct_cat1_prob[0]);

                    } else {                                    

                        VAR_7  = 7;

                        VAR_7 += vp56_rac_get_prob(VAR_0, vp8_dct_cat2_prob[0]) << 1;

                        VAR_7 += vp56_rac_get_prob(VAR_0, vp8_dct_cat2_prob[1]);

                    }

                } else {    

                    int VAR_8 = vp56_rac_get_prob(VAR_0, token_prob[8]);

                    int VAR_9 = vp56_rac_get_prob(VAR_0, token_prob[9+VAR_8]);

                    int VAR_10 = (VAR_8<<1) + VAR_9;

                    VAR_7  = 3 + (8<<VAR_10);

                    VAR_7 += vp8_rac_get_coeff(VAR_0, vp8_dct_cat_prob[VAR_10]);

                }

            }

        }



        

        VAR_1[zigzag_scan[VAR_3]] = (vp8_rac_get(VAR_0) ? -VAR_7 : VAR_7) * VAR_5[!!VAR_3];

        VAR_6 = ++VAR_3;

    } while (VAR_3 < 16);



    return VAR_6;

}

static int FUNC_0(VP56RangeCoder *VAR_0, DCTELEM VAR_1[16],
uint8_t VAR_2[8][3][NUM_DCT_TOKENS-1],
int VAR_3, int VAR_4, int16_t VAR_5[2])
{ uint8_t *token_prob; int VAR_6 = 0; int VAR_7; do { token_prob = VAR_2[vp8_coeff_band[VAR_3]][VAR_4]; if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[0]))
return VAR_6; skip_eob:
if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[1])) { VAR_4 = 0; token_prob = VAR_2[vp8_coeff_band[++VAR_3]][0]; if (VAR_3 < 16)
goto skip_eob; return VAR_6; } if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[2])) { VAR_7 = 1; VAR_4 = 1; } else { VAR_4 = 2; if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[3])) { VAR_7 = vp56_rac_get_prob(VAR_0, token_prob[4]); if (VAR_7)
VAR_7 += vp56_rac_get_prob(VAR_0, token_prob[5]); VAR_7 += 2; } else { if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[6])) { if (!vp56_rac_get_prob_branchy(VAR_0, token_prob[7])) { VAR_7  = 5 + vp56_rac_get_prob(VAR_0, vp8_dct_cat1_prob[0]); } else { VAR_7  = 7; VAR_7 += vp56_rac_get_prob(VAR_0, vp8_dct_cat2_prob[0]) << 1; VAR_7 += vp56_rac_get_prob(VAR_0, vp8_dct_cat2_prob[1]); } } else { int VAR_8 = vp56_rac_get_prob(VAR_0, token_prob[8]); int VAR_9 = vp56_rac_get_prob(VAR_0, token_prob[9+VAR_8]); int VAR_10 = (VAR_8<<1) + VAR_9; VAR_7  = 3 + (8<<VAR_10); VAR_7 += vp8_rac_get_coeff(VAR_0, vp8_dct_cat_prob[VAR_10]); } } } VAR_1[zigzag_scan[VAR_3]] = (vp8_rac_get(VAR_0) ? -VAR_7 : VAR_7) * VAR_5[!!VAR_3]; VAR_6 = ++VAR_3; } while (VAR_3 < 16); return VAR_6; }