之前在公司一个项目中一直使用 http://www.cnblogs.com/mcodec/articles/1780598.html 提供的H264 Android解码库
但是经常崩溃,最终定位到mc_dir_part函数中的
- qpix_op[luma_xy](dest_y, src_y, s->linesize);
尝试了一晚上也没修复好这个问题,于是打算自己移植FFmpeg
mcodec 兄所做的工作是将H264解码的代码从ffmpeg中提取出来做了深度优化,而本人对FFmpeg 还不甚了解,无法做到提取,而且新版本相互依赖太重,于是将整个FFmpeg 移植过来使用。
在配置时关闭了所有特性,只开启了所需的H264解码库,arm汇编特性,其余全部关闭。
以下是我的配置代码
- #!/bin/bash
- NDKRROOT=/home/aliang/Application/android-ndk
- PREBUILT=$NDKRROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86
- PLATFORM=$NDKRROOT/platforms/android-14/arch-arm
- export PATH=$PATH:$PREBUILT/bin
- FFCONFIG_COMMON='
- --enable-version3
- --disable-gpl
- --disable-nonfree
- --disable-everything
- --enable-decoder=h264
- --enable-armv5te
- --disable-ffmpeg
- --disable-ffplay
- --disable-ffprobe
- --disable-ffserver
- --disable-avfilter
- --disable-network
- --disable-avformat
- --disable-avdevice
- --disable-swresample
- --disable-swscale
- '
- ./configure --prefix=$PWD/_install_arm $FFCONFIG_COMMON \
- --arch=arm \
- --target-os=linux \
- --enable-small \
- --disable-debug
- --disable-logging
- --enable-cross-compile \
- --sysroot=$PLATFORM/user \
- --sysinclude=$PLATFORM/usr/include \
- --cross-prefix=arm-linux-androideabi- \
- --extra-ldflags=" -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl" \
- --extra-cflags="-I$PLATFORM/usr/include -O3"
JNI部分使用了mcodec兄的代码,编译后so库大小控制在680k 在未开启NEON和VPF的情况下
测试机QSD8250处理器在解码320*240 512Kbps Baseline 视频流的CPU占用为40%左右
接下来的工作就是编译armv7-a处理器优化的解码库。新版本的FFmpeg支持调用libstagefright来实现Android上的硬解码H264也是非常吸引人的地方。
感谢FFMPEG 感谢mcodec 兄。
======================== 9月21日的分割线 ========================
今天分别编译了VPF和NEON两个版本
–enable-armvpf
–enable-neon
开启VPF后在我的测试平台上提升并不明显,下降到38%左右
而开启NEON的版本则非常明显,与上面相同的码率分辨率下,保持在27%的CPU占用
因此 针对armv7-a及以上版本的cpu架构开启NEON优化是非常有必要的。
当然 也更加期待引入libstagefright来实现硬解码
======================== 12月1日的分割线 ========================
经过大量测试,性能瓶颈目前存在于色彩空间转换和缩放
使用libswscale进行这两步操作在arm处理器上没有更好的利用到arm指令集
于是将PINK NOISE的 YUV2RGB ARM汇编版 ( http://wss.co.uk/pinknoise/yuv2rgb) 移植到libswscale中,性能再次大幅提升。依然是上面的码率分辨率,下降到18%~20%。待这部分整理出后给出我的移植代码
(阿亮) |