Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAman Karmani <aman@tmm1.net>2022-02-04 23:14:57 +0300
committerAman Karmani <aman@tmm1.net>2022-02-08 00:42:40 +0300
commit2f299c0b8b4ab1b549b25ab48aa2adbc9f8718ea (patch)
treeb0c09870906bf6331e3e662d46b1640429d7ed29 /libavutil/arm
parent04cc7a5548fa22241a2d6bb4f719fe8e0e0843f1 (diff)
avutil: use getauxval(3) for CPU capabilities on linux/android ARM
getauxval is marginally faster, and works even when procfs is not mounted support on Linux was added in glibc 2.16 support on Android was added in 4.4 (API 20) fixes #6578 Signed-off-by: Aman Karmani <aman@tmm1.net>
Diffstat (limited to 'libavutil/arm')
-rw-r--r--libavutil/arm/cpu.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/libavutil/arm/cpu.c b/libavutil/arm/cpu.c
index 81e85e2525..c84a655c37 100644
--- a/libavutil/arm/cpu.c
+++ b/libavutil/arm/cpu.c
@@ -38,6 +38,10 @@
#include <string.h>
#include "libavutil/avstring.h"
+#if HAVE_GETAUXVAL
+#include <sys/auxv.h>
+#endif
+
#define AT_HWCAP 16
/* Relevant HWCAP values from kernel headers */
@@ -48,6 +52,19 @@
#define HWCAP_VFPv3 (1 << 13)
#define HWCAP_TLS (1 << 15)
+static int get_auxval(uint32_t *hwcap)
+{
+#if HAVE_GETAUXVAL
+ unsigned long ret = getauxval(AT_HWCAP);
+ if (ret == 0)
+ return -1;
+ *hwcap = ret;
+ return 0;
+#else
+ return -1;
+#endif
+}
+
static int get_hwcap(uint32_t *hwcap)
{
struct { uint32_t a_type; uint32_t a_val; } auxv;
@@ -106,9 +123,10 @@ int ff_get_cpu_flags_arm(void)
int flags = CORE_CPU_FLAGS;
uint32_t hwcap;
- if (get_hwcap(&hwcap) < 0)
- if (get_cpuinfo(&hwcap) < 0)
- return flags;
+ if (get_auxval(&hwcap) < 0)
+ if (get_hwcap(&hwcap) < 0)
+ if (get_cpuinfo(&hwcap) < 0)
+ return flags;
#define check_cap(cap, flag) do { \
if (hwcap & HWCAP_ ## cap) \