Mercurial > libavcodec.hg
comparison common.c @ 1875:45a1592dadca libavcodec
* moving some of the commonly used bit reading/writing functions
from common.c -> common.h so that they can be inlined.
+ performace gain ~1% (measured with DV decoding)
+ code bloat 0.05%
Looks like a win-win solution.
| author | romansh |
|---|---|
| date | Fri, 12 Mar 2004 23:39:38 +0000 |
| parents | 920e6381e1fe |
| children | 7b345b735ac7 |
comparison
equal
deleted
inserted
replaced
| 1874:fab737b59790 | 1875:45a1592dadca |
|---|---|
| 43 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | 43 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
| 44 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | 44 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
| 45 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 | 45 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 |
| 46 }; | 46 }; |
| 47 | 47 |
| 48 void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size) | |
| 49 { | |
| 50 s->buf = buffer; | |
| 51 s->buf_end = s->buf + buffer_size; | |
| 52 #ifdef ALT_BITSTREAM_WRITER | |
| 53 s->index=0; | |
| 54 ((uint32_t*)(s->buf))[0]=0; | |
| 55 // memset(buffer, 0, buffer_size); | |
| 56 #else | |
| 57 s->buf_ptr = s->buf; | |
| 58 s->bit_left=32; | |
| 59 s->bit_buf=0; | |
| 60 #endif | |
| 61 } | |
| 62 | |
| 63 //#ifdef CONFIG_ENCODERS | |
| 64 #if 1 | |
| 65 | |
| 66 /* return the number of bits output */ | |
| 67 int put_bits_count(PutBitContext *s) | |
| 68 { | |
| 69 #ifdef ALT_BITSTREAM_WRITER | |
| 70 return s->index; | |
| 71 #else | |
| 72 return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left; | |
| 73 #endif | |
| 74 } | |
| 75 | |
| 76 void align_put_bits(PutBitContext *s) | 48 void align_put_bits(PutBitContext *s) |
| 77 { | 49 { |
| 78 #ifdef ALT_BITSTREAM_WRITER | 50 #ifdef ALT_BITSTREAM_WRITER |
| 79 put_bits(s,( - s->index) & 7,0); | 51 put_bits(s,( - s->index) & 7,0); |
| 80 #else | 52 #else |
| 81 put_bits(s,s->bit_left & 7,0); | 53 put_bits(s,s->bit_left & 7,0); |
| 82 #endif | 54 #endif |
| 83 } | 55 } |
| 84 | 56 |
| 85 #endif //CONFIG_ENCODERS | |
| 86 | |
| 87 /* pad the end of the output stream with zeros */ | |
| 88 void flush_put_bits(PutBitContext *s) | |
| 89 { | |
| 90 #ifdef ALT_BITSTREAM_WRITER | |
| 91 align_put_bits(s); | |
| 92 #else | |
| 93 s->bit_buf<<= s->bit_left; | |
| 94 while (s->bit_left < 32) { | |
| 95 /* XXX: should test end of buffer */ | |
| 96 *s->buf_ptr++=s->bit_buf >> 24; | |
| 97 s->bit_buf<<=8; | |
| 98 s->bit_left+=8; | |
| 99 } | |
| 100 s->bit_left=32; | |
| 101 s->bit_buf=0; | |
| 102 #endif | |
| 103 } | |
| 104 | |
| 105 #ifdef CONFIG_ENCODERS | |
| 106 | |
| 107 void put_string(PutBitContext * pbc, char *s, int put_zero) | 57 void put_string(PutBitContext * pbc, char *s, int put_zero) |
| 108 { | 58 { |
| 109 while(*s){ | 59 while(*s){ |
| 110 put_bits(pbc, 8, *s); | 60 put_bits(pbc, 8, *s); |
| 111 s++; | 61 s++; |
| 113 if(put_zero) | 63 if(put_zero) |
| 114 put_bits(pbc, 8, 0); | 64 put_bits(pbc, 8, 0); |
| 115 } | 65 } |
| 116 | 66 |
| 117 /* bit input functions */ | 67 /* bit input functions */ |
| 118 | |
| 119 #endif //CONFIG_ENCODERS | |
| 120 | |
| 121 /** | |
| 122 * init GetBitContext. | |
| 123 * @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger then the actual read bits | |
| 124 * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end | |
| 125 * @param bit_size the size of the buffer in bits | |
| 126 */ | |
| 127 void init_get_bits(GetBitContext *s, | |
| 128 const uint8_t *buffer, int bit_size) | |
| 129 { | |
| 130 const int buffer_size= (bit_size+7)>>3; | |
| 131 | |
| 132 s->buffer= buffer; | |
| 133 s->size_in_bits= bit_size; | |
| 134 s->buffer_end= buffer + buffer_size; | |
| 135 #ifdef ALT_BITSTREAM_READER | |
| 136 s->index=0; | |
| 137 #elif defined LIBMPEG2_BITSTREAM_READER | |
| 138 #ifdef LIBMPEG2_BITSTREAM_READER_HACK | |
| 139 if ((int)buffer&1) { | |
| 140 /* word alignment */ | |
| 141 s->cache = (*buffer++)<<24; | |
| 142 s->buffer_ptr = buffer; | |
| 143 s->bit_count = 16-8; | |
| 144 } else | |
| 145 #endif | |
| 146 { | |
| 147 s->buffer_ptr = buffer; | |
| 148 s->bit_count = 16; | |
| 149 s->cache = 0; | |
| 150 } | |
| 151 #elif defined A32_BITSTREAM_READER | |
| 152 s->buffer_ptr = (uint32_t*)buffer; | |
| 153 s->bit_count = 32; | |
| 154 s->cache0 = 0; | |
| 155 s->cache1 = 0; | |
| 156 #endif | |
| 157 { | |
| 158 OPEN_READER(re, s) | |
| 159 UPDATE_CACHE(re, s) | |
| 160 UPDATE_CACHE(re, s) | |
| 161 CLOSE_READER(re, s) | |
| 162 } | |
| 163 #ifdef A32_BITSTREAM_READER | |
| 164 s->cache1 = 0; | |
| 165 #endif | |
| 166 } | |
| 167 | 68 |
| 168 /** | 69 /** |
| 169 * reads 0-32 bits. | 70 * reads 0-32 bits. |
| 170 */ | 71 */ |
| 171 unsigned int get_bits_long(GetBitContext *s, int n){ | 72 unsigned int get_bits_long(GetBitContext *s, int n){ |
