00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00031 #include "libavutil/avassert.h"
00032 #include "avcodec.h"
00033 #include "mathops.h"
00034 #include "get_bits.h"
00035 #include "put_bits.h"
00036
00037 const uint8_t ff_log2_run[41]={
00038 0, 0, 0, 0, 1, 1, 1, 1,
00039 2, 2, 2, 2, 3, 3, 3, 3,
00040 4, 4, 5, 5, 6, 6, 7, 7,
00041 8, 9,10,11,12,13,14,15,
00042 16,17,18,19,20,21,22,23,
00043 24,
00044 };
00045
00046 void avpriv_align_put_bits(PutBitContext *s)
00047 {
00048 put_bits(s,s->bit_left & 7,0);
00049 }
00050
00051 void avpriv_put_string(PutBitContext *pb, const char *string, int terminate_string)
00052 {
00053 while(*string){
00054 put_bits(pb, 8, *string);
00055 string++;
00056 }
00057 if(terminate_string)
00058 put_bits(pb, 8, 0);
00059 }
00060
00061 void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
00062 {
00063 int words= length>>4;
00064 int bits= length&15;
00065 int i;
00066
00067 if(length==0) return;
00068
00069 if(CONFIG_SMALL || words < 16 || put_bits_count(pb)&7){
00070 for(i=0; i<words; i++) put_bits(pb, 16, AV_RB16(src + 2*i));
00071 }else{
00072 for(i=0; put_bits_count(pb)&31; i++)
00073 put_bits(pb, 8, src[i]);
00074 flush_put_bits(pb);
00075 memcpy(put_bits_ptr(pb), src+i, 2*words-i);
00076 skip_put_bytes(pb, 2*words-i);
00077 }
00078
00079 put_bits(pb, bits, AV_RB16(src + 2*words)>>(16-bits));
00080 }
00081
00082
00083
00084 #define GET_DATA(v, table, i, wrap, size) \
00085 {\
00086 const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
00087 switch(size) {\
00088 case 1:\
00089 v = *(const uint8_t *)ptr;\
00090 break;\
00091 case 2:\
00092 v = *(const uint16_t *)ptr;\
00093 break;\
00094 default:\
00095 v = *(const uint32_t *)ptr;\
00096 break;\
00097 }\
00098 }
00099
00100
00101 static int alloc_table(VLC *vlc, int size, int use_static)
00102 {
00103 int index;
00104 index = vlc->table_size;
00105 vlc->table_size += size;
00106 if (vlc->table_size > vlc->table_allocated) {
00107 if(use_static)
00108 abort();
00109 vlc->table_allocated += (1 << vlc->bits);
00110 vlc->table = av_realloc_f(vlc->table,
00111 vlc->table_allocated, sizeof(VLC_TYPE) * 2);
00112 if (!vlc->table)
00113 return -1;
00114 }
00115 return index;
00116 }
00117
00118 static av_always_inline uint32_t bitswap_32(uint32_t x) {
00119 return (uint32_t)ff_reverse[x&0xFF]<<24
00120 | (uint32_t)ff_reverse[(x>>8)&0xFF]<<16
00121 | (uint32_t)ff_reverse[(x>>16)&0xFF]<<8
00122 | (uint32_t)ff_reverse[x>>24];
00123 }
00124
00125 typedef struct {
00126 uint8_t bits;
00127 uint16_t symbol;
00130 uint32_t code;
00131 } VLCcode;
00132
00133 static int compare_vlcspec(const void *a, const void *b)
00134 {
00135 const VLCcode *sa=a, *sb=b;
00136 return (sa->code >> 1) - (sb->code >> 1);
00137 }
00138
00153 static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
00154 VLCcode *codes, int flags)
00155 {
00156 int table_size, table_index, index, code_prefix, symbol, subtable_bits;
00157 int i, j, k, n, nb, inc;
00158 uint32_t code;
00159 VLC_TYPE (*table)[2];
00160
00161 table_size = 1 << table_nb_bits;
00162 if (table_nb_bits > 30)
00163 return -1;
00164 table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC);
00165 av_dlog(NULL, "new table index=%d size=%d\n", table_index, table_size);
00166 if (table_index < 0)
00167 return -1;
00168 table = &vlc->table[table_index];
00169
00170 for (i = 0; i < table_size; i++) {
00171 table[i][1] = 0;
00172 table[i][0] = -1;
00173 }
00174
00175
00176 for (i = 0; i < nb_codes; i++) {
00177 n = codes[i].bits;
00178 code = codes[i].code;
00179 symbol = codes[i].symbol;
00180 av_dlog(NULL, "i=%d n=%d code=0x%x\n", i, n, code);
00181 if (n <= table_nb_bits) {
00182
00183 j = code >> (32 - table_nb_bits);
00184 nb = 1 << (table_nb_bits - n);
00185 inc = 1;
00186 if (flags & INIT_VLC_LE) {
00187 j = bitswap_32(code);
00188 inc = 1 << n;
00189 }
00190 for (k = 0; k < nb; k++) {
00191 av_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n);
00192 if (table[j][1] != 0) {
00193 av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
00194 return -1;
00195 }
00196 table[j][1] = n;
00197 table[j][0] = symbol;
00198 j += inc;
00199 }
00200 } else {
00201
00202 n -= table_nb_bits;
00203 code_prefix = code >> (32 - table_nb_bits);
00204 subtable_bits = n;
00205 codes[i].bits = n;
00206 codes[i].code = code << table_nb_bits;
00207 for (k = i+1; k < nb_codes; k++) {
00208 n = codes[k].bits - table_nb_bits;
00209 if (n <= 0)
00210 break;
00211 code = codes[k].code;
00212 if (code >> (32 - table_nb_bits) != code_prefix)
00213 break;
00214 codes[k].bits = n;
00215 codes[k].code = code << table_nb_bits;
00216 subtable_bits = FFMAX(subtable_bits, n);
00217 }
00218 subtable_bits = FFMIN(subtable_bits, table_nb_bits);
00219 j = (flags & INIT_VLC_LE) ? bitswap_32(code_prefix) >> (32 - table_nb_bits) : code_prefix;
00220 table[j][1] = -subtable_bits;
00221 av_dlog(NULL, "%4x: n=%d (subtable)\n",
00222 j, codes[i].bits + table_nb_bits);
00223 index = build_table(vlc, subtable_bits, k-i, codes+i, flags);
00224 if (index < 0)
00225 return -1;
00226
00227 table = &vlc->table[table_index];
00228 table[j][0] = index;
00229 i = k-1;
00230 }
00231 }
00232 return table_index;
00233 }
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 int ff_init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes,
00263 const void *bits, int bits_wrap, int bits_size,
00264 const void *codes, int codes_wrap, int codes_size,
00265 const void *symbols, int symbols_wrap, int symbols_size,
00266 int flags)
00267 {
00268 VLCcode *buf;
00269 int i, j, ret;
00270
00271 vlc->bits = nb_bits;
00272 if(flags & INIT_VLC_USE_NEW_STATIC){
00273 VLC dyn_vlc = *vlc;
00274
00275 if (vlc->table_size)
00276 return 0;
00277
00278 ret = ff_init_vlc_sparse(&dyn_vlc, nb_bits, nb_codes,
00279 bits, bits_wrap, bits_size,
00280 codes, codes_wrap, codes_size,
00281 symbols, symbols_wrap, symbols_size,
00282 flags & ~INIT_VLC_USE_NEW_STATIC);
00283 av_assert0(ret >= 0);
00284 av_assert0(dyn_vlc.table_size <= vlc->table_allocated);
00285 if(dyn_vlc.table_size < vlc->table_allocated)
00286 av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", dyn_vlc.table_size, vlc->table_allocated);
00287 memcpy(vlc->table, dyn_vlc.table, dyn_vlc.table_size * sizeof(*vlc->table));
00288 vlc->table_size = dyn_vlc.table_size;
00289 ff_free_vlc(&dyn_vlc);
00290 return 0;
00291 }else {
00292 vlc->table = NULL;
00293 vlc->table_allocated = 0;
00294 vlc->table_size = 0;
00295 }
00296
00297 av_dlog(NULL, "build table nb_codes=%d\n", nb_codes);
00298
00299 buf = av_malloc((nb_codes+1)*sizeof(VLCcode));
00300
00301 av_assert0(symbols_size <= 2 || !symbols);
00302 j = 0;
00303 #define COPY(condition)\
00304 for (i = 0; i < nb_codes; i++) {\
00305 GET_DATA(buf[j].bits, bits, i, bits_wrap, bits_size);\
00306 if (!(condition))\
00307 continue;\
00308 GET_DATA(buf[j].code, codes, i, codes_wrap, codes_size);\
00309 if (flags & INIT_VLC_LE)\
00310 buf[j].code = bitswap_32(buf[j].code);\
00311 else\
00312 buf[j].code <<= 32 - buf[j].bits;\
00313 if (symbols)\
00314 GET_DATA(buf[j].symbol, symbols, i, symbols_wrap, symbols_size)\
00315 else\
00316 buf[j].symbol = i;\
00317 j++;\
00318 }
00319 COPY(buf[j].bits > nb_bits);
00320
00321 qsort(buf, j, sizeof(VLCcode), compare_vlcspec);
00322 COPY(buf[j].bits && buf[j].bits <= nb_bits);
00323 nb_codes = j;
00324
00325 ret = build_table(vlc, nb_bits, nb_codes, buf, flags);
00326
00327 av_free(buf);
00328 if (ret < 0) {
00329 av_freep(&vlc->table);
00330 return -1;
00331 }
00332 return 0;
00333 }
00334
00335
00336 void ff_free_vlc(VLC *vlc)
00337 {
00338 av_freep(&vlc->table);
00339 }