因为性能问题,那群iPhone佬更换了FFMPEG 1.0,然后解码速度快很多。结果android team也升级FFMPEG到1.0。
问题就出来了,编译成功,在很多device上都可以launch。但在三星Galaxy Tab 8.1(android 3.0)和Moto XOOM平板上launch时候,发生carsh。
于是跟进去opt.c里,发现是这里出问题。再深入跟进,原来是opt->default_val.i64报错。
然后跟踪代码,发现好像是涉及到int64_t都会出错,于是想到了指令问题。
顺便附带FFMPEG的编译脚本:
我找来一段检测CPU的代码(这段代码可以参考文章 http://blog.csdn.net/kwongls/article/details/8154273),检测结果如下:
shell@android:/data/local/myapp $ ./cpudetect
./cpudetect
CPU family (hex): 1-ARM
Number of CPU Cores (hex): 2
CPU features (hex): 11
NEON: Arm NEON is not supported.
ARCH: ARMv7.
VFPv3 is supported.
问题就出来了,编译成功,在很多device上都可以launch。但在三星Galaxy Tab 8.1(android 3.0)和Moto XOOM平板上launch时候,发生carsh。
下面引用Galaxy Tab 8.1平板的错误。在adb log里面看到错误如下:
#00 pc 0001399c /data/data/myapp/lib/libavutil.so (av_opt_set_defaults2)
于是跟进去opt.c里,发现是这里出问题。再深入跟进,原来是opt->default_val.i64报错。
av_opt_set_int(s, opt->name, opt->default_val.i64, 0);
检查opt->default_val变量,发现原来是一个联合的结构。
union
{
int64_t i64;
double dbl;
const char *str;
AVRational q;
} default_val;
然后跟踪代码,发现好像是涉及到int64_t都会出错,于是想到了指令问题。
顺便附带FFMPEG的编译脚本:
PREBUILT=/home/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
PLATFORM=/home/android-ndk-r7b/platforms/android-14/arch-arm
CFLAGS="-O3 -fPIC -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8"
LDFLAGS="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog"
./configure \
--enable-memalign-hack \
--disable-static \
--enable-shared \
--disable-debug \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-avfilter \
--disable-pthreads \
--disable-encoders \
--disable-decoders \
--disable-hwaccels \
--disable-muxers \
--disable-demuxers \
--disable-parsers \
--disable-protocols \
--disable-network \
--disable-filters \
--disable-bsfs \
--disable-indevs \
--disable-yasm \
--disable-sse \
--disable-amd3dnow \
--disable-amd3dnowext \
--enable-decoder=aac \
--enable-decoder=h264 \
--enable-decoder=h263 \
--enable-decoder=mpeg4 \
--enable-decoder=mpeg2video \
--prefix=/home/leven/code/ffmpeg-1.0/release \
--arch=arm \
--target-os=linux \
--enable-cross-compile \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--extra-cflags="$CFLAGS" \
--extra-ldflags="$LDFLAGS" \
--extra-libs="-lgcc"
我找来一段检测CPU的代码(这段代码可以参考文章 http://blog.csdn.net/kwongls/article/details/8154273),检测结果如下:
shell@android:/data/local/myapp $ ./cpudetect
./cpudetect
CPU family (hex): 1-ARM
Number of CPU Cores (hex): 2
CPU features (hex): 11
NEON: Arm NEON is not supported.
ARCH: ARMv7.
VFPv3 is supported.
事情到了这里,有一个结论了,原来这个CPU是不支持NEON。我把编译选项中-mfpu=neon去掉,更换成-mfpu=vfp,然后就能运行。