You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
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>
This commit is contained in:
1
configure
vendored
1
configure
vendored
@@ -6261,6 +6261,7 @@ check_func_headers lzo/lzo1x.h lzo1x_999_compress
|
|||||||
check_func_headers mach/mach_time.h mach_absolute_time
|
check_func_headers mach/mach_time.h mach_absolute_time
|
||||||
check_func_headers stdlib.h getenv
|
check_func_headers stdlib.h getenv
|
||||||
check_func_headers sys/stat.h lstat
|
check_func_headers sys/stat.h lstat
|
||||||
|
check_func_headers sys/auxv.h getauxval
|
||||||
|
|
||||||
check_func_headers windows.h GetModuleHandle
|
check_func_headers windows.h GetModuleHandle
|
||||||
check_func_headers windows.h GetProcessAffinityMask
|
check_func_headers windows.h GetProcessAffinityMask
|
||||||
|
@@ -38,6 +38,10 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
|
|
||||||
|
#if HAVE_GETAUXVAL
|
||||||
|
#include <sys/auxv.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define AT_HWCAP 16
|
#define AT_HWCAP 16
|
||||||
|
|
||||||
/* Relevant HWCAP values from kernel headers */
|
/* Relevant HWCAP values from kernel headers */
|
||||||
@@ -48,6 +52,19 @@
|
|||||||
#define HWCAP_VFPv3 (1 << 13)
|
#define HWCAP_VFPv3 (1 << 13)
|
||||||
#define HWCAP_TLS (1 << 15)
|
#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)
|
static int get_hwcap(uint32_t *hwcap)
|
||||||
{
|
{
|
||||||
struct { uint32_t a_type; uint32_t a_val; } auxv;
|
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;
|
int flags = CORE_CPU_FLAGS;
|
||||||
uint32_t hwcap;
|
uint32_t hwcap;
|
||||||
|
|
||||||
if (get_hwcap(&hwcap) < 0)
|
if (get_auxval(&hwcap) < 0)
|
||||||
if (get_cpuinfo(&hwcap) < 0)
|
if (get_hwcap(&hwcap) < 0)
|
||||||
return flags;
|
if (get_cpuinfo(&hwcap) < 0)
|
||||||
|
return flags;
|
||||||
|
|
||||||
#define check_cap(cap, flag) do { \
|
#define check_cap(cap, flag) do { \
|
||||||
if (hwcap & HWCAP_ ## cap) \
|
if (hwcap & HWCAP_ ## cap) \
|
||||||
|
Reference in New Issue
Block a user