Unified · Split
| @@ -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 | + | |
| 23 | +static const struct algo fdct_tab_arch[] = { | |
| 24 | + { 0 } | |
| 25 | +}; | |
| 26 | + | |
| 27 | +static 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 | +}; | |
| @@ -45,11 +45,6 @@ · 44 unmodified lines | ||
| 45 | 45 | #include "aandcttab.h" |
| 46 | 46 | #include "faandct.h" |
| 47 | 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 | 48 | #include "dctref.h" |
| 54 | 49 | |
| 55 | 50 | struct algo { |
| @@ -60,81 +55,36 @@ struct algo { · 4 unmodified lines | ||
| 60 | 55 | int nonspec; |
| 61 | 56 | }; |
| 62 | 57 | |
| 63 | −static const struct algo fdct_tab[] = { | |
| 58 | +static const struct algo fdct_tab[4] = { | |
| 64 | 59 | { "REF-DBL", ff_ref_fdct, FF_IDCT_PERM_NONE }, |
| 65 | 60 | { "FAAN", ff_faandct, FF_IDCT_PERM_NONE }, |
| 66 | 61 | { "IJG-AAN-INT", ff_fdct_ifast, FF_IDCT_PERM_NONE }, |
| 67 | 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 | 66 | { "FAANI", ff_faanidct, FF_IDCT_PERM_NONE }, |
| 88 | 67 | { "REF-DBL", ff_ref_idct, FF_IDCT_PERM_NONE }, |
| 89 | 68 | { "INT", ff_j_rev_dct, FF_IDCT_PERM_LIBMPEG2 }, |
| 90 | 69 | { "SIMPLE-C", ff_simple_idct_8, FF_IDCT_PERM_NONE }, |
| 91 | − | |
| 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 | |
| 70 | +}; | |
| 102 | 71 | |
| 103 | 72 | #if ARCH_ARM |
| 104 | − { "SIMPLE-ARM", ff_simple_idct_arm, FF_IDCT_PERM_NONE }, | |
| 105 | − { "INT-ARM", ff_j_rev_dct_arm, FF_IDCT_PERM_LIBMPEG2 }, | |
| 106 | −#endif | |
| 107 | −#if HAVE_ARMV5TE | |
| 108 | − { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te, FF_IDCT_PERM_NONE, AV_CPU_FLAG_ARMV5TE }, | |
| 109 | −#endif | |
| 110 | −#if HAVE_ARMV6 | |
| 111 | − { "SIMPLE-ARMV6", ff_simple_idct_armv6, FF_IDCT_PERM_LIBMPEG2, AV_CPU_FLAG_ARMV6 }, | |
| 112 | −#endif | |
| 113 | −#if HAVE_NEON && ARCH_ARM | |
| 114 | − { "SIMPLE-NEON", ff_simple_idct_neon, FF_IDCT_PERM_PARTTRANS, AV_CPU_FLAG_NEON }, | |
| 73 | +#include "arm/dct-test.c" | |
| 74 | +#elif ARCH_PPC | |
| 75 | +#include "ppc/dct-test.c" | |
| 76 | +#elif ARCH_X86 | |
| 77 | +#include "x86/dct-test.c" | |
| 78 | +#else | |
| 79 | +static const struct algo fdct_tab_arch[] = { 0 }; | |
| 80 | +static const struct algo idct_tab_arch[] = { 0 }; | |
| 115 | 81 | #endif |
| 116 | 82 | |
| 117 | − { 0 } | |
| 118 | −}; | |
| 119 | − | |
| 120 | 83 | #define AANSCALE_BITS 12 |
| 121 | 84 | |
| 122 | 85 | #define NB_ITS 20000 |
| 123 | 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 | 88 | DECLARE_ALIGNED(16, static int16_t, block)[64]; |
| 139 | 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 | 122 | int i; |
| 173 | 123 | |
| 124 | +#if ARCH_X86 | |
| 125 | + if (permute_x86(dst, src, perm_type)) | |
| 126 | + return; | |
| 127 | +#endif | |
| 128 | + | |
| 174 | 129 | switch (perm_type) { |
| 175 | 130 | case FF_IDCT_PERM_LIBMPEG2: |
| 176 | 131 | for (i = 0; i < 64; i++) |
| 177 | 132 | dst[(i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2)] = src[i]; |
| 178 | 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 | 134 | case FF_IDCT_PERM_PARTTRANS: |
| 188 | 135 | for (i = 0; i < 64; i++) |
| 189 | 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 | 436 | idct248_error("SIMPLE-C", ff_simple_idct248_put, speed); |
| 490 | 437 | } else { |
| 491 | 438 | const int cpu_flags = av_get_cpu_flags(); |
| 492 | − const struct algo *algos = test_idct ? idct_tab : fdct_tab; | |
| 493 | − for (i = 0; algos[i].name; i++) | |
| 494 | − if (!(~cpu_flags & algos[i].cpu_flag)) { | |
| 495 | − err |= dct_error(&algos[i], test, test_idct, speed); | |
| 496 | − } | |
| 439 | + if (test_idct) { | |
| 440 | + for (i = 0; i < FF_ARRAY_ELEMS(idct_tab); i++) | |
| 441 | + err |= dct_error(&idct_tab[i], test, test_idct, speed); | |
| 442 | + | |
| 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 | 456 | if (err) |
| @@ -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 | + | |
| 23 | +static 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 | + | |
| 30 | +static const struct algo idct_tab_arch[] = { | |
| 31 | + { 0 } | |
| 32 | +}; | |
| @@ -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 | + | |
| 25 | +static 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 | + | |
| 38 | +static 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 | + | |
| 52 | +static 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 | + | |
| 63 | +static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 }; | |
| 64 | + | |
| 65 | +static 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 | +} | |