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

因为性能问题,那群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-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,然后就能运行。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值