# HG changeset patch # User stefano # Date 1239525326 0 # Node ID 4cb7c65fc77501415f7aceead585dd866adb00b9 # Parent f7bd7e90ef9fb808e98e52948310201bb17c462c Split bitstream.h, put the bitstream writer stuff in the new file put_bits.h. diff -r f7bd7e90ef9f -r 4cb7c65fc775 ac3enc.c --- a/ac3enc.c Sun Apr 12 03:26:20 2009 +0000 +++ b/ac3enc.c Sun Apr 12 08:35:26 2009 +0000 @@ -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 -r f7bd7e90ef9f -r 4cb7c65fc775 adpcm.c --- a/adpcm.c Sun Apr 12 03:26:20 2009 +0000 +++ b/adpcm.c Sun Apr 12 08:35:26 2009 +0000 @@ -20,6 +20,7 @@ */ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "bytestream.h" /** diff -r f7bd7e90ef9f -r 4cb7c65fc775 alacenc.c --- a/alacenc.c Sun Apr 12 03:26:20 2009 +0000 +++ b/alacenc.c Sun Apr 12 08:35:26 2009 +0000 @@ -21,6 +21,7 @@ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" #include "lpc.h" #include "mathops.h" diff -r f7bd7e90ef9f -r 4cb7c65fc775 asv1.c --- a/asv1.c Sun Apr 12 03:26:20 2009 +0000 +++ b/asv1.c Sun Apr 12 08:35:26 2009 +0000 @@ -26,6 +26,7 @@ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" #include "mpeg12data.h" diff -r f7bd7e90ef9f -r 4cb7c65fc775 bitstream.c --- a/bitstream.c Sun Apr 12 03:26:20 2009 +0000 +++ b/bitstream.c Sun Apr 12 08:35:26 2009 +0000 @@ -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 -r f7bd7e90ef9f -r 4cb7c65fc775 bitstream.h --- a/bitstream.h Sun Apr 12 03:26:20 2009 +0000 +++ b/bitstream.h Sun Apr 12 08:35:26 2009 +0000 @@ -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 @@ # 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 @@ 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 -r f7bd7e90ef9f -r 4cb7c65fc775 cabac.h --- a/cabac.h Sun Apr 12 03:26:20 2009 +0000 +++ b/cabac.h Sun Apr 12 08:35:26 2009 +0000 @@ -27,7 +27,7 @@ #ifndef AVCODEC_CABAC_H #define AVCODEC_CABAC_H -#include "bitstream.h" +#include "put_bits.h" //#undef NDEBUG #include diff -r f7bd7e90ef9f -r 4cb7c65fc775 dca.c --- a/dca.c Sun Apr 12 03:26:20 2009 +0000 +++ b/dca.c Sun Apr 12 08:35:26 2009 +0000 @@ -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 -r f7bd7e90ef9f -r 4cb7c65fc775 dv.c --- a/dv.c Sun Apr 12 03:26:20 2009 +0000 +++ b/dv.c Sun Apr 12 08:35:26 2009 +0000 @@ -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 -r f7bd7e90ef9f -r 4cb7c65fc775 faxcompr.c --- a/faxcompr.c Sun Apr 12 03:26:20 2009 +0000 +++ b/faxcompr.c Sun Apr 12 08:35:26 2009 +0000 @@ -26,6 +26,7 @@ */ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "faxcompr.h" #define CCITT_SYMS 104 diff -r f7bd7e90ef9f -r 4cb7c65fc775 ffv1.c --- a/ffv1.c Sun Apr 12 03:26:20 2009 +0000 +++ b/ffv1.c Sun Apr 12 08:35:26 2009 +0000 @@ -27,6 +27,7 @@ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" #include "rangecoder.h" #include "golomb.h" diff -r f7bd7e90ef9f -r 4cb7c65fc775 flashsvenc.c --- a/flashsvenc.c Sun Apr 12 03:26:20 2009 +0000 +++ b/flashsvenc.c Sun Apr 12 08:35:26 2009 +0000 @@ -59,7 +59,7 @@ #include #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" #include "bytestream.h" diff -r f7bd7e90ef9f -r 4cb7c65fc775 g726.c --- a/g726.c Sun Apr 12 03:26:20 2009 +0000 +++ b/g726.c Sun Apr 12 08:35:26 2009 +0000 @@ -24,6 +24,7 @@ #include #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" /** * G.726 11bit float. diff -r f7bd7e90ef9f -r 4cb7c65fc775 gif.c --- a/gif.c Sun Apr 12 03:26:20 2009 +0000 +++ b/gif.c Sun Apr 12 08:35:26 2009 +0000 @@ -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 -r f7bd7e90ef9f -r 4cb7c65fc775 golomb.h --- a/golomb.h Sun Apr 12 03:26:20 2009 +0000 +++ b/golomb.h Sun Apr 12 08:35:26 2009 +0000 @@ -32,6 +32,7 @@ #include #include "bitstream.h" +#include "put_bits.h" #define INVALID_VLC 0x80000000 diff -r f7bd7e90ef9f -r 4cb7c65fc775 huffyuv.c --- a/huffyuv.c Sun Apr 12 03:26:20 2009 +0000 +++ b/huffyuv.c Sun Apr 12 08:35:26 2009 +0000 @@ -30,6 +30,7 @@ #include "avcodec.h" #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" #define VLC_BITS 11 diff -r f7bd7e90ef9f -r 4cb7c65fc775 lclenc.c --- a/lclenc.c Sun Apr 12 03:26:20 2009 +0000 +++ b/lclenc.c Sun Apr 12 08:35:26 2009 +0000 @@ -42,7 +42,7 @@ #include #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" #include "lcl.h" #if CONFIG_ZLIB diff -r f7bd7e90ef9f -r 4cb7c65fc775 lzwenc.c --- a/lzwenc.c Sun Apr 12 03:26:20 2009 +0000 +++ b/lzwenc.c Sun Apr 12 08:35:26 2009 +0000 @@ -26,7 +26,7 @@ */ #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" #include "lzw.h" #define LZW_MAXBITS 12 diff -r f7bd7e90ef9f -r 4cb7c65fc775 mjpeg.h --- a/mjpeg.h Sun Apr 12 03:26:20 2009 +0000 +++ b/mjpeg.h Sun Apr 12 08:35:26 2009 +0000 @@ -34,7 +34,7 @@ #define AVCODEC_MJPEG_H #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" /* JPEG marker codes */ diff -r f7bd7e90ef9f -r 4cb7c65fc775 mpegaudioenc.c --- a/mpegaudioenc.c Sun Apr 12 03:26:20 2009 +0000 +++ b/mpegaudioenc.c Sun Apr 12 08:35:26 2009 +0000 @@ -25,7 +25,7 @@ */ #include "avcodec.h" -#include "bitstream.h" +#include "put_bits.h" #undef CONFIG_MPEGAUDIO_HP #define CONFIG_MPEGAUDIO_HP 0 diff -r f7bd7e90ef9f -r 4cb7c65fc775 mpegvideo.h --- a/mpegvideo.h Sun Apr 12 03:26:20 2009 +0000 +++ b/mpegvideo.h Sun Apr 12 08:35:26 2009 +0000 @@ -30,6 +30,7 @@ #include "dsputil.h" #include "bitstream.h" +#include "put_bits.h" #include "ratecontrol.h" #include "parser.h" #include "mpeg12data.h" diff -r f7bd7e90ef9f -r 4cb7c65fc775 nellymoserenc.c --- a/nellymoserenc.c Sun Apr 12 03:26:20 2009 +0000 +++ b/nellymoserenc.c Sun Apr 12 08:35:26 2009 +0000 @@ -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 -r f7bd7e90ef9f -r 4cb7c65fc775 put_bits.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/put_bits.h Sun Apr 12 08:35:26 2009 +0000 @@ -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 -r f7bd7e90ef9f -r 4cb7c65fc775 vorbis_enc.c --- a/vorbis_enc.c Sun Apr 12 03:26:20 2009 +0000 +++ b/vorbis_enc.c Sun Apr 12 08:35:26 2009 +0000 @@ -31,7 +31,7 @@ #include "vorbis_enc_data.h" #define BITSTREAM_WRITER_LE -#include "bitstream.h" +#include "put_bits.h" #undef NDEBUG #include diff -r f7bd7e90ef9f -r 4cb7c65fc775 wma.h --- a/wma.h Sun Apr 12 03:26:20 2009 +0000 +++ b/wma.h Sun Apr 12 08:35:26 2009 +0000 @@ -23,6 +23,7 @@ #define AVCODEC_WMA_H #include "bitstream.h" +#include "put_bits.h" #include "dsputil.h" /* size of blocks */