From d3aadcff6ce412b17b3609d5ca2ed0e8ee4bfd2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Mon, 20 Sep 2010 18:24:31 +0000 Subject: [PATCH] =?UTF-8?q?In=20FFmpeg=20SVN=20r22715=20(I=20suppose),=20t?= =?UTF-8?q?here=20was=20an=20optimization=20done=20to=20speed=20up=20VLC?= =?UTF-8?q?=20table=20(whatever=20it=20is)=20initialization.=20Somehow=20t?= =?UTF-8?q?he=20code=20does=20not=20work=20on=20GCC2.=20Use=20the=20old=20?= =?UTF-8?q?code=20we=20had=20previously=20in=20SVN=20minus=20a=20flag=20(I?= =?UTF-8?q?NIT=5FVLC=5FUSE=5FSTATIC)=20which=20is=20no=20longer=20used=20i?= =?UTF-8?q?n=20FFmpeg.=20This=20fixes=20the=20GCC2=20build=20of=20FFmpeg?= =?UTF-8?q?=20and=20closes=20=C3=83#6643,=20#6582=20and=20#656.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38746 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../plugins/ffmpeg/libavcodec/bitstream.c | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/src/add-ons/media/plugins/ffmpeg/libavcodec/bitstream.c b/src/add-ons/media/plugins/ffmpeg/libavcodec/bitstream.c index 0d7a2dbc85..25d8502526 100644 --- a/src/add-ons/media/plugins/ffmpeg/libavcodec/bitstream.c +++ b/src/add-ons/media/plugins/ffmpeg/libavcodec/bitstream.c @@ -138,6 +138,7 @@ static int compare_vlcspec(const void *a, const void *b) return (sa->code >> 1) - (sb->code >> 1); } +#if __GNUC__ >= 3 /** * Build VLC decoding tables suitable for use with get_vlc(). * @@ -327,6 +328,151 @@ int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated); return 0; } +#else + +static int build_table(VLC *vlc, int table_nb_bits, + int nb_codes, + const void *bits, int bits_wrap, int bits_size, + const void *codes, int codes_wrap, int codes_size, + const void *symbols, int symbols_wrap, int symbols_size, + uint32_t code_prefix, int n_prefix, int flags) +{ + int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2, symbol; + uint32_t code; + VLC_TYPE (*table)[2]; + + table_size = 1 << table_nb_bits; + table_index = alloc_table(vlc, table_size, flags & 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); +#endif + if (table_index < 0) + return -1; + table = &vlc->table[table_index]; + + for(i=0;i=32 ? 0xffffffff : (1 << n_prefix)-1); + else + code_prefix2= code >> n; + if (n > 0 && code_prefix2 == code_prefix) { + if (n <= table_nb_bits) { + /* no need to add another table */ + j = (code << (table_nb_bits - n)) & (table_size - 1); + nb = 1 << (table_nb_bits - n); + for(k=0;k> n_prefix) + (k<> ((flags & INIT_VLC_LE) ? n_prefix : n)) & ((1 << table_nb_bits) - 1); +#ifdef DEBUG_VLC + av_log(NULL,AV_LOG_DEBUG,"%4x: n=%d (subtable)\n", + j, n); +#endif + /* compute table size */ + n1 = -table[j][1]; //bits + if (n > n1) + n1 = n; + table[j][1] = -n1; //bits + } + } + } + + /* second pass : fill auxillary tables recursively */ + for(i=0;i table_nb_bits) { + n = table_nb_bits; + table[i][1] = -n; //bits + } + index = build_table(vlc, n, nb_codes, + bits, bits_wrap, bits_size, + codes, codes_wrap, codes_size, + symbols, symbols_wrap, symbols_size, + (flags & INIT_VLC_LE) ? (code_prefix | (i << n_prefix)) : ((code_prefix << table_nb_bits) | i), + n_prefix + table_nb_bits, flags); + if (index < 0) + return -1; + /* note: realloc has been done, so reload tables */ + table = &vlc->table[table_index]; + table[i][0] = index; //code + } + } + return table_index; +} + +int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, + const void *bits, int bits_wrap, int bits_size, + const void *codes, int codes_wrap, int codes_size, + const void *symbols, int symbols_wrap, int symbols_size, + int flags) +{ + vlc->bits = nb_bits; + 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 { + vlc->table = NULL; + vlc->table_allocated = 0; + vlc->table_size = 0; + } + +#ifdef DEBUG_VLC + av_log(NULL,AV_LOG_DEBUG,"build table nb_codes=%d\n", nb_codes); +#endif + + if (build_table(vlc, nb_bits, nb_codes, + bits, bits_wrap, bits_size, + codes, codes_wrap, codes_size, + symbols, symbols_wrap, symbols_size, + 0, 0, flags) < 0) { + 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; +} +#endif // GCC2 version void free_vlc(VLC *vlc)