mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
arm: Fall back to runtime cpu feature detection via /proc/cpuinfo
On recent android versions, /proc/self/auxw is unreadable (unless the process is running running under the shell uid or in debuggable mode, which makes it hard to notice). See http://b.android.com/43055 and https://android-review.googlesource.com/51271 for more information about the issue. This makes sure e.g. neon optimizations are enabled at runtime in android apps even when built in release mode, if configured to use the runtime detection. CC: libav-stable@libav.org Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
d46d87d1d3
commit
ab8f1a6989
@ -34,6 +34,8 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "libavutil/avstring.h"
|
||||||
|
|
||||||
#define AT_HWCAP 16
|
#define AT_HWCAP 16
|
||||||
|
|
||||||
@ -66,13 +68,44 @@ static int get_hwcap(uint32_t *hwcap)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_cpuinfo(uint32_t *hwcap)
|
||||||
|
{
|
||||||
|
FILE *f = fopen("/proc/cpuinfo", "r");
|
||||||
|
char buf[200];
|
||||||
|
|
||||||
|
if (!f)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
*hwcap = 0;
|
||||||
|
while (fgets(buf, sizeof(buf), f)) {
|
||||||
|
if (av_strstart(buf, "Features", NULL)) {
|
||||||
|
if (strstr(buf, " edsp "))
|
||||||
|
*hwcap |= HWCAP_EDSP;
|
||||||
|
if (strstr(buf, " tls "))
|
||||||
|
*hwcap |= HWCAP_TLS;
|
||||||
|
if (strstr(buf, " thumbee "))
|
||||||
|
*hwcap |= HWCAP_THUMBEE;
|
||||||
|
if (strstr(buf, " vfp "))
|
||||||
|
*hwcap |= HWCAP_VFP;
|
||||||
|
if (strstr(buf, " vfpv3 "))
|
||||||
|
*hwcap |= HWCAP_VFPv3;
|
||||||
|
if (strstr(buf, " neon "))
|
||||||
|
*hwcap |= HWCAP_NEON;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int ff_get_cpu_flags_arm(void)
|
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_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) \
|
||||||
|
Loading…
Reference in New Issue
Block a user