comparison flac.c @ 5741:154b02065699 libavcodec

20% faster lpc, 6% overall flac decoding
author lorenm
date Sun, 30 Sep 2007 03:01:56 +0000
parents 4d62c0055174
children 83554c0e9ce6
comparison
equal deleted inserted replaced
5740:4d62c0055174 5741:154b02065699
313 static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order) 313 static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order)
314 { 314 {
315 int i, j; 315 int i, j;
316 int coeff_prec, qlevel; 316 int coeff_prec, qlevel;
317 int coeffs[pred_order]; 317 int coeffs[pred_order];
318 int32_t *decoded = s->decoded[channel];
318 319
319 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n"); 320 // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n");
320 321
321 /* warm up samples */ 322 /* warm up samples */
322 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order); 323 // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order);
323 324
324 for (i = 0; i < pred_order; i++) 325 for (i = 0; i < pred_order; i++)
325 { 326 {
326 s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps); 327 decoded[i] = get_sbits(&s->gb, s->curr_bps);
327 // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, s->decoded[channel][i]); 328 // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, decoded[i]);
328 } 329 }
329 330
330 coeff_prec = get_bits(&s->gb, 4) + 1; 331 coeff_prec = get_bits(&s->gb, 4) + 1;
331 if (coeff_prec == 16) 332 if (coeff_prec == 16)
332 { 333 {
354 int64_t sum; 355 int64_t sum;
355 for (i = pred_order; i < s->blocksize; i++) 356 for (i = pred_order; i < s->blocksize; i++)
356 { 357 {
357 sum = 0; 358 sum = 0;
358 for (j = 0; j < pred_order; j++) 359 for (j = 0; j < pred_order; j++)
359 sum += (int64_t)coeffs[j] * s->decoded[channel][i-j-1]; 360 sum += (int64_t)coeffs[j] * decoded[i-j-1];
360 s->decoded[channel][i] += sum >> qlevel; 361 decoded[i] += sum >> qlevel;
361 } 362 }
362 } else { 363 } else {
363 for (i = pred_order; i < s->blocksize-1; i += 2) 364 for (i = pred_order; i < s->blocksize-1; i += 2)
364 { 365 {
365 int c = coeffs[pred_order-1]; 366 int c;
366 int s0 = c * s->decoded[channel][i-pred_order]; 367 int d = decoded[i-pred_order];
367 int s1 = 0; 368 int s0 = 0, s1 = 0;
368 for (j = pred_order-1; j > 0; j--) 369 for (j = pred_order-1; j > 0; j--)
369 { 370 {
370 int d = s->decoded[channel][i-j]; 371 c = coeffs[j];
372 s0 += c*d;
373 d = decoded[i-j];
371 s1 += c*d; 374 s1 += c*d;
372 c = coeffs[j-1];
373 s0 += c*d;
374 } 375 }
375 s0 = s->decoded[channel][i] += s0 >> qlevel; 376 c = coeffs[0];
376 s1 += c * s0; 377 s0 += c*d;
377 s->decoded[channel][i+1] += s1 >> qlevel; 378 d = decoded[i] += s0 >> qlevel;
379 s1 += c*d;
380 decoded[i+1] += s1 >> qlevel;
378 } 381 }
379 if (i < s->blocksize) 382 if (i < s->blocksize)
380 { 383 {
381 int sum = 0; 384 int sum = 0;
382 for (j = 0; j < pred_order; j++) 385 for (j = 0; j < pred_order; j++)
383 sum += coeffs[j] * s->decoded[channel][i-j-1]; 386 sum += coeffs[j] * decoded[i-j-1];
384 s->decoded[channel][i] += sum >> qlevel; 387 decoded[i] += sum >> qlevel;
385 } 388 }
386 } 389 }
387 390
388 return 0; 391 return 0;
389 } 392 }