《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 設(shè)計(jì)應(yīng)用 > 支持MBAFF的H.264/AVC解碼器運(yùn)動(dòng)矢量預(yù)測(cè)模塊設(shè)計(jì)
支持MBAFF的H.264/AVC解碼器運(yùn)動(dòng)矢量預(yù)測(cè)模塊設(shè)計(jì)
包 磊,周開(kāi)倫,,林 濤
(同濟(jì)大學(xué) 超大規(guī)模集成電路研究所,上海 200331)
摘要: 分析了宏塊自適應(yīng)幀場(chǎng)模式(MBAFF)在P幀和B幀的幀間預(yù)測(cè)算法,,提出了可行的數(shù)據(jù)組織結(jié)構(gòu)和硬件實(shí)現(xiàn)方法,。作為完整的解碼器的一部分,其RTL代碼已經(jīng)完成了功能驗(yàn)證和仿真,,證明該設(shè)計(jì)是行之有效的,。
Abstract:
Key words :

摘  要: 分析了宏塊自適應(yīng)幀場(chǎng)模式(MBAFF)在P幀和B幀的幀間預(yù)測(cè)算法,提出了可行的數(shù)據(jù)組織結(jié)構(gòu)和硬件實(shí)現(xiàn)方法,。作為完整的解碼器的一部分,,其RTL代碼已經(jīng)完成了功能驗(yàn)證和仿真,證明該設(shè)計(jì)是行之有效的,。
關(guān)鍵詞: H.264,;MBAFF;幀間預(yù)測(cè),;運(yùn)動(dòng)矢量預(yù)測(cè)

  H.264/AVC支持3種圖像編碼模式:幀模式,、場(chǎng)模式和宏塊自適應(yīng)幀場(chǎng)(MBAFF)[1]模式。在幀模式下,,1幅圖像被劃分成由16×16宏塊組成的幀,;在場(chǎng)模式下,1幀圖像的頂場(chǎng)和底場(chǎng)被劃分成由16×16宏塊組成,;在MBAFF模式下,,幀場(chǎng)編碼的選擇在宏塊級(jí)指定,1幀圖像被劃分成由32×16的宏塊對(duì)組成,,每2個(gè)宏塊組成的宏塊對(duì)以幀模式或者場(chǎng)模式編碼,。一段圖像可能既有動(dòng)態(tài)的區(qū)域又有靜態(tài)的區(qū)域,H.264的MBAFF模式可以根據(jù)圖像的每個(gè)區(qū)域選擇最佳的編碼模式,。一般來(lái)說(shuō),,MBAFF模式對(duì)于視頻編碼的效率比其他兩種模式更好,,但編碼和解碼的復(fù)雜度也更高。本文將探討在解碼的過(guò)程中MBAFF模式在P幀和B幀的幀間預(yù)測(cè)算法和硬件設(shè)計(jì),。
1 幀間預(yù)測(cè)技術(shù)
  在進(jìn)行幀間預(yù)測(cè)時(shí),,空間上距離較近的圖像區(qū)域往往具有相關(guān)性很強(qiáng)的運(yùn)動(dòng)矢量,而且相對(duì)于以前視頻壓縮標(biāo)準(zhǔn)中最小8×8的劃分,,H.264最小4×4的劃分使得較小的圖像區(qū)域的運(yùn)動(dòng)矢量具有更高的相關(guān)性,,因此,可以利用預(yù)測(cè)技術(shù)預(yù)測(cè)出1組運(yùn)動(dòng)矢量MVp,,而編碼器只需要傳送能量很小的實(shí)際值和預(yù)測(cè)值的差值,,也就是運(yùn)動(dòng)矢量殘差MVd,這樣就可以提高編碼效率,。在解碼時(shí),,解碼器只需要采用同樣的算法先預(yù)測(cè)出運(yùn)動(dòng)矢量的預(yù)測(cè)值MVp,而后將其與殘差MVd相加便可以恢復(fù)出運(yùn)動(dòng)矢量的實(shí)際值MV[1]供運(yùn)動(dòng)補(bǔ)償使用,。MVp[1]取決于運(yùn)動(dòng)補(bǔ)償?shù)某叽绾袜徑麺V的有無(wú),。
  在幀間預(yù)測(cè)模式下,宏塊有16×16,、16×8,、8×16、8×8,、8×4,、4×8、4×4這7種運(yùn)動(dòng)矢量的分割方法,。為方便描述,,把參考宏塊相應(yīng)分割的運(yùn)動(dòng)矢量命名為MVLXN[2],參考索引命名為refIdxLXN[2],,其中N可以為A,、B、C,、D,,分別表示當(dāng)前宏塊或者宏塊分割的左邊、上邊,、右上和左上的相應(yīng)宏塊分割,。當(dāng)前宏塊分割的運(yùn)動(dòng)矢量MVpLX[2]就是通過(guò)MVLXN和refIdxLXN預(yù)測(cè)得到的。圖1所示為非MBAFF模式時(shí)當(dāng)前宏塊分割為16×16的情況,,E為當(dāng)前宏塊或宏塊分割,,A、B、C分別為E的左,、上,、右上方的3個(gè)相對(duì)應(yīng)分割塊。如果E的左邊不止1個(gè)分割,,則取其中最上的1個(gè)為A,;上方不止1個(gè)分割時(shí),,取最左邊1個(gè)為B,。


1.1 預(yù)測(cè)運(yùn)動(dòng)矢量MVp的計(jì)算
  在宏塊分割為16×16、8×8,、8×4,、4×8和4×4時(shí),運(yùn)動(dòng)矢量的預(yù)測(cè)值是由參考宏塊分割A(yù),、B,、C的運(yùn)動(dòng)矢量計(jì)算得到的:
  (1)如果分割B和C不可用,而分割A(yù)可用,,則會(huì)對(duì)MVLXB,、MVLXC、refIdxLXB,、refIdxLXC重新賦值:MVLXB=‘MVLXA,、MVLXC=MVLXA、refIdxLXB=refIdxLXA,、refIdx-LXC=refIdxLXA,。
  (2)根據(jù)refIdxLXA、refIdxLXB和refIdxLXC的取值計(jì)算mvpLX:
 ?、偃绻指預(yù),、B、C的參考索引refIdxLXA,、 refIdxLXB或refIdxLXC中的一個(gè)等于當(dāng)前分割的索引號(hào)refIdxLX,,則當(dāng)前分割的矢量預(yù)測(cè)值由相應(yīng)分割的運(yùn)動(dòng)矢量得到:MVpLX=mvLXN。
 ?、谌绻指預(yù),、B、C的參考索引refIdxLXA,、 refIdxLXB或refIdxLXC都不等于當(dāng)前分割的索引號(hào)refIdxLX,,則通過(guò)取A、B,、C的運(yùn)動(dòng)矢量中值得到:
  MVpLX[0]=Median(MVLXA[0],,MVLXB[0],MVLXC[0])
  MVpLX[1]=Median(MVLXA[1],MVLXB[1],,MVLXC[1])
  運(yùn)動(dòng)矢量的預(yù)測(cè)在當(dāng)前宏塊分割為16×8和8×16的時(shí)候會(huì)先做如下的判斷,,如果不滿(mǎn)足則通過(guò)上述取中值的方法得到預(yù)測(cè)值:
  (1)對(duì)于1個(gè)宏塊被分割成2個(gè)16×8子宏塊的情況
  ①計(jì)算mbPartIdx等于0的子宏塊如圖2(a)所示,。如果refIdxLXB等于當(dāng)前分割的refIdxLX,,則當(dāng)前塊的矢量預(yù)測(cè)值由B宏塊的相應(yīng)分割的矢量得到:MVpLX= MVLXB。


 ?、谟?jì)算mbPartIdx等于1的子宏塊如圖2所示,,如果refIdxLXA等于當(dāng)前分割的refIdxLX,則當(dāng)前塊的矢量預(yù)測(cè)值由A宏塊的相應(yīng)分割的矢量得到:MVpLX=MVLXA,。
  (2)對(duì)于1個(gè)宏塊被分割成2個(gè)8×16子宏塊的情況:
 ?、儆?jì)算mbPartIdx等于0的子宏塊如圖2(b)所示。如果refIdxLXA等于當(dāng)前分割的refIdxLX,,則當(dāng)前塊的矢量預(yù)測(cè)值由B宏塊的相應(yīng)分割的矢量得到:MVpLX=MVLXA,。
   ②計(jì)算mbPartIdx等于1的子宏塊如圖2(b)所示,,如果refIdxLXC等于當(dāng)前分割的refIdxLX,,則當(dāng)前塊的矢量預(yù)測(cè)值由C宏塊的相應(yīng)分割的矢量得到:MVpLX=MVLXC。
1.2 參考宏塊分割的運(yùn)動(dòng)矢量MVLXN和參考索引refIdxLXN的計(jì)算
  在計(jì)算參考宏塊分割A(yù),、B,、C的運(yùn)動(dòng)矢量MVLXN和參考索引refIdxLXN之前,應(yīng)先檢測(cè)分割C是否可用,,如果C不可用,,則用分割D的信息代替。A,、B,、C的運(yùn)動(dòng)矢量MVLXN和參考索引refIdxLXN的計(jì)算:
  (1)如果宏塊mbAddrN不可用或者宏塊mbAddrN為幀內(nèi)編碼,或者mbAddrN相應(yīng)分割或者子宏塊分割的predFlagLX等于0,,則對(duì)MVLXN置0,,對(duì)refIdxLXN置-1。
  (2)MVLXN為mbAddrN相應(yīng)宏塊分割或者子宏塊分割的運(yùn)動(dòng)矢量,,refIdxLXN為mbAddrN相應(yīng)宏塊分割的參考索引值:
  MVLXN=MvLX[mbPartIdxN][subMbPartIdxN]
  refIdxLXN=RefIdxLX[mbPartIdxN]
  (3)在MBAFF模式時(shí),,需要對(duì)MVLXN和refIdxLXN再做1次計(jì)算:
  ①如果當(dāng)前宏塊為場(chǎng)宏塊,,而mbAddrN為幀宏塊,,則:
  MVLXN[1]=MVLXN[1]/2
  refIdxLXN=refIdxLXN×2
  ②如果當(dāng)前宏塊為幀宏塊,,而mbAddrN為場(chǎng)宏塊,,則:
  MVLXN[1]=MVLXN[1]×2
  refIdxLXN=refIdxLXN/2
1.3 空間相鄰參考宏塊分割的選擇[2]
  在非MBAFF模式時(shí),,當(dāng)前宏塊的空間相鄰宏塊地址A、B,、C,、D的位置如圖3所示??臻g參考宏塊mbAddrN可以是MbAddrA,、MbAddrB、MbAddrC,、MbAddrD或者CurrMbAddr,。


  在MBAFF模式時(shí),當(dāng)前宏塊的空間相鄰宏塊地址A,、B,、C、D的位置如圖4所示,。此時(shí)會(huì)根據(jù)當(dāng)前宏塊是幀宏塊或者場(chǎng)宏塊currMbFrameFlag以及當(dāng)前宏塊是頂宏塊或者底宏塊mbIsTopMbFlag來(lái)計(jì)算1個(gè)中間值mbAddrX,并根據(jù)mbAddrX的幀場(chǎng)信息mbAddrXFrameFlag來(lái)得到最終的參考宏塊MbAddrN,。參考宏塊mbAddrN可以是MbAddrA,、MbAddrA+1、MbAddrB,、MbAddrB+1,、MbAddrC、MbAddrC+1,、MbAddrD,、MbAddrD+1、CurrMbAddr或者CurrMbAddr-1,。
  參考分割A(yù),、B、C,、D取自參考宏塊mbAddrN,,也可能來(lái)自當(dāng)前宏塊的空間相鄰宏塊或可能是當(dāng)前宏塊內(nèi)已解碼的分割。
1.4 運(yùn)動(dòng)矢量預(yù)測(cè)所需數(shù)據(jù)的組織
  運(yùn)動(dòng)矢量的預(yù)測(cè)需要當(dāng)前分割的左邊,、上邊,、左上和右上相應(yīng)分割的MVLXN和refIdxLXN信息來(lái)計(jì)算得到當(dāng)前分割的MVLX。如果宏塊的4個(gè)子宏塊都采用4×4分割,,則1個(gè)宏塊有16個(gè)運(yùn)動(dòng)矢量,,即每個(gè)4×4 block有1個(gè)運(yùn)動(dòng)矢量。這樣需要儲(chǔ)存每個(gè)block的運(yùn)動(dòng)矢量和參考索引,。1個(gè)宏塊需要存儲(chǔ)16個(gè)block的運(yùn)動(dòng)矢量MVLX和參考索引refIdxLX,,當(dāng)采用其他分割類(lèi)型時(shí),,每個(gè)分割內(nèi)所有block的運(yùn)動(dòng)矢量和參考索引為相同值。
   幀間預(yù)測(cè)按照block存儲(chǔ)和使用數(shù)據(jù),。當(dāng)前宏塊分割的運(yùn)動(dòng)矢量和參考索引需要按照block來(lái)存儲(chǔ)以用于后面宏塊的預(yù)測(cè),。每個(gè)分割內(nèi)所有block的運(yùn)動(dòng)矢量和參考索引為相同值,所以參考分割的MVLXN和refIdxLXN的引用也可以按照block來(lái)進(jìn)行,。
  因?yàn)橥环指顑?nèi)所有block的運(yùn)動(dòng)矢量和參考索引為相同值,,因此,參考分割的MVLXN和refIdx-LXN也就是參考宏塊相應(yīng)的block的MVLX和refIdx-LX,。圖5為非MBAFF模式時(shí)預(yù)測(cè)當(dāng)前分割的運(yùn)動(dòng)矢量的示意圖,。由圖可見(jiàn),在進(jìn)行預(yù)測(cè)時(shí)是通過(guò)與當(dāng)前分割最接近的左,、上,、左上以及右上的4個(gè)4×4 block的運(yùn)動(dòng)矢量來(lái)對(duì)當(dāng)前的運(yùn)動(dòng)矢量進(jìn)行預(yù)測(cè)的。圖5(a)~(d)分別表明了當(dāng)前宏塊采用不同劃分時(shí)A,、B,、C、D 4個(gè)參考?jí)K的取值情況,。在預(yù)測(cè)時(shí)一般選取A,、B、C塊對(duì)當(dāng)前的運(yùn)動(dòng)矢量進(jìn)行預(yù)測(cè),,當(dāng)C不可用時(shí)則選用A,、B、D進(jìn)行預(yù)測(cè),。在MBAFF模式時(shí),,由于參考宏塊的位置不同(參見(jiàn)1.3節(jié))會(huì)作相應(yīng)變化。

2 直接預(yù)測(cè)模式和硬件設(shè)計(jì)
  H.264/AVC對(duì)運(yùn)動(dòng)矢量的重建引入了直接預(yù)測(cè)模式,,在該模式下運(yùn)動(dòng)矢量殘差沒(méi)有被傳送,,只有宏塊的預(yù)測(cè)模式會(huì)被傳送。解碼器根據(jù)預(yù)測(cè)模式以及其余宏塊的信息對(duì)當(dāng)前的運(yùn)動(dòng)矢量進(jìn)行恢復(fù),。運(yùn)動(dòng)矢量的重建流程如圖6所示,。在直接預(yù)測(cè)模式下,H.264分別采用3種不同的方式對(duì)運(yùn)動(dòng)矢量進(jìn)行重建,。


  (1)復(fù)制模式,。在P類(lèi)型的宏塊中,利用空間上相鄰分割的運(yùn)動(dòng)矢量對(duì)當(dāng)前的運(yùn)動(dòng)矢量進(jìn)行預(yù)測(cè),。
  (2)空間模式,。在B類(lèi)型的宏塊中,利用空間上相鄰分割的運(yùn)動(dòng)矢量對(duì)當(dāng)前的運(yùn)動(dòng)矢量進(jìn)行預(yù)測(cè),。
  (3)時(shí)間模式,。在B類(lèi)型的宏塊中,,通過(guò)將時(shí)間上相鄰而且在空間上位置相同的8×8分割的運(yùn)動(dòng)矢量進(jìn)行重量化來(lái)預(yù)測(cè)出當(dāng)前的運(yùn)動(dòng)矢量。
  其中復(fù)制模式和空間模式在算法上具有一定的相似性,,差別在于復(fù)制模式只需要重建1個(gè)方向的運(yùn)動(dòng)矢量,,而空間模式需要重建雙向的運(yùn)動(dòng)矢量。
2.1 空間模式及復(fù)制模式重建算法和硬件設(shè)計(jì)
    在這2種模式下:(1)宏塊只能劃分成1個(gè)16×16分割或者4個(gè)8×8分割,。在劃分成4個(gè)8×8時(shí),,每1個(gè)8×8分割可以獨(dú)立地被設(shè)置成直接模式或者ReadMV模式;(2)計(jì)算當(dāng)前的運(yùn)動(dòng)矢量需要借助在空間上相鄰分割的運(yùn)動(dòng)矢量來(lái)對(duì)當(dāng)前分割的運(yùn)動(dòng)矢量進(jìn)行重建,。此時(shí)運(yùn)動(dòng)矢量的預(yù)測(cè)算法與前面介紹的預(yù)測(cè)運(yùn)動(dòng)矢量的算法基本相同,,所不同的是此時(shí)宏塊中的任意1個(gè)分割預(yù)測(cè)時(shí)所使用的相鄰塊信息均由圖7所示的A、B,、C,、D 4個(gè)塊預(yù)測(cè)。

  Direct 8×8用A,、B,、C、D 4個(gè)塊進(jìn)行預(yù)測(cè),。預(yù)測(cè)的基本算法流程如圖8所示,。由圖可見(jiàn),在預(yù)測(cè)時(shí)首先檢測(cè)參考?jí)KC是否可用,,如不可用,則C塊的參數(shù)用D塊的參數(shù)代替,;而后利用A,、B、C塊的參考索引RefIdxA[f/b],、RefIdxB[f/b],、RefIdxC[f/b]中大于0的最小值來(lái)預(yù)測(cè)出當(dāng)前分割的參考索引號(hào)ReFrame[f/b],如果RefIdxA[f/b],、RefIdxB[f/b],、RefIdxC[f/b]全部小于0,則ReFrame[f/b]取-1,;然后用ReFrame[f/b]與A,、B、C塊的參考索引進(jìn)行對(duì)比,,如果ReFrame[f/b]只是A,、B、C其中的1個(gè),,現(xiàn)令其為SelectedBlk的索引號(hào)相同,,則當(dāng)前分割的運(yùn)動(dòng)矢量中,,(MVx,MVy)取SelectedBlk的(MVxS,,MVyS),;否則取A、B,、C塊運(yùn)動(dòng)矢量的中值,。


  在空間模式及復(fù)制模式下,需要使用空間上相鄰的上邊及左邊的4×4塊的運(yùn)動(dòng)矢量信息來(lái)對(duì)空間模式,、復(fù)制模式中的運(yùn)動(dòng)矢量以及ReadMV模式中的MVp進(jìn)行計(jì)算,。針對(duì)非MBAFF模式和MBAFF模式所需要的block的運(yùn)動(dòng)矢量信息分析如下:
  (1)在非MBAFF模式時(shí),硬件實(shí)現(xiàn)需要維持1個(gè)4×4 block行,,以及當(dāng)前待解碼宏塊的左邊4個(gè)block列的運(yùn)動(dòng)矢量信息,。解碼器如果需要支持1 920×1 280分辨率視頻流的解碼,則就要存儲(chǔ)(1 920/4+4+1)=485個(gè)4×4 block的運(yùn)動(dòng)矢量信息,,如圖9所示,。

  (2)在MBAFF模式時(shí),由于宏塊對(duì)的出現(xiàn)使得所需要的block信息相比非MBAFF模式的情況更加復(fù)雜,。硬件實(shí)現(xiàn)時(shí)需要維持2個(gè)4×4 block行,,以及當(dāng)前待解碼宏塊的左邊宏塊對(duì)的8個(gè)block列的運(yùn)動(dòng)矢量信息。解碼器如果需要支持1 920×1 280分辨率視頻流的解碼,,則就要存儲(chǔ)(2×(1920/4)+8+1)=969個(gè)4×4 block的運(yùn)動(dòng)矢量信息,,如圖10所示。


    設(shè)計(jì)中將這部分信息存放在片內(nèi)SRAM中,。此外,,為了便于讀取以及節(jié)省存取時(shí)間,設(shè)計(jì)中將1個(gè)block的運(yùn)動(dòng)矢量信息存放于SRAM 1個(gè)地址單元中,。1個(gè)地址單元的數(shù)據(jù)結(jié)構(gòu)需要存放前向參考索引RefIdxF,、后向參考索引RefIdxB、前向水平運(yùn)動(dòng)矢量MVxF,、前向垂直運(yùn)動(dòng)矢量MVyF,、后向水平運(yùn)動(dòng)矢量MVxB、后向垂直運(yùn)動(dòng)矢量MVyB,。
    通過(guò)以上分析在硬件實(shí)現(xiàn)時(shí)采用如圖11所示的結(jié)構(gòu)對(duì)該模塊進(jìn)行設(shè)計(jì),。設(shè)計(jì)中使用1個(gè)Local Sram作為1個(gè)Line buffer來(lái)對(duì)空間模式及復(fù)制模式下需要使用到的空間上相鄰塊的運(yùn)動(dòng)矢量信息進(jìn)行存儲(chǔ)。當(dāng)該模塊被啟動(dòng)后,,根據(jù)輸入的當(dāng)前宏塊的預(yù)測(cè)模式以及當(dāng)前宏塊的位置信息,,地址生成器根據(jù)當(dāng)前宏塊的信息產(chǎn)生相應(yīng)的地址以及控制信號(hào)從Local Sram中取出A、B,、C,、D 4個(gè)block的運(yùn)動(dòng)矢量信息傳送給MV idx計(jì)算模塊來(lái)計(jì)算當(dāng)前分割的運(yùn)動(dòng)矢量,,計(jì)算完畢后得出完成信號(hào)給地址生成器以便其產(chǎn)生相應(yīng)的地址將解碼好的數(shù)據(jù)存回Local Sram中供后續(xù)解碼使用。


2.2 時(shí)間模式重建算法和硬件設(shè)計(jì)
  圖12所示為宏塊類(lèi)型為B宏塊,、預(yù)測(cè)模式為直接預(yù)測(cè)模式時(shí)采用時(shí)間模式對(duì)運(yùn)動(dòng)矢量進(jìn)行重建的算法示意圖,。


   由圖可見(jiàn),時(shí)間模式運(yùn)動(dòng)矢量重建的步驟為:
  (1)當(dāng)前待解的分割先在List[1][0]中找到與自己位置相對(duì)應(yīng)的分割相應(yīng)的,、在List[0]中的參考圖像List[0][x],,將該參考圖像作為當(dāng)前分割的List[0]參考。
  (2)找出List[1][0]圖像中與當(dāng)前分割位置相對(duì)應(yīng)的分割指向List[0][x]的運(yùn)動(dòng)矢量MVCol[2]和參考索引refIdxCol[2],。
  (3)根據(jù)當(dāng)前分割所在圖像與List[0][x]圖像的播放順序POC的差值tb[2],、List[0][x]與List[1][0]的POC的差值td[2],通過(guò)如下公式量化出當(dāng)前分割指向List[0][x]圖像的運(yùn)動(dòng)矢量MVL0以及指向List[1][0]的運(yùn)動(dòng)矢量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) 根據(jù)refIdxCol和當(dāng)前圖像是幀或場(chǎng)圖像標(biāo)志field_pic_flag以及當(dāng)前宏塊是幀宏塊或場(chǎng)宏塊來(lái)計(jì)算refIdxL0:
     refIdxL0=((refIdxCol<0)?0:MapColToList0(refIdxCol))
     refIdxL1=0
     在非MBAFF模式時(shí),,圖像類(lèi)型可以是FRM和FLD表示當(dāng)前是幀或場(chǎng),;在MBAFF模式時(shí),圖像類(lèi)型以AFRM表示當(dāng)前圖像是宏塊級(jí)幀場(chǎng)自適應(yīng),。
     在MBAFF模式時(shí),,首先根據(jù)當(dāng)前圖像類(lèi)型PicCodingStruct(CurrPic)[2]和參考圖像類(lèi)型PicCodingStruct(colPic)[2]來(lái)計(jì)算1個(gè)宏塊地址mbAddrX,然后再根據(jù)mbAddrX是否為場(chǎng)宏塊以及當(dāng)前宏塊是否為場(chǎng)宏塊來(lái)計(jì)算出在List[1][0]中與當(dāng)前分割位置相對(duì)應(yīng)的宏塊mbAddrCol,,最后得到其中相應(yīng)宏塊分割mbAddrCol\mbPartIdxCol\subMbPartIdxCol的運(yùn)動(dòng)矢量MVCol和參考索引refIdxCol,MVCol和refIdxCol取值為mbAddrCol相應(yīng)分割的前向或者后向運(yùn)動(dòng)矢量和參考索引,。
  因此,,對(duì)于已經(jīng)解碼的圖像需要存儲(chǔ)每個(gè)宏塊的運(yùn)動(dòng)矢量、參考索引,、宏塊類(lèi)型(mbType,、subMbType)和宏塊的幀場(chǎng)標(biāo)志mb_field_decoding_flag[2],以用于當(dāng)前圖像宏塊的運(yùn)動(dòng)矢量預(yù)測(cè),。
  時(shí)間模式下運(yùn)動(dòng)矢量重建的硬件實(shí)現(xiàn)框圖如圖13所示,。設(shè)計(jì)中采用了空間模式以及復(fù)制模式硬件實(shí)現(xiàn)所用的Local Sram。這里還在Local Sram中開(kāi)辟了一段新的存儲(chǔ)空間,,用于存放所需要的圖像層信息,。與空間及復(fù)制模式一樣,,重建后的運(yùn)動(dòng)矢量信息寫(xiě)回到Local Sram中供后續(xù)解碼使用。


  由運(yùn)算公式可見(jiàn)時(shí)間模式下運(yùn)動(dòng)矢量的重建涉及乘法,、除法,、加法以及減法運(yùn)算,這些運(yùn)算對(duì)于硬件實(shí)現(xiàn)將會(huì)帶來(lái)很大的開(kāi)銷(xiāo),,所以設(shè)計(jì)中將差值運(yùn)算拆分成流水線的形式進(jìn)行運(yùn)算,。
  本文介紹了H.264/AVC的宏塊自適應(yīng)幀場(chǎng)模式在P幀和B幀的幀間預(yù)測(cè)算法,分析了運(yùn)動(dòng)矢量預(yù)測(cè)模塊的硬件實(shí)現(xiàn),,提出了可行的數(shù)據(jù)組織結(jié)構(gòu)和硬件實(shí)現(xiàn)方法,。
參考文獻(xiàn)
[1] 畢厚杰.新一代視頻壓縮編碼標(biāo)準(zhǔn)——H.264/AVC[J].北京:人民郵電出版社,2002.
[2] Advanced video coding for generic audiovisual services. ITU-T Recommendation H.264,, May. 2005.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。