Originally committed as revision 22716 to svn://svn.ffmpeg.org/ffmpeg/trunk
release/0.6
Loren Merritt 15 years ago
parent 3224079956
commit b23cf13c67
  1. 106
      libavcodec/bitstream.c

@ -170,74 +170,74 @@ static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
return -1; return -1;
table = &vlc->table[table_index]; table = &vlc->table[table_index];
for(i=0;i<table_size;i++) { for (i = 0; i < table_size; i++) {
table[i][1] = 0; //bits table[i][1] = 0; //bits
table[i][0] = -1; //codes table[i][0] = -1; //codes
} }
/* first pass: map codes and compute auxillary table sizes */ /* first pass: map codes and compute auxillary table sizes */
for(i=0;i<nb_codes;i++) { for (i = 0; i < nb_codes; i++) {
n = codes[i].bits; n = codes[i].bits;
code = codes[i].code; code = codes[i].code;
symbol = codes[i].symbol; symbol = codes[i].symbol;
#if defined(DEBUG_VLC) && 0 #if defined(DEBUG_VLC) && 0
av_log(NULL,AV_LOG_DEBUG,"i=%d n=%d code=0x%x\n", i, n, code); av_log(NULL,AV_LOG_DEBUG,"i=%d n=%d code=0x%x\n", i, n, code);
#endif #endif
if (n <= table_nb_bits) { if (n <= table_nb_bits) {
/* no need to add another table */ /* no need to add another table */
j = code >> (32 - table_nb_bits); j = code >> (32 - table_nb_bits);
nb = 1 << (table_nb_bits - n); nb = 1 << (table_nb_bits - n);
inc = 1; inc = 1;
if (flags & INIT_VLC_LE) { if (flags & INIT_VLC_LE) {
j = bitswap_32(code); j = bitswap_32(code);
inc = 1 << n; inc = 1 << n;
} }
for(k=0;k<nb;k++) { for (k = 0; k < nb; k++) {
#ifdef DEBUG_VLC #ifdef DEBUG_VLC
av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n", av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n",
j, i, n); j, i, n);
#endif #endif
if (table[j][1] /*bits*/ != 0) { if (table[j][1] /*bits*/ != 0) {
av_log(NULL, AV_LOG_ERROR, "incorrect codes\n"); av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
return -1; return -1;
} }
table[j][1] = n; //bits table[j][1] = n; //bits
table[j][0] = symbol; table[j][0] = symbol;
j += inc; j += inc;
} }
} else { } else {
/* fill auxiliary table recursively */ /* fill auxiliary table recursively */
n -= table_nb_bits; n -= table_nb_bits;
code_prefix = code >> (32 - table_nb_bits); code_prefix = code >> (32 - table_nb_bits);
subtable_bits = n; subtable_bits = n;
codes[i].bits = n; codes[i].bits = n;
codes[i].code = code << table_nb_bits; codes[i].code = code << table_nb_bits;
for (k = i+1; k < nb_codes; k++) { for (k = i+1; k < nb_codes; k++) {
n = codes[k].bits - table_nb_bits; n = codes[k].bits - table_nb_bits;
if (n <= 0) if (n <= 0)
break; break;
code = codes[k].code; code = codes[k].code;
if (code >> (32 - table_nb_bits) != code_prefix) if (code >> (32 - table_nb_bits) != code_prefix)
break; break;
codes[k].bits = n; codes[k].bits = n;
codes[k].code = code << table_nb_bits; codes[k].code = code << table_nb_bits;
subtable_bits = FFMAX(subtable_bits, n); subtable_bits = FFMAX(subtable_bits, n);
} }
subtable_bits = FFMIN(subtable_bits, table_nb_bits); subtable_bits = FFMIN(subtable_bits, table_nb_bits);
j = (flags & INIT_VLC_LE) ? bitswap_32(code_prefix) >> (32 - table_nb_bits) : code_prefix; j = (flags & INIT_VLC_LE) ? bitswap_32(code_prefix) >> (32 - table_nb_bits) : code_prefix;
table[j][1] = -subtable_bits; table[j][1] = -subtable_bits;
#ifdef DEBUG_VLC #ifdef DEBUG_VLC
av_log(NULL,AV_LOG_DEBUG,"%4x: n=%d (subtable)\n", av_log(NULL,AV_LOG_DEBUG,"%4x: n=%d (subtable)\n",
j, codes[i].bits + table_nb_bits); j, codes[i].bits + table_nb_bits);
#endif #endif
index = build_table(vlc, subtable_bits, k-i, codes+i, flags); index = build_table(vlc, subtable_bits, k-i, codes+i, flags);
if (index < 0) if (index < 0)
return -1; return -1;
/* note: realloc has been done, so reload tables */ /* note: realloc has been done, so reload tables */
table = &vlc->table[table_index]; table = &vlc->table[table_index];
table[j][0] = index; //code table[j][0] = index; //code
i = k-1; i = k-1;
} }
} }
return table_index; return table_index;
} }

Loading…
Cancel
Save