Last active
August 31, 2016 11:52
-
-
Save alexandruc/d2bc868afde596fa6302 to your computer and use it in GitHub Desktop.
Gstreamer patch for android mips build - for cerbero rev 4df49a735b00134516bafa44301bf424108166f5
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/cerbero/enums.py b/cerbero/enums.py | |
index 88edefe..f80373e 100644 | |
--- a/cerbero/enums.py | |
+++ b/cerbero/enums.py | |
@@ -34,7 +34,7 @@ class Architecture: | |
UNIVERSAL = 'universal' | |
ARM = 'arm' | |
ARMv7 = 'armv7' | |
- | |
+ MIPS = 'mips' | |
class Distro: | |
''' Enumeration of supported distributions ''' | |
diff --git a/config/android.config b/config/android.config | |
index b0e3950..7a02419 100644 | |
--- a/config/android.config | |
+++ b/config/android.config | |
@@ -28,6 +28,19 @@ if target_arch == Architecture.ARM or target_arch == Architecture.ARMv7: | |
break | |
if toolchain_path: | |
break | |
+elif target_arch == Architecture.MIPS: | |
+ tools_prefix = 'mipsel-linux-android' | |
+ host = "mipsel-linux-android" | |
+ _arch = 'mips' | |
+ | |
+ for tc_version in ['4.8', '4.7', '4.6']: | |
+ for tc_arch in ['linux-x86', 'linux-x86_64']: | |
+ tmp = '%s/toolchains/mipsel-linux-android-%s/prebuilt/%s/bin' % (toolchain_prefix, tc_version, tc_arch) | |
+ if os.path.exists(tmp): | |
+ toolchain_path = tmp | |
+ break | |
+ if toolchain_path: | |
+ break | |
elif target_arch == Architecture.X86: | |
tools_prefix = 'i686-linux-android' | |
host = "i686-linux-android" | |
@@ -84,6 +97,10 @@ if target_arch in [Architecture.ARM, Architecture.ARMv7]: | |
ldflags += "-march=armv7-a -Wl,--fix-cortex-a8 " | |
if target_arch == Architecture.X86: | |
cflags += ' -march=i686 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300' | |
+if target_arch == Architecture.MIPS: | |
+ cflags += ' -march=mips32 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300' | |
+ ldflags += ' -march=mips32 ' | |
+ | |
# Toolchain environment | |
@@ -96,10 +113,15 @@ def cmd(command): | |
return '%s-%s' % (tools_prefix, command) | |
os.environ['CC']= '%s%s' % (ccache, cmd('gcc')) | |
-os.environ['CC'] += ' -fuse-ld=gold' | |
+if target_arch != Architecture.MIPS: | |
+ os.environ['CC'] += ' -fuse-ld=gold' | |
os.environ['CXX']= '%s%s' % (ccache, cmd('g++')) | |
-os.environ['CXX'] += ' -fuse-ld=gold' | |
-os.environ['LD']= cmd('ld.gold') | |
+if target_arch != Architecture.MIPS: | |
+ os.environ['CXX'] += ' -fuse-ld=gold' | |
+if target_arch == Architecture.MIPS: | |
+ os.environ['LD']= cmd('ld') | |
+else: | |
+ os.environ['LD']= cmd('ld.gold') | |
os.environ['CPP']= cmd('cpp') | |
os.environ['RANLIB']= cmd('ranlib') | |
os.environ['AR']= cmd('ar') | |
diff --git a/config/cross-android-mips.cbc b/config/cross-android-mips.cbc | |
new file mode 100644 | |
index 0000000..cf7d023 | |
--- /dev/null | |
+++ b/config/cross-android-mips.cbc | |
@@ -0,0 +1,9 @@ | |
+import os | |
+from cerbero.config import Platform, Architecture, Distro, DistroVersion | |
+ | |
+target_platform = Platform.ANDROID | |
+target_distro = Distro.ANDROID | |
+target_distro_version = DistroVersion.ANDROID_GINGERBREAD | |
+target_arch = Architecture.MIPS | |
+ | |
+#variants = ['nodebug'] | |
diff --git a/recipes/gnustl.recipe b/recipes/gnustl.recipe | |
index 3e593a9..c6d1423 100644 | |
--- a/recipes/gnustl.recipe | |
+++ b/recipes/gnustl.recipe | |
@@ -32,8 +32,10 @@ class Recipe(recipe.Recipe): | |
stl_libdir = os.path.join(stl_prefix, 'libs', 'x86') | |
elif self.config.target_arch == Architecture.ARMv7: | |
stl_libdir = os.path.join(stl_prefix, 'libs', 'armeabi-v7a') | |
- else: | |
+ elif self.config.target_arch == Architecture.ARM: | |
stl_libdir = os.path.join(stl_prefix, 'libs', 'armeabi') | |
+ else: | |
+ stl_libdir = os.path.join(stl_prefix, 'libs', 'mips') | |
libdir = os.path.join(self.config.prefix, 'lib') | |
if not os.path.exists(libdir): | |
os.makedirs(libdir) | |
diff --git a/recipes/libiconv.recipe b/recipes/libiconv.recipe | |
index d7d0024..d472822 100644 | |
--- a/recipes/libiconv.recipe | |
+++ b/recipes/libiconv.recipe | |
@@ -19,4 +19,4 @@ class Recipe(recipe.Recipe): | |
def prepare(self): | |
if self.config.target_platform != Platform.LINUX: | |
- self.runtime_dep = True | |
+ self.runtime_dep = True | |
\ No newline at end of file | |
diff --git a/recipes/libmad.recipe b/recipes/libmad.recipe | |
index ac16edf..e019963 100644 | |
--- a/recipes/libmad.recipe | |
+++ b/recipes/libmad.recipe | |
@@ -24,8 +24,11 @@ class Recipe(recipe.Recipe): | |
elif self.config.target_platform == Platform.DARWIN: | |
self.patches += ['libmad/0004-Remove-clang-unsupported-compiler-flags.patch'] | |
elif self.config.target_platform == Platform.ANDROID: | |
- if Architecture.is_arm(self.config.target_arch): | |
+ #if Architecture.is_arm(self.config.target_arch): | |
+ if self.config.target_arch == Architecture.ARM or self.config.target_arch == Architecture.ARMv7 or self.config.target_arch == Architecture.MIPS: | |
# Disable thumb mode to get the optimizations compiled properly | |
self.new_env['CFLAGS'] = os.environ['CFLAGS'].replace('-mthumb', '') | |
if self.config.target_arch == Architecture.X86: | |
self.new_env['CFLAGS'] = os.environ['CFLAGS'] + ' -fno-stack-protector' | |
+ if self.config.target_arch == Architecture.MIPS: | |
+ self.patches += ['libmad/0005-imp_constraint.patch'] | |
diff --git a/recipes/libmad/0005-imp_constraint.patch b/recipes/libmad/0005-imp_constraint.patch | |
new file mode 100644 | |
index 0000000..903ae03 | |
--- /dev/null | |
+++ b/recipes/libmad/0005-imp_constraint.patch | |
@@ -0,0 +1,34 @@ | |
+diff -u -r a/apps/codecs/libmad/fixed.h b/apps/codecs/libmad/fixed.h | |
+--- a/fixed.h | |
++++ b/fixed.h | |
+@@ -292,6 +292,21 @@ | |
+ | |
+ # elif defined(FPM_MIPS) | |
+ | |
++#if defined (__GNUC__) && defined (__GNUC_MINOR__) | |
++#define __GNUC_PREREQ(maj, min) ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) | |
++#else | |
++#define __GNUC_PREREQ(maj, min) 0 | |
++#endif | |
++ | |
++#if __GNUC_PREREQ(4,4) | |
++typedef unsigned int u64_di_t __attribute__ ((mode (DI))); | |
++# define MAD_F_MLX(hi, lo, x, y) \ | |
++do { \ | |
++ u64_di_t __ll = (u64_di_t) (x) * (y); \ | |
++ hi = __ll >> 32; \ | |
++ lo = __ll; \ | |
++}while(0) | |
++#else | |
+ /* | |
+ * This MIPS version is fast and accurate; the disposition of the least | |
+ * significant bit depends on OPT_ACCURACY via mad_f_scale64(). | |
+@@ -321,6 +336,8 @@ | |
+ : "%r" ((x) >> 12), "r" ((y) >> 16)) | |
+ # define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) | |
+ # endif | |
++ | |
++#endif /* __GNU_PREREQ(4,4) */ | |
+ | |
+ # if defined(OPT_SPEED) | |
+ # define mad_f_scale64(hi, lo) \ | |
diff --git a/recipes/libvpx.recipe b/recipes/libvpx.recipe | |
index 1604d60..b8bef71 100644 | |
--- a/recipes/libvpx.recipe | |
+++ b/recipes/libvpx.recipe | |
@@ -13,7 +13,7 @@ class Recipe(recipe.Recipe): | |
url = 'http://webm.googlecode.com/files/libvpx-v1.3.0.tar.bz2' | |
configure_tpl = "./configure --prefix=%(prefix)s "\ | |
"--libdir=%(libdir)s %(options)s" | |
- configure_options = "--enable-pic --as=yasm --disable-unit-tests " | |
+ configure_options = "--enable-pic --as=yasm --disable-unit-tests --disable-examples --disable-docs" | |
add_host_build_target = False | |
supports_cache_variables = False | |
can_use_configure_cache = False | |
@@ -26,6 +26,8 @@ class Recipe(recipe.Recipe): | |
'libvpx/0006-Add-armv7s-ios-support.patch', | |
'libvpx/0007-configure-quote-local-variables-correctly.patch', | |
'libvpx/0008-Add-support-for-iOS-simulator-on-x86-64.patch', | |
+ 'libvpx/0009-configure-mips.patch', | |
+ 'libvpx/0010-androidmk-mips.patch', | |
] | |
files_libs = ['libvpx'] | |
@@ -47,8 +49,10 @@ class Recipe(recipe.Recipe): | |
arch = 'arm' | |
elif self.config.target_arch == Architecture.ARMv7: | |
arch = 'armv7' | |
- elif self.config.target_arch == Architecture.ARMv7S: | |
- arch = 'armv7s' | |
+ #elif self.config.target_arch == Architecture.ARMv7S: | |
+ # arch = 'armv7s' | |
+ elif self.config.target_arch == Architecture.MIPS: | |
+ arch = 'mips' | |
self.new_env['LD'] = os.environ.get('CC', 'gcc') | |
if self.config.target_platform == Platform.DARWIN: | |
@@ -94,6 +98,8 @@ class Recipe(recipe.Recipe): | |
pass | |
elif self.config.target_arch == Architecture.X86: | |
pass | |
+ elif self.config.target_arch == Architecture.MIPS: | |
+ arch = 'mips32' | |
else: | |
raise FatalError("Unsupported Android architecture %s" % self.config.target_arch) | |
self.config_sh = 'LD=$CC ./configure' | |
diff --git a/recipes/libvpx/0009-configure-mips.patch b/recipes/libvpx/0009-configure-mips.patch | |
new file mode 100644 | |
index 0000000..fa33b61 | |
--- /dev/null | |
+++ b/recipes/libvpx/0009-configure-mips.patch | |
@@ -0,0 +1,11 @@ | |
+--- a/configure | |
++++ b/configure | |
+@@ -102,6 +102,7 @@ all_platforms="${all_platforms} mips32-android-gcc" | |
+ all_platforms="${all_platforms} armv7-win32-vs11" | |
+ all_platforms="${all_platforms} armv7-win32-vs12" | |
+ all_platforms="${all_platforms} mips32-linux-gcc" | |
++all_platforms="${all_platforms} mips32-android-gcc" | |
+ all_platforms="${all_platforms} ppc32-darwin8-gcc" | |
+ all_platforms="${all_platforms} ppc32-darwin9-gcc" | |
+ all_platforms="${all_platforms} ppc32-linux-gcc"-- | |
+ | |
diff --git a/recipes/libvpx/0010-androidmk-mips.patch b/recipes/libvpx/0010-androidmk-mips.patch | |
new file mode 100644 | |
index 0000000..5e9eb02 | |
--- /dev/null | |
+++ b/recipes/libvpx/0010-androidmk-mips.patch | |
@@ -0,0 +1,106 @@ | |
+diff --git a/build/make/Android.mk b/build/make/Android.mk | |
+index 48a0dd7..369c2a5 100644 | |
+--- a/build/make/Android.mk | |
++++ b/build/make/Android.mk | |
+@@ -53,12 +53,20 @@ | |
+ ASM_CNV_PATH_LOCAL := $(TARGET_ARCH_ABI)/ads2gas | |
+ ASM_CNV_PATH := $(LOCAL_PATH)/$(ASM_CNV_PATH_LOCAL) | |
+ | |
+-# Makefiles created by the libvpx configure process | |
+-# This will need to be fixed to handle x86. | |
++# Use the makefiles generated by upstream configure to determine which files to | |
++# build. Also set any architecture-specific flags. | |
+ ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) | |
+ include $(CONFIG_DIR)libs-armv7-android-gcc.mk | |
+-else | |
++ LOCAL_ARM_MODE := arm | |
++else ifeq ($(TARGET_ARCH_ABI),armeabi) | |
+ include $(CONFIG_DIR)libs-armv5te-android-gcc.mk | |
++ LOCAL_ARM_MODE := arm | |
++else ifeq ($(TARGET_ARCH_ABI),x86) | |
++ include $(CONFIG_DIR)libs-x86-android-gcc.mk | |
++else ifeq ($(TARGET_ARCH_ABI),mips) | |
++ include $(CONFIG_DIR)libs-mips-android-gcc.mk | |
++else | |
++ $(error Not a supported TARGET_ARCH_ABI: $(TARGET_ARCH_ABI)) | |
+ endif | |
+ | |
+ # Rule that is normally in Makefile created by libvpx | |
+@@ -72,9 +80,12 @@ | |
+ # Include the list of files to be built | |
+ include $(LIBVPX_PATH)/libs.mk | |
+ | |
+-# Want arm, not thumb, optimized | |
+-LOCAL_ARM_MODE := arm | |
++# Optimise the code. May want to revisit this setting in the future. | |
+ LOCAL_CFLAGS := -O3 | |
++ | |
++# For x86, include the source code in the search path so it will find files | |
++# like x86inc.asm and x86_abi_support.asm | |
++LOCAL_ASMFLAGS := -I$(LIBVPX_PATH) | |
+ | |
+ # ----------------------------------------------------------------------------- | |
+ # Template : asm_offsets_template | |
+@@ -109,7 +120,7 @@ | |
+ @grep $(OFFSET_PATTERN) $$< | tr -d '\#' | $(CONFIG_DIR)$(ASM_CONVERSION) > $$@ | |
+ endef | |
+ | |
+-# Use ads2gas script to convert from RVCT format to GAS format. This passes | |
++# Use ads2gas script to convert from RVCT format to GAS format. This | |
+ # puts the processed file under $(ASM_CNV_PATH). Local clean rule | |
+ # to handle removing these | |
+ ifeq ($(CONFIG_VP8_ENCODER), yes) | |
+@@ -146,18 +157,26 @@ | |
+ | |
+ # Pull out assembly files, splitting NEON from the rest. This is | |
+ # done to specify that the NEON assembly files use NEON assembler flags. | |
+-CODEC_SRCS_ASM_ALL = $(filter %.asm.s, $(CODEC_SRCS_UNIQUE)) | |
+-CODEC_SRCS_ASM = $(foreach v, \ | |
+- $(CODEC_SRCS_ASM_ALL), \ | |
+- $(if $(findstring neon,$(v)),,$(v))) | |
++# x86 assembly matches %.asm, arm matches %.asm.s | |
++ | |
++# x86: | |
++ | |
++CODEC_SRCS_ASM_X86 = $(filter %.asm, $(CODEC_SRCS_UNIQUE)) | |
++LOCAL_SRC_FILES += $(foreach file, $(CODEC_SRCS_ASM_X86), libvpx/$(file)) | |
++ | |
++# arm: | |
++CODEC_SRCS_ASM_ARM_ALL = $(filter %.asm.s, $(CODEC_SRCS_UNIQUE)) | |
++CODEC_SRCS_ASM_ARM = $(foreach v, \ | |
++ $(CODEC_SRCS_ASM_ARM_ALL), \ | |
++ $(if $(findstring neon,$(v)),,$(v))) | |
+ CODEC_SRCS_ASM_ADS2GAS = $(patsubst %.s, \ | |
+ $(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \ | |
+- $(CODEC_SRCS_ASM)) | |
++ $(CODEC_SRCS_ASM_ARM)) | |
+ LOCAL_SRC_FILES += $(CODEC_SRCS_ASM_ADS2GAS) | |
+ | |
+ ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) | |
+ CODEC_SRCS_ASM_NEON = $(foreach v, \ | |
+- $(CODEC_SRCS_ASM_ALL),\ | |
++ $(CODEC_SRCS_ASM_ARM_ALL),\ | |
+ $(if $(findstring neon,$(v)),$(v),)) | |
+ CODEC_SRCS_ASM_NEON_ADS2GAS = $(patsubst %.s, \ | |
+ $(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \ | |
+@@ -189,6 +208,10 @@ | |
+ endif | |
+ $(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vpx_scale_rtcd.h | |
+ | |
++ifeq ($(TARGET_ARCH_ABI),x86) | |
++$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vpx_config.asm | |
++endif | |
++ | |
+ .PHONY: clean | |
+ clean: | |
+ @echo "Clean: ads2gas files [$(TARGET_ARCH_ABI)]" | |
+diff --git a/test/android/README b/test/android/README | |
+index 6840d91..4a1adcf 100644 | |
+--- a/test/android/README | |
++++ b/test/android/README | |
+@@ -3,7 +3,7 @@ | |
+ ./libvpx/configure --target=armv7-android-gcc --enable-external-build \ | |
+ --enable-postproc --disable-install-srcs --enable-multi-res-encoding \ | |
+ --enable-temporal-denoising --disable-unit-tests --disable-install-docs \ | |
+- --disable-examples --disable-runtime-cpu-detect --sdk=$NDK | |
++ --disable-examples --disable-runtime-cpu-detect --sdk-path=$NDK |
Sorry for the loong delay for the response. I simply don't get notifications for comments for gists.
I see you have used a patch. I hope it's working. if you need any help, let me know.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I can't comment on your blog it seems, so a comment here instead...
The official GStreamer website is http://gstreamer.freedesktop.org , gstreamer.com was just a project by some companies in the past that is no longer maintained and provides completely outdated versions of GStreamer (3+ years by now).
You can also get the latest version of cerbero at https://cgit.freedesktop.org/gstreamer/cerbero/ , which can be used to build newer versions of GStreamer but still has no MIPS support.
Would you mind providing your patch to the GStreamer project at https://bugzilla.gnome.org/show_bug.cgi?id=734188 ? Thanks :)