HEVC的幀間預測解碼(5)
1.概述
HEVC的幀間預測過程的複雜程度實在是令人髮指。
我從解碼角度詳細分析一下,由於細節非常多,難免有錯誤或者遺漏。
所以,請結合標準閱讀本系列,否則很難理解
幀間預測(inter prediction)過程爲解碼提供幀間預測值(predSamples[x][y]),對應標準8.5.2中的內容。
簡單說,幀間預測就是以預測塊(PU,prediction unit)爲單位,計算PU的運動向量(MV,motion vector),並根據MV從對應的參考幀中獲得預測值的過程。
個人覺得此過程的焦點和難點就在於兩點:1.參考隊列緩存區(DPB)的維護 2.MV的計算。
其中第1點在文章HEVC的參考隊列解碼中已經詳細介紹了。
本文着重介紹第2點,mv的計算。
2.PU相關
PU(prediction unit)預測單元,是進行幀間預測和運動補償的基本單元。其劃分的方法在文章HEVC標準中的圖像分割(2)中已經介紹過了。如圖,大的方框代表CU,共有8中分塊方式。
圖1 PU的分塊
PU(prediction unit)預測單元,是進行幀間預測和運動補償的基本單元。每一個PU中包含的參數有:
merge_flag:1表示當前PU的mvp計算採用merge模式,0表示不採用merge模式,默認爲0,當包含PU的CU爲skip模式時,merge_flag爲1。
merge_idx:給出在merge模式時,從merging mvp候選列表(merging candidate list,在本文中簡稱MCL)中選取mvp所使用的index。
inter_pred_idc:給出PU的參考方向。0表示PRED_L0, 前向預測;1表示PRED_l1, 後向預測;2表示PRED_BI,雙向預測(除了4x8和8x4的PU,這一點在後面會解釋)。
mvp_l0_flag:指出在非merge模式時,從mvp候選列表(motion vector predictor candidate list 0)中選取mvp所使用的index。
mvp_l1_flag:指出在非merge模式時,從mvp候選列表(motion vector predictor candidate list 1)中選取mvp所使用的index。
除了上述的參數,我們的已知條件還有:當前CU的左上角座標 ( xCb, yCb ),當前PU的左上角座標( xPb, yPb ),CU的尺寸nCbS,PU的尺寸(nPbW X nPbH),PU的partIdx。
下面分成merge模式和非merge模式進行mv的計算。
3.Merge模式的mv計算
3.1 Merge模式整體流程
當PU的merge_flag等於1時,採用merge模式計算mv。
前置處理,當Log2ParMrgLevel >2 且nCbS == 8時有:
( xPb, yPb ) = ( xCb, yCb )
nPbW = nPbH= nCbS
partIdx = 0
就是說,PU所在的CTU尺寸爲8x8且Log2ParMrgLevel >2時,PU的座標和尺寸都用CU的代替。
參數Log2ParMrgLevel 位於pps中,含義就是merge模式中多大的尺寸的塊內部的PU可以平行(parallel)做mv運算。
比如Log2ParMrgLevel = 6,那麼64x64內PU的merge模式的mv可以同時計算。具體的爲什麼能平行做,我們將在後面解釋。
Merge模式的mv計算用一句話概括就是:組成一個mv候選值的列表,然後根據merge_idx從列表裏選擇出mv。
其中列表中的每一項候選值都包含如下元素:
availableFlag,refIdxLX,predFlagLX,mvLX(其中X等於0,1,分別代表前後向)
比如時域候選值(俗稱的collocated)就包含(availableFlagCol,refIdxLXCol,predFlagLXCol,mvLXCol)
Merge模式的具體流程如下:
M1.計算空域候選值(spatial merging candidates)
M2.將時域候選值(temporal merging candidates)的refIdx,即refIdxLXCol(X等於0,或者1)設爲0.
M3.計算前向參考的時域候選值的其他元素。
M4.如果當前slice爲B,再計算一次後向參考的時域候選值。
M5.組成MCL(merging
candidate list)
M6.將變量numCurrMergeCand和numOrigMergeCand設爲MCL中候選值的個數。
M7.如果當前slice爲B,計算組合雙向預測參考值(combined
bi-predictive merging candidates)。
M8.計算零運動向量參考值(zero motion vector merging candidates)。
M9.用merge_idx從MCL中選出MCL[merge_idx]。mvLX,refIdxLX, predFlagLX等於參考值的對應元素。
M10.如果predFlagL0等於1,predFlagL1等於1,且PU的尺寸爲4x8和8x4,則
refIdxL1 = −1,predFlagL1 = 0。什麼意思呢?只有前向參考,後向參考被棄掉了。所以4x8和8x4的PU沒有可能雙向參考。