Reintroduce lost idctSparseCol for Alpha. Sorry for adding even more
authorFalk Hüffner <mellum@users.sourceforge.net>
Mon, 24 Jun 2002 21:17:22 +0000 (21:17 +0000)
committerFalk Hüffner <mellum@users.sourceforge.net>
Mon, 24 Jun 2002 21:17:22 +0000 (21:17 +0000)
code duplication, I'm currently working on the put/add variants, but I
did not get them to be as fast as the old method yet...

Originally committed as revision 703 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/simple_idct.c

index 0665f66..9edb726 100644 (file)
@@ -167,6 +167,79 @@ static inline int idctRowCondDC(int16_t *row)
 
        return 2;
 }
+
+inline static void idctSparseCol(int16_t *col)
+{
+        int a0, a1, a2, a3, b0, b1, b2, b3;
+
+        col[0] += (1 << (COL_SHIFT - 1)) / W4;
+
+        a0 = W4 * col[8 * 0];
+        a1 = W4 * col[8 * 0];
+        a2 = W4 * col[8 * 0];
+        a3 = W4 * col[8 * 0];
+
+        if (col[8 * 2]) {
+                a0 += W2 * col[8 * 2];
+                a1 += W6 * col[8 * 2];
+                a2 -= W6 * col[8 * 2];
+                a3 -= W2 * col[8 * 2];
+        }
+
+        if (col[8 * 4]) {
+                a0 += W4 * col[8 * 4];
+                a1 -= W4 * col[8 * 4];
+                a2 -= W4 * col[8 * 4];
+                a3 += W4 * col[8 * 4];
+        }
+
+        if (col[8 * 6]) {
+                a0 += W6 * col[8 * 6];
+                a1 -= W2 * col[8 * 6];
+                a2 += W2 * col[8 * 6];
+                a3 -= W6 * col[8 * 6];
+        }
+
+        if (col[8 * 1]) {
+                b0 = W1 * col[8 * 1];
+                b1 = W3 * col[8 * 1];
+                b2 = W5 * col[8 * 1];
+                b3 = W7 * col[8 * 1];
+        } else {
+                b0 = b1 = b2 = b3 = 0;
+        }
+
+        if (col[8 * 3]) {
+                b0 += W3 * col[8 * 3];
+                b1 -= W7 * col[8 * 3];
+                b2 -= W1 * col[8 * 3];
+                b3 -= W5 * col[8 * 3];
+        }
+
+        if (col[8 * 5]) {
+                b0 += W5 * col[8 * 5];
+                b1 -= W1 * col[8 * 5];
+                b2 += W7 * col[8 * 5];
+                b3 += W3 * col[8 * 5];
+        }
+
+        if (col[8 * 7]) {
+                b0 += W7 * col[8 * 7];
+                b1 -= W5 * col[8 * 7];
+                b2 += W3 * col[8 * 7];
+                b3 -= W1 * col[8 * 7];
+        }
+
+        col[8 * 0] = (a0 + b0) >> COL_SHIFT;
+        col[8 * 7] = (a0 - b0) >> COL_SHIFT;
+        col[8 * 1] = (a1 + b1) >> COL_SHIFT;
+        col[8 * 6] = (a1 - b1) >> COL_SHIFT;
+        col[8 * 2] = (a2 + b2) >> COL_SHIFT;
+        col[8 * 5] = (a2 - b2) >> COL_SHIFT;
+        col[8 * 3] = (a3 + b3) >> COL_SHIFT;
+        col[8 * 4] = (a3 - b3) >> COL_SHIFT;
+}
+
 #else  /* not ARCH_ALPHA */
 
 static inline void idctRowCondDC (int16_t * row)