From ccc54864fef9afed00a32c0fc1394a78cf6e971e Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 30 May 2008 19:48:02 +0000 Subject: 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 --- libavcodec/bitstream.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'libavcodec/bitstream.c') 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; } -- cgit v1.2.3