Mercurial > libavcodec.hg
comparison bitstream.c @ 11713:b9354f343d2d libavcodec
change a variable-length array to a malloc.
| author | lorenm |
|---|---|
| date | Wed, 12 May 2010 22:38:05 +0000 |
| parents | 7dd2a45249a9 |
| children |
comparison
equal
deleted
inserted
replaced
| 11712:25ed71436974 | 11713:b9354f343d2d |
|---|---|
| 273 const void *bits, int bits_wrap, int bits_size, | 273 const void *bits, int bits_wrap, int bits_size, |
| 274 const void *codes, int codes_wrap, int codes_size, | 274 const void *codes, int codes_wrap, int codes_size, |
| 275 const void *symbols, int symbols_wrap, int symbols_size, | 275 const void *symbols, int symbols_wrap, int symbols_size, |
| 276 int flags) | 276 int flags) |
| 277 { | 277 { |
| 278 VLCcode buf[nb_codes]; | 278 VLCcode *buf; |
| 279 int i, j; | 279 int i, j, ret; |
| 280 | 280 |
| 281 vlc->bits = nb_bits; | 281 vlc->bits = nb_bits; |
| 282 if(flags & INIT_VLC_USE_NEW_STATIC){ | 282 if(flags & INIT_VLC_USE_NEW_STATIC){ |
| 283 if(vlc->table_size && vlc->table_size == vlc->table_allocated){ | 283 if(vlc->table_size && vlc->table_size == vlc->table_allocated){ |
| 284 return 0; | 284 return 0; |
| 292 } | 292 } |
| 293 | 293 |
| 294 #ifdef DEBUG_VLC | 294 #ifdef DEBUG_VLC |
| 295 av_log(NULL,AV_LOG_DEBUG,"build table nb_codes=%d\n", nb_codes); | 295 av_log(NULL,AV_LOG_DEBUG,"build table nb_codes=%d\n", nb_codes); |
| 296 #endif | 296 #endif |
| 297 | |
| 298 buf = av_malloc((nb_codes+1)*sizeof(VLCcode)); | |
| 297 | 299 |
| 298 assert(symbols_size <= 2 || !symbols); | 300 assert(symbols_size <= 2 || !symbols); |
| 299 j = 0; | 301 j = 0; |
| 300 #define COPY(condition)\ | 302 #define COPY(condition)\ |
| 301 for (i = 0; i < nb_codes; i++) {\ | 303 for (i = 0; i < nb_codes; i++) {\ |
| 317 // qsort is the slowest part of init_vlc, and could probably be improved or avoided | 319 // qsort is the slowest part of init_vlc, and could probably be improved or avoided |
| 318 qsort(buf, j, sizeof(VLCcode), compare_vlcspec); | 320 qsort(buf, j, sizeof(VLCcode), compare_vlcspec); |
| 319 COPY(buf[j].bits && buf[j].bits <= nb_bits); | 321 COPY(buf[j].bits && buf[j].bits <= nb_bits); |
| 320 nb_codes = j; | 322 nb_codes = j; |
| 321 | 323 |
| 322 if (build_table(vlc, nb_bits, nb_codes, buf, flags) < 0) { | 324 ret = build_table(vlc, nb_bits, nb_codes, buf, flags); |
| 325 | |
| 326 av_free(buf); | |
| 327 if (ret < 0) { | |
| 323 av_freep(&vlc->table); | 328 av_freep(&vlc->table); |
| 324 return -1; | 329 return -1; |
| 325 } | 330 } |
| 326 if((flags & INIT_VLC_USE_NEW_STATIC) && vlc->table_size != vlc->table_allocated) | 331 if((flags & INIT_VLC_USE_NEW_STATIC) && vlc->table_size != vlc->table_allocated) |
| 327 av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated); | 332 av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated); |
