Mercurial > libavcodec.hg
comparison bitstream.c @ 6935:24e01f7cc819 libavcodec
Make init_vlc* support proper static tables instead of this broken beyond
imagination alloc_static() trash.
| author | michael |
|---|---|
| date | Fri, 30 May 2008 19:48:02 +0000 |
| parents | f57fee2decd6 |
| children | da73a98945ea |
comparison
equal
deleted
inserted
replaced
| 6934:ac6f00bed029 | 6935:24e01f7cc819 |
|---|---|
| 108 { | 108 { |
| 109 int index; | 109 int index; |
| 110 index = vlc->table_size; | 110 index = vlc->table_size; |
| 111 vlc->table_size += size; | 111 vlc->table_size += size; |
| 112 if (vlc->table_size > vlc->table_allocated) { | 112 if (vlc->table_size > vlc->table_allocated) { |
| 113 if(use_static>1) | |
| 114 abort(); //cant do anything, init_vlc() is used with too little memory | |
| 113 vlc->table_allocated += (1 << vlc->bits); | 115 vlc->table_allocated += (1 << vlc->bits); |
| 114 if(use_static) | 116 if(use_static) |
| 115 vlc->table = ff_realloc_static(vlc->table, | 117 vlc->table = ff_realloc_static(vlc->table, |
| 116 sizeof(VLC_TYPE) * 2 * vlc->table_allocated); | 118 sizeof(VLC_TYPE) * 2 * vlc->table_allocated); |
| 117 else | 119 else |
| 133 int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2, symbol; | 135 int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2, symbol; |
| 134 uint32_t code; | 136 uint32_t code; |
| 135 VLC_TYPE (*table)[2]; | 137 VLC_TYPE (*table)[2]; |
| 136 | 138 |
| 137 table_size = 1 << table_nb_bits; | 139 table_size = 1 << table_nb_bits; |
| 138 table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_STATIC); | 140 table_index = alloc_table(vlc, table_size, flags & (INIT_VLC_USE_STATIC|INIT_VLC_USE_NEW_STATIC)); |
| 139 #ifdef DEBUG_VLC | 141 #ifdef DEBUG_VLC |
| 140 av_log(NULL,AV_LOG_DEBUG,"new table index=%d size=%d code_prefix=%x n=%d\n", | 142 av_log(NULL,AV_LOG_DEBUG,"new table index=%d size=%d code_prefix=%x n=%d\n", |
| 141 table_index, table_size, code_prefix, n_prefix); | 143 table_index, table_size, code_prefix, n_prefix); |
| 142 #endif | 144 #endif |
| 143 if (table_index < 0) | 145 if (table_index < 0) |
| 262 const void *codes, int codes_wrap, int codes_size, | 264 const void *codes, int codes_wrap, int codes_size, |
| 263 const void *symbols, int symbols_wrap, int symbols_size, | 265 const void *symbols, int symbols_wrap, int symbols_size, |
| 264 int flags) | 266 int flags) |
| 265 { | 267 { |
| 266 vlc->bits = nb_bits; | 268 vlc->bits = nb_bits; |
| 267 if(!(flags & INIT_VLC_USE_STATIC)) { | 269 if(flags & INIT_VLC_USE_NEW_STATIC){ |
| 270 if(vlc->table_size && vlc->table_size == vlc->table_allocated){ | |
| 271 return 0; | |
| 272 }else if(vlc->table_size){ | |
| 273 abort(); // fatal error, we are called on a partially initialized table | |
| 274 } | |
| 275 }else if(!(flags & INIT_VLC_USE_STATIC)) { | |
| 268 vlc->table = NULL; | 276 vlc->table = NULL; |
| 269 vlc->table_allocated = 0; | 277 vlc->table_allocated = 0; |
| 270 vlc->table_size = 0; | 278 vlc->table_size = 0; |
| 271 } else { | 279 } else { |
| 272 /* Static tables are initially always NULL, return | 280 /* Static tables are initially always NULL, return |
| 285 symbols, symbols_wrap, symbols_size, | 293 symbols, symbols_wrap, symbols_size, |
| 286 0, 0, flags) < 0) { | 294 0, 0, flags) < 0) { |
| 287 av_freep(&vlc->table); | 295 av_freep(&vlc->table); |
| 288 return -1; | 296 return -1; |
| 289 } | 297 } |
| 298 if((flags & INIT_VLC_USE_NEW_STATIC) && vlc->table_size != vlc->table_allocated) | |
| 299 av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated); | |
| 290 return 0; | 300 return 0; |
| 291 } | 301 } |
| 292 | 302 |
| 293 | 303 |
| 294 void free_vlc(VLC *vlc) | 304 void free_vlc(VLC *vlc) |
