[FFmpeg-cvslog] dct-test: Move arch-specific bits into arch-specific subdirectories

Diego Biurrun git at videolan.org
Mon Jul 21 13:51:08 CEST 2014


ffmpeg | branch: master | Diego Biurrun <diego at biurrun.de> | Tue Feb 18 14:15:55 2014 +0100| [81b9bf319226fe03436c80aaa8a2c91767cab7ce] | committer: Diego Biurrun

dct-test: Move arch-specific bits into arch-specific subdirectories

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=81b9bf319226fe03436c80aaa8a2c91767cab7ce
---

 libavcodec/arm/dct-test.c |   40 +++++++++++++++++
 libavcodec/dct-test.c     |  105 +++++++++++++--------------------------------
 libavcodec/ppc/dct-test.c |   32 ++++++++++++++
 libavcodec/x86/dct-test.c |   82 +++++++++++++++++++++++++++++++++++
 4 files changed, 185 insertions(+), 74 deletions(-)

diff --git a/libavcodec/arm/dct-test.c b/libavcodec/arm/dct-test.c
new file mode 100644
index 0000000..70e5c1c
--- /dev/null
+++ b/libavcodec/arm/dct-test.c
@@ -0,0 +1,40 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "idct.h"
+
+static const struct algo fdct_tab_arch[] = {
+    { 0 }
+};
+
+static const struct algo idct_tab_arch[] = {
+    { "SIMPLE-ARM",     ff_simple_idct_arm,     FF_IDCT_PERM_NONE },
+    { "INT-ARM",        ff_j_rev_dct_arm,       FF_IDCT_PERM_LIBMPEG2 },
+#if HAVE_ARMV5TE
+    { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te, FF_IDCT_PERM_NONE,      AV_CPU_FLAG_ARMV5TE },
+#endif
+#if HAVE_ARMV6
+    { "SIMPLE-ARMV6",   ff_simple_idct_armv6,   FF_IDCT_PERM_LIBMPEG2,  AV_CPU_FLAG_ARMV6 },
+#endif
+#if HAVE_NEON
+    { "SIMPLE-NEON",    ff_simple_idct_neon,    FF_IDCT_PERM_PARTTRANS, AV_CPU_FLAG_NEON },
+#endif
+    { 0 }
+};
diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c
index d1393c4..979fc0b 100644
--- a/libavcodec/dct-test.c
+++ b/libavcodec/dct-test.c
@@ -45,11 +45,6 @@
 #include "aandcttab.h"
 #include "faandct.h"
 #include "faanidct.h"
-#include "arm/idct.h"
-#include "ppc/fdct.h"
-#include "x86/fdct.h"
-#include "x86/idct_xvid.h"
-#include "x86/simple_idct.h"
 #include "dctref.h"
 
 struct algo {
@@ -60,81 +55,36 @@ struct algo {
     int nonspec;
 };
 
-static const struct algo fdct_tab[] = {
+static const struct algo fdct_tab[4] = {
     { "REF-DBL",     ff_ref_fdct,          FF_IDCT_PERM_NONE },
     { "FAAN",        ff_faandct,           FF_IDCT_PERM_NONE },
     { "IJG-AAN-INT", ff_fdct_ifast,        FF_IDCT_PERM_NONE },
     { "IJG-LLM-INT", ff_jpeg_fdct_islow_8, FF_IDCT_PERM_NONE },
-
-#if HAVE_MMX_INLINE
-    { "MMX",         ff_fdct_mmx,          FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMX },
-#endif
-#if HAVE_MMXEXT_INLINE
-    { "MMXEXT",      ff_fdct_mmxext,       FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMXEXT },
-#endif
-#if HAVE_SSE2_INLINE
-    { "SSE2",        ff_fdct_sse2,         FF_IDCT_PERM_NONE, AV_CPU_FLAG_SSE2 },
-#endif
-
-#if HAVE_ALTIVEC
-    { "altivecfdct", ff_fdct_altivec,      FF_IDCT_PERM_NONE, AV_CPU_FLAG_ALTIVEC },
-#endif
-
-    { 0 }
 };
 
-static const struct algo idct_tab[] = {
+static const struct algo idct_tab[4] = {
     { "FAANI",       ff_faanidct,          FF_IDCT_PERM_NONE },
     { "REF-DBL",     ff_ref_idct,          FF_IDCT_PERM_NONE },
     { "INT",         ff_j_rev_dct,         FF_IDCT_PERM_LIBMPEG2 },
     { "SIMPLE-C",    ff_simple_idct_8,     FF_IDCT_PERM_NONE },
-
-#if HAVE_MMX_INLINE
-    { "SIMPLE-MMX",     ff_simple_idct_mmx,     FF_IDCT_PERM_SIMPLE,    AV_CPU_FLAG_MMX },
-    { "XVID-MMX",       ff_idct_xvid_mmx,       FF_IDCT_PERM_NONE,      AV_CPU_FLAG_MMX,    1 },
-#endif
-#if HAVE_MMXEXT_INLINE
-    { "XVID-MMXEXT",    ff_idct_xvid_mmxext,    FF_IDCT_PERM_NONE,      AV_CPU_FLAG_MMXEXT, 1 },
-#endif
-#if HAVE_SSE2_INLINE
-    { "XVID-SSE2",      ff_idct_xvid_sse2,      FF_IDCT_PERM_SSE2,      AV_CPU_FLAG_SSE2,   1 },
-#endif
+};
 
 #if ARCH_ARM
-    { "SIMPLE-ARM",     ff_simple_idct_arm,     FF_IDCT_PERM_NONE },
-    { "INT-ARM",        ff_j_rev_dct_arm,       FF_IDCT_PERM_LIBMPEG2 },
-#endif
-#if HAVE_ARMV5TE
-    { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te, FF_IDCT_PERM_NONE,      AV_CPU_FLAG_ARMV5TE },
-#endif
-#if HAVE_ARMV6
-    { "SIMPLE-ARMV6",   ff_simple_idct_armv6,   FF_IDCT_PERM_LIBMPEG2,  AV_CPU_FLAG_ARMV6 },
-#endif
-#if HAVE_NEON && ARCH_ARM
-    { "SIMPLE-NEON",    ff_simple_idct_neon,    FF_IDCT_PERM_PARTTRANS, AV_CPU_FLAG_NEON },
+#include "arm/dct-test.c"
+#elif ARCH_PPC
+#include "ppc/dct-test.c"
+#elif ARCH_X86
+#include "x86/dct-test.c"
+#else
+static const struct algo fdct_tab_arch[] = { 0 };
+static const struct algo idct_tab_arch[] = { 0 };
 #endif
 
-    { 0 }
-};
-
 #define AANSCALE_BITS 12
 
 #define NB_ITS 20000
 #define NB_ITS_SPEED 50000
 
-static short idct_simple_mmx_perm[64] = {
-    0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
-    0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
-    0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
-    0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
-    0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
-    0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
-    0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
-    0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
-};
-
-static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 };
-
 DECLARE_ALIGNED(16, static int16_t, block)[64];
 DECLARE_ALIGNED(8,  static int16_t, block1)[64];
 
@@ -171,19 +121,16 @@ static void permute(int16_t dst[64], const int16_t src[64],
 {
     int i;
 
+#if ARCH_X86
+    if (permute_x86(dst, src, perm_type))
+        return;
+#endif
+
     switch (perm_type) {
     case FF_IDCT_PERM_LIBMPEG2:
         for (i = 0; i < 64; i++)
             dst[(i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2)] = src[i];
         break;
-    case FF_IDCT_PERM_SIMPLE:
-        for (i = 0; i < 64; i++)
-            dst[idct_simple_mmx_perm[i]] = src[i];
-        break;
-    case FF_IDCT_PERM_SSE2:
-        for (i = 0; i < 64; i++)
-            dst[(i & 0x38) | idct_sse2_row_perm[i & 7]] = src[i];
-        break;
     case FF_IDCT_PERM_PARTTRANS:
         for (i = 0; i < 64; i++)
             dst[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = src[i];
@@ -489,11 +436,21 @@ int main(int argc, char **argv)
         idct248_error("SIMPLE-C", ff_simple_idct248_put, speed);
     } else {
         const int cpu_flags = av_get_cpu_flags();
-        const struct algo *algos = test_idct ? idct_tab : fdct_tab;
-        for (i = 0; algos[i].name; i++)
-            if (!(~cpu_flags & algos[i].cpu_flag)) {
-                err |= dct_error(&algos[i], test, test_idct, speed);
-            }
+        if (test_idct) {
+            for (i = 0; i < FF_ARRAY_ELEMS(idct_tab); i++)
+                err |= dct_error(&idct_tab[i], test, test_idct, speed);
+
+            for (i = 0; idct_tab_arch[i].name; i++)
+                if (!(~cpu_flags & idct_tab_arch[i].cpu_flag))
+                    err |= dct_error(&idct_tab_arch[i], test, test_idct, speed);
+        } else {
+            for (i = 0; i < FF_ARRAY_ELEMS(fdct_tab); i++)
+                err |= dct_error(&fdct_tab[i], test, test_idct, speed);
+
+            for (i = 0; fdct_tab_arch[i].name; i++)
+                if (!(~cpu_flags & fdct_tab_arch[i].cpu_flag))
+                    err |= dct_error(&fdct_tab_arch[i], test, test_idct, speed);
+        }
     }
 
     if (err)
diff --git a/libavcodec/ppc/dct-test.c b/libavcodec/ppc/dct-test.c
new file mode 100644
index 0000000..37fd8bb
--- /dev/null
+++ b/libavcodec/ppc/dct-test.c
@@ -0,0 +1,32 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "fdct.h"
+
+static const struct algo fdct_tab_arch[] = {
+#if HAVE_ALTIVEC
+    { "altivecfdct", ff_fdct_altivec, FF_IDCT_PERM_NONE, AV_CPU_FLAG_ALTIVEC },
+#endif
+    { 0 }
+};
+
+static const struct algo idct_tab_arch[] = {
+    { 0 }
+};
diff --git a/libavcodec/x86/dct-test.c b/libavcodec/x86/dct-test.c
new file mode 100644
index 0000000..2df9170
--- /dev/null
+++ b/libavcodec/x86/dct-test.c
@@ -0,0 +1,82 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "fdct.h"
+#include "idct_xvid.h"
+#include "simple_idct.h"
+
+static const struct algo fdct_tab_arch[] = {
+#if HAVE_MMX_INLINE
+    { "MMX",    ff_fdct_mmx,    FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMX },
+#endif
+#if HAVE_MMXEXT_INLINE
+    { "MMXEXT", ff_fdct_mmxext, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMXEXT },
+#endif
+#if HAVE_SSE2_INLINE
+    { "SSE2",   ff_fdct_sse2,   FF_IDCT_PERM_NONE, AV_CPU_FLAG_SSE2 },
+#endif
+    { 0 }
+};
+
+static const struct algo idct_tab_arch[] = {
+#if HAVE_MMX_INLINE
+    { "SIMPLE-MMX",  ff_simple_idct_mmx,  FF_IDCT_PERM_SIMPLE, AV_CPU_FLAG_MMX },
+    { "XVID-MMX",    ff_idct_xvid_mmx,    FF_IDCT_PERM_NONE,   AV_CPU_FLAG_MMX,    1 },
+#endif
+#if HAVE_MMXEXT_INLINE
+    { "XVID-MMXEXT", ff_idct_xvid_mmxext, FF_IDCT_PERM_NONE,   AV_CPU_FLAG_MMXEXT, 1 },
+#endif
+#if HAVE_SSE2_INLINE
+    { "XVID-SSE2",   ff_idct_xvid_sse2,   FF_IDCT_PERM_SSE2,   AV_CPU_FLAG_SSE2,   1 },
+#endif
+    { 0 }
+};
+
+static short idct_simple_mmx_perm[64] = {
+    0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
+    0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
+    0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
+    0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
+    0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
+    0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
+    0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
+    0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
+};
+
+static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 };
+
+static int permute_x86(int16_t dst[64], const int16_t src[64],
+                       enum idct_permutation_type perm_type)
+{
+    int i;
+
+    switch (perm_type) {
+    case FF_IDCT_PERM_SIMPLE:
+        for (i = 0; i < 64; i++)
+            dst[idct_simple_mmx_perm[i]] = src[i];
+        return 1;
+    case FF_IDCT_PERM_SSE2:
+        for (i = 0; i < 64; i++)
+            dst[(i & 0x38) | idct_sse2_row_perm[i & 7]] = src[i];
+        return 1;
+    }
+
+    return 0;
+}



More information about the ffmpeg-cvslog mailing list