天天看點

【HEVC學習與研究】33、編碼一個CU(幀内部分)2:幀内預測各種模式的實作

HEVC中一共定義了35中幀内編碼預測模式,編号分别以0-34定義。其中模式0定義為平面模式(INTRA_PLANAR),模式1定義為均值模式(INTRA_DC),模式2~34定義為角度預測模式(INTRA_ANGULAR2~INTRA_ANGULAR34),分别代表了不同的角度。具體的示意圖如标準文檔的圖8-1所示:

【HEVC學習與研究】33、編碼一個CU(幀内部分)2:幀内預測各種模式的實作

這三大類的預測方法均有實作的代碼。首先看最簡單的Intra_DC模式,該模式同角度預測模式實作在同一個函數Void TComPrediction::xPredIntraAng(...)中:

在這個函數中可以看到,Intra_DC模式中所有預測塊的像素值都是同一個值dcval,這個值是由一個函數predIntraGetPredValDC計算得到:

在該函數中,編碼器通過判斷上方和左方參考像素是否有效而選擇将相應的資料(指針pSrc指向的資料)累加到iSum中,并對這些參考資料取平均傳回。是以,在DC模式下,所有預測像素值都是同一個值,也即參考資料的均值,這也是DC模式命名的由來。

第二種預測模式時平面模式,該模式定義在xPredIntraPlanar函數中。

首先從參考資料中擷取的是頂行和左列的資料,并記錄一下左下角和右上角的兩個像素值。然後計算底行和右列的資料,方法是用左下角的像素減去頂行相應位置的像素得到底行,右上角的像素減去左列相應位置的像素得到右列。預測塊中每個像素的資料,就是對應的四個邊的像素值的平均。

第三種預測模式,即mode=2~34時采用角度預測模式。實作的方式在xPredIntraAng中:

在圖8.1中可以看出,模式18的預測方向相當于對角線預測。是以以模式18為分界線,2~17分為水準模式(modeHor),18~33分為垂直模式(modeVer),這樣區分有利于減少代碼的備援。另外,從該圖中也可以看出,模式10和26即相當于水準模式和垂直模式,在代碼中也定義了兩個宏HOR_IDX和VER_IDX表示,然後計算目前模式同水準/垂直模式之間的角度差,用intraPredAngle表示。intraPredAngle不同的取值對應的預測方向可以參考圖8-2:

【HEVC學習與研究】33、編碼一個CU(幀内部分)2:幀内預測各種模式的實作

圖中可見,intraPredAngle的取值可能出現正值或負值。當intraPredAngle取非負值時,垂直模式下隻參考上方的參考點,水準模式下隻參考左方的參考點;當intraPredAngle取負值的時候,refMain會依照refSide中的資料進行部分擴充,是以會同時參考左方和上方兩部分的參考點。當intraPredAngle為0的時候,表示預測模式為10或者26,這是也就是水準或者垂直模式,直接複制參考像素的值就OK了;否則,會對角度做一個判斷,如果對應的是參考像素中的整像素點那麼就不需要進行計算,直接擷取該點資料;如果對應的不是整像素點,那麼會按照相鄰兩點按照“距離”進行權重平均作為參考像素點的值。

除此之外,這個函數還實作了對小于16×16尺寸塊實作濾波操作,以及水準模式時将預測矩陣進行轉置操作。

大緻上Intra預測塊的生成方法就這樣了,下一個問題在于,參考像素是如何來的?pSrc指針指向的資料又是如何擷取的?且聽下回。

繼續閱讀