FFMPEG 1.0 在 Galaxy Tab 8.1 下运行失败的原因

来源:互联网 发布:网络快车的新政策 编辑:程序博客网 时间:2024/05/30 20:07
因为性能问题,那群iPhone佬更换了FFMPEG 1.0,然后解码速度快很多。结果android team也升级FFMPEG到1.0。
问题就出来了,编译成功,在很多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-x86PLATFORM=/home/android-ndk-r7b/platforms/android-14/arch-armCFLAGS="-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,然后就能运行。



原创粉丝点击