| @@ -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 | |
| 55 | struct algo { | 50 | struct algo { |
| @@ -60,81 +55,36 @@ struct algo { · 4 unmodified lines |
| 60 | int nonspec; | 55 | int nonspec; |
| 61 | }; | 56 | }; |
| 62 | | 57 | |
| 63 | static const struct algo fdct_tab[] = { | 58 | static 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 | |
| 86 | static const struct algo idct_tab[] = { | 65 | static 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_ARM | 72 | #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 | #endif | 75 | #include "ppc/dct-test.c" |
| 107 | #if HAVE_ARMV5TE | 76 | #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 | #endif | 78 | #else |
| 110 | #if HAVE_ARMV6 | 79 | static const struct algo fdct_tab_arch[] = { 0 }; |
| 111 | { "SIMPLE-ARMV6", ff_simple_idct_armv6, FF_IDCT_PERM_LIBMPEG2, AV_CPU_FLAG_ARMV6 }, | 80 | static 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 | #endif | 81 | #endif |
| 116 | | 82 | |
| 117 | { 0 } | | |
| 118 | }; | | |
| 119 | | | |
| 120 | #define AANSCALE_BITS 12 | 83 | #define AANSCALE_BITS 12 |
| 121 | | 84 | |
| 122 | #define NB_ITS 20000 | 85 | #define NB_ITS 20000 |
| 123 | #define NB_ITS_SPEED 50000 | 86 | #define NB_ITS_SPEED 50000 |
| 124 | | 87 | |
| 125 | static 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 | | | |
| 136 | static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 }; | | |
| 137 | | | |
| 138 | DECLARE_ALIGNED(16, static int16_t, block)[64]; | 88 | DECLARE_ALIGNED(16, static int16_t, block)[64]; |
| 139 | DECLARE_ALIGNED(8, static int16_t, block1)[64]; | 89 | DECLARE_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) |