diff options
author | BERO <bero@geocities.co.jp> | 2003-05-14 00:32:22 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2003-05-14 00:32:22 +0000 |
commit | d8e00c099731b8499a8c377469ac5796f5bd186c (patch) | |
tree | 711680cabebcfad66236563377db4e1ee77545b6 /libavcodec/common.h | |
parent | 7062fad6e9e5d506f2cdaa31c75c404ccd1315ab (diff) | |
download | ffmpeg-d8e00c099731b8499a8c377469ac5796f5bd186c.tar.gz |
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
Originally committed as revision 1871 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/common.h')
-rw-r--r-- | libavcodec/common.h | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/libavcodec/common.h b/libavcodec/common.h index b7ec2ae41b..494db42e2e 100644 --- a/libavcodec/common.h +++ b/libavcodec/common.h @@ -16,6 +16,7 @@ #define ALT_BITSTREAM_READER //#define LIBMPEG2_BITSTREAM_READER //#define A32_BITSTREAM_READER +#define LIBMPEG2_BITSTREAM_READER_HACK //add BERO #ifdef HAVE_AV_CONFIG_H /* only include the following when compiling package */ @@ -472,6 +473,16 @@ LAST_SKIP_BITS(name, gb, num) for examples see get_bits, show_bits, skip_bits, get_vlc */ +static inline int unaligned32_be(const void *v) +{ +#ifdef CONFIG_ALIGN + const uint8_t *p=v; + return (((p[0]<<8) | p[1])<<16) | (p[2]<<8) | (p[3]); +#else + return be2me_32( unaligned32(v)); //original +#endif +} + #ifdef ALT_BITSTREAM_READER # define MIN_CACHE_BITS 25 @@ -483,7 +494,7 @@ for examples see get_bits, show_bits, skip_bits, get_vlc (gb)->index= name##_index;\ # define UPDATE_CACHE(name, gb)\ - name##_cache= be2me_32( unaligned32( ((uint8_t *)(gb)->buffer)+(name##_index>>3) ) ) << (name##_index&0x07);\ + name##_cache= unaligned32_be( ((uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\ # define SKIP_CACHE(name, gb, num)\ name##_cache <<= (num);\ @@ -528,6 +539,17 @@ static inline int get_bits_count(GetBitContext *s){ (gb)->cache= name##_cache;\ (gb)->buffer_ptr= name##_buffer_ptr;\ +#ifdef LIBMPEG2_BITSTREAM_READER_HACK + +# define UPDATE_CACHE(name, gb)\ + if(name##_bit_count >= 0){\ + name##_cache+= (int)be2me_16(*(uint16_t*)name##_buffer_ptr++) << name##_bit_count;\ + name##_buffer_ptr+=2;\ + name##_bit_count-= 16;\ + }\ + +#else + # define UPDATE_CACHE(name, gb)\ if(name##_bit_count > 0){\ name##_cache+= ((name##_buffer_ptr[0]<<8) + name##_buffer_ptr[1]) << name##_bit_count;\ @@ -535,6 +557,8 @@ static inline int get_bits_count(GetBitContext *s){ name##_bit_count-= 16;\ }\ +#endif + # define SKIP_CACHE(name, gb, num)\ name##_cache <<= (num);\ @@ -630,6 +654,37 @@ static inline int get_bits_count(GetBitContext *s){ #endif +/* add BERO + if MSB not set it is negative +*/ +static inline int get_xbits(GetBitContext *s, int n){ + register int tmp; + register int32_t cache; + OPEN_READER(re, s) + UPDATE_CACHE(re, s) + cache = GET_CACHE(re,s); + if ((int32_t)cache<0) { //MSB=1 + tmp = NEG_USR32(cache,n); + } else { + // tmp = (-1<<n) | NEG_USR32(cache,n) + 1; mpeg12.c algo + // tmp = - (NEG_USR32(cache,n) ^ ((1 << n) - 1)); h263.c algo + tmp = - NEG_USR32(~cache,n); + } + LAST_SKIP_BITS(re, s, n) + CLOSE_READER(re, s) + return tmp; +} + +static inline int get_sbits(GetBitContext *s, int n){ + register int tmp; + OPEN_READER(re, s) + UPDATE_CACHE(re, s) + tmp= SHOW_SBITS(re, s, n); + LAST_SKIP_BITS(re, s, n) + CLOSE_READER(re, s) + return tmp; +} + static inline unsigned int get_bits(GetBitContext *s, int n){ register int tmp; OPEN_READER(re, s) |