[FFmpeg-user] Cross-compile ffmpeg with android ndk and libspeex fails
Marcin Griszbacher
marcin.griszbacher at gmail.com
Mon Sep 19 20:37:24 EEST 2016
Hello. I need to build ffmpeg as library for android. I use slightly modified bambuser script and I made it work on current ffmpeg version (I needed some ADPCM and H264 decoders). Recently I found out I need Speex decoder (and possibly encoder) as well, so I tried adding it to project. However this is where I find problems. I can easily run configure without cross-compile but with libspeex added, I can cross-compile without libspeex, but when I try to cross-compile with libspeex I get an error “speex not found using pkg-config”. I downloaded Speex and compiled it - no success. I installed it by Brew - no success. I tried adding prefix when compiling Speex - still nothing. Same with adding CFLAGS and LDFLAGS. I tried numerous ways of adding it to the project, but no matter what do I do I get the same error, every single time.
Long story short: how can I compile ffmpeg to Android .so library with Speex decoder inside? If that matters I use OS X system.
My build script:
#!/bin/bash
if [ "$NDK" = "" ]; then
echo NDK variable not set, assuming ${HOME}/android-ndk
export NDK=${HOME}/Library/Android/sdk/ndk-bundle
fi
SYSROOT=$NDK/platforms/android-16/arch-arm
# Expand the prebuilt/* path into the correct one
TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64`
export PATH=$TOOLCHAIN/bin:$PATH
rm -rf build/ffmpeg
mkdir -p build/ffmpeg
cd ffmpeg
# Don't build any neon version for now
for version in armv5te armv7a; do
DEST=../build/ffmpeg
FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm"
FLAGS="$FLAGS --sysroot=$SYSROOT"
#FLAGS="$FLAGS --soname-prefix=/data/data/com.bambuser.broadcaster/lib/"
FLAGS="$FLAGS --enable-shared --disable-symver"
FLAGS="$FLAGS --enable-small"
#--optimization-flags=-O2"
FLAGS="$FLAGS --disable-everything"
# FLAGS="$FLAGS --enable-encoder=mpeg2video --enable-encoder=nellymoser"
FLAGS="$FLAGS --enable-decoder=h264 --enable-decoder=adpcm_ima_oki --enable-decoder=adpcm_ima_ws"
FLAGS="$FLAGS --enable-encoder=adpcm_ima_qt --enable-encoder=adpcm_ima_wav --enable-encoder=adpcm_g726"
FLAGS="$FLAGS --enable-encoder=adpcm_g722 --enable-libspeex"
case "$version" in
armv7a)
EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp"
EXTRA_LDFLAGS=""
ABI="armeabi-v7a"
;;
*)
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
ABI="armeabi"
;;
esac
DEST="$DEST/$ABI"
FLAGS="$FLAGS --prefix=$DEST"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I/usr/local/include/"
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -L/usr/local/lib"
mkdir -p $DEST
echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" > $DEST/info.txt
./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" | tee $DEST/configuration.txt
[ $PIPESTATUS == 0 ] || exit 1
rm compat/strtod.o
rm compat/strtod.d
make clean
make -j4 || exit 1
make install || exit 1
done
Config.log fragment with error:
arm-linux-androideabi-gcc --sysroot=/Users/mgriszbacher/Library/Android/sdk/ndk-bundle/platforms/android-16/arch-arm -isysroot /Users/mgriszbacher/Library/Android/sdk/ndk-bundle/platforms/android-16/arch-arm -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Dstrtod=avpriv_strtod -DPIC -I/usr/local/include/ -march=armv5te -std=c99 -fomit-frame-pointer -fPIC -marm -pthread -c -o /tmp/ffconf.rYieelIt.o /tmp/ffconf.6y5cL6p4.c
arm-linux-androideabi-gcc -L/usr/local/lib --sysroot=/Users/mgriszbacher/Library/Android/sdk/ndk-bundle/platforms/android-16/arch-arm -isysroot /Users/mgriszbacher/Library/Android/sdk/ndk-bundle/platforms/android-16/arch-arm -march=armv5te -Wl,--as-needed -Wl,-z,noexecstack -o /tmp/ffconf.TDeNtAx9 /tmp/ffconf.rYieelIt.o -lm -lz -pthread
check_complexfunc cabs 1
check_ld cc
check_cc
BEGIN /tmp/ffconf.6y5cL6p4.c
1 #include <complex.h>
2 #include <math.h>
3 float foo(complex float f, complex float g) { return cabs(f * I); }
4 int main(void){ return (int) foo; }
END /tmp/ffconf.6y5cL6p4.c
arm-linux-androideabi-gcc --sysroot=/Users/mgriszbacher/Library/Android/sdk/ndk-bundle/platforms/android-16/arch-arm -isysroot /Users/mgriszbacher/Library/Android/sdk/ndk-bundle/platforms/android-16/arch-arm -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Dstrtod=avpriv_strtod -DPIC -I/usr/local/include/ -march=armv5te -std=c99 -fomit-frame-pointer -fPIC -marm -pthread -c -o /tmp/ffconf.rYieelIt.o /tmp/ffconf.6y5cL6p4.c
/tmp/ffconf.6y5cL6p4.c:1:21: fatal error: complex.h: No such file or directory
#include <complex.h>
^
compilation terminated.
check_complexfunc cexp 1
check_ld cc
check_cc
BEGIN /tmp/ffconf.6y5cL6p4.c
1 #include <complex.h>
2 #include <math.h>
3 float foo(complex float f, complex float g) { return cexp(f * I); }
4 int main(void){ return (int) foo; }
END /tmp/ffconf.6y5cL6p4.c
arm-linux-androideabi-gcc --sysroot=/Users/mgriszbacher/Library/Android/sdk/ndk-bundle/platforms/android-16/arch-arm -isysroot /Users/mgriszbacher/Library/Android/sdk/ndk-bundle/platforms/android-16/arch-arm -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Dstrtod=avpriv_strtod -DPIC -I/usr/local/include/ -march=armv5te -std=c99 -fomit-frame-pointer -fPIC -marm -pthread -c -o /tmp/ffconf.rYieelIt.o /tmp/ffconf.6y5cL6p4.c
/tmp/ffconf.6y5cL6p4.c:1:21: fatal error: complex.h: No such file or directory
#include <complex.h>
^
compilation terminated.
check_pkg_config speex speex/speex.h speex_decoder_init -lspeex
false --exists --print-errors speex
ERROR: speex not found using pkg-config
More information about the ffmpeg-user
mailing list