ffmpeg – android ndk build assembler messages bad instruction

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 instructioncmovg r2,r3′ /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4424: Error: bad instruction cmovl r1,r3' /var/folders/2p/0jqlz1c94t537_53qn3h8v9h0000gn/T//cc8Tnpth.s:4426: Error: bad instructioncmovg 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

Leave a Comment