H.264/AVC解码器运动矢量预测模块设计与应用
、C块的参考索引RefIdxA[f/b]、RefIdxB[f/b]、RefIdxC[f/b]中大于0的最小值来预测出当前分割的参考索引号ReFrame[f/b],如果RefIdxA[f/b]、RefIdxB[f/b]、RefIdxC[f/b]全部小于0,则ReFrame[f/b]取-1;然后用ReFrame[f/b]与A、B、C块的参考索引进行对比,如果ReFrame[f/b]只是A、B、C其中的1个,现令其为SelectedBlk的索引号相同,则当前分割的运动矢量中,(MVx,MVy)取SelectedBlk的(MVxS,MVyS);否则取A、B、C块运动矢量的中值。
本文引用地址://m.amcfsurvey.com/article/201612/328516.htm在空间模式及复制模式下,需要使用空间上相邻的上边及左边的4×4块的运动矢量信息来对空间模式、复制模式中的运动矢量以及ReadMV模式中的MVp进行计算。针对非MBAFF模式和MBAFF模式所需要的block的运动矢量信息分析如下:
(1)在非MBAFF模式时,硬件实现需要维持1个4×4 block行,以及当前待解码宏块的左边4个block列的运动矢量信息。解码器如果需要支持1 920×1 280分辨率视频流的解码,则就要存储(1 920/4+4+1)=485个4×4 block的运动矢量信息。
(2)在MBAFF模式时,由于宏块对的出现使得所需要的block信息相比非MBAFF模式的情况更加复杂。硬件实现时需要维持2个4×4 block行,以及当前待解码宏块的左边宏块对的8个block列的运动矢量信息。解码器如果需要支持1 920×1 280分辨率视频流的解码,则就要存储(2×(1920/4)+8+1)=969个4×4 block的运动矢量信息。
设计中将这部分信息存放在片内SRAM中。此外,为了便于读取以及节省存取时间,设计中将1个block的运动矢量信息存放于SRAM 1个地址单元中。1个地址单元的数据结构需要存放前向参考索引RefIdxF、后向参考索引RefIdxB、前向水平运动矢量MVxF、前向垂直运动矢量MVyF、后向水平运动矢量MVxB、后向垂直运动矢量MVyB。
通过以上分析在硬件实现时采用如图11所示的结构对该模块进行设计。设计中使用1个Local Sram作为1个Line buffer来对空间模式及复制模式下需要使用到的空间上相邻块的运动矢量信息进行存储。计算完毕后得出完成信号给地址生成器以便其产生相应的地址将解码好的数据存回Local Sram中供后续解码使用。
2.2 时间模式重建算法和硬件设计
由图可见,时间模式运动矢量重建的步骤为:
(1)当前待解的分割先在List[1][0]中找到与自己位置相对应的分割相应的、在List[0]中的参考图像List[0][x],将该参考图像作为当前分割的List[0]参考。
(2)找出List[1][0]图像中与当前分割位置相对应的分割指向List[0][x]的运动矢量MVCol[2]和参考索引refIdxCol[2]。
(3)根据当前分割所在图像与List[0][x]图像的播放顺序POC的差值tb[2]、List[0][x]与List[1][0]的POC的差值td[2],通过如下公式量化出当前分割指向List[0][x]图像的运动矢量MVL0以及指向List[1][0]的运动矢量MVL1。
tb=Clip3(-128,127,DiffPicOrderCnt(currPicOrField, pic0))
td=Clip3(-128,127,DiffPicOrderCnt(pic1,pic0))
tx=(16 384+Abs(td/2))/td
DistScaleFactor=Clip3(-1024,1023,(tb*tx+32)》6)
MVL0=(DistScaleFactor*mvCol+128)》8
MVL1=MVL0-MVCol
(4) 根据refIdxCol和当前图像是帧或场图像标志field_pic_flag以及当前宏块是帧宏块或场宏块来计算refIdxL0:
refIdxL0=((refIdxCol<0)?0:MapColToList0(refIdxCol))
refIdxL1=0
在非MBAFF模式时,图像类型可以是FRM和FLD表示当前是帧或场;在MBAFF模式时,图像类型以AFRM表示当前图像是宏块级帧场自适应。
在MBAFF模式时,首先根据当前图像类型PicCodingStruct(CurrPic)[2]和参考图像类型PicCodingStruct(colPic)[2]来计算1个宏块地址mbAddrX,然后再根据mbAddrX是否为场宏块以及当前宏块是否为场宏块来计算出在List[1][0]中与当前分割位置相对应的宏块mbAddrCol,最后得到其中相应宏块分割mbAddrColmbPartIdxColsubMbPartIdxCol的运动矢量MVCol和参考索引refIdxCol,MVCol和refIdxCol取值为mbAddrCol相应分割的前向或者后向运动矢量和参考索引。
因此,对于已经解码的图像需要存储每个宏块的运动矢量、参考索引、宏块类型(mbType、subMbType)和宏块的帧场标志mb_field_decoding_flag[2],以用于当前图像宏块的运动矢量预测。
时间模式下运动矢量重建的硬件实现框图如图13所示。设计中采用了空间模式以及复制模式硬件实现所用的Local Sram。这里还在Local Sram中开辟了一段新的存储空间,用于存放所需要的图像层信息。与空间及复制模式一样,重建后的运动矢量信息写回到Local Sram中供后续解码使用。
由运算公式可见时间模式下运动矢量的重建涉及乘法、除法、加法以及减法运算,这些运算对于硬件实现将会带来很大的开销,所以设计中将差值运算拆分成流水线的形式进行运算。
本文介绍了H.264/AVC的宏块自适应帧场模式在P帧和B帧的帧间预测算法,H.264支持1/4或1/8像素精度的运动矢量。在1/4像素精度时可使用6抽头滤波器来减少高频噪声,对于1/8像素精度的运动矢量,可使用更为复杂的8抽头的滤波器。在进行运动估计时,编码器还可选择"增强"内插滤波器来提高预测的效果。分析了运动矢量预测模块的硬件实现,提出了可行的数据组织结构和硬件实现方法。
评论