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塊運動矢量的中值。
本文引用地址:http://www.ex-cimer.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中。此外,為了便于讀取以及節(jié)省存取時間,設計中將1個block的運動矢量信息存放于SRAM 1個地址單元中。1個地址單元的數據結構需要存放前向參考索引RefIdxF、后向參考索引RefIdxB、前向水平運動矢量MVxF、前向垂直運動矢量MVyF、后向水平運動矢量MVxB、后向垂直運動矢量MVyB。
通過以上分析在硬件實現時采用如圖11所示的結構對該模塊進行設計。設計中使用1個Local Sram作為1個Line buffer來對空間模式及復制模式下需要使用到的空間上相鄰塊的運動矢量信息進行存儲。計算完畢后得出完成信號給地址生成器以便其產生相應的地址將解碼好的數據存回Local Sram中供后續(xù)解碼使用。
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中供后續(xù)解碼使用。
由運算公式可見時間模式下運動矢量的重建涉及乘法、除法、加法以及減法運算,這些運算對于硬件實現將會帶來很大的開銷,所以設計中將差值運算拆分成流水線的形式進行運算。
本文介紹了H.264/AVC的宏塊自適應幀場模式在P幀和B幀的幀間預測算法,H.264支持1/4或1/8像素精度的運動矢量。在1/4像素精度時可使用6抽頭濾波器來減少高頻噪聲,對于1/8像素精度的運動矢量,可使用更為復雜的8抽頭的濾波器。在進行運動估計時,編碼器還可選擇"增強"內插濾波器來提高預測的效果。分析了運動矢量預測模塊的硬件實現,提出了可行的數據組織結構和硬件實現方法。
評論