summaryrefslogtreecommitdiff
path: root/libavcodec/flacenc.c
diff options
context:
space:
mode:
authorLoren Merritt <lorenm@u.washington.edu>2007-09-29 23:44:34 +0000
committerLoren Merritt <lorenm@u.washington.edu>2007-09-29 23:44:34 +0000
commitbfdd5bc1f15c0c632dd8ad683fa03a63b4dec9f6 (patch)
tree3590bf0b8e4bcd544489ee3cbe9c9a85a5be578c /libavcodec/flacenc.c
parenta309dce75fb08f9c7b4a248afab97d5ac105b9b3 (diff)
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/flacenc.c')
-rw-r--r--libavcodec/flacenc.c21
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;
}
}
}