mirror of
https://github.com/nyanmisaka/ffmpeg-rockchip.git
synced 2025-10-30 20:16:42 +08:00
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
This commit is contained in:
committed by
Michael Niedermayer
parent
7062fad6e9
commit
d8e00c0997
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user