视频压缩1/2ME模块设计
2011-07-03王明江张爱平
王明江,颜 琥,张爱平
(哈尔滨工业大学深圳研究生院微电子中心,深圳518055)
1 引言
近年来,随着VLSI技术和宽带数字网技术的发展,人们对数字视频业务如可视电话、电视会议、安全监视、高清晰度电视、视频点播和数字化视频光盘等应用产生了越来越浓厚的兴趣。但是,所有这些应用都面临一个重要的问题——通信带宽或存储空间不足,视频数据的压缩编码正是解决这一问题的有效途径。
2003年3月,由ISO/IEC与ITU-T组成的联合视频组(JVT)发布H.264标准,并将该标准正式纳入MPEG-4作为MPEG-4标准的第10部分,称为 H.264/AVC[1]。与早期的压缩标准 H.263、MPEG-2、MPEG-4相比,H.264在相同的视觉质量下编码比特率可以节省一倍[2]。由于采用了一系列的先进编码技术,H.264具有非常好的压缩率,然而,它的运算复杂度也超过了以往任何的视频编码标准,高出其它视频压缩标准几倍甚至十几倍,需要消耗大量的时间和系统资源,因此实时编解码器的实现面临着巨大的挑战。
表1给出了基于JVT官方公布的JM8.0参考软件获得的H.264编码器中各个模块编码复杂程度的分析[3]。从中可以看出复杂度最高,最消耗时间和资源的部分是运动估计/补偿,该模块占去了系统80%以上的资源。尤其是在H.264/AVC的帧间编码过程中,因为使用了可变块匹配运动估计、多参考帧运动补偿和拉格朗日率失真优化等先进的编码技术,使得由整数像素运动估计(IME)和分数像素运动估计(FME)组成的帧间运动估计过程占用了整个编码器70%以上的编码运算时间。其中FME运算量达到整个编码的45%以上[4]。1/2ME是FME中最主要的部分。要达到30帧每秒的实时编码要求,就必须优化运动估计的算法、减小运动估计的运算量、通过硬件加速来缩短编码运算时间[5]。
表1 基于JVT JM8.0的H.264编码器复杂度分析[3]
2 算法分析
2.1 变尺寸块运动估计模式选择
根据变尺寸运动估计及模式选择的算法思想,从减少算法复杂度、减少变尺寸块选择的计算量、能否映射出具体的硬件实现等几个方面考虑,既保证一定的图像编码质量,又能把芯片面积和功耗限定在一定范围内。如在块模式种类引入方面,考虑到对于大尺寸视频编码,过细的块划分对视频质量改善作用很小,而运算量巨大,可以简化模式种类,如只考虑16×16,16×8,8×16,8×8四种块模式。
2.2 多参考帧选择
H.264编码器可从一组前面或后面的已编码图像中选取多个与当前帧相关性较大的图像作为帧间编码的参考图像。通过扩大寻找匹配图像块的范围,再经过多次比较的结果,可使匹配后的预测精度显著改进。H.264允许最多采用16帧参考帧。实际上,对绝大多数图像序列,采用5帧参考帧的运动预测就能获得非常好的编码效果。在采用全搜索算法或是快速全搜索算法的前提下,多参考帧技术的引入将使得运算量随着参考帧数的增大而线性增加。考虑到硬件实现的具体情况,对于1080P这样的大尺寸视频,引入3个以上的参考帧,在运算量规模和图像数据存储等方面都将是难以接受的,所以通常都是从减少参考帧数目的角度来考虑支持多参考帧。在本设计中,主要综合衡量多参考帧技术所能带来的编码质量增益和对应运算量代价及硬件开销两个方面,对如何支持多参考帧技术做出取舍,如只支持3个以下的参考帧等。
2.3 率失真优化模式选择
H.264编码过程中需要面临如何在多种块划分方式中选择最佳模式,在运动估计时如何选择最佳运动矢量等问题,主要采用了基于率失真理论的率失真最优化算法来在不同的模式中进行取舍。先对每种可能的模式计算其比特数和失真,然后用一标准来综合衡量该模式,最后选择评价值最小的模式。高复杂度模式采用SAD,SATD,SSD等描述的失真和实际用到的码率进行模式选择,而低复杂度模式针对不同的模式给出一个有倾向性的不同的初值SAD0,仅采用SAD来描述失真,不需要计算实际码率。分析可知高复杂度模型尽管能够获得更好的编码效果,但要求进行大量的运算,而低复杂度模型不需要计算SAD外的其它值,进行模式选择操作较为简单,便于硬件实现。
3 电路设计
1/2ME进一步的在整数最佳点附近寻找最佳匹配点,其硬件架构主要包括如下几个主要组成部分:PE核心运算部件、片上缓冲存储器、基于率失真的代价函数产生器、比较器、控制器等部分。框图如图1所示。
图1 分像素运动估计硬件架构的系统框图
IME 模块在16×16,16×8,8×16,8×8四种块模式中找出了最佳的块模式及相应的运动矢量,同时把1/2ME需要用到的插值数据及当前块数据存储在缓存中,并把存储的地址信息提供给1/2ME。本设计采用片上128b位宽的缓存,存储单元以4×4块大小为单位,实际的有效数据可能从4×4中任意一个位置开始,因此,IME模块还提供了有效数据的起始位置。在整数搜索的时候,如果搜索到了图像边界,进行1/2插值的时候,要对边界像素进行扩展,因此,还提供边界信息给1/2ME模块。
1/2插值涉及两个维度,同时进行插值不仅控制难度大,而且将消耗大量资源。将二维插值分解成两个一维插值,并考虑到处理一个宏块要进行4个8×8块的处理,因此将两个一维插值中间插入流水,不仅易于控制,结构简洁,而且缩短了宏块的处理时间。
流水线如图2所示,横向插值模块主要完成横向插值工作,纵向插值模块完成纵向插值,同时选取插值后最佳匹配点。当前块及参考块数据都存储在同一个存储器中,而在进行垂直插值时,首先要读取当前块的数据,因此为了解决访问冲突,在完成前一个8×8水平插值后,需要等待几个周期,待当前块数据读取结束后,再进行下一个8×8块的水平插值。
图2 1/2ME流水图
整个1/2ME的数据路径如图3所示。
图3 1/2ME数据路径图
数据从前级缓存,进入水平插值模块,水平插值后的数据进入到1/2ME内部缓存,这是流水的第一级。从1/2ME内部缓存出来的数据,经垂直插值,进入后级缓存;同时,当前宏块的数据也被读出,进行9个候选点的SAD计算及累加,最终比较得出最佳匹配点。第二级将给出一个当前块读取结束信号,避免第一级的访问冲突。
横向插值控制模块设计成一次处理一个8×8块。1/2插值采用6抽头滤波器,实际因边界扩展需要处理14×14像素。整个设计的存储单位为一个4×4子块数据大小,所以读取一行14个像素值最多需要 5次访问存储(1,4,4,4,1),最少 4次。同样,总共14行像素,最多需要读5轮,总共最多需要25次访问存储。
为充分利用带宽,设计8个滤波器组,每周期可得到8个插值像素,插值像素和原像素仍以4×4的形式存于缓存中。模块中设置14×7个像素大小的寄存器组,读入的数据(块四周的数据)要根据边界条件以及有效数据起始位置进行裁剪再存入寄存器组。读入的数据在寄存器组中按照一定的规则进行左移和上移,使得滤波器组的输入得到更新。滤波后的数据即时输往内部缓存。
参考像素垂直方向有效起始位置不同,开始得到有效滤波数据的时间也不同。滤波器组设计成一次处理4行数据,当一次开始位置为0时,读第一行的4×4块(水平达到7个像素)就可以开始滤波。其它位置时,待第二行读入(达到至少4行像素)时,才开始滤波。起始位置为0和3时,读完数据的同时,整个插值也随之结束。起始位置为1和2时,读完数据后还需等待几个周期,整个插值才结束,因此,加入几个等待状态。
纵向插值模块控制和横向插值模块控制类似。纵向插值时数据垂直读取,每一列需读取4次,共5轮。在纵向插值模块中,包含SAD的计算及累加模块,同时进行最佳点的选取。当前块数据存储在前级缓存中,所以可以与插值数据同时读取。当前块数据读入后存储在8×8像素大小的寄存器组中,待插值像素读入后存储在4×10的寄存器组中。参考像素寄存器组按一定的规则上移,使滤波器组的输入得到更新。每插完一列,参考像素寄存器组都要更新。
插值滤波器同样设置8个,一次插出的8个像素与读入的经水平插值后的像素组成4×4块的形式,送往后级缓存。SAD计算累加器接收当前块及插值后的数据,一起完成9个候选点SAD的计算。9个候选点的SAD在整个插值结束时通过一个比较器得到最小值,与此对应的位置点即为最佳匹配点。
半像素点通过对相应的整像素点进行6抽头滤波得出,权重为(1/32,-5/32,5/8,5/8,-5/32,1/32)。1/2像素插值示意图如图4所示。大写字母表示整数像素,小写字母表示1/2插值像素。
以像素h为例,h由垂直的最近六个像素插值得到,即:
将输入系数进行变换,得到下式:
每个输入系数都是2的整数次方,通过移位就能完成输入与系列的相乘。对于负号项,采用取反加1来实现。因为有部分加数需要左移,所以其右端可以加上这边需要添加的项。同样,四舍五入的操作,即加上16的部分,也添加到左移项的右端。运用Wallace树形式可得到滤波结果。
计算SAD的是1/2精度的数据,每周期产生4×4的数据中,相应位置点的数据是2×2,即四个,因此,SAD模块设计成每次生成4个像素的部分SAD值,进行累加。对于求绝对值部分,直接用求差后的最高位,即符号位,作为选择器的选择信号来选通差值的原码或者反码,加1部分,转移到累加器中进行。累加器采用Wallace树加法器外加一个寄存器实现(见图5)。
多路比较选择模块是从9个SAD值中,选出SAD最小的一个,输出相应点的位置信息。设计中分两级进行比较,第一级使用三个3选1的比较器选出3个候选点,第二级再从这3个点中选出最小一个。对于这9个点,考虑到现实视频中物体运动方向的概率,设置一定的优先级。优先级最高的是水平方向上的运动,接着是垂直方向上的运动,最后是四角沿45度方向的运动。
图5 SAD累加器
4 结束语
本设计实现了视频编码中的1/2ME硬件加速模块,提出了用两级流水完成1/2精度插值的结构,既提高了模块的吞吐量,又简化了控制结构。设计出来的电路处理一个宏块的时钟周期小于150个,在Charted 0.13μm工艺下综合后逻辑门为74.3K,最高工作频率约160MHz,在1.20V的供电电压下,功耗在10mW左右。本设计已应用于本实验室高清视频编码芯片中。
[1]Joint Video Team(JVT)of ITU-T VCEG and ISO/IEC MPEG.Draft ITU-T Recommendation and Final Draft InternationalStandard of Joint Video Specification(ITU-T Rec.H.264|ISO/IEC 14496 -10 AVC)[C].7th Meeting,Pattaya,Thailand,2003.
[2]毕厚杰.新一代视频压缩编码标准 -H.264/AVC[M].北京:人民邮电出版社,2005.
[3]J Zhang,Y He,S Yang,et al.Performance and Complexity Joint Optimization for H.264 Video Coding[C].ISCAS’03.2003,4:520 -523.
[4]TC Chen,Y W Huang,L G Chen.Analysis and Design of Macroblock Pipelining for H.264/AVC VLSI Architecture[C].ISCAS’04.2004,2:273 -276.
[5]梁亚玲,刘静,杜明辉.H.264中块运动估计及其发展趋势[J].电视技术,2005,(z1):40-43.