diff options
author | Mans Rullgard <mans@mansr.com> | 2012-04-21 15:31:10 +0100 |
---|---|---|
committer | Mans Rullgard <mans@mansr.com> | 2012-04-22 12:30:45 +0100 |
commit | d526c5338d50d12a54fd95130030c60070707d3e (patch) | |
tree | 5cac97b8414872d2bdf977292e63ef8edf3eb49a /libavutil | |
parent | d7458bc8c62ae1cb2ffc805b989fcddf4029dda6 (diff) | |
download | ffmpeg-d526c5338d50d12a54fd95130030c60070707d3e.tar.gz |
ARM: allow runtime masking of CPU features
This allows masking CPU features with the -cpuflags avconv option
which is useful for testing different optimisations without rebuilding.
Signed-off-by: Mans Rullgard <mans@mansr.com>
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/arm/Makefile | 1 | ||||
-rw-r--r-- | libavutil/arm/cpu.c | 30 | ||||
-rw-r--r-- | libavutil/arm/cpu.h | 32 | ||||
-rw-r--r-- | libavutil/cpu.c | 10 | ||||
-rw-r--r-- | libavutil/cpu.h | 8 |
5 files changed, 80 insertions, 1 deletions
diff --git a/libavutil/arm/Makefile b/libavutil/arm/Makefile new file mode 100644 index 0000000000..246f73a8ac --- /dev/null +++ b/libavutil/arm/Makefile @@ -0,0 +1 @@ +OBJS += arm/cpu.o diff --git a/libavutil/arm/cpu.c b/libavutil/arm/cpu.c new file mode 100644 index 0000000000..33dca1c65a --- /dev/null +++ b/libavutil/arm/cpu.c @@ -0,0 +1,30 @@ +/* + * 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 "libavutil/cpu.h" +#include "config.h" + +int ff_get_cpu_flags_arm(void) +{ + return AV_CPU_FLAG_ARMV5TE * HAVE_ARMV5TE | + AV_CPU_FLAG_ARMV6 * HAVE_ARMV6 | + AV_CPU_FLAG_ARMV6T2 * HAVE_ARMV6T2 | + AV_CPU_FLAG_VFP * HAVE_ARMVFP | + AV_CPU_FLAG_VFPV3 * HAVE_VFPV3 | + AV_CPU_FLAG_NEON * HAVE_NEON; +} diff --git a/libavutil/arm/cpu.h b/libavutil/arm/cpu.h new file mode 100644 index 0000000000..72e16d409f --- /dev/null +++ b/libavutil/arm/cpu.h @@ -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 + */ + +#ifndef AVUTIL_ARM_CPU_H +#define AVUTIL_ARM_CPU_H + +#include "config.h" +#include "libavutil/cpu.h" + +#define have_armv5te(flags) (HAVE_ARMV5TE && ((flags) & AV_CPU_FLAG_ARMV5TE)) +#define have_armv6(flags) (HAVE_ARMV6 && ((flags) & AV_CPU_FLAG_ARMV6)) +#define have_armv6t2(flags) (HAVE_ARMV6T2 && ((flags) & AV_CPU_FLAG_ARMV6T2)) +#define have_vfp(flags) (HAVE_ARMVFP && ((flags) & AV_CPU_FLAG_VFP)) +#define have_vfpv3(flags) (HAVE_VFPV3 && ((flags) & AV_CPU_FLAG_VFPV3)) +#define have_neon(flags) (HAVE_NEON && ((flags) & AV_CPU_FLAG_NEON)) + +#endif diff --git a/libavutil/cpu.c b/libavutil/cpu.c index 6fc13adbca..e23d40180f 100644 --- a/libavutil/cpu.c +++ b/libavutil/cpu.c @@ -28,6 +28,7 @@ int av_get_cpu_flags(void) if (checked) return flags; + if (ARCH_ARM) flags = ff_get_cpu_flags_arm(); if (ARCH_PPC) flags = ff_get_cpu_flags_ppc(); if (ARCH_X86) flags = ff_get_cpu_flags_x86(); @@ -52,7 +53,14 @@ static const struct { int flag; const char *name; } cpu_flag_tab[] = { -#if ARCH_PPC +#if ARCH_ARM + { AV_CPU_FLAG_ARMV5TE, "armv5te" }, + { AV_CPU_FLAG_ARMV6, "armv6" }, + { AV_CPU_FLAG_ARMV6T2, "armv6t2" }, + { AV_CPU_FLAG_VFP, "vfp" }, + { AV_CPU_FLAG_VFPV3, "vfpv3" }, + { AV_CPU_FLAG_NEON, "neon" }, +#elif ARCH_PPC { AV_CPU_FLAG_ALTIVEC, "altivec" }, #elif ARCH_X86 { AV_CPU_FLAG_MMX, "mmx" }, diff --git a/libavutil/cpu.h b/libavutil/cpu.h index 55ad7d17a9..0c0b1de8f0 100644 --- a/libavutil/cpu.h +++ b/libavutil/cpu.h @@ -42,6 +42,13 @@ #define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions #define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard +#define AV_CPU_FLAG_ARMV5TE (1 << 0) +#define AV_CPU_FLAG_ARMV6 (1 << 1) +#define AV_CPU_FLAG_ARMV6T2 (1 << 2) +#define AV_CPU_FLAG_VFP (1 << 3) +#define AV_CPU_FLAG_VFPV3 (1 << 4) +#define AV_CPU_FLAG_NEON (1 << 5) + /** * Return the flags which specify extensions supported by the CPU. */ @@ -56,6 +63,7 @@ int av_get_cpu_flags(void); void av_set_cpu_flags_mask(int mask); /* The following CPU-specific functions shall not be called directly. */ +int ff_get_cpu_flags_arm(void); int ff_get_cpu_flags_ppc(void); int ff_get_cpu_flags_x86(void); |