[FFmpeg-cvslog] arm: Fall back to runtime cpu feature detection via /proc/cpuinfo

Martin Storsjö git at videolan.org
Tue Feb 12 12:47:56 CET 2013


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Thu Feb  7 10:54:20 2013 +0200| [ab8f1a698990c33afb4c1c6ae5af3d6de4f696cb] | committer: Martin Storsjö

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 at libav.org
Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ab8f1a698990c33afb4c1c6ae5af3d6de4f696cb
---

 libavutil/arm/cpu.c |   35 ++++++++++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/libavutil/arm/cpu.c b/libavutil/arm/cpu.c
index 041afc9..b4aabc3 100644
--- a/libavutil/arm/cpu.c
+++ b/libavutil/arm/cpu.c
@@ -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)              \



More information about the ffmpeg-cvslog mailing list