摘要:为了实现基于DSP的H.264视频编码器的实时性能,提出了一系列优化实现方法。首先结合TMS320DM6437硬件特点,描述了X264代码向TMS320DM6437平台的移植过程和优化方法,重点介绍了整数DCT变换和量化的线性汇编编写及汇编级优化。实验结果表明,本编码器实现了cif'格式视频的实时编码,Dl格式视频的编码速率也达到了18 fps,基本满足视频监控系统中编码器的需求。
H.264作为新一代多媒体视频编码标准,采用了许多先进的技术,在编码效率和性能大幅度提高的同时,增加了抗误码及网络白适应等功能,广泛地应用于视频电话、移动视频和流媒体等场合。传统上进行音视频开发一般使用视频编解码ASIC芯片的方法,但是这种方法开发周期长、适应性差,而近年出现的高性能DSP(数字信号处理器)就很好的解决了这些问题且产品性能更稳定,所以笔者采用TI公司专门推出的高性能DSP平台TMS320DM6437(简称DM6437)数字媒体处理器来实现H.264视频编码器[21。X264是一款支持H.264标准的开源编码器代码,是南网上自由组织联合开发,注重实用,与另外两种开源代码JM和T264相比,在不明显降低图像质量的基础上,大大降低了计算复杂度,广泛应用于视频压缩和格式转换领域,凶此本文选择开发源代码X264(20081113版)进行研究。
基于DM6437平台实现H.264编码器,需要通过改进算法或者重新进行资源配置,以满足应用环境的要求。笔者重点研究了H.264编码器在以TMS320DM6437为日标的CCS平台上的移植和优化工作,包括C语言级的优化、算法优化、整数DCT变换和量化的线性汇编编写以及汇编级优化等。
1 H.264视频编码器的构建
1.1 X264编码器到DM6437的移植
X264编码器支持H.264的基本档次以及主要档次的某些功能选项和功能模块,代码尺寸非常庞大,视频编码速度相当慢。在对X264源码研究过程中,发现在视频编码质量下降不是很明显的情况下,可以将一些功能模块删除,以减小代码尺寸,加快编码速度。此项工作在文献[3-4]中均有详细讲解,读者可根据实际情况进行调整应用。笔者利用TI公司提供的CCS3.3 (Code Composer Studio)平台,将裁剪后的X264模型移植到DM6437平台上。
1.2 视频采集
DM6437数字媒体处理器中的视频处理前端(VPFE)具有视频采集功能,可以将CCD摄像头采集的RGB图像转换为符合BT.656规范的YUV4:2:2图像。采集完的视频数据在内存中的数据结构如图l所示。
在进行H.264视频编码时,必须调整原始视频的数据结构。如果对Dl格式的视频进行编码,Y分量数据不变,U分量和V分量数据做垂直方向的2:1亚采样,转换成360x288的分辨率;如果对cif'格式的视频进行编码,需要对Y分量进行水平和垂直方向的2:1亚采样,转换成352x288分辨率,同时对U分量和V分量进行水平方向的2:1亚采样和垂直方向上的4:1亚采样,转换成176x144的分辨率。图2为经过调整后的Y、U、V各分量的数据结构。
图l DM6437的VPFE所采集视频数据的数据结构
图2调整后视频数据的数据结构
(注:图中MxN是Y分量的分辨率,U、V分量的分辨率为( M/2)×( N/2),若为Dl格式,M=720,N=576;若为cif格式,M=352,N=288)1.3 LCD回放DM6437视频处理子系统中的视频处理后端(VPBE)负责将符合BT.656规范的YUV4:2:2数据转换成RGB数据,凶此可以与LCD显示器进行无缝连接。在摄像头采集和|L264编码工作完成以后,本文提出LCD回放模块,进行重建图像回放,便于观察效果。基于DM6437实时视频采集的H264视频编码器系统框图如图3所示。
图3系统框架示意图
H.264编码器在DM6437上的优化刚构建好的基于DM6437的H.264编码器很慢,难以满足视频监控需求,必须对其进行优化,提高处理性能。对H264编码程序主要从系统优化、算法优化和汇编优化3个方面进行。
2.1系统优化系统优化主要是对ccs提供的各种编译参数进行选择、搭配、调整。主要从以下几个方面进行优化:l)编译器的优化。首先设定合适的编译选项,控制编译器生成更高效、代码尺寸更小的汇编代码。文中设计的H.264编码器所用到的编译选项包括:-pm,-op2,-03,-mt,-mh,-k等。2)DSP/BIOS的配置.、在DM6437的开发中,CaChe和EDMA等功能的应用已不能单纯通过在程序中调用相关API来实现,必须在有DSP/BIOS进行管理的条件下才能正常T作,此时就涉及到存储空间的合理配置,为了最大化DM6437的存储性能,本文通过进行多次配置后编码器T作性能的比较,将LIP配置为32 kB的LIP-Cache.将LID配置为32 kB的LIDCaehe和48kB的LIDSRAM,将L2配置为64 kB的L2Cache和64 kB的L2SRAM。在DM6437中配置Cache过程包括:Ll和L2Cache大小的设置,模式的设置,以及外部存储器DDR可被高速缓存的设置。3)任务调度。文中设计的H.264视频编码器中采集和回放过程的主要操作是数据搬移,可以用EDMA3来实现,进而解放CPU来专心进行编码T作。凶此设置一个任务即可。
2.2算法优化H.264数字视频编码标准,具有很高的压缩性能,但其运算复杂度是H.263标准的3倍以上,所以需要采用算法来降低运算复杂度。其中比较常用的方法是在帧内/帧间预测过程中采用快速算法,降低模式选择的次数:或者是对H.264中采用的Lagrangian率失真优化模型进行化简,提高运算的速度。除上述方法之外,全零块预判算法也是有效手段之一。
在低码率视频应用中,常见的是运动缓慢的具有静止背景的图像,静止背景经过DCT和量化后往往所有系数都为零。被判断为全零块的图像块可以省去DCT和量化两个环节而降低运算量、节约运算时间。因此基于H.264编码器的预判零方案如图4所示。
图4 H.264编码器预判零方案
由于H.264中的帧间模式有16x16、16x8、8x16、8x8、8x4、4x8、4x4 7种模式,所以在运动搜索过程中,零块的判决阀值也要随帧间模式的变化而发生变化,不同块模式(MxN块)的零块判决阀值可以定义为:
(1)
其中,M、N=4、8或16,是MxN块中4x4块的个数,即为MxN/16。
根据以上的分析,基于最佳零块判决的运动搜索算法,在进行运动搜索时,加入停止搜索条件,对根据运动矢量计算出来的每个子块的SAD值进行全零块判决,这个判决门限由(1)决定,若当前MxN块的SAD小于门限值,则提前结束对该子块的运动搜索,并跳过其后的变换和量化操作:否则与常规的运动搜索过程相同。
新的AZBs检测方法可归纳如下:
1)检查当前M×N块的SAD值是否小·THl的值。
如果是真的,判定该M×N块不是全零块,否则转到步骤2);
2)检查当前M×N块的SAD值是否小于·THO的值。
如果是真的,判定该M×N块是全零块,否则转到步骤3):
3)执行DCT/Q模块。
2.3汇编优化文中在CCS3.3中用profile T具对H.264程序进行剖析,结果如表1所示,可发现H.264标准中运动估计、DCT变换、量化等是最耗时的部分。
对这些耗时部分主要采用以下2种方式进行优化:
1)内联函数(intrinsics)优化 内联函数是C6000编译器提供的可以直接映射成为内联(inline)汇编指令的特殊函数,这样就可以提高应用程序的性能。由于上述函数都很适合运用数据打包和SIMD(单指令多数据)操作,而6000编译器提供的内联函数中有很多相关的函数接口,因此将这些费时函数全部用内联函数进行改写,例如要进行4x4块的量化操作,需要16次循环,要进行16次取数据,16次乘法,16次加法,16次移位操作。dct数组元素宽度为16位,可以利用_memd8()函数一次读取4个数组元素,这样可将读取数据次数减为4次,并在外层循环体内使用其他intrinsics函数一次对两个DCT数组元素进行处理,从而拆解了内层循环。
2)线性汇编优化 整数DCT变换及量化过程在H.264编码器代码中占用了大概20%~25%的时间,对该部分进行汇编级优化,可提高编码器的性能。整数DCT变换的关键函数sub4x4_dct用于计算残差块并对残差块进行整数DCT变换;add4x4_idct函数是其逆过程,作用是对反量化后的系数进行反DCT变换,并将反变换后的系数矩阵与预测块矩阵叠加。以sub4x4_dct函数为例,对整数变换的线性汇编级优化过程进行说明。整数变换的公式见(2)式。
为4x4残差矩阵,即待编码块src与pred预测块的差值,见(3)式。
首先使用两次LDNW指令从指定存储器中读出src和pred中的第一行数据,使src00和src01,src02和src03,pred00和pred01,pred02和pred03分别存放在同一个寄存器中。然后使用两条SUB2指令进行对应像素的减运算,得到X矩阵的第1行元素。重复以上操作3次就得到整个残差矩阵。接着使用6次ADD2指令计算,可得,,依次类推,可以计算出剩余的3行。最后在这个运算中,使用PACK2和PACKH2指令来对数据进行重新打包,完成数据的交换。
整数DCT4x4蝶形变换过程中,将二维整数变换转换为两次一维的变换,先进行水平变换,水平变换后的系数按列存放,垂直变换就转换成系数矩阵的水平变换。凶此,水平变换和垂直变换可以调用相同的程序来完成。
对量化函数采取汇编优化后,把和MF值用表的形式存储,要使用这两个参数时,从表中读取i_qscale的对应值。整数DCT变换及量化过程优化前后的效率如表2所示。
3 实验结果文中对经过移植和优化后的H.264编码器进行实验验证,选取具有代表性的视频序列akiyo(背景简单,景物运动缓慢)进行编码,视频为YUV 4:2:0格式,采用IPPP ……编码模式,DM6437的时钟频率为600 MHz,对于cif'和Dl视频格式的图像在不同QP值下测试的结果如表3所示。
(注:平均PSNR的单位为dB.码率单位为kbit/s,编码速度单位为fps)对表3进行分析可以看出,在PSNR和码率没有引起明显变化的情况下,H.264编码器的编码速度获得了极大的提高,其中cif格式视频编码已经满足实时性要求,同时Dl格式在QP=36时编码速度达到了18 fps,这样的编码性能基本可以满足视频监控系统中的应用。
编码结束后生成的.264文件存到PC机,可以用VLCplayer进行解码播放。解码播放出来的图像如网5所示。
图5为用VLC播放cif格式的akiyo视频文件的截图,图(a)表示akiyo视频原文件截图,图(b)表示经过H.264编码器编码的akiyo视频文件截图,由截图的画面质量可以看出,图像质量没有明显下降,整个画面有不明显的噪点(脸部).颜色偏暗,证明此H.264编码器对于cif格式的视频文件编码效果较好。
4 结 论
文中首先在DM6437上构建了H.264视频编码器,编码器主要分为摄像头实时采集、H.264编码、LCD回放3个部分,组成一个完整的可观看编码效率和效果的系统。将X264编码器移植到DM6437平台之后,对DM6437硬件资源及性能进行深入研究,分别从C语言级、系统级、算法级、整数DCT变换和量化的线性汇编编写以及汇编级等方面进行优化,最终实现了cif'格式视频的实时编码,基本满足视频监控系统中编码器的需求。本文介绍的针对DM6437平台的H264编码器移植、优化的思路和方法,对构建高效的视频应用平台具有一定的参考价值。