|
|
@@ -34,6 +34,8 @@ |
|
|
|
|
|
|
|
#include <stdint.h> |
|
|
|
#include <stdio.h> |
|
|
|
#include <string.h> |
|
|
|
#include "libavutil/avstring.h" |
|
|
|
|
|
|
|
#define AT_HWCAP 16 |
|
|
|
|
|
|
@@ -66,13 +68,44 @@ static int get_hwcap(uint32_t *hwcap) |
|
|
|
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 flags = CORE_CPU_FLAGS; |
|
|
|
uint32_t hwcap; |
|
|
|
|
|
|
|
if (get_hwcap(&hwcap) < 0) |
|
|
|
return flags; |
|
|
|
if (get_cpuinfo(&hwcap) < 0) |
|
|
|
return flags; |
|
|
|
|
|
|
|
#define check_cap(cap, flag) do { \ |
|
|
|
if (hwcap & HWCAP_ ## cap) \ |
|
|
|