diff options
author | Loren Merritt <lorenm@u.washington.edu> | 2007-09-25 23:30:29 +0000 |
---|---|---|
committer | Loren Merritt <lorenm@u.washington.edu> | 2007-09-25 23:30:29 +0000 |
commit | f74471e043c6788a59bf6e8143f71d3968353152 (patch) | |
tree | 25183a5d523561caaba7e49666ef7b786a9dd302 /libavcodec/flacenc.c | |
parent | 7ecae905b688385428fabc41b029747ac5bac0ee (diff) | |
download | ffmpeg-streaming-f74471e043c6788a59bf6e8143f71d3968353152.zip ffmpeg-streaming-f74471e043c6788a59bf6e8143f71d3968353152.tar.gz |
optimize encode_residual_lpc()
37%/45%/90% faster on core2/k8/p4, making flac encoding overall 15%/17%/40% faster at compression_level>=8 (less at low levels).
Originally committed as revision 10585 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/flacenc.c')
-rw-r--r-- | libavcodec/flacenc.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c index 9dd6c7e..8dd55ea 100644 --- a/libavcodec/flacenc.c +++ b/libavcodec/flacenc.c @@ -838,17 +838,22 @@ static void encode_residual_lpc(int32_t *res, const int32_t *smp, int n, int order, const int32_t *coefs, int shift) { int i, j; - int32_t pred; for(i=0; i<order; i++) { res[i] = smp[i]; } - for(i=order; i<n; i++) { - pred = 0; - for(j=0; j<order; j++) { - pred += coefs[j] * smp[i-j-1]; + for(i=order; i<n; i+=2) { + int32_t c = coefs[0]; + int32_t p0 = 0, p1 = c*smp[i]; + for(j=1; j<order; j++) { + int32_t s = smp[i-j]; + p0 += c*s; + c = coefs[j]; + p1 += c*s; } - res[i] = smp[i] - (pred >> shift); + p0 += c*smp[i-order]; + res[i+0] = smp[i+0] - (p0 >> shift); + res[i+1] = smp[i+1] - (p1 >> shift); } } |