天天看點

H.266:幀内預測之PDPC(VTM4)

關于H.266幀内完整過程的總結(來自小小柴):

https://blog.csdn.net/cxy19931018/article/details/80635898#commentBox

其中,對角模式提到的“需要與參考像素進行濾波以減少邊界的不連續性”的方法其實就是PDPC過程。

——————————————————————————————————————————————

以下内容整理自JVET-M1001, JVET-M1002,該PDPC算法在VTM4中已實作。

PDPC(Position dependent intra prediction combination),中文全稱為位置決定的幀内預測組合。它将未濾波邊界參考像素和類似HEVC中根據濾波後的參考像素得到的幀内預測值組合起來得到最終的幀内預測值。具體實作公式如下所示:

pred(x,y)=(wL×R(-1,y) + wT×R(x,-1) – wTL ×R(-1,-1)+(64 – wL – wT+wTL)×pred(x,y) + 32 )>>6

其中R(x,-1), R(-1,y)分别表示上邊和左邊的目前像素 ,R(-1,-1)表示目前塊左上角的參考像素,pred(x,y)表示幀内預測像素。

根據上述公式可知,已知pred(x,y),PDPC算法的關鍵在于找出參考像素( R(x,-1), R(-1,y) )和算出權重值(wL,wT,wTL)。下面分模式讨論如何得到參考像素和權重值。

設nScale = ( ( Log2( nTbW ) + Log2( nTbH ) − 2 ) >> 2 ) (後續計算要用)

設相鄰像素為p(x’ , y’), 其中 x’ = −1, y’ = −1…refH − 1 或 x’ = 0…refW − 1, y’ = −1,

已知必有R(-1,-1) = p(-1 , -1)

  1. Planar和DC模式
H.266:幀内預測之PDPC(VTM4)

x = x’ ,R(x,-1) = p(x’, -1)

y = y’ ,R(-1,y) = p(-1,y’)

wT[ y’ ] = 32 >> ( ( y’ << 1 ) >> nScale )

wL[ x’ ] = 32 >> ( ( x’ << 1 ) >> nScale )

wTL[ x ][ y ] = ( predModeIntra = = INTRA_DC ) ? ( ( wL[ x ] >> 4 ) + ( wT[ y ] >> 4 ) ) : 0

  1. 模式18和模式50(水準和垂直方向)
H.266:幀内預測之PDPC(VTM4)

x = x’ ,R(x,-1) = p(x’, -1)

y = y’ ,R(-1,y) = p(-1,y’)

模式18:

wT[ y’ ] = 32 >> ( ( y’ << 1 ) >> nScale )

wL[ x’ ] = 0

wTL[x’][ y’ ] = 32 >> ( ( y’ << 1 ) >> nScale )

模式50:

wT[y’ ] = 0

wL[ x’] = 32 >> ( ( x’ << 1 ) >> nScale )

wTL[x’ ][ y’] = 32 >> ( ( x’ << 1 ) >> nScale )

  1. 模式2和模式66(對角線方向)
H.266:幀内預測之PDPC(VTM4)

x = x’ + y’ + 1 ,R(x,-1) = p(x’ + y’ + 1, -1)

y = x’ + y’ + 1 ,R(-1,y) = p(-1, x’ + y’ + 1)

wT[ y’ ] = (32 >> 1) >> ( ( y’ << 1 ) >> nScale )

wL[ x’] = (32 >> 1) >> ( ( x’ << 1 ) >> nScale )

wTL[ x’ ][ y’ ] = 0

  1. 模式值小于等于10
H.266:幀内預測之PDPC(VTM4)

dXPos[ y’] = ( ( y’ + 1 ) * invAngle + 2 ) >> 2

dXFrac[ y’ ] = dXPos[ y’ ] & 63

dXInt[ y’] = dXPos [ y’ ] >> 6

dX[ x’ ][ y’ ] = x’ + dXInt[ y’ ]

R(-1,y) = 0

R(x,-1) = ( dX[ x’ ][ y’ ] < refW − 1 ) ? mainRef[ dX[ x’ ][ y’ ] + ( dXFrac[ y’ ] >> 5 ) ] : 0

wT[ y’ ] = ( dX[ x’ ][ y’ ] < refW − 1 ) ? 32 >> ( ( y’ << 1 ) >> nScale ) : 0

wL[ x’ ] = 0

wTL[ x’ ][ y’ ] = 0

  1. 模式值大于等于58
H.266:幀内預測之PDPC(VTM4)

dYPos[ x’] = ( ( x’ + 1 ) * invAngle + 2 ) >> 2

dYFrac[ x’ ] = dYPos[ x’ ] & 63

dYInt[ x’ ] = dYPos[ x’ ] >> 6

dY[ x’ ][ y’ ] = y’ + dYInt[ x’ ]

R(-1,y) = ( dY[ x’ ][ y’ ] < refH − 1 ) ? sideRef[ dY[ x’ ][ y’ ] + ( dYFrac[ x’ ] >> 5 ) ] : 0

R(x,-1) = 0

wT[ y’ ] = 0

wL[ x’ ] = ( dY[ x’ ][ y’ ] < refH − 1 ) ? 32 >> ( ( x’ << 1 ) >> nScale ) : 0

wTL[ x’ ][ y’ ] = 0

  1. 其他模式

    R(x,-1) =0

    R(-1,y) = 0

    wT[ y’ ] = 0

    wL[ x’] = 0

    wTL[ x’ ][ y’ ] = 0

将上述分類讨論的情況整理成如下表格:

H.266:幀内預測之PDPC(VTM4)

Modes <=10 和 Modes >= 58的權重值的選擇要看判斷條件是否成立(即參考像素是否超出可取值範圍),詳情參見上文。

2019-5-15

再次整理:

PDPC算法是通過預測像素和參考像素的線性組合得到的預測值。計算公式如下所示:

pred(x,y)=(wL×R-1,y + wT×Rx,-1 – wTL ×R-1,-1+(64 – wL – wT+wTL)×pred(x,y) + 32 )>>6

其中,pred(x,y)表示通過幀内預測得到的目前預測像素,Rx,-1和R-1,y 分别表示左側和上方的參考像素,R-1,-1表示目前塊左上角的參考像素。

對于DC, Planar, Horizontal和Vertical模式,參考像素無需額外的邊界濾波,參考像素下标中的x和y值分别是目前像素的x和y。

對于模式2,模式66及它們的相鄰模式,參考像素下标中的x和y分别通過x = x’+y’+1和y = x’+y’+1計算得到。角度模式如下圖所示:

H.266:幀内預測之PDPC(VTM4)

權重計算公式:

  1. 對于DC, Planar, Horizontal和Vertical模式:

    scale = ((g_aucLog2[iWidth] - 2 + g_aucLog2[iHeight] - 2 + 2) >> 2)

    wT = 32 >> ((y << 1) >> scale)

    wL = 32 >> ((x << 1) >> scale)

  2. 對于模式2(top-right),模式66(bottom-left)及它們的相鄰模式
    H.266:幀内預測之PDPC(VTM4)

其中,shift即為1中的scale。

參考像素權重置零情況:

(1) Planar,wTL = 0;

(2) DC,無;

(3) Horizontal,wL = 0;

(4) Vertical,wT = 0;

(5) 其他如上表所示。

其他資料:

  1. VTM代碼中,通過變量isModeVer将角度模式分為水準類還是垂直類,并以水準方向或垂直方向為零基點計算角度的偏移情況。

    m_ipaParam.isModeVer = predMode >= DIA_IDX; //DIA_IDX=34

    refMain = bIsModeVer ? refAbove : refLeft ;//refAbove是上方參考行

    refSide = bIsModeVer ? refLeft : refAbove;//refLeft是左側參考列

    if (!bIsModeVer)

    {

    std::swap(width, height); //交換width和height的值

    }

    故PDPC中,模式2相鄰模式的left點實際上是上邊一行的參考像素,模式66相鄰模式的left點才是左側一列的參考像素。

  2. PDPC的典型提案:

    提案H0057(目前采用的方案):

    (1)提出僅對planar, DC, vertical, horizontal等4種幀内預測模式适用PDPC。

    (2)PDPC之前的權重參數是以查表方式得到的,該提案提出通過位置關系計算權重值,且計算公式主要通過加法和移位實作,計算複雜度低,節省了碼字。

    提案J0069(目前采用的方案):

    基于H0057,将PDPC的适用範圍擴充到對角和對角的鄰角。

上一篇: rbind的坑?

繼續閱讀