Mercurial > libavcodec.hg
comparison common.c @ 238:99a9f903f0e3 libavcodec
optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
author | michaelni |
---|---|
date | Fri, 15 Feb 2002 00:14:01 +0000 |
parents | 5fc0c3af3fe4 |
children | 28c5c62b1c4c |
comparison
equal
deleted
inserted
replaced
237:75123d30f862 | 238:99a9f903f0e3 |
---|---|
27 void (*write_data)(void *, UINT8 *, int)) | 27 void (*write_data)(void *, UINT8 *, int)) |
28 { | 28 { |
29 s->buf = buffer; | 29 s->buf = buffer; |
30 s->buf_end = s->buf + buffer_size; | 30 s->buf_end = s->buf + buffer_size; |
31 s->data_out_size = 0; | 31 s->data_out_size = 0; |
32 if(write_data!=NULL) | |
33 { | |
34 fprintf(stderr, "write Data callback is not supported\n"); | |
35 } | |
32 #ifdef ALT_BITSTREAM_WRITER | 36 #ifdef ALT_BITSTREAM_WRITER |
33 s->index=0; | 37 s->index=0; |
34 ((uint32_t*)(s->buf))[0]=0; | 38 ((uint32_t*)(s->buf))[0]=0; |
35 // memset(buffer, 0, buffer_size); | 39 // memset(buffer, 0, buffer_size); |
36 if(write_data!=NULL) | 40 #else |
37 { | |
38 fprintf(stderr, "write Data callback is not supported\n"); | |
39 } | |
40 #else | |
41 s->write_data = write_data; | |
42 s->opaque = opaque; | |
43 s->buf_ptr = s->buf; | 41 s->buf_ptr = s->buf; |
44 s->bit_cnt=0; | 42 s->bit_left=32; |
45 s->bit_buf=0; | 43 s->bit_buf=0; |
46 #endif | 44 #endif |
47 } | 45 } |
48 | |
49 #ifndef ALT_BITSTREAM_WRITER | |
50 static void flush_buffer(PutBitContext *s) | |
51 { | |
52 int size; | |
53 if (s->write_data) { | |
54 size = s->buf_ptr - s->buf; | |
55 if (size > 0) | |
56 s->write_data(s->opaque, s->buf, size); | |
57 s->buf_ptr = s->buf; | |
58 s->data_out_size += size; | |
59 } | |
60 } | |
61 | |
62 void put_bits(PutBitContext *s, int n, unsigned int value) | |
63 { | |
64 unsigned int bit_buf; | |
65 int bit_cnt; | |
66 | |
67 #ifdef STATS | |
68 st_out_bit_counts[st_current_index] += n; | |
69 #endif | |
70 // printf("put_bits=%d %x\n", n, value); | |
71 assert(n == 32 || value < (1U << n)); | |
72 | |
73 bit_buf = s->bit_buf; | |
74 bit_cnt = s->bit_cnt; | |
75 | |
76 // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf); | |
77 /* XXX: optimize */ | |
78 if (n < (32-bit_cnt)) { | |
79 bit_buf |= value << (32 - n - bit_cnt); | |
80 bit_cnt+=n; | |
81 } else { | |
82 bit_buf |= value >> (n + bit_cnt - 32); | |
83 *(UINT32 *)s->buf_ptr = be2me_32(bit_buf); | |
84 //printf("bitbuf = %08x\n", bit_buf); | |
85 s->buf_ptr+=4; | |
86 if (s->buf_ptr >= s->buf_end) | |
87 flush_buffer(s); | |
88 bit_cnt=bit_cnt + n - 32; | |
89 if (bit_cnt == 0) { | |
90 bit_buf = 0; | |
91 } else { | |
92 bit_buf = value << (32 - bit_cnt); | |
93 } | |
94 } | |
95 | |
96 s->bit_buf = bit_buf; | |
97 s->bit_cnt = bit_cnt; | |
98 } | |
99 #endif | |
100 | 46 |
101 /* return the number of bits output */ | 47 /* return the number of bits output */ |
102 INT64 get_bit_count(PutBitContext *s) | 48 INT64 get_bit_count(PutBitContext *s) |
103 { | 49 { |
104 #ifdef ALT_BITSTREAM_WRITER | 50 #ifdef ALT_BITSTREAM_WRITER |
105 return s->data_out_size * 8 + s->index; | 51 return s->data_out_size * 8 + s->index; |
106 #else | 52 #else |
107 return (s->buf_ptr - s->buf + s->data_out_size) * 8 + (INT64)s->bit_cnt; | 53 return (s->buf_ptr - s->buf + s->data_out_size) * 8 + 32 - (INT64)s->bit_left; |
108 #endif | 54 #endif |
109 } | 55 } |
110 | 56 |
111 void align_put_bits(PutBitContext *s) | 57 void align_put_bits(PutBitContext *s) |
112 { | 58 { |
113 #ifdef ALT_BITSTREAM_WRITER | 59 #ifdef ALT_BITSTREAM_WRITER |
114 put_bits(s,( - s->index) & 7,0); | 60 put_bits(s,( - s->index) & 7,0); |
115 #else | 61 #else |
116 put_bits(s,(8 - s->bit_cnt) & 7,0); | 62 put_bits(s,s->bit_left & 7,0); |
117 #endif | 63 #endif |
118 } | 64 } |
119 | 65 |
120 /* pad the end of the output stream with zeros */ | 66 /* pad the end of the output stream with zeros */ |
121 void flush_put_bits(PutBitContext *s) | 67 void flush_put_bits(PutBitContext *s) |
122 { | 68 { |
123 #ifdef ALT_BITSTREAM_WRITER | 69 #ifdef ALT_BITSTREAM_WRITER |
124 align_put_bits(s); | 70 align_put_bits(s); |
125 #else | 71 #else |
126 while (s->bit_cnt > 0) { | 72 s->bit_buf<<= s->bit_left; |
73 while (s->bit_left < 32) { | |
127 /* XXX: should test end of buffer */ | 74 /* XXX: should test end of buffer */ |
128 *s->buf_ptr++=s->bit_buf >> 24; | 75 *s->buf_ptr++=s->bit_buf >> 24; |
129 s->bit_buf<<=8; | 76 s->bit_buf<<=8; |
130 s->bit_cnt-=8; | 77 s->bit_left+=8; |
131 } | 78 } |
132 flush_buffer(s); | 79 s->bit_left=32; |
133 s->bit_cnt=0; | |
134 s->bit_buf=0; | 80 s->bit_buf=0; |
135 #endif | 81 #endif |
136 } | 82 } |
137 | |
138 #ifndef ALT_BITSTREAM_WRITER | |
139 /* for jpeg : escape 0xff with 0x00 after it */ | |
140 void jput_bits(PutBitContext *s, int n, unsigned int value) | |
141 { | |
142 unsigned int bit_buf, b; | |
143 int bit_cnt, i; | |
144 | |
145 assert(n == 32 || value < (1U << n)); | |
146 | |
147 bit_buf = s->bit_buf; | |
148 bit_cnt = s->bit_cnt; | |
149 | |
150 //printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf); | |
151 /* XXX: optimize */ | |
152 if (n < (32-bit_cnt)) { | |
153 bit_buf |= value << (32 - n - bit_cnt); | |
154 bit_cnt+=n; | |
155 } else { | |
156 bit_buf |= value >> (n + bit_cnt - 32); | |
157 /* handle escape */ | |
158 for(i=0;i<4;i++) { | |
159 b = (bit_buf >> 24); | |
160 *(s->buf_ptr++) = b; | |
161 if (b == 0xff) | |
162 *(s->buf_ptr++) = 0; | |
163 bit_buf <<= 8; | |
164 } | |
165 /* we flush the buffer sooner to handle worst case */ | |
166 if (s->buf_ptr >= (s->buf_end - 8)) | |
167 flush_buffer(s); | |
168 | |
169 bit_cnt=bit_cnt + n - 32; | |
170 if (bit_cnt == 0) { | |
171 bit_buf = 0; | |
172 } else { | |
173 bit_buf = value << (32 - bit_cnt); | |
174 } | |
175 } | |
176 | |
177 s->bit_buf = bit_buf; | |
178 s->bit_cnt = bit_cnt; | |
179 } | |
180 #endif | |
181 | 83 |
182 /* pad the end of the output stream with zeros */ | 84 /* pad the end of the output stream with zeros */ |
183 #ifndef ALT_BITSTREAM_WRITER | 85 #ifndef ALT_BITSTREAM_WRITER |
184 void jflush_put_bits(PutBitContext *s) | 86 void jflush_put_bits(PutBitContext *s) |
185 { | 87 { |
186 unsigned int b; | 88 unsigned int b; |
187 s->bit_buf |= ~1U >> s->bit_cnt; /* set all the unused bits to one */ | 89 s->bit_buf<<= s->bit_left; |
188 | 90 s->bit_buf |= ~1U >> (32 - s->bit_left); /* set all the unused bits to one */ |
189 while (s->bit_cnt > 0) { | 91 |
92 while (s->bit_left < 32) { | |
190 b = s->bit_buf >> 24; | 93 b = s->bit_buf >> 24; |
191 *s->buf_ptr++ = b; | 94 *s->buf_ptr++ = b; |
192 if (b == 0xff) | 95 if (b == 0xff) |
193 *s->buf_ptr++ = 0; | 96 *s->buf_ptr++ = 0; |
194 s->bit_buf<<=8; | 97 s->bit_buf<<=8; |
195 s->bit_cnt-=8; | 98 s->bit_left+=8; |
196 } | 99 } |
197 flush_buffer(s); | 100 s->bit_left=32; |
198 s->bit_cnt=0; | |
199 s->bit_buf=0; | 101 s->bit_buf=0; |
200 } | 102 } |
201 #else | 103 #else |
202 void jflush_put_bits(PutBitContext *s) | 104 void jflush_put_bits(PutBitContext *s) |
203 { | 105 { |