H.264/AVC解码器运动矢量预测模块设计与应用
- UID
- 872339
|
H.264/AVC解码器运动矢量预测模块设计与应用
H.264/AVC支持3种图像编码模式:帧模式、场模式和宏块自适应帧场(MBAFF)模式。在帧模式下,1幅图像被划分成由16×16宏块组成的帧;H.264是一种高性能的视频编解码技术。目前国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。H.264最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。本文将探讨在解码的过程中MBAFF模式在P帧和B帧的帧间预测算法和硬件设计。
1 帧间预测技术
帧间预测是利用视频图像帧间的相关性,即时间相关性,来达到图像压缩的目的,广泛用于普通电视、会议电视、视频电话、高清晰度电视的压缩编码。在图像传输技术中,活动图像特别是电视图像是关注的主要对象。活动图像是由时间上以帧周期为间隔的连续图像帧组成的时间图像序列,它在时间上比在空间上具有更大的相关性。大多数电视图像相邻帧间细节变化是很小的,即视频图像帧间具有很强的相关性,利用帧所具有的相关性的特点进行帧间编码,可获得比帧内编码高得多的压缩比。在解码时,解码器只需要采用同样的算法先预测出运动矢量的预测值MVp,而后将其与残差MVd相加便可以恢复出运动矢量的实际值MV[1]供运动补偿使用。MVp[1]取决于运动补偿的尺寸和邻近MV的有无。
在帧间预测模式下,宏块有16×16、16×8、8×16、8×8、8×4、4×8、4×4这7种运动矢量的分割方法。为方便描述,把参考宏块相应分割的运动矢量命名为MVLXN[2],参考索引命名为refIdxLXN,当前宏块分割的运动矢量MVpLX[2]就是通过MVLXN和refIdxLXN预测得到的。图1所示为非MBAFF模式时当前宏块分割为16×16的情况,E为当前宏块或宏块分割,A、B、C分别为E的左、上、右上方的3个相对应分割块。因为人眼对图像中静止或活动慢的部分,要求有较高的空间分辨率,而对时间分辨率的要求可低些。这种方法叫帧重复方法,广泛应用于视频电话、视频会议系统中,其图像帧速率一般为1~15帧/秒。
1.1 预测运动矢量MVp的计算
在宏块分割为16×16、8×8、8×4、4×8和4×4时,运动矢量的预测值是由参考宏块分割A、B、C的运动矢量计算得到的:
(1)如果分割B和C不可用,而分割A可用,则会对MVLXB、MVLXC、refIdxLXB、refIdxLXC重新赋值:MVLXB=‘MVLXA、MVLXC=MVLXA、refIdxLXB=refIdxLXA、refIdx-LXC=refIdxLXA。
(2)根据refIdxLXA、refIdxLXB和refIdxLXC的取值计算mvpLX:
①如果分割A、B、C的参考索引refIdxLXA、 refIdxLXB或refIdxLXC中的一个等于当前分割的索引号refIdxLX,则当前分割的矢量预测值由相应分割的运动矢量得到:MVpLX=mvLXN。
②如果分割A、B、C的参考索引refIdxLXA、 refIdxLXB或refIdxLXC都不等于当前分割的索引号refIdxLX,则通过取A、B、C的运动矢量中值得到:
MVpLX[0]=Median(MVLXA[0],MVLXB[0],MVLXC[0])
MVpLX[1]=Median(MVLXA[1],MVLXB[1],MVLXC[1])
运动矢量的预测在当前宏块分割为16×8和8×16的时候会先做如下的判断,如果不满足则通过上述取中值的方法得到预测值:
(1)对于1个宏块被分割成2个16×8子宏块的情况
①计算mbPartIdx等于0的子宏块如图2(a)所示。如果refIdxLXB等于当前分割的refIdxLX,则当前块的矢量预测值由B宏块的相应分割的矢量得到:MVpLX= MVLXB。
②计算mbPartIdx等于1的子宏块如图2所示,如果refIdxLXA等于当前分割的refIdxLX,则当前块的矢量预测值由A宏块的相应分割的矢量得到:MVpLX=MVLXA。
(2)对于1个宏块被分割成2个8×16子宏块的情况:
①计算mbPartIdx等于0的子宏块如图2(b)所示。如果refIdxLXA等于当前分割的refIdxLX,则当前块的矢量预测值由B宏块的相应分割的矢量得到:MVpLX=MVLXA。
②计算mbPartIdx等于1的子宏块如图2(b)所示,如果refIdxLXC等于当前分割的refIdxLX,则当前块的矢量预测值由C宏块的相应分割的矢量得到:MVpLX=MVLXC。
1.2 参考宏块分割的运动矢量MVLXN和参考索引refIdxLXN的计算
在计算参考宏块分割A、B、C的运动矢量MVLXN和参考索引refIdxLXN之前,应先检测分割C是否可用,如果C不可用,则用分割D的信息代替。A、B、C的运动矢量MVLXN和参考索引refIdxLXN的计算:
(1)如果宏块mbAddrN不可用或者宏块mbAddrN为帧内编码,或者mbAddrN相应分割或者子宏块分割的predFlagLX等于0,则对MVLXN置0,对refIdxLXN置-1。
(2)MVLXN为mbAddrN相应宏块分割或者子宏块分割的运动矢量,refIdxLXN为mbAddrN相应宏块分割的参考索引值:
MVLXN=MvLX[mbPartIdxN][subMbPartIdxN]
refIdxLXN=RefIdxLX[mbPartIdxN]
(3)在MBAFF模式时,需要对MVLXN和refIdxLXN再做1次计算:
①如果当前宏块为场宏块,而mbAddrN为帧宏块,则:
MVLXN[1]=MVLXN[1]/2
refIdxLXN=refIdxLXN×2
②如果当前宏块为帧宏块,而mbAddrN为场宏块,则:
MVLXN[1]=MVLXN[1]×2
refIdxLXN=refIdxLXN/2
1.3 空间相邻参考宏块分割的选择
在非MBAFF模式时,当前宏块的空间相邻宏块地址A、B、C、D的位置如图3所示。空间参考宏块mbAddrN可以是MbAddrA、MbAddrB、MbAddrC、MbAddrD或者CurrMbAddr。
在MBAFF模式时,当前宏块的空间相邻宏块地址A、B、C、D的位置如图4所示。此时会根据当前宏块是帧宏块或者场宏块currMbFrameFlag以及当前宏块是顶宏块或者底宏块mbIsTopMbFlag来计算1个中间值mbAddrX,并根据mbAddrX的帧场信息mbAddrXFrameFlag来得到最终的参考宏块MbAddrN。参考宏块mbAddrN可以是MbAddrA、MbAddrA+1、MbAddrB、MbAddrB+1、MbAddrC、MbAddrC+1、MbAddrD、MbAddrD+1、CurrMbAddr或者CurrMbAddr-1。
1.4 运动矢量预测所需数据的组织
运动矢量的预测需要当前分割的左边、上边、左上和右上相应分割的MVLXN和refIdxLXN信息来计算得到当前分割的MVLX。1个宏块需要存储16个block的运动矢量MVLX和参考索引refIdxLX,当采用其他分割类型时,每个分割内所有block的运动矢量和参考索引为相同值。
帧间预测按照block存储和使用数据。当前宏块分割的运动矢量和参考索引需要按照block来存储以用于后面宏块的预测。每个分割内所有block的运动矢量和参考索引为相同值,所以参考分割的MVLXN和refIdxLXN的引用也可以按照block来进行。
因为同一分割内所有block的运动矢量和参考索引为相同值,因此,参考分割的MVLXN和refIdx-LXN也就是参考宏块相应的block的MVLX和refIdx-LX。图5(a)~(d)分别表明了当前宏块采用不同划分时A、B、C、D 4个参考块的取值情况。在预测时一般选取A、B、C块对当前的运动矢量进行预测,当C不可用时则选用A、B、D进行预测。在MBAFF模式时,由于参考宏块的位置不同会作相应变化。H.264为了提高码率控制的能力,量化步长的变化的幅度控制在12.5%左右,而不是以不变的增幅变化。变换系数幅度的归一化被放在反量化过程中处理以减少计算的复杂性。为了强调彩色的逼真性,对色度系数采用了较小量化步长。 |
|
|
|
|
|