From b275500706ac3a20ac59bdb6ee080dc32f3254cf Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Sun, 12 Apr 2009 08:35:26 +0000 Subject: [PATCH] Split bitstream.h, put the bitstream writer stuff in the new file put_bits.h. Originally committed as revision 18461 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/ac3enc.c | 3 +- libavcodec/adpcm.c | 1 + libavcodec/alacenc.c | 1 + libavcodec/asv1.c | 1 + libavcodec/bitstream.c | 1 + libavcodec/bitstream.h | 274 -------------------------------- libavcodec/cabac.h | 2 +- libavcodec/dca.c | 1 + libavcodec/dv.c | 1 + libavcodec/faxcompr.c | 1 + libavcodec/ffv1.c | 1 + libavcodec/flashsvenc.c | 2 +- libavcodec/g726.c | 1 + libavcodec/gif.c | 2 +- libavcodec/golomb.h | 1 + libavcodec/huffyuv.c | 1 + libavcodec/lclenc.c | 2 +- libavcodec/lzwenc.c | 2 +- libavcodec/mjpeg.h | 2 +- libavcodec/mpegaudioenc.c | 2 +- libavcodec/mpegvideo.h | 1 + libavcodec/nellymoserenc.c | 2 +- libavcodec/put_bits.h | 311 +++++++++++++++++++++++++++++++++++++ libavcodec/vorbis_enc.c | 2 +- libavcodec/wma.h | 1 + libavformat/adtsenc.c | 1 + libavformat/gif.c | 2 +- libavformat/movenc.c | 1 + libavformat/mpegenc.c | 2 +- libavformat/swfenc.c | 2 +- 30 files changed, 340 insertions(+), 287 deletions(-) create mode 100644 libavcodec/put_bits.h diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index d68580150e..190bc38c1a 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -27,7 +27,8 @@ //#define DEBUG_BITALLOC #include "libavutil/crc.h" #include "avcodec.h" -#include "bitstream.h" +#include "bitstream.h" // for ff_reverse +#include "put_bits.h" #include "ac3.h" typedef struct AC3EncodeContext { diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index 7ddd72375a..59c7cabcd9 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -20,6 +20,7 @@ */ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "bytestream.h" /** diff --git a/libavcodec/alacenc.c b/libavcodec/alacenc.c index 886b6c68ba..82761c03b3 100644 --- a/libavcodec/alacenc.c +++ b/libavcodec/alacenc.c @@ -21,6 +21,7 @@ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" #include "lpc.h" #include "mathops.h" diff --git a/libavcodec/asv1.c b/libavcodec/asv1.c index 79752fbafe..c9a346addb 100644 --- a/libavcodec/asv1.c +++ b/libavcodec/asv1.c @@ -26,6 +26,7 @@ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" #include "mpeg12data.h" diff --git a/libavcodec/bitstream.c b/libavcodec/bitstream.c index 48510988f2..39dbe0411e 100644 --- a/libavcodec/bitstream.c +++ b/libavcodec/bitstream.c @@ -29,6 +29,7 @@ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" const uint8_t ff_log2_run[32]={ 0, 0, 0, 0, 1, 1, 1, 1, diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h index e2d557669e..e6ce62cfe3 100644 --- a/libavcodec/bitstream.h +++ b/libavcodec/bitstream.h @@ -39,8 +39,6 @@ # define ALT_BITSTREAM_READER #endif -//#define ALT_BITSTREAM_WRITER -//#define ALIGNED_BITSTREAM_WRITER #if !defined(LIBMPEG2_BITSTREAM_READER) && !defined(A32_BITSTREAM_READER) && !defined(ALT_BITSTREAM_READER) # if ARCH_ARM # define A32_BITSTREAM_READER @@ -74,106 +72,6 @@ static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ # define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s))) #endif -/* bit output */ - -/* buf and buf_end must be present and used by every alternative writer. */ -typedef struct PutBitContext { -#ifdef ALT_BITSTREAM_WRITER - uint8_t *buf, *buf_end; - int index; -#else - uint32_t bit_buf; - int bit_left; - uint8_t *buf, *buf_ptr, *buf_end; -#endif - int size_in_bits; -} PutBitContext; - -/** - * Initializes the PutBitContext \p s. - * - * @param buffer the buffer where to put bits - * @param buffer_size the size in bytes of \p buffer - */ -static inline void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size) -{ - if(buffer_size < 0) { - buffer_size = 0; - buffer = NULL; - } - - s->size_in_bits= 8*buffer_size; - s->buf = buffer; - s->buf_end = s->buf + buffer_size; -#ifdef ALT_BITSTREAM_WRITER - s->index=0; - ((uint32_t*)(s->buf))[0]=0; -// memset(buffer, 0, buffer_size); -#else - s->buf_ptr = s->buf; - s->bit_left=32; - s->bit_buf=0; -#endif -} - -/** - * Returns the total number of bits written to the bitstream. - */ -static inline int put_bits_count(PutBitContext *s) -{ -#ifdef ALT_BITSTREAM_WRITER - return s->index; -#else - return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left; -#endif -} - -/** - * Pads the end of the output stream with zeros. - */ -static inline void flush_put_bits(PutBitContext *s) -{ -#ifdef ALT_BITSTREAM_WRITER - align_put_bits(s); -#else -#ifndef BITSTREAM_WRITER_LE - s->bit_buf<<= s->bit_left; -#endif - while (s->bit_left < 32) { - /* XXX: should test end of buffer */ -#ifdef BITSTREAM_WRITER_LE - *s->buf_ptr++=s->bit_buf; - s->bit_buf>>=8; -#else - *s->buf_ptr++=s->bit_buf >> 24; - s->bit_buf<<=8; -#endif - s->bit_left+=8; - } - s->bit_left=32; - s->bit_buf=0; -#endif -} - -/** - * Pads the bitstream with zeros up to the next byte boundary. - */ -void align_put_bits(PutBitContext *s); - -/** - * Puts the string \p s in the bitstream. - * - * @param terminate_string 0-terminates the written string if value is 1 - */ -void ff_put_string(PutBitContext * pbc, const char *s, int terminate_string); - -/** - * Copies the content of \p src to the bitstream. - * - * @param length the number of bits of \p src to copy - */ -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 */ typedef struct GetBitContext { @@ -207,178 +105,6 @@ typedef struct RL_VLC_ELEM { uint8_t run; } RL_VLC_ELEM; -static inline void put_bits(PutBitContext *s, int n, unsigned int value) -#ifndef ALT_BITSTREAM_WRITER -{ - unsigned int bit_buf; - int bit_left; - - // printf("put_bits=%d %x\n", n, value); - assert(n == 32 || value < (1U << n)); - - bit_buf = s->bit_buf; - bit_left = s->bit_left; - - // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf); - /* XXX: optimize */ -#ifdef BITSTREAM_WRITER_LE - bit_buf |= value << (32 - bit_left); - if (n >= bit_left) { -#if !HAVE_FAST_UNALIGNED - if (3 & (intptr_t) s->buf_ptr) { - AV_WL32(s->buf_ptr, bit_buf); - } else -#endif - *(uint32_t *)s->buf_ptr = le2me_32(bit_buf); - s->buf_ptr+=4; - bit_buf = (bit_left==32)?0:value >> bit_left; - bit_left+=32; - } - bit_left-=n; -#else - if (n < bit_left) { - bit_buf = (bit_buf<> (n - bit_left); -#if !HAVE_FAST_UNALIGNED - if (3 & (intptr_t) s->buf_ptr) { - AV_WB32(s->buf_ptr, bit_buf); - } else -#endif - *(uint32_t *)s->buf_ptr = be2me_32(bit_buf); - //printf("bitbuf = %08x\n", bit_buf); - s->buf_ptr+=4; - bit_left+=32 - n; - bit_buf = value; - } -#endif - - s->bit_buf = bit_buf; - s->bit_left = bit_left; -} -#else /* ALT_BITSTREAM_WRITER defined */ -{ -# ifdef ALIGNED_BITSTREAM_WRITER -# if ARCH_X86 - __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" - ); -# else - int index= s->index; - uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5); - - 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); - index+= n; - s->index= index; -# endif -# else //ALIGNED_BITSTREAM_WRITER -# if ARCH_X86 - __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" - ); -# 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); - index+= n; - s->index= index; -# endif -# endif //!ALIGNED_BITSTREAM_WRITER -} -#endif - -static inline void put_sbits(PutBitContext *pb, int bits, int32_t val) -{ - assert(bits >= 0 && bits <= 31); - - put_bits(pb, bits, val & ((1<buf + (s->index>>3); -#else - return s->buf_ptr; -#endif -} - -/** - * Skips the given number of bytes. - * PutBitContext must be flushed & aligned to a byte boundary before calling this. - */ -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; -#else - assert(s->bit_left==32); - s->buf_ptr += n; -#endif -} - -/** - * Skips the given number of bits. - * Must only be used if the actual values in the bitstream do not matter. - * If \p n is 0 the behavior is undefined. - */ -static inline void skip_put_bits(PutBitContext *s, int n){ -#ifdef ALT_BITSTREAM_WRITER - s->index += n; -#else - s->bit_left -= n; - s->buf_ptr-= s->bit_left>>5; - s->bit_left &= 31; -#endif -} - -/** - * Changes the end of the buffer. - * - * @param size the new size in bytes of the buffer where to put bits - */ -static inline void set_put_bits_buffer_size(PutBitContext *s, int size){ - s->buf_end= s->buf + size; -} - /* Bitstream reader API docs: name arbitrary name which is used as prefix for the internal variables diff --git a/libavcodec/cabac.h b/libavcodec/cabac.h index 8ce4245b88..ea4ac54a23 100644 --- a/libavcodec/cabac.h +++ b/libavcodec/cabac.h @@ -27,7 +27,7 @@ #ifndef AVCODEC_CABAC_H #define AVCODEC_CABAC_H -#include "bitstream.h" +#include "put_bits.h" //#undef NDEBUG #include diff --git a/libavcodec/dca.c b/libavcodec/dca.c index 4b57242657..86b9c8f6ab 100644 --- a/libavcodec/dca.c +++ b/libavcodec/dca.c @@ -33,6 +33,7 @@ #include "avcodec.h" #include "dsputil.h" #include "bitstream.h" +#include "put_bits.h" #include "dcadata.h" #include "dcahuff.h" #include "dca.h" diff --git a/libavcodec/dv.c b/libavcodec/dv.c index 31325f6809..c11e33a31b 100644 --- a/libavcodec/dv.c +++ b/libavcodec/dv.c @@ -41,6 +41,7 @@ #include "avcodec.h" #include "dsputil.h" #include "bitstream.h" +#include "put_bits.h" #include "simple_idct.h" #include "dvdata.h" diff --git a/libavcodec/faxcompr.c b/libavcodec/faxcompr.c index 087197e97c..8d5e857de7 100644 --- a/libavcodec/faxcompr.c +++ b/libavcodec/faxcompr.c @@ -26,6 +26,7 @@ */ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "faxcompr.h" #define CCITT_SYMS 104 diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c index 570999a32f..281a400a3e 100644 --- a/libavcodec/ffv1.c +++ b/libavcodec/ffv1.c @@ -27,6 +27,7 @@ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" #include "rangecoder.h" #include "golomb.h" diff --git a/libavcodec/flashsvenc.c b/libavcodec/flashsvenc.c index ef73a9b19c..f207f8d078 100644 --- a/libavcodec/flashsvenc.c +++ b/libavcodec/flashsvenc.c @@ -59,7 +59,7 @@ #include #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" #include "bytestream.h" diff --git a/libavcodec/g726.c b/libavcodec/g726.c index ea72d39885..383d08af63 100644 --- a/libavcodec/g726.c +++ b/libavcodec/g726.c @@ -24,6 +24,7 @@ #include #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" /** * G.726 11bit float. diff --git a/libavcodec/gif.c b/libavcodec/gif.c index 7306a7fa79..6ab00e14ee 100644 --- a/libavcodec/gif.c +++ b/libavcodec/gif.c @@ -48,7 +48,7 @@ /* at least they don't use PDP_ENDIAN :) */ #define BITSTREAM_WRITER_LE -#include "bitstream.h" +#include "put_bits.h" /* bitstream minipacket size */ #define GIF_CHUNKS 100 diff --git a/libavcodec/golomb.h b/libavcodec/golomb.h index 59b4f9eca0..be64f2533e 100644 --- a/libavcodec/golomb.h +++ b/libavcodec/golomb.h @@ -32,6 +32,7 @@ #include #include "bitstream.h" +#include "put_bits.h" #define INVALID_VLC 0x80000000 diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c index e02bea2be8..59437b1a0f 100644 --- a/libavcodec/huffyuv.c +++ b/libavcodec/huffyuv.c @@ -30,6 +30,7 @@ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" #define VLC_BITS 11 diff --git a/libavcodec/lclenc.c b/libavcodec/lclenc.c index d4fa9b7624..011ce8ffcc 100644 --- a/libavcodec/lclenc.c +++ b/libavcodec/lclenc.c @@ -42,7 +42,7 @@ #include #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" #include "lcl.h" #if CONFIG_ZLIB diff --git a/libavcodec/lzwenc.c b/libavcodec/lzwenc.c index 4565b22c64..f3f66833a1 100644 --- a/libavcodec/lzwenc.c +++ b/libavcodec/lzwenc.c @@ -26,7 +26,7 @@ */ #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" #include "lzw.h" #define LZW_MAXBITS 12 diff --git a/libavcodec/mjpeg.h b/libavcodec/mjpeg.h index 1d80ae0a22..c556cb2366 100644 --- a/libavcodec/mjpeg.h +++ b/libavcodec/mjpeg.h @@ -34,7 +34,7 @@ #define AVCODEC_MJPEG_H #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" /* JPEG marker codes */ diff --git a/libavcodec/mpegaudioenc.c b/libavcodec/mpegaudioenc.c index 5caa83aaca..50a7b35120 100644 --- a/libavcodec/mpegaudioenc.c +++ b/libavcodec/mpegaudioenc.c @@ -25,7 +25,7 @@ */ #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" #undef CONFIG_MPEGAUDIO_HP #define CONFIG_MPEGAUDIO_HP 0 diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 10dd48ca1e..ab90bef5f2 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -30,6 +30,7 @@ #include "dsputil.h" #include "bitstream.h" +#include "put_bits.h" #include "ratecontrol.h" #include "parser.h" #include "mpeg12data.h" diff --git a/libavcodec/nellymoserenc.c b/libavcodec/nellymoserenc.c index fe1a886d7f..1cf0f14e19 100644 --- a/libavcodec/nellymoserenc.c +++ b/libavcodec/nellymoserenc.c @@ -40,7 +40,7 @@ #include "dsputil.h" #define BITSTREAM_WRITER_LE -#include "bitstream.h" +#include "put_bits.h" #define POW_TABLE_SIZE (1<<11) #define POW_TABLE_OFFSET 3 diff --git a/libavcodec/put_bits.h b/libavcodec/put_bits.h new file mode 100644 index 0000000000..3bddd44ac0 --- /dev/null +++ b/libavcodec/put_bits.h @@ -0,0 +1,311 @@ +/* + * copyright (c) 2004 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file libavcodec/put_bits.h + * bitstream writer API + */ + +#ifndef AVCODEC_PUT_BITS_H +#define AVCODEC_PUT_BITS_H + +#include +#include +#include +#include "libavutil/bswap.h" +#include "libavutil/common.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/log.h" +#include "mathops.h" + +//#define ALT_BITSTREAM_WRITER +//#define ALIGNED_BITSTREAM_WRITER + +/* buf and buf_end must be present and used by every alternative writer. */ +typedef struct PutBitContext { +#ifdef ALT_BITSTREAM_WRITER + uint8_t *buf, *buf_end; + int index; +#else + uint32_t bit_buf; + int bit_left; + uint8_t *buf, *buf_ptr, *buf_end; +#endif + int size_in_bits; +} PutBitContext; + +/** + * Initializes the PutBitContext \p s. + * + * @param buffer the buffer where to put bits + * @param buffer_size the size in bytes of \p buffer + */ +static inline void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size) +{ + if(buffer_size < 0) { + buffer_size = 0; + buffer = NULL; + } + + s->size_in_bits= 8*buffer_size; + s->buf = buffer; + s->buf_end = s->buf + buffer_size; +#ifdef ALT_BITSTREAM_WRITER + s->index=0; + ((uint32_t*)(s->buf))[0]=0; +// memset(buffer, 0, buffer_size); +#else + s->buf_ptr = s->buf; + s->bit_left=32; + s->bit_buf=0; +#endif +} + +/** + * Returns the total number of bits written to the bitstream. + */ +static inline int put_bits_count(PutBitContext *s) +{ +#ifdef ALT_BITSTREAM_WRITER + return s->index; +#else + return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left; +#endif +} + +/** + * Pads the end of the output stream with zeros. + */ +static inline void flush_put_bits(PutBitContext *s) +{ +#ifdef ALT_BITSTREAM_WRITER + align_put_bits(s); +#else +#ifndef BITSTREAM_WRITER_LE + s->bit_buf<<= s->bit_left; +#endif + while (s->bit_left < 32) { + /* XXX: should test end of buffer */ +#ifdef BITSTREAM_WRITER_LE + *s->buf_ptr++=s->bit_buf; + s->bit_buf>>=8; +#else + *s->buf_ptr++=s->bit_buf >> 24; + s->bit_buf<<=8; +#endif + s->bit_left+=8; + } + s->bit_left=32; + s->bit_buf=0; +#endif +} + +/** + * Pads the bitstream with zeros up to the next byte boundary. + */ +void align_put_bits(PutBitContext *s); + +/** + * Puts the string \p s in the bitstream. + * + * @param terminate_string 0-terminates the written string if value is 1 + */ +void ff_put_string(PutBitContext * pbc, const char *s, int terminate_string); + +/** + * Copies the content of \p src to the bitstream. + * + * @param length the number of bits of \p src to copy + */ +void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length); + +static inline void put_bits(PutBitContext *s, int n, unsigned int value) +#ifndef ALT_BITSTREAM_WRITER +{ + unsigned int bit_buf; + int bit_left; + + // printf("put_bits=%d %x\n", n, value); + assert(n == 32 || value < (1U << n)); + + bit_buf = s->bit_buf; + bit_left = s->bit_left; + + // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf); + /* XXX: optimize */ +#ifdef BITSTREAM_WRITER_LE + bit_buf |= value << (32 - bit_left); + if (n >= bit_left) { +#if !HAVE_FAST_UNALIGNED + if (3 & (intptr_t) s->buf_ptr) { + AV_WL32(s->buf_ptr, bit_buf); + } else +#endif + *(uint32_t *)s->buf_ptr = le2me_32(bit_buf); + s->buf_ptr+=4; + bit_buf = (bit_left==32)?0:value >> bit_left; + bit_left+=32; + } + bit_left-=n; +#else + if (n < bit_left) { + bit_buf = (bit_buf<> (n - bit_left); +#if !HAVE_FAST_UNALIGNED + if (3 & (intptr_t) s->buf_ptr) { + AV_WB32(s->buf_ptr, bit_buf); + } else +#endif + *(uint32_t *)s->buf_ptr = be2me_32(bit_buf); + //printf("bitbuf = %08x\n", bit_buf); + s->buf_ptr+=4; + bit_left+=32 - n; + bit_buf = value; + } +#endif + + s->bit_buf = bit_buf; + s->bit_left = bit_left; +} +#else /* ALT_BITSTREAM_WRITER defined */ +{ +# ifdef ALIGNED_BITSTREAM_WRITER +# if ARCH_X86 + __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" + ); +# else + int index= s->index; + uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5); + + 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); + index+= n; + s->index= index; +# endif +# else //ALIGNED_BITSTREAM_WRITER +# if ARCH_X86 + __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" + ); +# 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); + index+= n; + s->index= index; +# endif +# endif //!ALIGNED_BITSTREAM_WRITER +} +#endif + +static inline void put_sbits(PutBitContext *pb, int bits, int32_t val) +{ + assert(bits >= 0 && bits <= 31); + + put_bits(pb, bits, val & ((1<buf + (s->index>>3); +#else + return s->buf_ptr; +#endif +} + +/** + * Skips the given number of bytes. + * PutBitContext must be flushed & aligned to a byte boundary before calling this. + */ +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; +#else + assert(s->bit_left==32); + s->buf_ptr += n; +#endif +} + +/** + * Skips the given number of bits. + * Must only be used if the actual values in the bitstream do not matter. + * If \p n is 0 the behavior is undefined. + */ +static inline void skip_put_bits(PutBitContext *s, int n){ +#ifdef ALT_BITSTREAM_WRITER + s->index += n; +#else + s->bit_left -= n; + s->buf_ptr-= s->bit_left>>5; + s->bit_left &= 31; +#endif +} + +/** + * Changes the end of the buffer. + * + * @param size the new size in bytes of the buffer where to put bits + */ +static inline void set_put_bits_buffer_size(PutBitContext *s, int size){ + s->buf_end= s->buf + size; +} + +#endif /* AVCODEC_PUT_BITS_H */ diff --git a/libavcodec/vorbis_enc.c b/libavcodec/vorbis_enc.c index 8ab7de51ce..9c91859abe 100644 --- a/libavcodec/vorbis_enc.c +++ b/libavcodec/vorbis_enc.c @@ -31,7 +31,7 @@ #include "vorbis_enc_data.h" #define BITSTREAM_WRITER_LE -#include "bitstream.h" +#include "put_bits.h" #undef NDEBUG #include diff --git a/libavcodec/wma.h b/libavcodec/wma.h index fee7562033..869c54bf9a 100644 --- a/libavcodec/wma.h +++ b/libavcodec/wma.h @@ -23,6 +23,7 @@ #define AVCODEC_WMA_H #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" /* size of blocks */ diff --git a/libavformat/adtsenc.c b/libavformat/adtsenc.c index 70e252e2b6..857fe71407 100644 --- a/libavformat/adtsenc.c +++ b/libavformat/adtsenc.c @@ -21,6 +21,7 @@ */ #include "libavcodec/bitstream.h" +#include "libavcodec/put_bits.h" #include "libavcodec/internal.h" #include "avformat.h" diff --git a/libavformat/gif.c b/libavformat/gif.c index 0cda9748c3..7ac9499577 100644 --- a/libavformat/gif.c +++ b/libavformat/gif.c @@ -45,7 +45,7 @@ /* at least they don't use PDP_ENDIAN :) */ #define BITSTREAM_WRITER_LE -#include "libavcodec/bitstream.h" +#include "libavcodec/put_bits.h" /* bitstream minipacket size */ #define GIF_CHUNKS 100 diff --git a/libavformat/movenc.c b/libavformat/movenc.c index e4c5a6c0fc..8db5c4e4c6 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -27,6 +27,7 @@ #include "isom.h" #include "avc.h" #include "libavcodec/bitstream.h" +#include "libavcodec/put_bits.h" #undef NDEBUG #include diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c index 5b949feea1..11a2deb033 100644 --- a/libavformat/mpegenc.c +++ b/libavformat/mpegenc.c @@ -20,7 +20,7 @@ */ #include "libavutil/fifo.h" -#include "libavcodec/bitstream.h" +#include "libavcodec/put_bits.h" #include "avformat.h" #include "mpeg.h" diff --git a/libavformat/swfenc.c b/libavformat/swfenc.c index 8caf0d1007..a8556c85e4 100644 --- a/libavformat/swfenc.c +++ b/libavformat/swfenc.c @@ -20,7 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "libavcodec/bitstream.h" +#include "libavcodec/put_bits.h" #include "avformat.h" #include "swf.h"