>
首页 » 技术文章 » 基于TMS320C64xx的H.264编码器优化

基于TMS320C64xx的H.264编码器优化

作者:■  解放军信息工程大学    郭惠芳  时间:2005-07-20 11:24  来源:本站原创
摘 要:本文分析了H.264软件编码器的结构,提出了影响速度的瓶颈,并给出其中两方面的优化方案:改进的块匹配算法和1/4象素参考帧插值函数结构的优化。同时,针对高性能DSP芯片TMS320C64xx的特点提出了一系列的优化方案,最后讨论了C语言程序在DSP硬件上优化设计的一般性规则。
关键词:H.264标准; 块匹配准则;1/4象素插值

引言
与H.263协议相比,H.264协议的基本算法仍然是通过帧间预测和运动补偿消除时域的冗余,经过变换编码消除频域的冗余。但是,在计算精度和其它一些具体细节上都有所改进,这既是H.264协议优于H.263协议的关键所在,同时也是提高H.264编码器运算速度的最大瓶颈。这些关键技术可以概括为:1/4象素精度的运动预测与补偿,基于4×4块的DCT变换,以及基于最小4×4块的多种运动预测与补偿模式。
H.264协议推出了一系列测试程序——JM系列,本文的优化方案就是针对JM61程序在TMS320C64xx系列DSP芯片上的移植而进行的。
通过对整个程序的分析可以看出,在编码端,encode_one_ macroblock()函数是实现整个协议的关键函数,也是对一个宏块编码的全部过程,因此,对这个函数优化的程度直接决定了编码器的编码速度。虽然JM系列程序随着H.264协议的发展而不断更新,但它始终是以测试为目的,内部结构还存在许多冗余,大量的判断以及循环语句也不适合DSP程序的执行。
基于DSP的优化方案
块匹配方案的优化
在H.264协议中,将每个宏块的inter预测模式分为7种,需要在参考帧中寻找每种模式的最佳匹配块。目前,判断两个子块匹配最常用的准则是求帧间亮度的最小绝对误差值(SAD值),JM61参考程序采用的也是这个准则,其公式为:

其中表示当前帧图像中的象素点,表示参考帧图像中的象素点,i、j分别表示当前搜索点pos的偏移量。
由于DSP片内空间有限,不可能将参与计算的两个因子(和)全部放在片内,而SAD值的计算又是进行整象素搜索的关键,在编码一个宏块时,这个公式被反复调用,因此,有必要在进行SAD计算之前引入参考窗代替原来的参考帧。参考窗是参考帧中的有效数据部分,包含了当前宏块的整象素运动搜索范围之内的所有参考点,并且对一个宏块进行编码时只需要引入一次,所占用的空间较小,因而可以将参考窗数据放在片内,利于存取与计算,编码下一个宏块时再对窗中的数据进行刷新。
填充参考窗的过程可以分为两种情况:第一种情况是所有的搜索点都在参考帧的内部,并没有超出参考帧图像的边界,在这种情况下,可以利用EDMA直接进行数据搬移,只需要配置几个寄存器启动EDMA,只占用很少的CPU资源,这样既没有增加数据搬移时间,又能在计算SAD时保证数据放在片内,从而提高运算速度。第二种情况是在搜索范围之内的参考点并不都在参考帧图像内部,有一部分超出了图像的边界,对于这些超出了边界的参考点,需要用与之最临近的边界点代替,根据出边界的情况需要进行不同处理。没有出边界的参考点仍然可以用EDMA或者QDMA进行搬移。
参考窗的大小是由搜索范围决定的, 参考程序中采用的搜索方法是搜索范围为16的全搜索算法(FS),这种算法的优点在于能够100%地搜索到最佳匹配块,保证图像的质量,然而带来的缺点就是计算量很大。假设搜索范围为16,在搜索范围之内便有1089个待搜索的点,对每个搜索点要进行256次绝对误差计算和255次求加运算,所以很难进行图像的实时处理。为了减少计算量,提高速度,许多快速算法只选取其中的一些象素点进行匹配运算,并认为这其中的最佳匹配点就是当前宏块的最佳匹配点,如三步搜索法和中心菱形搜索法,菱形三步搜索法等,但存在搜索到非最佳点的情况,从而会增大帧间预测误差。所以,利用这些快速算法时,搜索点的选取显得尤为关键。为了进一步衡量这几种快速算法,本方案分别对这几种算法进行了测试,分别得到采用几种算法之后,恢复图像的信噪比(SNR)。选取的测试对象是foreman序列和trevor序列,foreman序列的特点是镜头晃动较大,trevor序列的特点则是内部的变动较大。测试的其它条件为:选取两个标准序列的前100帧图像;每帧图像大小为QCIF(176×144);序列中I帧量化级数为31,P帧量化级数为34;码率大小是30帧/秒;并开打了RDO选项,且使用了去块效应滤波器,测试结果见表1。
从测试结果可以看出,采用快速算法之后,恢复图像的SNR虽然有所减少,但是减少的幅度不大,从主观效果来看,几种快速算法与全搜索算法的差别也不大。从码流方面比较几种算法,中心菱形搜索法的码流较小,匹配程度较高,因此,本文在最后的优化中采用了这种算法。
亮度参考帧的插值优化
在H.264协议中,运动预测与补偿的精度达到了1/4象素,其中1/2象素点是通过对整象素进行6-tap滤波得到的,1/4象素点是由整象素点和1/2象素点进行线性插值得到的,具体的插值方式如图1和图2所示。
在JM61参考程序中,实现插值的方法是基于C语言实现的,并没有编解码时间的限制,因此,在移植到DSP上以后,耗时较多,优化的余地也比较大。
1/2象素插值
从H.264协议本身以及图1可以看出,为了得到半象素点a的预测值,必须先得到临近的6个整象素点。从另一个角度来说,以整象素点B为例,在a的左右,共有6个半象素点在插值的时候需要用到B点,而DSP的空间有限性决定了每一次读取整象素点必须从片外获得,导致本来就很费时的数据读取过程出现更长的延时。基于以上的分析,本文对半象素的插值过程提出的优化方案为:减少循环次数,减少中间变量的维数以减少寻址时间。
本文将原来程序中的循环次数减半(包括水平插值和垂直插值),在每一个循环单元中计算出两个半象素点,也就是说,由原来的一次读取6个整象素点并滤波得到1个半象素点,简化为一次读取7个整象素点后进行两次滤波得到2个半象素点。通过测试可以看出,这种简单的变动是很有实际效果的。
1/4象素插值
1/4象素点的采用是H.264协议优于以前协议的重要标志,但其时间损耗也是巨大的。与半象素点相比,1/4象素点的插值方式要简单许多(只需要用到两个最临近的整象素或半象素点),但是,由于需要计算的点数是半象素点的4倍,循环的周期也随之扩大,也使这个过程成为影响插值函数速度的主要瓶颈。如图2所示,1/4象素点完全是由整象素点和半象素点插值得到的,并且空间距离很短。本方案改变了原来函数的结构,将图2中的虚线部分作为一个循环单元,一次计算多个1/4象素点,提高了整象素点和半象素点的利用率,减少读取数据的时间。以a点为例,参考程序中的方法共需要读取8次,而修改之后的a点只需要读取2次。参考程序中的每一个循环单元只得到一个1/4象素点,修改之后增加到12个,使循环的次数大大减少,从而提高了编码速度。
结合所使用的硬件,从另一个角度来看,处理的每个数据占8bit,C64xx处理器可以一次读取多个字节,处理多个字节,而所占用的时间与处理单字节一样。本方案修改之后的循环单元中一次可以得到12个1/4象素点,这其中又有8个点是连续的(分别是第二行、第四行的前四个点),于是,又可以充分利用C64xx的特点,将片外的数据读到片内时,根据需要存放到连续的地址中。例如,在片内的某4个连续空间中存放标号分别为A、a、a、a的象素点,在另外的4个连续空间中存放标号分别为b、b、c、d的象素点,然后利用C64xx特有的指令一次得到标号分别为2、3、4、5的4个1/4象素点的值,同时,还可以将它们一次存放到片外的参考帧中。按照这种方法将会省去2/3的1/4象素点的存储时间。

表2 测试结果(单位:ms)
项目 函数A 函数B
优化前时间 30 3537
优化后时间 6 396

测试结果
本方案通过使用上述的优化方案,针对参考程序中的SetupFastFullPelSearch()和UnifiedOneForthPix()两个函数进行,测试平台为主频为600MHz的TMS320C 6416芯片评估板,测试结果见表2。
表2中,函数A表示SetupFast FullPelSearch(),函数B表示UnifiedOneForthPix(),其中,针对B函数的测试只是进行了结构的优化,并没有利用EDMA。

结语
本文结合实际工作,重点探讨了在TMS320C64xx系列DSP上实现H.264视频编码的方法。C64xx系列DSP的硬件资源为实现高性能提供了必要的条件,针对TMS320C64xx芯片的结构和H.264应用程序自身的特点,提出了JM61参考程序在DSP上移植的优化方案,可以总结为以下几个方面:
1. 利用存储器的优化,将常用的数据放到片内;
2. 修改程序的结构,消除冗余;
3. 充分利用C64xx系列的优势,尤其是新增的特殊指令,尽量在一个指令周期内处理多个数据;
4. 利用EDMA和QDMA进行数据搬移,提前将数据放到片内,减少数据存储的时间;
5. 对速度影响较大的函数手工编写成汇编语言。■

相关推荐

基于TMS320C64xx的H.264编码器优化

用SKILL语言对Concept HDL进行二次开发

在线研讨会
焦点