关于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)
- Planar和DC模式
![](https://i-blog.csdnimg.cn/blog_migrate/6259fddf8174abafdb70354ccb134118.png)
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
- 模式18和模式50(水平和垂直方向)
![](https://i-blog.csdnimg.cn/blog_migrate/6259fddf8174abafdb70354ccb134118.png)
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 )
- 模式2和模式66(对角线方向)
![](https://i-blog.csdnimg.cn/blog_migrate/cb8323ced4f50ccf150391baba4b71eb.png)
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
- 模式值小于等于10
![](https://i-blog.csdnimg.cn/blog_migrate/4e485a140476b49e6fd774e852513fbc.png)
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
- 模式值大于等于58
![](https://i-blog.csdnimg.cn/blog_migrate/d9194fe3d3fe44e640eae808fe94bd2e.png)
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
- 其他模式
R(x,-1) =0
R(-1,y) = 0
wT[ y’ ] = 0
wL[ x’] = 0
wTL[ x’ ][ y’ ] = 0
将上述分类讨论的情况整理成如下表格:
![](https://i-blog.csdnimg.cn/blog_migrate/80b6203b4fb6a122f900a33d278c00be.png)
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计算得到。角度模式如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/b801baa0f3d7f11f799c92a9d0b089ea.png)
权重计算公式:
- 对于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(top-right),模式66(bottom-left)及它们的相邻模式
其中,shift即为1中的scale。
参考像素权重置零情况:
(1) Planar,wTL = 0;
(2) DC,无;
(3) Horizontal,wL = 0;
(4) Vertical,wT = 0;
(5) 其他如上表所示。
其他资料:
-
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点才是左侧一列的参考像素。 -
PDPC的典型提案:
提案H0057(当前采用的方案):
(1)提出仅对planar, DC, vertical, horizontal等4种帧内预测模式适用PDPC。
(2)PDPC之前的权重参数是以查表方式得到的,该提案提出通过位置关系计算权重值,且计算公式主要通过加法和移位实现,计算复杂度低,节省了码字。
提案J0069(当前采用的方案):
基于H0057,将PDPC的适用范围扩展到对角和对角的邻角。