comparison flacenc.c @ 3354:ba80e4de976b libavcodec

simplify & optimize things a little
author michael
date Sat, 24 Jun 2006 13:56:29 +0000
parents 5b901881d6ed
children 649ebe86d779
comparison
equal deleted inserted replaced
3353:5b901881d6ed 3354:ba80e4de976b
80 576, 1152, 2304, 4608, 80 576, 1152, 2304, 4608,
81 0, 0, 81 0, 0,
82 256, 512, 1024, 2048, 4096, 8192, 16384, 32768 82 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
83 }; 83 };
84 84
85 static const int flac_blocksizes_ordered[14] = {
86 0, 192, 256, 512, 576, 1024, 1152, 2048, 2304, 4096, 4608, 8192, 16384, 32768
87 };
88
89 /** 85 /**
90 * Writes streaminfo metadata block to byte array 86 * Writes streaminfo metadata block to byte array
91 */ 87 */
92 static void write_streaminfo(FlacEncodeContext *s, uint8_t *header) 88 static void write_streaminfo(FlacEncodeContext *s, uint8_t *header)
93 { 89 {
120 int i; 116 int i;
121 int target; 117 int target;
122 int blocksize; 118 int blocksize;
123 119
124 assert(samplerate > 0); 120 assert(samplerate > 0);
125 blocksize = 0; 121 blocksize = flac_blocksizes[1];
126 target = (samplerate * BLOCK_TIME_MS) / 1000; 122 target = (samplerate * BLOCK_TIME_MS) / 1000;
127 for(i=13; i>=0; i--) { 123 for(i=0; i<16; i++) {
128 if(target >= flac_blocksizes_ordered[i]) { 124 if(target >= flac_blocksizes[i] && flac_blocksizes[i] > blocksize) {
129 blocksize = flac_blocksizes_ordered[i]; 125 blocksize = flac_blocksizes[i];
130 break; 126 }
131 }
132 }
133 if(blocksize == 0) {
134 blocksize = flac_blocksizes_ordered[1];
135 } 127 }
136 return blocksize; 128 return blocksize;
137 } 129 }
138 130
139 static int flac_encode_init(AVCodecContext *avctx) 131 static int flac_encode_init(AVCodecContext *avctx)
141 int freq = avctx->sample_rate; 133 int freq = avctx->sample_rate;
142 int channels = avctx->channels; 134 int channels = avctx->channels;
143 FlacEncodeContext *s = avctx->priv_data; 135 FlacEncodeContext *s = avctx->priv_data;
144 int i; 136 int i;
145 uint8_t *streaminfo; 137 uint8_t *streaminfo;
146
147 if(s == NULL) {
148 return -1;
149 }
150 138
151 if(avctx->sample_fmt != SAMPLE_FMT_S16) { 139 if(avctx->sample_fmt != SAMPLE_FMT_S16) {
152 return -1; 140 return -1;
153 } 141 }
154 142
280 } 268 }
281 269
282 static void encode_residual_fixed(int32_t *res, int32_t *smp, int n, int order) 270 static void encode_residual_fixed(int32_t *res, int32_t *smp, int n, int order)
283 { 271 {
284 int i; 272 int i;
285 int32_t pred;
286 273
287 for(i=0; i<order; i++) { 274 for(i=0; i<order; i++) {
288 res[i] = smp[i]; 275 res[i] = smp[i];
289 } 276 }
290 for(i=order; i<n; i++) { 277
291 pred = 0; 278 if(order==0){
292 switch(order) { 279 for(i=order; i<n; i++)
293 case 0: pred = 0; 280 res[i]= smp[i];
294 break; 281 }else if(order==1){
295 case 1: pred = smp[i-1]; 282 for(i=order; i<n; i++)
296 break; 283 res[i]= smp[i] - smp[i-1];
297 case 2: pred = 2*smp[i-1] - smp[i-2]; 284 }else if(order==2){
298 break; 285 for(i=order; i<n; i++)
299 case 3: pred = 3*smp[i-1] - 3*smp[i-2] + smp[i-3]; 286 res[i]= smp[i] - 2*smp[i-1] + smp[i-2];
300 break; 287 }else if(order==3){
301 case 4: pred = 4*smp[i-1] - 6*smp[i-2] + 4*smp[i-3] - smp[i-4]; 288 for(i=order; i<n; i++)
302 break; 289 res[i]= smp[i] - 3*smp[i-1] + 3*smp[i-2] - smp[i-3];
303 } 290 }else{
304 res[i] = smp[i] - pred; 291 for(i=order; i<n; i++)
292 res[i]= smp[i] - 4*smp[i-1] + 6*smp[i-2] - 4*smp[i-3] + smp[i-4];
305 } 293 }
306 } 294 }
307 295
308 static void encode_residual(FlacEncodeContext *s, int ch) 296 static void encode_residual(FlacEncodeContext *s, int ch)
309 { 297 {
326 } 314 }
327 315
328 static void 316 static void
329 put_sbits(PutBitContext *pb, int bits, int32_t val) 317 put_sbits(PutBitContext *pb, int bits, int32_t val)
330 { 318 {
331 uint32_t uval;
332
333 assert(bits >= 0 && bits <= 31); 319 assert(bits >= 0 && bits <= 31);
334 uval = (val < 0) ? (1UL << bits) + val : val; 320
335 put_bits(pb, bits, uval); 321 put_bits(pb, bits, val & ((1<<bits)-1));
336 } 322 }
337 323
338 static void 324 static void
339 write_utf8(PutBitContext *pb, uint32_t val) 325 write_utf8(PutBitContext *pb, uint32_t val)
340 { 326 {
341 int i, bytes, mask, shift; 327 int bytes, shift;
342 328
343 bytes = 1; 329 if(val < 0x80){
344 if(val >= 0x80) bytes++;
345 if(val >= 0x800) bytes++;
346 if(val >= 0x10000) bytes++;
347 if(val >= 0x200000) bytes++;
348 if(val >= 0x4000000) bytes++;
349
350 if(bytes == 1) {
351 put_bits(pb, 8, val); 330 put_bits(pb, 8, val);
352 return; 331 return;
353 } 332 }
354 333
334 bytes= (av_log2(val)-1) / 5;
355 shift = (bytes - 1) * 6; 335 shift = (bytes - 1) * 6;
356 mask = 0x80 + ((1 << 7) - (1 << (8 - bytes))); 336 put_bits(pb, 8, (256 - (256>>bytes)) | (val >> shift));
357 put_bits(pb, 8, mask | (val >> shift)); 337 while(shift >= 6){
358 for(i=0; i<bytes-1; i++) {
359 shift -= 6; 338 shift -= 6;
360 put_bits(pb, 8, 0x80 | ((val >> shift) & 0x3F)); 339 put_bits(pb, 8, 0x80 | ((val >> shift) & 0x3F));
361 } 340 }
362 } 341 }
363 342