]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
encode_residual_fixed(): replace FIR with finite differences.
authorlorenm <lorenm@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Sat, 29 Sep 2007 23:21:57 +0000 (23:21 +0000)
committerlorenm <lorenm@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Sat, 29 Sep 2007 23:21:57 +0000 (23:21 +0000)
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.

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@10624 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

libavcodec/flacenc.c

index 5f9d78ef123f99d9de95addc613b19e721ec1734..e2627a8f9ef7c7894e8fd532f8796a4e040b6748 100644 (file)
@@ -840,14 +840,35 @@ static void encode_residual_fixed(int32_t *res, const int32_t *smp, int n,
         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;
+        }
     }
 }