基于ARM9的H.264编解码器实现
2012-11-10蔡成都张正炳长江大学电子信息学院湖北荆州434023
蔡成都,张正炳 (长江大学电子信息学院,湖北 荆州 434023)
基于ARM9的H.264编解码器实现
蔡成都,张正炳 (长江大学电子信息学院,湖北 荆州 434023)
基于ARM9嵌入式开发平台和嵌入式Linux操作系统,实现了基于H.264标准的编解码器x264以及ffmpeg的移植,并提出优化方案。结果表明,该编解码器能满足qcif格式文件实时解码的要求。
H.264;ARM9;嵌入式系统;编解码
H.264/AVC 是由ITU-T 和ISO/IEC 联合视频小组(JVT[1]) 开发的新一代视频压缩标准, 该标准引进了许多新技术, 包括可变块大小运动补偿、1/4 像素运动估计、帧内预测、4×4整数变换和去块效应滤波等[2]。与之前的H.263以及MPEG-4等标准相比,在同等图像质量上,H.264平均码流低40%左右,压缩比更高[3];同样的,在同等压缩比的基础上,H.264重建图像更加精细,质量更好。H.264具有压缩率高,码流低的特点,使得经过H.264压缩的视频数据,在通过网络传输的过程中需要的带宽更低,传输起来十分便利。然而,这些优点是以成倍增加编解码计算复杂度为代价的,其编码的计算复杂度大约相当于H.263的3倍以上, 解码复杂度大约相当于H.263的2~3倍[4]。
虽然H.264带来了编解码效率和质量的提升,但是其较高的编解码复杂度使得在实际应用时必须进行优化,否则很难实现实时编解码和传输。随着嵌入式技术以及视频压缩编码技术的发展,基于嵌入式系统的视频编解码软件的开发使得人们能在嵌入式系统上实现软解码并达到比较理想的效果。下面,笔者基于ARM9处理器,对H.264解码器在嵌入式平台上的应用提出优化方案。
1 软硬件开发平台
采用友善之臂的mini2440作为硬件平台,处理器主频为400MHZ,并且拥有64M片上SDRAM(Synchronous DRAM,同步动态随机存储器),足够运行一般软件的内存需要,256M的NAND FLASH可用于存储文件。以功能强大、免费并且可靠性高的LINUX系统作为嵌入式操作系统。
首先在PC机上建立交叉编译环境,然后通过交叉编译分别将引导程序和嵌入式系统移植到目标板。构建嵌入式系统主要包含2方面:①针对目标板的硬件状况对操作系统内核进行裁剪和配置;②构建根文件系统[5]。
2 H.264编解码器的移植
笔者采用的软件包为ffmpeg_x264_src_20071007.rar,解压之后包含一个ffmpeg的文件夹和一个x264的文件夹。其中,x264作为编码器输出H.264码流,ffmpeg则作为解码器进行解码播放。
在编译X264之前首先要编译yasm以支持MMX或者SSE优化,使得编码性能得到提升。笔者采用的是yasm1.1.0版本,解压软件包后进行配置:
#./configure——prefix=usr/local/bin/yasm
#make
#make install
完成yasm编译之后即可编译x264:
#cd x264
#./configure——prefix=/static //如果要移植到arm开发板上的话则添加——host=arm-linux选项
#make
#make install
完成之后即可在x264的目录下生成x264文件以及一些必须的库文件。
在进行ffmpeg和ffplay的编译移植之前需进行SDL库的移植,编译之前键入./configure-help查看帮助,选好需要设置的参数即可进行编译。键入以下命令进行编译:
#./configure——prefix=/FriendlyArm/SDL——disable-video-qtopia——disable-video-dummy——disable-video-fbcon——disable-video-dga——disable-arts——disable-esd——disable-alsa——disable-cdrom——disable-video-x11——disable-nasm——target=arm-linux——host=arm-linux——enable-video-fbcon
#make
#make install
编译完成之后会在选定目录下生成所需的动态库和include头文件。在交叉编译ffmpeg时必须将x264的相关选项——enable-libx264加上,另外要添加额外的include/link路径:
——extra-cflags=-I/usr/local/include
——extra-ldflags=-L/usr/local/lib
——extra-libs=-L/usr/local/lib
直接configure后会发现SDL不被支持,这样便无法生成所需要的ffplay,查看configure后发现在检测SDL(SDL check)时未定义SDL目录,笔者定义的SDL的目录为/opt/FriendlyArm/SDL/bin,所以将未定义目录的地方改为:SDL_CONFIG=“/opt/FriendlyArm/SDL/bin/sdl-config”即可编译通过并同时产生可以在目标平台上运行的ffmpeg和ffplay这2个所需的文件。将整个编译过程中生成的库文件libSDL-1.2.so.0、libx264.so.56以及ffmpeg和ffplay移植到目标板对应目录下即可。
3 解码器优化方案
1)算法优化 H.264标准虽然在性能上有很大的提升,但是算法却极为复杂。所以,针对ARM处理器,对于CPU占用较大的乘除运算改用移位运算。如a+12b-4c+d+20e-20f,其中包含5个加法和4个乘法。利用移位运算将其改写为a+d+(3b-c)≪2+5[(e-f)≪2],则变成了5个加法,2个乘法和2个移位运算,这样就大大的降低了运算量。
另外,将CAVLC码表转化为二叉树码表的形式;对调用频率高但代码量小的函数使用关键字_inline等方法都可以起到优化代码的作用[6]。
2)基于ARM指令集的优化 在ARM处理器上条件分支语句需要3个时钟周期,而普通操作只需要1个时钟周期,所以,可通过将循环语句展开,降低开销,从而达到提高效率的目的。
此外,将一些变换函数(如DCT变换和IDCT变换)采用更加适合ARM处理器的汇编代码改写,同时在编译器优化选项上使用O3选项,可以降低程序的时间复杂度。同时在编解码的时候可加入一些优化参数,也可以得到更理想的效果。
4 测试分析
试验所用的处理器为S3C2440,主频400MHz,操作系统为linux系统2.6版本内核,交叉编译器版本为4.3.2的版本。使用移植好的x264和ffmpeg以及ffplay对标准序列做测试,测试结果如表1所示。
表1 测试结果
注:qp值表示量化步长,共有52个值,当qp取最大值51时,表示最粗糙的量化;当qp取0时,表示最精细的量化,笔者统一选取qp=26;选取的测试序列akiyo_qcif、coastguard_qcif以及coastguard_cif出自http://trace.eas.asu.edu/yuv/;PSNR一栏中所示的分别是亮度信号(Y分量,即灰度值)、色度信号(U、V分量,描述影像色彩及饱和度)、均值(Avg)以及全局(Global)峰值信噪比。
图1 视频序列播放效果
从表1可以看出笔者采用的S3C2440处理器在编码时速度比较慢,特别是对于格式更大的cif序列,编码速度比同样内容的qcif格式的序列慢4倍。但是在解码的时候qcif序列能达到15fps左右的帧率,基本达到了实时解码。目标板上播放标准qcif序列akiyo_qcif.yuv效果如图1所示,基本可以满足安防监控的需求。若采用更好的处理器或者更优化的算法,可以达到更好的帧率,满足更高的需求。
5 结 语
基于ARM9架构的处理器,对H.264软解码算法做了一定优化,对qcif格式的视频序列基本达到实时解码,但对于格式较大的cif序列效果不太显著,后期希望能通过对算法其他方面的优化以及采用支持多媒体扩展MMX指令的处理器来实现更大格式序列的实时解码。
[1]郭存锁.基于H.264 的数字视频解码器设计[D].北京:北方工业大学,2011.
[2]毕厚杰.新一代视频压缩编码标准——H.264/AVC[M].北京:人民邮电出版社,2005.
[3]张春田,苏育挺,张静.数字图像压缩编码[M].北京:清华大学出版社,2006.
[4]Tsai C Y,Chen T C,Chen L G.Low power entropy coding hardware design for H.264/AVC baseline profile encoder[A].IEEE International Conference on Multimedia and Expo[C].2006:1941-1944.
[5]陈文智.嵌入式系统开发原理与实践[M].北京:清华大学出版社,2005.
[6]沈骞,娄淑琴,宿金华.基于VW2010芯片的网络视频压缩编解码器设计与实现[J].计算机测量与控制,2007,15(12):1814-1816.
[7]沙亮,王贵锦,赵安邦,等.H.264编码下基于DCT系数量化值的PSNR估计方法[J].清华大学学报(自然科学版),2008, 48(4):510-513.
[编辑] 洪云飞
10.3969/j.issn.1673-1409(N).2012.04.042
TN919.8
A
1673-1409(2012)04-N121-03
2012-02-13
蔡成都(1987-),男, 2009年大学毕业,硕士生,现主要从事视频通信方面的研究工作。