Mercurial > libavcodec.hg
changeset 5738:c1a4aae5adb4 libavcodec
encode_residual_fixed(): replace FIR with finite differences.
4x faster order 2, 3.5x order 3, 3x order 4.
overall flac encoding: 35% faster at compression_levels 0-2, no effect at higher levels.
author | lorenm |
---|---|
date | Sat, 29 Sep 2007 23:21:57 +0000 |
parents | efa3c1f9259a |
children | 832a3152d38e |
files | flacenc.c |
diffstat | 1 files changed, 27 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/flacenc.c Sat Sep 29 22:31:18 2007 +0000 +++ b/flacenc.c Sat Sep 29 23:21:57 2007 +0000 @@ -840,14 +840,35 @@ for(i=order; i<n; i++) res[i]= smp[i] - smp[i-1]; }else if(order==2){ - for(i=order; i<n; i++) - res[i]= smp[i] - 2*smp[i-1] + smp[i-2]; + int a = smp[order-1] - smp[order-2]; + for(i=order; i<n; i++) { + int b = smp[i] - smp[i-1]; + res[i]= b - a; + a = b; + } }else if(order==3){ - for(i=order; i<n; i++) - res[i]= smp[i] - 3*smp[i-1] + 3*smp[i-2] - smp[i-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++) { + int b = smp[i] - smp[i-1]; + int d = b - a; + res[i]= d - c; + a = b; + c = d; + } }else{ - for(i=order; i<n; i++) - res[i]= smp[i] - 4*smp[i-1] + 6*smp[i-2] - 4*smp[i-3] + smp[i-4]; + 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++) { + 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; + } } }