---
libavcodec/arm/dct-test.c | 40 ++++++++++++++++++
libavcodec/bfin/dct-test.c | 31 ++++++++++++++
libavcodec/dct-test.c | 101 +++++++++++++++------------------------------
libavcodec/ppc/dct-test.c | 32 ++++++++++++++
libavcodec/x86/dct-test.c | 70 +++++++++++++++++++++++++++++++
5 files changed, 206 insertions(+), 68 deletions(-)
create mode 100644 libavcodec/arm/dct-test.c
create mode 100644 libavcodec/bfin/dct-test.c
create mode 100644 libavcodec/ppc/dct-test.c
create mode 100644 libavcodec/x86/dct-test.c
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/bfin/dct-test.c b/libavcodec/bfin/dct-test.c
new file mode 100644
index 0000000..da0b4d6
--- /dev/null
+++ b/libavcodec/bfin/dct-test.c
@@ -0,0 +1,31 @@
+/*
+ * 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 "dct.h"
+
+static const struct algo fdct_tab_arch[] = {
+ { "BFINfdct", ff_bfin_fdct, FF_IDCT_PERM_NONE },
+ { 0 }
+};
+
+static const struct algo idct_tab_arch[] = {
+ { "BFINidct", ff_bfin_idct, FF_IDCT_PERM_NONE },
+ { 0 }
+};
diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c
index f1054db..2a3fd5a 100644
--- a/libavcodec/dct-test.c
+++ b/libavcodec/dct-test.c
@@ -48,10 +48,6 @@
#include "aandcttab.h"
#include "faandct.h"
#include "faanidct.h"
-#include "x86/fdct.h"
-#include "x86/idct_permutation.h"
-#include "x86/idct_xvid.h"
-#include "x86/simple_idct.h"
#include "dctref.h"
struct algo {
@@ -62,71 +58,33 @@ 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
-
-#if ARCH_BFIN
- { "BFINfdct", ff_bfin_fdct, FF_IDCT_PERM_NONE },
-#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_BFIN
- { "BFINidct", ff_bfin_idct, FF_IDCT_PERM_NONE },
-#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_BFIN
+#include "bfin/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
@@ -168,19 +126,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[simple_mmx_permutation[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];
@@ -486,11 +441,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..2b083d5
--- /dev/null
+++ b/libavcodec/x86/dct-test.c
@@ -0,0 +1,70 @@
+/*
+ * 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_permutation.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 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[simple_mmx_permutation[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;
+}
--
1.8.3.2
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel