Mercurial > libavcodec.hg
comparison bitstream.c @ 2663:b33be8b00488 libavcodec
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
| author | michael |
|---|---|
| date | Wed, 11 May 2005 01:46:13 +0000 |
| parents | 582e635cfa08 |
| children | 5dfb90019814 |
comparison
equal
deleted
inserted
replaced
| 2662:2fe9599170f6 | 2663:b33be8b00488 |
|---|---|
| 130 | 130 |
| 131 static int build_table(VLC *vlc, int table_nb_bits, | 131 static int build_table(VLC *vlc, int table_nb_bits, |
| 132 int nb_codes, | 132 int nb_codes, |
| 133 const void *bits, int bits_wrap, int bits_size, | 133 const void *bits, int bits_wrap, int bits_size, |
| 134 const void *codes, int codes_wrap, int codes_size, | 134 const void *codes, int codes_wrap, int codes_size, |
| 135 uint32_t code_prefix, int n_prefix, int use_static) | 135 uint32_t code_prefix, int n_prefix, int flags) |
| 136 { | 136 { |
| 137 int i, j, k, n, table_size, table_index, nb, n1, index; | 137 int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2; |
| 138 uint32_t code; | 138 uint32_t code; |
| 139 VLC_TYPE (*table)[2]; | 139 VLC_TYPE (*table)[2]; |
| 140 | 140 |
| 141 table_size = 1 << table_nb_bits; | 141 table_size = 1 << table_nb_bits; |
| 142 table_index = alloc_table(vlc, table_size, use_static); | 142 table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_STATIC); |
| 143 #ifdef DEBUG_VLC | 143 #ifdef DEBUG_VLC |
| 144 printf("new table index=%d size=%d code_prefix=%x n=%d\n", | 144 printf("new table index=%d size=%d code_prefix=%x n=%d\n", |
| 145 table_index, table_size, code_prefix, n_prefix); | 145 table_index, table_size, code_prefix, n_prefix); |
| 146 #endif | 146 #endif |
| 147 if (table_index < 0) | 147 if (table_index < 0) |
| 163 #if defined(DEBUG_VLC) && 0 | 163 #if defined(DEBUG_VLC) && 0 |
| 164 printf("i=%d n=%d code=0x%x\n", i, n, code); | 164 printf("i=%d n=%d code=0x%x\n", i, n, code); |
| 165 #endif | 165 #endif |
| 166 /* if code matches the prefix, it is in the table */ | 166 /* if code matches the prefix, it is in the table */ |
| 167 n -= n_prefix; | 167 n -= n_prefix; |
| 168 if (n > 0 && (code >> n) == code_prefix) { | 168 if(flags & INIT_VLC_LE) |
| 169 code_prefix2= code & (n_prefix>=32 ? 0xffffffff : (1 << n_prefix)-1); | |
| 170 else | |
| 171 code_prefix2= code >> n; | |
| 172 if (n > 0 && code_prefix2 == code_prefix) { | |
| 169 if (n <= table_nb_bits) { | 173 if (n <= table_nb_bits) { |
| 170 /* no need to add another table */ | 174 /* no need to add another table */ |
| 171 j = (code << (table_nb_bits - n)) & (table_size - 1); | 175 j = (code << (table_nb_bits - n)) & (table_size - 1); |
| 172 nb = 1 << (table_nb_bits - n); | 176 nb = 1 << (table_nb_bits - n); |
| 173 for(k=0;k<nb;k++) { | 177 for(k=0;k<nb;k++) { |
| 178 if(flags & INIT_VLC_LE) | |
| 179 j = (code >> n_prefix) + (k<<n); | |
| 174 #ifdef DEBUG_VLC | 180 #ifdef DEBUG_VLC |
| 175 av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n", | 181 av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n", |
| 176 j, i, n); | 182 j, i, n); |
| 177 #endif | 183 #endif |
| 178 if (table[j][1] /*bits*/ != 0) { | 184 if (table[j][1] /*bits*/ != 0) { |
| 183 table[j][0] = i; //code | 189 table[j][0] = i; //code |
| 184 j++; | 190 j++; |
| 185 } | 191 } |
| 186 } else { | 192 } else { |
| 187 n -= table_nb_bits; | 193 n -= table_nb_bits; |
| 188 j = (code >> n) & ((1 << table_nb_bits) - 1); | 194 j = (code >> ((flags & INIT_VLC_LE) ? n_prefix : n)) & ((1 << table_nb_bits) - 1); |
| 189 #ifdef DEBUG_VLC | 195 #ifdef DEBUG_VLC |
| 190 printf("%4x: n=%d (subtable)\n", | 196 printf("%4x: n=%d (subtable)\n", |
| 191 j, n); | 197 j, n); |
| 192 #endif | 198 #endif |
| 193 /* compute table size */ | 199 /* compute table size */ |
| 209 table[i][1] = -n; //bits | 215 table[i][1] = -n; //bits |
| 210 } | 216 } |
| 211 index = build_table(vlc, n, nb_codes, | 217 index = build_table(vlc, n, nb_codes, |
| 212 bits, bits_wrap, bits_size, | 218 bits, bits_wrap, bits_size, |
| 213 codes, codes_wrap, codes_size, | 219 codes, codes_wrap, codes_size, |
| 214 (code_prefix << table_nb_bits) | i, | 220 (flags & INIT_VLC_LE) ? (code_prefix | (i << n_prefix)) : ((code_prefix << table_nb_bits) | i), |
| 215 n_prefix + table_nb_bits, use_static); | 221 n_prefix + table_nb_bits, flags); |
| 216 if (index < 0) | 222 if (index < 0) |
| 217 return -1; | 223 return -1; |
| 218 /* note: realloc has been done, so reload tables */ | 224 /* note: realloc has been done, so reload tables */ |
| 219 table = &vlc->table[table_index]; | 225 table = &vlc->table[table_index]; |
| 220 table[i][0] = index; //code | 226 table[i][0] = index; //code |
