History

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

Diego Biurrun committed 12 years ago

Commit 81b9bf31 parent a9f3f5f4 files · +185 −74Browse files

Unified · Split

4 files
  1. libavcodec/arm/dct-test.c +40 −0
  2. libavcodec/dct-test.c +31 −74
  3. libavcodec/ppc/dct-test.c +32 −0
  4. libavcodec/x86/dct-test.c +82 −0
libavcodec/arm/dct-test.c+40−0
@@ -0,0 +1,40 @@
1/*
2 * This file is part of Libav.
3 *
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "config.h"
20
21#include "idct.h"
22
23static const struct algo fdct_tab_arch[] = {
24 { 0 }
25};
26
27static const struct algo idct_tab_arch[] = {
28 { "SIMPLE-ARM", ff_simple_idct_arm, FF_IDCT_PERM_NONE },
29 { "INT-ARM", ff_j_rev_dct_arm, FF_IDCT_PERM_LIBMPEG2 },
30#if HAVE_ARMV5TE
31 { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te, FF_IDCT_PERM_NONE, AV_CPU_FLAG_ARMV5TE },
32#endif
33#if HAVE_ARMV6
34 { "SIMPLE-ARMV6", ff_simple_idct_armv6, FF_IDCT_PERM_LIBMPEG2, AV_CPU_FLAG_ARMV6 },
35#endif
36#if HAVE_NEON
37 { "SIMPLE-NEON", ff_simple_idct_neon, FF_IDCT_PERM_PARTTRANS, AV_CPU_FLAG_NEON },
38#endif
39 { 0 }
40};
libavcodec/dct-test.c+31−74
@@ -45,11 +45,6 @@ · 44 unmodified lines
45#include "aandcttab.h"45#include "aandcttab.h"
46#include "faandct.h"46#include "faandct.h"
47#include "faanidct.h"47#include "faanidct.h"
48#include "arm/idct.h"
49#include "ppc/fdct.h"
50#include "x86/fdct.h"
51#include "x86/idct_xvid.h"
52#include "x86/simple_idct.h"
53#include "dctref.h"48#include "dctref.h"
54 49
55struct algo {50struct algo {
@@ -60,81 +55,36 @@ struct algo { · 4 unmodified lines
60 int nonspec;55 int nonspec;
61};56};
62 57
63static const struct algo fdct_tab[] = {58static const struct algo fdct_tab[4] = {
64 { "REF-DBL", ff_ref_fdct, FF_IDCT_PERM_NONE },59 { "REF-DBL", ff_ref_fdct, FF_IDCT_PERM_NONE },
65 { "FAAN", ff_faandct, FF_IDCT_PERM_NONE },60 { "FAAN", ff_faandct, FF_IDCT_PERM_NONE },
66 { "IJG-AAN-INT", ff_fdct_ifast, FF_IDCT_PERM_NONE },61 { "IJG-AAN-INT", ff_fdct_ifast, FF_IDCT_PERM_NONE },
67 { "IJG-LLM-INT", ff_jpeg_fdct_islow_8, FF_IDCT_PERM_NONE },62 { "IJG-LLM-INT", ff_jpeg_fdct_islow_8, FF_IDCT_PERM_NONE },
68
69#if HAVE_MMX_INLINE
70 { "MMX", ff_fdct_mmx, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMX },
71#endif
72#if HAVE_MMXEXT_INLINE
73 { "MMXEXT", ff_fdct_mmxext, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMXEXT },
74#endif
75#if HAVE_SSE2_INLINE
76 { "SSE2", ff_fdct_sse2, FF_IDCT_PERM_NONE, AV_CPU_FLAG_SSE2 },
77#endif
78
79#if HAVE_ALTIVEC
80 { "altivecfdct", ff_fdct_altivec, FF_IDCT_PERM_NONE, AV_CPU_FLAG_ALTIVEC },
81#endif
82
83 { 0 }
84};63};
85 64
86static const struct algo idct_tab[] = {65static const struct algo idct_tab[4] = {
87 { "FAANI", ff_faanidct, FF_IDCT_PERM_NONE },66 { "FAANI", ff_faanidct, FF_IDCT_PERM_NONE },
88 { "REF-DBL", ff_ref_idct, FF_IDCT_PERM_NONE },67 { "REF-DBL", ff_ref_idct, FF_IDCT_PERM_NONE },
89 { "INT", ff_j_rev_dct, FF_IDCT_PERM_LIBMPEG2 },68 { "INT", ff_j_rev_dct, FF_IDCT_PERM_LIBMPEG2 },
90 { "SIMPLE-C", ff_simple_idct_8, FF_IDCT_PERM_NONE },69 { "SIMPLE-C", ff_simple_idct_8, FF_IDCT_PERM_NONE },
91 70};
92#if HAVE_MMX_INLINE
93 { "SIMPLE-MMX", ff_simple_idct_mmx, FF_IDCT_PERM_SIMPLE, AV_CPU_FLAG_MMX },
94 { "XVID-MMX", ff_idct_xvid_mmx, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMX, 1 },
95#endif
96#if HAVE_MMXEXT_INLINE
97 { "XVID-MMXEXT", ff_idct_xvid_mmxext, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMXEXT, 1 },
98#endif
99#if HAVE_SSE2_INLINE
100 { "XVID-SSE2", ff_idct_xvid_sse2, FF_IDCT_PERM_SSE2, AV_CPU_FLAG_SSE2, 1 },
101#endif
102 71
103#if ARCH_ARM72#if ARCH_ARM
104 { "SIMPLE-ARM", ff_simple_idct_arm, FF_IDCT_PERM_NONE },73#include "arm/dct-test.c"
105 { "INT-ARM", ff_j_rev_dct_arm, FF_IDCT_PERM_LIBMPEG2 },74#elif ARCH_PPC
106#endif75#include "ppc/dct-test.c"
107#if HAVE_ARMV5TE76#elif ARCH_X86
108 { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te, FF_IDCT_PERM_NONE, AV_CPU_FLAG_ARMV5TE },77#include "x86/dct-test.c"
109#endif78#else
110#if HAVE_ARMV679static const struct algo fdct_tab_arch[] = { 0 };
111 { "SIMPLE-ARMV6", ff_simple_idct_armv6, FF_IDCT_PERM_LIBMPEG2, AV_CPU_FLAG_ARMV6 },80static const struct algo idct_tab_arch[] = { 0 };
112#endif
113#if HAVE_NEON && ARCH_ARM
114 { "SIMPLE-NEON", ff_simple_idct_neon, FF_IDCT_PERM_PARTTRANS, AV_CPU_FLAG_NEON },
115#endif81#endif
116 82
117 { 0 }
118};
119
120#define AANSCALE_BITS 1283#define AANSCALE_BITS 12
121 84
122#define NB_ITS 2000085#define NB_ITS 20000
123#define NB_ITS_SPEED 5000086#define NB_ITS_SPEED 50000
124 87
125static short idct_simple_mmx_perm[64] = {
126 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
127 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
128 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
129 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
130 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
131 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
132 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
133 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
134};
135
136static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 };
137
138DECLARE_ALIGNED(16, static int16_t, block)[64];88DECLARE_ALIGNED(16, static int16_t, block)[64];
139DECLARE_ALIGNED(8, static int16_t, block1)[64];89DECLARE_ALIGNED(8, static int16_t, block1)[64];
140 90
@@ -171,19 +121,16 @@ static void permute(int16_t dst[64], const int16_t src[64], · 30 unmodified lines
171{121{
172 int i;122 int i;
173 123
124#if ARCH_X86
125 if (permute_x86(dst, src, perm_type))
126 return;
127#endif
128
174 switch (perm_type) {129 switch (perm_type) {
175 case FF_IDCT_PERM_LIBMPEG2:130 case FF_IDCT_PERM_LIBMPEG2:
176 for (i = 0; i < 64; i++)131 for (i = 0; i < 64; i++)
177 dst[(i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2)] = src[i];132 dst[(i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2)] = src[i];
178 break;133 break;
179 case FF_IDCT_PERM_SIMPLE:
180 for (i = 0; i < 64; i++)
181 dst[idct_simple_mmx_perm[i]] = src[i];
182 break;
183 case FF_IDCT_PERM_SSE2:
184 for (i = 0; i < 64; i++)
185 dst[(i & 0x38) | idct_sse2_row_perm[i & 7]] = src[i];
186 break;
187 case FF_IDCT_PERM_PARTTRANS:134 case FF_IDCT_PERM_PARTTRANS:
188 for (i = 0; i < 64; i++)135 for (i = 0; i < 64; i++)
189 dst[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = src[i];136 dst[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = src[i];
@@ -489,11 +436,21 @@ int main(int argc, char **argv) · 299 unmodified lines
489 idct248_error("SIMPLE-C", ff_simple_idct248_put, speed);436 idct248_error("SIMPLE-C", ff_simple_idct248_put, speed);
490 } else {437 } else {
491 const int cpu_flags = av_get_cpu_flags();438 const int cpu_flags = av_get_cpu_flags();
492 const struct algo *algos = test_idct ? idct_tab : fdct_tab;439 if (test_idct) {
493 for (i = 0; algos[i].name; i++)440 for (i = 0; i < FF_ARRAY_ELEMS(idct_tab); i++)
494 if (!(~cpu_flags & algos[i].cpu_flag)) {441 err |= dct_error(&idct_tab[i], test, test_idct, speed);
495 err |= dct_error(&algos[i], test, test_idct, speed);442
496 }443 for (i = 0; idct_tab_arch[i].name; i++)
444 if (!(~cpu_flags & idct_tab_arch[i].cpu_flag))
445 err |= dct_error(&idct_tab_arch[i], test, test_idct, speed);
446 } else {
447 for (i = 0; i < FF_ARRAY_ELEMS(fdct_tab); i++)
448 err |= dct_error(&fdct_tab[i], test, test_idct, speed);
449
450 for (i = 0; fdct_tab_arch[i].name; i++)
451 if (!(~cpu_flags & fdct_tab_arch[i].cpu_flag))
452 err |= dct_error(&fdct_tab_arch[i], test, test_idct, speed);
453 }
497 }454 }
498 455
499 if (err)456 if (err)
libavcodec/ppc/dct-test.c+32−0
@@ -0,0 +1,32 @@
1/*
2 * This file is part of Libav.
3 *
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "config.h"
20
21#include "fdct.h"
22
23static const struct algo fdct_tab_arch[] = {
24#if HAVE_ALTIVEC
25 { "altivecfdct", ff_fdct_altivec, FF_IDCT_PERM_NONE, AV_CPU_FLAG_ALTIVEC },
26#endif
27 { 0 }
28};
29
30static const struct algo idct_tab_arch[] = {
31 { 0 }
32};
libavcodec/x86/dct-test.c+82−0
@@ -0,0 +1,82 @@
1/*
2 * This file is part of Libav.
3 *
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "config.h"
20
21#include "fdct.h"
22#include "idct_xvid.h"
23#include "simple_idct.h"
24
25static const struct algo fdct_tab_arch[] = {
26#if HAVE_MMX_INLINE
27 { "MMX", ff_fdct_mmx, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMX },
28#endif
29#if HAVE_MMXEXT_INLINE
30 { "MMXEXT", ff_fdct_mmxext, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMXEXT },
31#endif
32#if HAVE_SSE2_INLINE
33 { "SSE2", ff_fdct_sse2, FF_IDCT_PERM_NONE, AV_CPU_FLAG_SSE2 },
34#endif
35 { 0 }
36};
37
38static const struct algo idct_tab_arch[] = {
39#if HAVE_MMX_INLINE
40 { "SIMPLE-MMX", ff_simple_idct_mmx, FF_IDCT_PERM_SIMPLE, AV_CPU_FLAG_MMX },
41 { "XVID-MMX", ff_idct_xvid_mmx, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMX, 1 },
42#endif
43#if HAVE_MMXEXT_INLINE
44 { "XVID-MMXEXT", ff_idct_xvid_mmxext, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMXEXT, 1 },
45#endif
46#if HAVE_SSE2_INLINE
47 { "XVID-SSE2", ff_idct_xvid_sse2, FF_IDCT_PERM_SSE2, AV_CPU_FLAG_SSE2, 1 },
48#endif
49 { 0 }
50};
51
52static short idct_simple_mmx_perm[64] = {
53 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
54 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
55 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
56 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
57 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
58 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
59 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
60 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
61};
62
63static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 };
64
65static int permute_x86(int16_t dst[64], const int16_t src[64],
66 enum idct_permutation_type perm_type)
67{
68 int i;
69
70 switch (perm_type) {
71 case FF_IDCT_PERM_SIMPLE:
72 for (i = 0; i < 64; i++)
73 dst[idct_simple_mmx_perm[i]] = src[i];
74 return 1;
75 case FF_IDCT_PERM_SSE2:
76 for (i = 0; i < 64; i++)
77 dst[(i & 0x38) | idct_sse2_row_perm[i & 7]] = src[i];
78 return 1;
79 }
80
81 return 0;
82}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t