Issue
I have compiled the latest ffmpeg source using the following build script adapted from Telegram :
#!/bin/bash
#apply fix http://permalink.gmane.org/gmane.comp.video.ffmpeg.devel/203198
function build_one {
echo "Cleaning..."
make clean
echo "Configuring..."
./configure \
--cc$CC \
--nm$NM \
--enable-stripping \
--arch$ARCH \
--cpu$CPU \
--target-oslinux \
--enable-cross-compile \
--yasmexe$NDK/prebuilt/darwin-x86_64/bin/yasm \
--prefix$PREFIX \
--enable-pic \
--disable-shared \
--enable-static \
--cross-prefix$CROSS_PREFIX \
--sysroot$PLATFORM \
--extra-cflags"-Os -DANDROID $OPTIMIZE_CFLAGS -fPIE -pie --static" \
--extra-ldflags"-Wl,-rpath-link$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl" \
--extra-libs"-lgcc" \
\
--enable-version3 \
--enable-gpl \
\
--disable-doc \
--disable-avx \
\
--disable-everything \
--disable-network \
--disable-zlib \
--disable-debug \
--disable-programs \
--disable-network \
\
--enable-pthreads \
--enable-protocolfile \
--enable-decoderh264 \
--enable-decodergif \
--enable-demuxermov \
--enable-demuxergif \
--enable-hwaccels \
--enable-runtime-cpudetect \
--enable-asm \
$ADDITIONAL_CONFIGURE_FLAG
#echo "continue?"
#read
make -j8 install
}
NDK~/Downloads/android-ndk-r12b/
#arm platform
PLATFORM$NDK/platforms/android-9/arch-arm
PREBUILT$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
LD$PREBUILT/bin/arm-linux-androideabi-ld
AR$PREBUILT/bin/arm-linux-androideabi-ar
NM$PREBUILT/bin/arm-linux-androideabi-nm
GCCLIB$PREBUILT/lib/gcc/arm-linux-androideabi/4.9/libgcc.a
ARCHarm
CC$PREBUILT/bin/arm-linux-androideabi-gcc
CROSS_PREFIX$PREBUILT/bin/arm-linux-androideabi-
#arm v5
CPUarmv5te
OPTIMIZE_CFLAGS"-marm -march$CPU"
PREFIX./android/$CPU
ADDITIONAL_CONFIGURE_FLAG"--disable-armv6 --disable-armv6t2 --disable-vfp --disable-neon"
build_one
#arm v7n
CPUarmv7-a
OPTIMIZE_CFLAGS"-marm -march$CPU"
PREFIX./android/$CPU
ADDITIONAL_CONFIGURE_FLAG--enable-neon
build_one
#x86 platform
PLATFORM$NDK/platforms/android-9/arch-x86
PREBUILT$NDK/toolchains/x86-4.9/prebuilt/darwin-x86_64
LD$PREBUILT/bin/i686-linux-android-ld
AR$PREBUILT/bin/i686-linux-android-ar
NM$PREBUILT/bin/i686-linux-android-nm
GCCLIB$PREBUILT/lib/gcc/i686-linux-android/4.9/libgcc.a
ARCHx86
CC$PREBUILT/bin/i686-linux-android-gcc
CROSS_PREFIX$PREBUILT/bin/i686-linux-android-
CPUi686
OPTIMIZE_CFLAGS"-march$CPU"
PREFIX./android/$CPU
ADDITIONAL_CONFIGURE_FLAG"--disable-mmx --disable-yasm"
build_one
I copied the contents of the android/ folder generated to jni/ffmpeg/. I then tried to do a ndk-build, which fails with an error.
The Android.mk file is as follows :
LOCAL_PATH : $(call my-dir)
LOCAL_MODULE : avutil
LOCAL_MODULE_FILENAME : libavutil
LOCAL_SRC_FILES : ./ffmpeg/armv7-a/lib/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : avformat
LOCAL_MODULE_FILENAME : libavformat
LOCAL_SRC_FILES : ./ffmpeg/armv7-a/lib/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : avcodec
LOCAL_MODULE_FILENAME : libavcodec
LOCAL_SRC_FILES : ./ffmpeg/armv7-a/lib/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : avdevice
LOCAL_MODULE_FILENAME : libavdevice
LOCAL_SRC_FILES : ./ffmpeg/armv7-a/lib/libavdevice.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : avfilter
LOCAL_MODULE_FILENAME : libavfilter
LOCAL_SRC_FILES : ./ffmpeg/armv7-a/lib/libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : postproc
LOCAL_MODULE_FILENAME : libpostproc
LOCAL_SRC_FILES : ./ffmpeg/armv7-a/lib/libpostproc.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : swresample
LOCAL_MODULE_FILENAME : libswresample
LOCAL_SRC_FILES : ./ffmpeg/armv7-a/lib/libswresample.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : swscale
LOCAL_MODULE_FILENAME : libswscale
LOCAL_SRC_FILES : ./ffmpeg/armv7-a/lib/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE : false
LOCAL_MODULE : ffmpeg
LOCAL_CFLAGS : -w -stdc11 -Os -DNULL0 -DSOCKLEN_Tsocklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE1 -D_FILE_OFFSET_BITS64
LOCAL_CFLAGS + -Drestrict'' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -fno-math-errno
LOCAL_CFLAGS + -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math -D__STDC_CONSTANT_MACROS
LOCAL_CPPFLAGS : -DBSD1 -ffast-math -Os -funroll-loops -stdc++11
LOCAL_LDLIBS : -ljnigraphics -llog -lz -latomic
LOCAL_STATIC_LIBRARIES : avformat avcodec avutil avfilter avdevice postproc swresample swscale
LOCAL_SRC_FILES : ffmpeg.c
include $(BUILD_SHARED_LIBRARY)
The error thrown is :
[armeabi-v7a] Compile thumb : ffmpeg < ffmpeg.c /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s: Assembler messages: /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4421: Error: bad instruction
cmovg r3,r8' /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4422: Error: bad instruction
cmovg r2,r3′ /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4424: Error: bad instructioncmovl r1,r3' /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4426: Error: bad instruction
cmovg r3,r8′ make: *** [path/to/app/obj/local/armeabi-v7a/objs/ffmpeg/ffmpeg.o] Error 1
I am guessing i got the compiler wrong somewhere. I am trying to build on a mac. Is there something i am missing? I am trying to build only for armeabi-v7a.
Solution
You need to include local c files and Config.h file
like this.
LOCAL_PATH : $(call my-dir)
LOCAL_MODULE : libavcodec
LOCAL_CFLAGS : -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS : -Wl,--gc-sections,--icfsafe
LOCAL_C_INCLUDES : ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS + -marcharmv7-a -mfloat-abisoftfp
LOCAL_SRC_FILES : ../obj/local/$(TARGET_ARCH_ABI)/lib/libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : libavfilter
LOCAL_CFLAGS : -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS : -Wl,--gc-sections,--icfsafe
LOCAL_C_INCLUDES : ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS + -marcharmv7-a -mfloat-abisoftfp
LOCAL_SRC_FILES : ../obj/local/$(TARGET_ARCH_ABI)/lib/libavfilter.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : libavformat
LOCAL_CFLAGS : -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS : -Wl,--gc-sections,--icfsafe
LOCAL_C_INCLUDES : ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS + -marcharmv7-a -mfloat-abisoftfp
LOCAL_SRC_FILES : ../obj/local/$(TARGET_ARCH_ABI)/lib/libavformat.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : libavutil
LOCAL_CFLAGS : -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS : -Wl,--gc-sections,--icfsafe
LOCAL_C_INCLUDES : ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS + -marcharmv7-a -mfloat-abisoftfp
LOCAL_SRC_FILES : ../obj/local/$(TARGET_ARCH_ABI)/lib/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE : libswscale
LOCAL_CFLAGS : -Os -ffunction-sections -fdata-sections
LOCAL_LDFLAGS : -Wl,--gc-sections,--icfsafe
LOCAL_C_INCLUDES : ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_CFLAGS + -marcharmv7-a -mfloat-abisoftfp
LOCAL_SRC_FILES : ../obj/local/$(TARGET_ARCH_ABI)/lib/libswscale.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_DISABLE_FATAL_LINKER_WARNINGS : true
LOCAL_LDLIBS : -llog -landroid -lz -lm
LOCAL_CFLAGS : -Os -ffunction-sections -fdata-sections -fvisibilityhidden -flto
LOCAL_LDFLAGS : -Wl,--gc-sections,--icfsafe
LOCAL_CFLAGS + -marcharmv7-a -mfloat-abisoftfp
LOCAL_STATIC_LIBRARIES : libavfilter libavformat libavcodec libswscale libavutil
LOCAL_C_INCLUDES : $(LOCAL_PATH)/ffmpeg
LOCAL_C_INCLUDES + ../obj/local/$(TARGET_ARCH_ABI)/include
LOCAL_C_INCLUDES + $(LOCAL_PATH)/ffmpeg/$(TARGET_ARCH_ABI)-config
LOCAL_SRC_FILES : ffmpeg/ffmpeg.c ffmpeg/cmdutils.c ffmpeg/ffmpeg_filter.c ffmpeg/ffmpeg_opt.c
LOCAL_MODULE : videokit
include $(BUILD_SHARED_LIBRARY)
Answered By – Sabish.M