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。
于是跟进去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-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,然后就能运行。
- FFMPEG 1.0 在 Galaxy Tab 8.1 下运行失败的原因
- 在DOS环境下运行sphinx4当中的回归测试失败的原因
- P1000 Galaxy Tab的概述
- tomcat在opensuse下开机自启失败的原因
- Android在eclipse下的单元测试失败原因
- 使用Windbg在XP下Heap追踪失败的原因
- Android自动运行失败的原因分析
- 一些常见的Android运行失败原因
- mysql_install_db 运行失败的一些原因分析
- FFmpeg 在树莓派上的运行
- JAVA程序在eclipse下可运行但不能在cmd命令下运行的原因
- java运行失败原因
- 在Qsys上运行程序时出现make elf文件失败的原因
- 解决MinGW+ffmpeg在vs2010的Release模式下加载avcodec-57.dll失败的问题
- win32下的内存分配失败原因
- Release下IATHOOK失败的原因
- Mac下抹掉磁盘失败的原因
- Ubuntu下apt-get失败的原因
- NO.0 cin返回的状态
- Linux之并发多线程服务器-2
- HTTP GET与POST区别
- Swing 取色器
- jquery获取table下的td的select标签选中的值
- FFMPEG 1.0 在 Galaxy Tab 8.1 下运行失败的原因
- SVN:入门级安装和源码安装、Hooks设置
- 阅读源代码系列
- JSP九种内置对象及其作用
- How to run workflow using PL/SQL
- android之Notification通知
- php解析请求url并返回json数据
- something useful
- 阅读源代码系列