diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2008-05-30 19:48:02 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2008-05-30 19:48:02 +0000 |
commit | ccc54864fef9afed00a32c0fc1394a78cf6e971e (patch) | |
tree | 34551d4108e0de41995119dbd4587fc55fa2c1dc | |
parent | 27f19ed5015f8a83411987e208d87b03af89d11c (diff) | |
download | ffmpeg-ccc54864fef9afed00a32c0fc1394a78cf6e971e.tar.gz |
Make init_vlc* support proper static tables instead of this broken beyond
imagination alloc_static() trash.
Originally committed as revision 13561 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/bitstream.c | 14 | ||||
-rw-r--r-- | libavcodec/bitstream.h | 3 |
2 files changed, 14 insertions, 3 deletions
diff --git a/libavcodec/bitstream.c b/libavcodec/bitstream.c index f02c9c7e12..823bf97f4f 100644 --- a/libavcodec/bitstream.c +++ b/libavcodec/bitstream.c @@ -110,6 +110,8 @@ static int alloc_table(VLC *vlc, int size, int use_static) index = vlc->table_size; vlc->table_size += size; if (vlc->table_size > vlc->table_allocated) { + if(use_static>1) + abort(); //cant do anything, init_vlc() is used with too little memory vlc->table_allocated += (1 << vlc->bits); if(use_static) vlc->table = ff_realloc_static(vlc->table, @@ -135,7 +137,7 @@ static int build_table(VLC *vlc, int table_nb_bits, VLC_TYPE (*table)[2]; table_size = 1 << table_nb_bits; - table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_STATIC); + table_index = alloc_table(vlc, table_size, flags & (INIT_VLC_USE_STATIC|INIT_VLC_USE_NEW_STATIC)); #ifdef DEBUG_VLC av_log(NULL,AV_LOG_DEBUG,"new table index=%d size=%d code_prefix=%x n=%d\n", table_index, table_size, code_prefix, n_prefix); @@ -264,7 +266,13 @@ int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, int flags) { vlc->bits = nb_bits; - if(!(flags & INIT_VLC_USE_STATIC)) { + if(flags & INIT_VLC_USE_NEW_STATIC){ + if(vlc->table_size && vlc->table_size == vlc->table_allocated){ + return 0; + }else if(vlc->table_size){ + abort(); // fatal error, we are called on a partially initialized table + } + }else if(!(flags & INIT_VLC_USE_STATIC)) { vlc->table = NULL; vlc->table_allocated = 0; vlc->table_size = 0; @@ -287,6 +295,8 @@ int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, av_freep(&vlc->table); return -1; } + if((flags & INIT_VLC_USE_NEW_STATIC) && vlc->table_size != vlc->table_allocated) + av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated); return 0; } diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h index 68b9cf6e3d..8d2d795d7c 100644 --- a/libavcodec/bitstream.h +++ b/libavcodec/bitstream.h @@ -800,8 +800,9 @@ int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags); -#define INIT_VLC_USE_STATIC 1 +#define INIT_VLC_USE_STATIC 1 ///< VERY strongly deprecated and forbidden #define INIT_VLC_LE 2 +#define INIT_VLC_USE_NEW_STATIC 4 void free_vlc(VLC *vlc); /** |