--- mbcoding.c 2003/02/09 06:33:51 1.25.2.14 +++ mbcoding.c 2003/02/12 11:58:30 1.25.2.16 @@ -110,7 +110,7 @@ void init_vlc_tables(void) { - ptr_t i, j, k, intra, last, run, run_esc, level, level_esc, escape, escape_len, offset; + uint32_t i, j, k, intra, last, run, run_esc, level, level_esc, escape, escape_len, offset; int32_t l; #ifdef BIGLUT @@ -127,7 +127,7 @@ for (last = 0; last < 2; last++) { for (run = 0; run < 63 + last; run++) - for (level = 0; level < 32 << intra; level++) + for (level = 0; level < (uint32_t)(32 << intra); level++) { #ifdef BIGLUT offset = LEVELOFFSET; @@ -146,7 +146,7 @@ #else offset = !intra * LEVELOFFSET; #endif - for (j = 0; j < 1 << (12 - coeff_tab[intra][i].vlc.len); j++) + for (j = 0; j < (uint32_t)(1 << (12 - coeff_tab[intra][i].vlc.len)); j++) { DCT3D[intra][(coeff_tab[intra][i].vlc.code << (12 - coeff_tab[intra][i].vlc.len)) | j].len = coeff_tab[intra][i].vlc.len; DCT3D[intra][(coeff_tab[intra][i].vlc.code << (12 - coeff_tab[intra][i].vlc.len)) | j].event = coeff_tab[intra][i].event; @@ -171,7 +171,7 @@ for (last = 0; last < 2; last++) for (run = 0; run < 63 + last; run++) { - for (level = 1; level < 32 << intra; level++) + for (level = 1; level < (uint32_t)(32 << intra); level++) { if (level <= max_level[intra][last][run] && run <= max_run[intra][last][level]) continue; @@ -196,7 +196,7 @@ } else { - if (level <= max_level[intra][last][run_esc] && run_esc <= max_run[intra][last][level]) + if (run_esc <= max_run[intra][last][level] && level <= max_level[intra][last][run_esc]) { escape = ESCAPE2; escape_len = 7 + 2; @@ -580,6 +580,50 @@ return bits; } +int +CodeCoeffInter_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag) +{ + uint32_t i, run, prev_run, len; + int32_t level, prev_level, level_shifted; + int bits = 0; + + i = 0; + run = 0; + + while (!(level = qcoeff[zigzag[i++]])) + run++; + + prev_level = level; + prev_run = run; + run = 0; + + while (i < 64) { + if ((level = qcoeff[zigzag[i++]]) != 0) { + level_shifted = prev_level + 32; + if (!(level_shifted & -64)) + len = coeff_VLC[0][0][level_shifted][prev_run].len; + else + len = 30; + + bits += len; + prev_level = level; + prev_run = run; + run = 0; + } + else + run++; + } + + level_shifted = prev_level + 32; + if (!(level_shifted & -64)) + len = coeff_VLC[0][1][level_shifted][prev_run].len; + else + len = 30; + bits += len; + + return bits; +} + #endif