put_bits.h. Originally committed as revision 18461 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
| @@ -27,7 +27,8 @@ | |||||
| //#define DEBUG_BITALLOC | //#define DEBUG_BITALLOC | ||||
| #include "libavutil/crc.h" | #include "libavutil/crc.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | |||||
| #include "bitstream.h" // for ff_reverse | |||||
| #include "put_bits.h" | |||||
| #include "ac3.h" | #include "ac3.h" | ||||
| typedef struct AC3EncodeContext { | typedef struct AC3EncodeContext { | ||||
| @@ -20,6 +20,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| /** | /** | ||||
| @@ -21,6 +21,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "lpc.h" | #include "lpc.h" | ||||
| #include "mathops.h" | #include "mathops.h" | ||||
| @@ -26,6 +26,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "mpeg12data.h" | #include "mpeg12data.h" | ||||
| @@ -29,6 +29,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| const uint8_t ff_log2_run[32]={ | const uint8_t ff_log2_run[32]={ | ||||
| 0, 0, 0, 0, 1, 1, 1, 1, | 0, 0, 0, 0, 1, 1, 1, 1, | ||||
| @@ -39,8 +39,6 @@ | |||||
| # define ALT_BITSTREAM_READER | # define ALT_BITSTREAM_READER | ||||
| #endif | #endif | ||||
| //#define ALT_BITSTREAM_WRITER | |||||
| //#define ALIGNED_BITSTREAM_WRITER | |||||
| #if !defined(LIBMPEG2_BITSTREAM_READER) && !defined(A32_BITSTREAM_READER) && !defined(ALT_BITSTREAM_READER) | #if !defined(LIBMPEG2_BITSTREAM_READER) && !defined(A32_BITSTREAM_READER) && !defined(ALT_BITSTREAM_READER) | ||||
| # if ARCH_ARM | # if ARCH_ARM | ||||
| # define A32_BITSTREAM_READER | # 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))) | # define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s))) | ||||
| #endif | #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 */ | /* bit input */ | ||||
| /* buffer, buffer_end and size_in_bits must be present and used by every reader */ | /* buffer, buffer_end and size_in_bits must be present and used by every reader */ | ||||
| typedef struct GetBitContext { | typedef struct GetBitContext { | ||||
| @@ -207,178 +105,6 @@ typedef struct RL_VLC_ELEM { | |||||
| uint8_t run; | uint8_t run; | ||||
| } RL_VLC_ELEM; | } 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) | value; | |||||
| bit_left-=n; | |||||
| } else { | |||||
| bit_buf<<=bit_left; | |||||
| bit_buf |= value >> (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<<bits)-1)); | |||||
| } | |||||
| static inline uint8_t* pbBufPtr(PutBitContext *s) | |||||
| { | |||||
| #ifdef ALT_BITSTREAM_WRITER | |||||
| return s->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: | /* Bitstream reader API docs: | ||||
| name | name | ||||
| arbitrary name which is used as prefix for the internal variables | arbitrary name which is used as prefix for the internal variables | ||||
| @@ -27,7 +27,7 @@ | |||||
| #ifndef AVCODEC_CABAC_H | #ifndef AVCODEC_CABAC_H | ||||
| #define AVCODEC_CABAC_H | #define AVCODEC_CABAC_H | ||||
| #include "bitstream.h" | |||||
| #include "put_bits.h" | |||||
| //#undef NDEBUG | //#undef NDEBUG | ||||
| #include <assert.h> | #include <assert.h> | ||||
| @@ -33,6 +33,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "dcadata.h" | #include "dcadata.h" | ||||
| #include "dcahuff.h" | #include "dcahuff.h" | ||||
| #include "dca.h" | #include "dca.h" | ||||
| @@ -41,6 +41,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "simple_idct.h" | #include "simple_idct.h" | ||||
| #include "dvdata.h" | #include "dvdata.h" | ||||
| @@ -26,6 +26,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "faxcompr.h" | #include "faxcompr.h" | ||||
| #define CCITT_SYMS 104 | #define CCITT_SYMS 104 | ||||
| @@ -27,6 +27,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "rangecoder.h" | #include "rangecoder.h" | ||||
| #include "golomb.h" | #include "golomb.h" | ||||
| @@ -59,7 +59,7 @@ | |||||
| #include <zlib.h> | #include <zlib.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | |||||
| #include "put_bits.h" | |||||
| #include "bytestream.h" | #include "bytestream.h" | ||||
| @@ -24,6 +24,7 @@ | |||||
| #include <limits.h> | #include <limits.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| /** | /** | ||||
| * G.726 11bit float. | * G.726 11bit float. | ||||
| @@ -48,7 +48,7 @@ | |||||
| /* at least they don't use PDP_ENDIAN :) */ | /* at least they don't use PDP_ENDIAN :) */ | ||||
| #define BITSTREAM_WRITER_LE | #define BITSTREAM_WRITER_LE | ||||
| #include "bitstream.h" | |||||
| #include "put_bits.h" | |||||
| /* bitstream minipacket size */ | /* bitstream minipacket size */ | ||||
| #define GIF_CHUNKS 100 | #define GIF_CHUNKS 100 | ||||
| @@ -32,6 +32,7 @@ | |||||
| #include <stdint.h> | #include <stdint.h> | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #define INVALID_VLC 0x80000000 | #define INVALID_VLC 0x80000000 | ||||
| @@ -30,6 +30,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #define VLC_BITS 11 | #define VLC_BITS 11 | ||||
| @@ -42,7 +42,7 @@ | |||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | |||||
| #include "put_bits.h" | |||||
| #include "lcl.h" | #include "lcl.h" | ||||
| #if CONFIG_ZLIB | #if CONFIG_ZLIB | ||||
| @@ -26,7 +26,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | |||||
| #include "put_bits.h" | |||||
| #include "lzw.h" | #include "lzw.h" | ||||
| #define LZW_MAXBITS 12 | #define LZW_MAXBITS 12 | ||||
| @@ -34,7 +34,7 @@ | |||||
| #define AVCODEC_MJPEG_H | #define AVCODEC_MJPEG_H | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | |||||
| #include "put_bits.h" | |||||
| /* JPEG marker codes */ | /* JPEG marker codes */ | ||||
| @@ -25,7 +25,7 @@ | |||||
| */ | */ | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bitstream.h" | |||||
| #include "put_bits.h" | |||||
| #undef CONFIG_MPEGAUDIO_HP | #undef CONFIG_MPEGAUDIO_HP | ||||
| #define CONFIG_MPEGAUDIO_HP 0 | #define CONFIG_MPEGAUDIO_HP 0 | ||||
| @@ -30,6 +30,7 @@ | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "ratecontrol.h" | #include "ratecontrol.h" | ||||
| #include "parser.h" | #include "parser.h" | ||||
| #include "mpeg12data.h" | #include "mpeg12data.h" | ||||
| @@ -40,7 +40,7 @@ | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #define BITSTREAM_WRITER_LE | #define BITSTREAM_WRITER_LE | ||||
| #include "bitstream.h" | |||||
| #include "put_bits.h" | |||||
| #define POW_TABLE_SIZE (1<<11) | #define POW_TABLE_SIZE (1<<11) | ||||
| #define POW_TABLE_OFFSET 3 | #define POW_TABLE_OFFSET 3 | ||||
| @@ -0,0 +1,311 @@ | |||||
| /* | |||||
| * copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at> | |||||
| * | |||||
| * 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 <stdint.h> | |||||
| #include <stdlib.h> | |||||
| #include <assert.h> | |||||
| #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) | value; | |||||
| bit_left-=n; | |||||
| } else { | |||||
| bit_buf<<=bit_left; | |||||
| bit_buf |= value >> (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<<bits)-1)); | |||||
| } | |||||
| static inline uint8_t* pbBufPtr(PutBitContext *s) | |||||
| { | |||||
| #ifdef ALT_BITSTREAM_WRITER | |||||
| return s->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 */ | |||||
| @@ -31,7 +31,7 @@ | |||||
| #include "vorbis_enc_data.h" | #include "vorbis_enc_data.h" | ||||
| #define BITSTREAM_WRITER_LE | #define BITSTREAM_WRITER_LE | ||||
| #include "bitstream.h" | |||||
| #include "put_bits.h" | |||||
| #undef NDEBUG | #undef NDEBUG | ||||
| #include <assert.h> | #include <assert.h> | ||||
| @@ -23,6 +23,7 @@ | |||||
| #define AVCODEC_WMA_H | #define AVCODEC_WMA_H | ||||
| #include "bitstream.h" | #include "bitstream.h" | ||||
| #include "put_bits.h" | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| /* size of blocks */ | /* size of blocks */ | ||||
| @@ -21,6 +21,7 @@ | |||||
| */ | */ | ||||
| #include "libavcodec/bitstream.h" | #include "libavcodec/bitstream.h" | ||||
| #include "libavcodec/put_bits.h" | |||||
| #include "libavcodec/internal.h" | #include "libavcodec/internal.h" | ||||
| #include "avformat.h" | #include "avformat.h" | ||||
| @@ -45,7 +45,7 @@ | |||||
| /* at least they don't use PDP_ENDIAN :) */ | /* at least they don't use PDP_ENDIAN :) */ | ||||
| #define BITSTREAM_WRITER_LE | #define BITSTREAM_WRITER_LE | ||||
| #include "libavcodec/bitstream.h" | |||||
| #include "libavcodec/put_bits.h" | |||||
| /* bitstream minipacket size */ | /* bitstream minipacket size */ | ||||
| #define GIF_CHUNKS 100 | #define GIF_CHUNKS 100 | ||||
| @@ -27,6 +27,7 @@ | |||||
| #include "isom.h" | #include "isom.h" | ||||
| #include "avc.h" | #include "avc.h" | ||||
| #include "libavcodec/bitstream.h" | #include "libavcodec/bitstream.h" | ||||
| #include "libavcodec/put_bits.h" | |||||
| #undef NDEBUG | #undef NDEBUG | ||||
| #include <assert.h> | #include <assert.h> | ||||
| @@ -20,7 +20,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/fifo.h" | #include "libavutil/fifo.h" | ||||
| #include "libavcodec/bitstream.h" | |||||
| #include "libavcodec/put_bits.h" | |||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "mpeg.h" | #include "mpeg.h" | ||||
| @@ -20,7 +20,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * 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 "avformat.h" | ||||
| #include "swf.h" | #include "swf.h" | ||||