You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	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
This commit is contained in:
		| @@ -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 { | ||||
|   | ||||
| @@ -20,6 +20,7 @@ | ||||
|  */ | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "bytestream.h" | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -21,6 +21,7 @@ | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "dsputil.h" | ||||
| #include "lpc.h" | ||||
| #include "mathops.h" | ||||
|   | ||||
| @@ -26,6 +26,7 @@ | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "dsputil.h" | ||||
| #include "mpeg12data.h" | ||||
|  | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
| @@ -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) | 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: | ||||
| name | ||||
|     arbitrary name which is used as prefix for the internal variables | ||||
|   | ||||
| @@ -27,7 +27,7 @@ | ||||
| #ifndef AVCODEC_CABAC_H | ||||
| #define AVCODEC_CABAC_H | ||||
|  | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
|  | ||||
| //#undef NDEBUG | ||||
| #include <assert.h> | ||||
|   | ||||
| @@ -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" | ||||
|   | ||||
| @@ -41,6 +41,7 @@ | ||||
| #include "avcodec.h" | ||||
| #include "dsputil.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "simple_idct.h" | ||||
| #include "dvdata.h" | ||||
|  | ||||
|   | ||||
| @@ -26,6 +26,7 @@ | ||||
|  */ | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "faxcompr.h" | ||||
|  | ||||
| #define CCITT_SYMS 104 | ||||
|   | ||||
| @@ -27,6 +27,7 @@ | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "dsputil.h" | ||||
| #include "rangecoder.h" | ||||
| #include "golomb.h" | ||||
|   | ||||
| @@ -59,7 +59,7 @@ | ||||
| #include <zlib.h> | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "bytestream.h" | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -24,6 +24,7 @@ | ||||
| #include <limits.h> | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
|  | ||||
| /** | ||||
|  * G.726 11bit float. | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -32,6 +32,7 @@ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
|  | ||||
| #define INVALID_VLC           0x80000000 | ||||
|  | ||||
|   | ||||
| @@ -30,6 +30,7 @@ | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "dsputil.h" | ||||
|  | ||||
| #define VLC_BITS 11 | ||||
|   | ||||
| @@ -42,7 +42,7 @@ | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "lcl.h" | ||||
|  | ||||
| #if CONFIG_ZLIB | ||||
|   | ||||
| @@ -26,7 +26,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "lzw.h" | ||||
|  | ||||
| #define LZW_MAXBITS 12 | ||||
|   | ||||
| @@ -34,7 +34,7 @@ | ||||
| #define AVCODEC_MJPEG_H | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
|  | ||||
|  | ||||
| /* JPEG marker codes */ | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
|  | ||||
| #undef  CONFIG_MPEGAUDIO_HP | ||||
| #define CONFIG_MPEGAUDIO_HP 0 | ||||
|   | ||||
| @@ -30,6 +30,7 @@ | ||||
|  | ||||
| #include "dsputil.h" | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "ratecontrol.h" | ||||
| #include "parser.h" | ||||
| #include "mpeg12data.h" | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
							
								
								
									
										311
									
								
								libavcodec/put_bits.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										311
									
								
								libavcodec/put_bits.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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" | ||||
|  | ||||
| #define BITSTREAM_WRITER_LE | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
|  | ||||
| #undef NDEBUG | ||||
| #include <assert.h> | ||||
|   | ||||
| @@ -23,6 +23,7 @@ | ||||
| #define AVCODEC_WMA_H | ||||
|  | ||||
| #include "bitstream.h" | ||||
| #include "put_bits.h" | ||||
| #include "dsputil.h" | ||||
|  | ||||
| /* size of blocks */ | ||||
|   | ||||
| @@ -21,6 +21,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include "libavcodec/bitstream.h" | ||||
| #include "libavcodec/put_bits.h" | ||||
| #include "libavcodec/internal.h" | ||||
| #include "avformat.h" | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -27,6 +27,7 @@ | ||||
| #include "isom.h" | ||||
| #include "avc.h" | ||||
| #include "libavcodec/bitstream.h" | ||||
| #include "libavcodec/put_bits.h" | ||||
|  | ||||
| #undef NDEBUG | ||||
| #include <assert.h> | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include "libavutil/fifo.h" | ||||
| #include "libavcodec/bitstream.h" | ||||
| #include "libavcodec/put_bits.h" | ||||
| #include "avformat.h" | ||||
| #include "mpeg.h" | ||||
|  | ||||
|   | ||||
| @@ -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" | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user