X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fbitstream.h;h=4a3d55d19b6bd9a5599d103412af7338ab882c7d;hb=79b0b66ba07890c4f71b42d2554d73db537bec97;hp=26dee2df8861ce7c607e86f790fa9f2c4ce6c26b;hpb=344b825cebd2aa3f36316fdfbc4d564c9ce1d02c;p=ffmpeg diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h index 26dee2df886..4a3d55d19b6 100644 --- a/libavcodec/bitstream.h +++ b/libavcodec/bitstream.h @@ -13,7 +13,7 @@ //#define LIBMPEG2_BITSTREAM_READER //#define A32_BITSTREAM_READER #define LIBMPEG2_BITSTREAM_READER_HACK //add BERO - + extern const uint8_t ff_reverse[256]; #if defined(ARCH_X86) || defined(ARCH_X86_64) @@ -53,6 +53,11 @@ typedef struct PutBitContext { static inline void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size) { + if(buffer_size < 0) { + buffer_size = 0; + buffer = NULL; + } + s->buf = buffer; s->buf_end = s->buf + buffer_size; #ifdef ALT_BITSTREAM_WRITER @@ -141,7 +146,7 @@ typedef struct RL_VLC_ELEM { # ifdef __GNUC__ static inline uint32_t unaligned32(const void *v) { struct Unaligned { - uint32_t i; + uint32_t i; } __attribute__((packed)); return ((const struct Unaligned *) v)->i; @@ -168,7 +173,7 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) #endif // printf("put_bits=%d %x\n", n, value); assert(n == 32 || value < (1U << n)); - + bit_buf = s->bit_buf; bit_left = s->bit_left; @@ -178,7 +183,7 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) bit_buf = (bit_buf<> (n - bit_left); #ifdef UNALIGNED_STORES_ARE_BAD if (3 & (intptr_t) s->buf_ptr) { @@ -191,7 +196,7 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) *(uint32_t *)s->buf_ptr = be2me_32(bit_buf); //printf("bitbuf = %08x\n", bit_buf); s->buf_ptr+=4; - bit_left+=32 - n; + bit_left+=32 - n; bit_buf = value; } @@ -207,28 +212,28 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) # ifdef ALIGNED_BITSTREAM_WRITER # if defined(ARCH_X86) || defined(ARCH_X86_64) asm volatile( - "movl %0, %%ecx \n\t" - "xorl %%eax, %%eax \n\t" - "shrdl %%cl, %1, %%eax \n\t" - "shrl %%cl, %1 \n\t" - "movl %0, %%ecx \n\t" - "shrl $3, %%ecx \n\t" - "andl $0xFFFFFFFC, %%ecx \n\t" - "bswapl %1 \n\t" - "orl %1, (%2, %%ecx) \n\t" - "bswapl %%eax \n\t" - "addl %3, %0 \n\t" - "movl %%eax, 4(%2, %%ecx) \n\t" - : "=&r" (s->index), "=&r" (value) - : "r" (s->buf), "r" (n), "0" (s->index), "1" (value<<(-n)) - : "%eax", "%ecx" + "movl %0, %%ecx \n\t" + "xorl %%eax, %%eax \n\t" + "shrdl %%cl, %1, %%eax \n\t" + "shrl %%cl, %1 \n\t" + "movl %0, %%ecx \n\t" + "shrl $3, %%ecx \n\t" + "andl $0xFFFFFFFC, %%ecx \n\t" + "bswapl %1 \n\t" + "orl %1, (%2, %%ecx) \n\t" + "bswapl %%eax \n\t" + "addl %3, %0 \n\t" + "movl %%eax, 4(%2, %%ecx) \n\t" + : "=&r" (s->index), "=&r" (value) + : "r" (s->buf), "r" (n), "0" (s->index), "1" (value<<(-n)) + : "%eax", "%ecx" ); # else int index= s->index; uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5); - - value<<= 32-n; - + + value<<= 32-n; + ptr[0] |= be2me_32(value>>(index&31)); ptr[1] = be2me_32(value<<(32-(index&31))); //if(n>24) printf("%d %d\n", n, value); @@ -238,25 +243,25 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) # else //ALIGNED_BITSTREAM_WRITER # if defined(ARCH_X86) || defined(ARCH_X86_64) asm volatile( - "movl $7, %%ecx \n\t" - "andl %0, %%ecx \n\t" - "addl %3, %%ecx \n\t" - "negl %%ecx \n\t" - "shll %%cl, %1 \n\t" - "bswapl %1 \n\t" - "movl %0, %%ecx \n\t" - "shrl $3, %%ecx \n\t" - "orl %1, (%%ecx, %2) \n\t" - "addl %3, %0 \n\t" - "movl $0, 4(%%ecx, %2) \n\t" - : "=&r" (s->index), "=&r" (value) - : "r" (s->buf), "r" (n), "0" (s->index), "1" (value) - : "%ecx" + "movl $7, %%ecx \n\t" + "andl %0, %%ecx \n\t" + "addl %3, %%ecx \n\t" + "negl %%ecx \n\t" + "shll %%cl, %1 \n\t" + "bswapl %1 \n\t" + "movl %0, %%ecx \n\t" + "shrl $3, %%ecx \n\t" + "orl %1, (%%ecx, %2) \n\t" + "addl %3, %0 \n\t" + "movl $0, 4(%%ecx, %2) \n\t" + : "=&r" (s->index), "=&r" (value) + : "r" (s->buf), "r" (n), "0" (s->index), "1" (value) + : "%ecx" ); # else int index= s->index; uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3)); - + ptr[0] |= be2me_32(value<<(32-n-(index&7) )); ptr[1] = 0; //if(n>24) printf("%d %d\n", n, value); @@ -271,9 +276,9 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) static inline uint8_t* pbBufPtr(PutBitContext *s) { #ifdef ALT_BITSTREAM_WRITER - return s->buf + (s->index>>3); + return s->buf + (s->index>>3); #else - return s->buf_ptr; + return s->buf_ptr; #endif } @@ -285,11 +290,11 @@ static inline void skip_put_bytes(PutBitContext *s, int n){ assert((put_bits_count(s)&7)==0); #ifdef ALT_BITSTREAM_WRITER FIXME may need some cleaning of the buffer - s->index += n<<3; + s->index += n<<3; #else assert(s->bit_left==32); - s->buf_ptr += n; -#endif + s->buf_ptr += n; +#endif } /** @@ -303,7 +308,7 @@ static inline void skip_put_bits(PutBitContext *s, int n){ s->bit_left -= n; s->buf_ptr-= s->bit_left>>5; s->bit_left &= 31; -#endif +#endif } /** @@ -361,10 +366,10 @@ 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]); + const uint8_t *p=v; + return (((p[0]<<8) | p[1])<<16) | (p[2]<<8) | (p[3]); #else - return be2me_32( unaligned32(v)); //original + return be2me_32( unaligned32(v)); //original #endif } @@ -523,8 +528,8 @@ static inline int get_bits_count(GetBitContext *s){ #if defined(ARCH_X86) || defined(ARCH_X86_64) # define SKIP_CACHE(name, gb, num)\ asm(\ - "shldl %2, %1, %0 \n\t"\ - "shll %2, %1 \n\t"\ + "shldl %2, %1, %0 \n\t"\ + "shll %2, %1 \n\t"\ : "+r" (name##_cache0), "+r" (name##_cache1)\ : "Ic" ((uint8_t)num)\ ); @@ -564,9 +569,9 @@ static inline int get_bits_count(GetBitContext *s){ /** * read mpeg1 dc style vlc (sign bit + mantisse with no MSB). - * if MSB not set it is negative + * if MSB not set it is negative * @param n length in bits - * @author BERO + * @author BERO */ static inline int get_xbits(GetBitContext *s, int n){ register int tmp; @@ -672,7 +677,11 @@ static inline void skip_bits1(GetBitContext *s){ static inline void init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size) { - const int buffer_size= (bit_size+7)>>3; + int buffer_size= (bit_size+7)>>3; + if(buffer_size < 0 || bit_size < 0) { + buffer_size = bit_size = 0; + buffer = NULL; + } s->buffer= buffer; s->size_in_bits= bit_size; @@ -781,34 +790,20 @@ void free_vlc(VLC *vlc); SKIP_BITS(name, gb, n)\ } -// deprecated, dont use get_vlc for new code, use get_vlc2 instead or use GET_VLC directly -static inline int get_vlc(GetBitContext *s, VLC *vlc) -{ - int code; - VLC_TYPE (*table)[2]= vlc->table; - - OPEN_READER(re, s) - UPDATE_CACHE(re, s) - - GET_VLC(code, re, s, table, vlc->bits, 3) - - CLOSE_READER(re, s) - return code; -} /** * parses a vlc code, faster then get_vlc() - * @param bits is the number of bits which will be read at once, must be + * @param bits is the number of bits which will be read at once, must be * identical to nb_bits in init_vlc() * @param max_depth is the number of times bits bits must be readed to completly - * read the longest vlc code + * read the longest vlc code * = (max_vlc_length + bits - 1) / bits */ static always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int max_depth) { int code; - + OPEN_READER(re, s) UPDATE_CACHE(re, s) @@ -824,7 +819,7 @@ static always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], #include "avcodec.h" static inline void print_bin(int bits, int n){ int i; - + for(i=n-1; i>=0; i--){ av_log(NULL, AV_LOG_DEBUG, "%d", (bits>>i)&1); } @@ -834,7 +829,7 @@ static inline void print_bin(int bits, int n){ static inline int get_bits_trace(GetBitContext *s, int n, char *file, const char *func, int line){ int r= get_bits(s, n); - + print_bin(r, n); av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d bit @%5d in %s %s:%d\n", r, n, r, get_bits_count(s)-n, file, func, line); return r; @@ -845,16 +840,16 @@ static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], int bits int r= get_vlc2(s, table, bits, max_depth); int len= get_bits_count(s) - pos; int bits2= show>>(24-len); - + print_bin(bits2, len); - + av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d vlc @%5d in %s %s:%d\n", bits2, len, r, pos, file, func, line); return r; } static inline int get_xbits_trace(GetBitContext *s, int n, char *file, const char *func, int line){ int show= show_bits(s, n); int r= get_xbits(s, n); - + print_bin(show, n); av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d xbt @%5d in %s %s:%d\n", show, n, r, get_bits_count(s)-n, file, func, line); return r;