X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fbitstream.h;h=f48f1ee944d74651b08c661b2d52bde0c1f46552;hb=3143f13345e4a206dc03491255116a1eb8119ae0;hp=fd1b4a94f88694b7bc271f7f9e1a1f5ba32c60ff;hpb=98f7b56bb6562db841219a42ea4e15d43a835c93;p=ffmpeg diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h index fd1b4a94f88..f48f1ee944d 100644 --- a/libavcodec/bitstream.h +++ b/libavcodec/bitstream.h @@ -23,18 +23,19 @@ * bitstream api header. */ -#ifndef BITSTREAM_H -#define BITSTREAM_H +#ifndef FFMPEG_BITSTREAM_H +#define FFMPEG_BITSTREAM_H #include #include #include -#include "common.h" -#include "bswap.h" -#include "log.h" +#include "libavutil/bswap.h" +#include "libavutil/common.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/log.h" #if defined(ALT_BITSTREAM_READER_LE) && !defined(ALT_BITSTREAM_READER) -#define ALT_BITSTREAM_READER +# define ALT_BITSTREAM_READER #endif //#define ALT_BITSTREAM_WRITER @@ -43,12 +44,11 @@ # ifdef ARCH_ARMV4L # define A32_BITSTREAM_READER # else -#define ALT_BITSTREAM_READER +# define ALT_BITSTREAM_READER //#define LIBMPEG2_BITSTREAM_READER //#define A32_BITSTREAM_READER # endif #endif -#define LIBMPEG2_BITSTREAM_READER_HACK //add BERO extern const uint8_t ff_reverse[256]; @@ -136,8 +136,8 @@ static inline void flush_put_bits(PutBitContext *s) } void align_put_bits(PutBitContext *s); -void ff_put_string(PutBitContext * pbc, char *s, int put_zero); -void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length); +void ff_put_string(PutBitContext * pbc, const char *s, int put_zero); +void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length); /* bit input */ /* buffer, buffer_end and size_in_bits must be present and used by every reader */ @@ -176,38 +176,6 @@ typedef struct RL_VLC_ELEM { #define UNALIGNED_STORES_ARE_BAD #endif -/* used to avoid missaligned exceptions on some archs (alpha, ...) */ -#if defined(ARCH_X86) -# define unaligned16(a) (*(const uint16_t*)(a)) -# define unaligned32(a) (*(const uint32_t*)(a)) -# define unaligned64(a) (*(const uint64_t*)(a)) -#else -# ifdef __GNUC__ -# define unaligned(x) \ -static inline uint##x##_t unaligned##x(const void *v) { \ - struct Unaligned { \ - uint##x##_t i; \ - } __attribute__((packed)); \ - \ - return ((const struct Unaligned *) v)->i; \ -} -# elif defined(__DECC) -# define unaligned(x) \ -static inline uint##x##_t unaligned##x(const void *v) { \ - return *(const __unaligned uint##x##_t *) v; \ -} -# else -# define unaligned(x) \ -static inline uint##x##_t unaligned##x(const void *v) { \ - return *(const uint##x##_t *) v; \ -} -# endif -unaligned(16) -unaligned(32) -unaligned(64) -#undef unaligned -#endif /* defined(ARCH_X86) */ - #ifndef ALT_BITSTREAM_WRITER static inline void put_bits(PutBitContext *s, int n, unsigned int value) { @@ -315,6 +283,13 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) } #endif +static inline void put_sbits(PutBitContext *pb, int bits, int32_t val) +{ + assert(bits >= 0 && bits <= 31); + + put_bits(pb, bits, val & ((1<buffer)+(name##_index>>3) ) >> (name##_index&0x07);\ + name##_cache= AV_RL32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) >> (name##_index&0x07);\ # define SKIP_CACHE(name, gb, num)\ name##_cache >>= (num); # else # define UPDATE_CACHE(name, gb)\ - name##_cache= unaligned32_be( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\ + name##_cache= AV_RB32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\ # define SKIP_CACHE(name, gb, num)\ name##_cache <<= (num); @@ -503,26 +458,13 @@ static inline void skip_bits_long(GetBitContext *s, int n){ (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;\ + name##_cache+= AV_RB16(name##_buffer_ptr) << name##_bit_count; \ name##_buffer_ptr+=2;\ name##_bit_count-= 16;\ }\ -#endif - # define SKIP_CACHE(name, gb, num)\ name##_cache <<= (num);\ @@ -819,10 +761,20 @@ int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags); -#define INIT_VLC_USE_STATIC 1 +#define INIT_VLC_USE_STATIC 1 ///< VERY strongly deprecated and forbidden #define INIT_VLC_LE 2 +#define INIT_VLC_USE_NEW_STATIC 4 void free_vlc(VLC *vlc); +#define INIT_VLC_STATIC(vlc, bits, a,b,c,d,e,f,g, static_size)\ +{\ + static VLC_TYPE table[static_size][2];\ + (vlc)->table= table;\ + (vlc)->table_allocated= static_size;\ + init_vlc(vlc, bits, a,b,c,d,e,f,g, INIT_VLC_USE_NEW_STATIC);\ +} + + /** * * if the vlc code is invalid and max_depth=1 than no bits will be removed @@ -969,4 +921,11 @@ static inline int decode012(GetBitContext *gb){ return get_bits1(gb) + 1; } -#endif /* BITSTREAM_H */ +static inline int decode210(GetBitContext *gb){ + if (get_bits1(gb)) + return 0; + else + return 2 - get_bits1(gb); +} + +#endif /* FFMPEG_BITSTREAM_H */