Mercurial > libavcodec.hg
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 } |