diff options
author | Paul B Mahol <onemda@gmail.com> | 2013-07-04 19:54:43 +0000 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2013-07-05 16:51:08 +0000 |
commit | 48f2750de8a47671aa4e09e91d7ab811558d2c2f (patch) | |
tree | 50bd4f60d1f7ed11a0b5b4b58af8c0770e02646a | |
parent | 4e10d87f384a11b11034349e441f76207275c756 (diff) | |
download | ffmpeg-48f2750de8a47671aa4e09e91d7ab811558d2c2f.tar.gz |
get_bits: add get_bits_le()
Signed-off-by: Paul B Mahol <onemda@gmail.com>
-rw-r--r-- | libavcodec/get_bits.h | 61 |
1 files changed, 43 insertions, 18 deletions
diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h index 4f4aa9aea8..b6cc75a474 100644 --- a/libavcodec/get_bits.h +++ b/libavcodec/get_bits.h @@ -139,27 +139,34 @@ typedef struct RL_VLC_ELEM { #define CLOSE_READER(name, gb) (gb)->index = name ## _index +# ifdef LONG_BITSTREAM_READER + +# define UPDATE_CACHE_LE(name, gb) name ## _cache = \ + AV_RL64((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7) + +# define UPDATE_CACHE_BE(name, gb) name ## _cache = \ + AV_RB64((gb)->buffer + (name ## _index >> 3)) >> (32 - (name ## _index & 7)) + +#else + +# define UPDATE_CACHE_LE(name, gb) name ## _cache = \ + AV_RL32((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7) + +# define UPDATE_CACHE_BE(name, gb) name ## _cache = \ + AV_RB32((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7) + +#endif + + #ifdef BITSTREAM_READER_LE -# ifdef LONG_BITSTREAM_READER -# define UPDATE_CACHE(name, gb) name ## _cache = \ - AV_RL64((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7) -# else -# define UPDATE_CACHE(name, gb) name ## _cache = \ - AV_RL32((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7) -# endif +# define UPDATE_CACHE(name, gb) UPDATE_CACHE_LE(name, gb) # define SKIP_CACHE(name, gb, num) name ## _cache >>= (num) #else -# ifdef LONG_BITSTREAM_READER -# define UPDATE_CACHE(name, gb) name ## _cache = \ - AV_RB64((gb)->buffer + (name ## _index >> 3)) >> (32 - (name ## _index & 7)) -# else -# define UPDATE_CACHE(name, gb) name ## _cache = \ - AV_RB32((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7) -# endif +# define UPDATE_CACHE(name, gb) UPDATE_CACHE_BE(name, gb) # define SKIP_CACHE(name, gb, num) name ## _cache <<= (num) @@ -180,12 +187,18 @@ typedef struct RL_VLC_ELEM { #define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) +#define SHOW_UBITS_LE(name, gb, num) zero_extend(name ## _cache, num) +#define SHOW_SBITS_LE(name, gb, num) sign_extend(name ## _cache, num) + +#define SHOW_UBITS_BE(name, gb, num) NEG_USR32(name ## _cache, num) +#define SHOW_SBITS_BE(name, gb, num) NEG_SSR32(name ## _cache, num) + #ifdef BITSTREAM_READER_LE -# define SHOW_UBITS(name, gb, num) zero_extend(name ## _cache, num) -# define SHOW_SBITS(name, gb, num) sign_extend(name ## _cache, num) +# define SHOW_UBITS(name, gb, num) SHOW_UBITS_LE(name, gb, num) +# define SHOW_SBITS(name, gb, num) SHOW_SBITS_LE(name, gb, num) #else -# define SHOW_UBITS(name, gb, num) NEG_USR32(name ## _cache, num) -# define SHOW_SBITS(name, gb, num) NEG_SSR32(name ## _cache, num) +# define SHOW_UBITS(name, gb, num) SHOW_UBITS_BE(name, gb, num) +# define SHOW_SBITS(name, gb, num) SHOW_SBITS_BE(name, gb, num) #endif #define GET_CACHE(name, gb) ((uint32_t) name ## _cache) @@ -250,6 +263,18 @@ static inline unsigned int get_bits(GetBitContext *s, int n) return tmp; } +static inline unsigned int get_bits_le(GetBitContext *s, int n) +{ + register int tmp; + OPEN_READER(re, s); + av_assert2(n>0 && n<=25); + UPDATE_CACHE_LE(re, s); + tmp = SHOW_UBITS_LE(re, s, n); + LAST_SKIP_BITS(re, s, n); + CLOSE_READER(re, s); + return tmp; +} + /** * Show 1-25 bits. */ |