# HG changeset patch # User lorenm # Date 1190763073 0 # Node ID 0c92562f1330595fecc1a7411e5ca62ad4faf1fa # Parent b3695c27215681655c7e901cb3d411b5579c6a49 optimize decode_subframe_lpc() 50%/67%/43% faster on core2/k8/p4, making flac decoding overall 24%/25%/11% faster diff -r b3695c272156 -r 0c92562f1330 flac.c --- a/flac.c Tue Sep 25 23:30:29 2007 +0000 +++ b/flac.c Tue Sep 25 23:31:13 2007 +0000 @@ -359,10 +359,25 @@ s->decoded[channel][i] += sum >> qlevel; } } else { - int sum; - for (i = pred_order; i < s->blocksize; i++) + for (i = pred_order; i < s->blocksize-1; i += 2) { - sum = 0; + int c = coeffs[pred_order-1]; + int s0 = c * s->decoded[channel][i-pred_order]; + int s1 = 0; + for (j = pred_order-1; j > 0; j--) + { + int d = s->decoded[channel][i-j]; + s1 += c*d; + c = coeffs[j-1]; + s0 += c*d; + } + s0 = s->decoded[channel][i] += s0 >> qlevel; + s1 += c * s0; + s->decoded[channel][i+1] += s1 >> qlevel; + } + if (i < s->blocksize) + { + int sum = 0; for (j = 0; j < pred_order; j++) sum += coeffs[j] * s->decoded[channel][i-j-1]; s->decoded[channel][i] += sum >> qlevel;