diff options
author | Loren Merritt <lorenm@u.washington.edu> | 2007-09-29 23:44:34 +0000 |
---|---|---|
committer | Loren Merritt <lorenm@u.washington.edu> | 2007-09-29 23:44:34 +0000 |
commit | bfdd5bc1f15c0c632dd8ad683fa03a63b4dec9f6 (patch) | |
tree | 3590bf0b8e4bcd544489ee3cbe9c9a85a5be578c /libavcodec | |
parent | a309dce75fb08f9c7b4a248afab97d5ac105b9b3 (diff) | |
download | ffmpeg-bfdd5bc1f15c0c632dd8ad683fa03a63b4dec9f6.tar.gz |
unroll finite differences to avoid swapping registers.
1.5x faster encode_residual_fixed().
overall flac encoding: 3% faster at compression_levels 0-2.
Originally committed as revision 10625 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/flacenc.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c index e2627a8f9e..fb69561010 100644 --- a/libavcodec/flacenc.c +++ b/libavcodec/flacenc.c @@ -841,33 +841,36 @@ static void encode_residual_fixed(int32_t *res, const int32_t *smp, int n, res[i]= smp[i] - smp[i-1]; }else if(order==2){ int a = smp[order-1] - smp[order-2]; - for(i=order; i<n; i++) { + for(i=order; i<n; i+=2) { int b = smp[i] - smp[i-1]; res[i]= b - a; - a = b; + a = smp[i+1] - smp[i]; + res[i+1]= a - b; } }else if(order==3){ int a = smp[order-1] - smp[order-2]; int c = smp[order-1] - 2*smp[order-2] + smp[order-3]; - for(i=order; i<n; i++) { + for(i=order; i<n; i+=2) { int b = smp[i] - smp[i-1]; int d = b - a; res[i]= d - c; - a = b; - c = d; + a = smp[i+1] - smp[i]; + c = a - b; + res[i+1]= c - d; } }else{ int a = smp[order-1] - smp[order-2]; int c = smp[order-1] - 2*smp[order-2] + smp[order-3]; int e = smp[order-1] - 3*smp[order-2] + 3*smp[order-3] - smp[order-4]; - for(i=order; i<n; i++) { + for(i=order; i<n; i+=2) { int b = smp[i] - smp[i-1]; int d = b - a; int f = d - c; res[i]= f - e; - a = b; - c = d; - e = f; + a = smp[i+1] - smp[i]; + c = a - b; + e = c - d; + res[i+1]= e - f; } } } |