- HEVC boundary filter回顾
- 仅作用于使用DC(1),vertical(10)和horizontal(26) mode且小于32x32的PU的亮度块的最左侧一列和最上侧一行的参考像素点。
- 当使用vertical mode时,最左侧一列的值p(0,y)为下式,其中,y属于[0,N-1],其中,N是PU的大小,见标准文档8.4.4.2.6式(8-62):
p(0,y)=p(0,y) + ((p(-1, y) - p(-1, -1))>>1) - 当使用horizontal mode时,最上侧一行的值p(x,0)的滤波处理类似于vertical mode,见标准文档8.4.4.2.6式(8-54)
- 当使用DC mode时,使用3-tap (1 2 1)/4作用于p(0,0),使用2-tap ( 3 1)/4作用于其余处于边界的预测参考值,如下式所示(标准文档8.4.4.2.5式(8-42,8-43,8-44)),
p(0,0)=(p(-1, 0) + 2 * dc +p(0, -1)+2)>>2;
p(x,0)=(p(x,-1)+3*dc+2)>>2;
p(0,y)=(p(-1,y)+3*dc+2)>>2;
dc的计算方式见标准文档8.4.4.2.5式(8-41)
- JVET中的boundary prediction filters
- 扩展到更多的角度,不再局限于DC,vertical和horizontal
- 扩展到更多参考像素行,四行或四列。对于mode 2和mode 34,使用2-tap滤波器,对于mode 3-6和30-33使用3-tap滤波器,如下图所示,对于mode 34的最左侧四行分别使用不同的2-tap滤波器,对于mode 30-33的最左侧一行使用3-tap滤波器,
- JEM代码阅读
- 见宏
VCEG_AZ07_INTRA_65ANG_MODES
,以及宏VCEG_AZ07_INTRA_BOUNDARY_FILTER_MULTI_LINE
用于对mode2和mode34中额外的边界行进行处理 - SPS header中添加了
m_useIntraBoundaryFilter
参数,用于在序列级别决策是否使用该技术,一般情况下打开 - 关键代码在函数
predIntraAng
中
//VCEG_AZ07_INTRA_65ANG_MODES,扩展到67个角度后,则相应地将3-6改成3-10,30-33改成58-65,34改成66
//关键的函数,xIntraPredFilteringMode34 + xIntraPredFilteringMode02 + xIntraPredFilteringModeDGL
#if VCEG_AZ07_INTRA_BOUNDARY_FILTER
else if( enableBoundaryFilter && isLuma(compID) )
{
#if VCEG_AZ07_INTRA_65ANG_MODES
if( uiDirMode == VDIA_IDX )
#else
if( uiDirMode == 34 )
#endif
{
xIntraPredFilteringMode34( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight);
}
else if( uiDirMode == 2 )
{
xIntraPredFilteringMode02( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight);
}
#if VCEG_AZ07_INTRA_65ANG_MODES
else if( ( uiDirMode<=10 && uiDirMode>2 ) || ( uiDirMode>=(VDIA_IDX-8) && uiDirMode<VDIA_IDX ) )
#else
else if( ( uiDirMode<=6 && uiDirMode>2 ) || ( uiDirMode>=30 && uiDirMode<34 ) )
#endif
{
xIntraPredFilteringModeDGL( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight, uiDirMode );
}
}
#endif
xIntraPredFilteringMode34
,对最左侧4行进行滤波处理,滤波器参数分别(8 8)/4, (12 4)/4, (14 2)/4, (15 1)/4对应于第1-4行,具体地
for ( Int y = 0, iDstStride2 = 0, iSrcStride2 = -1; y < iHeight; y++, iDstStride2+=iDstStride, iSrcStride2+=iSrcStride )
{
pDst[iDstStride2 ] = ( 8 * pDst[iDstStride2 ] + 8 * pSrc[iSrcStride2+iSrcStride ] + 8 ) >> 4;
#if VCEG_AZ07_INTRA_BOUNDARY_FILTER_MULTI_LINE
pDst[iDstStride2+1] = ( 12 * pDst[iDstStride2+1] + 4 * pSrc[iSrcStride2+iSrcStride*2] + 8 ) >> 4;
pDst[iDstStride2+2] = ( 14 * pDst[iDstStride2+2] + 2 * pSrc[iSrcStride2+iSrcStride*3] + 8 ) >> 4;
pDst[iDstStride2+3] = ( 15 * pDst[iDstStride2+3] + pSrc[iSrcStride2+iSrcStride*4] + 8 ) >> 4;
#endif
}
xIntraPredFilteringMode02
,对最上侧4行进行滤波处理,滤波器参数分别(8 8)/4, (12 4)/4, (14 2)/4, (15 1)/4对应于第1-4行,具体地
for ( Int x = 0; x < iWidth; x++ )
{
pDst[x ] = ( 8 * pDst[x ] + 8 * pSrc[x - iSrcStride + 1] + 8 ) >> 4;
#if VCEG_AZ07_INTRA_BOUNDARY_FILTER_MULTI_LINE
pDst[x+iDstStride ] = ( 12 * pDst[x+iDstStride ] + 4 * pSrc[x - iSrcStride + 2] + 8 ) >> 4;
pDst[x+iDstStride*2] = ( 14 * pDst[x+iDstStride*2] + 2 * pSrc[x - iSrcStride + 3] + 8 ) >> 4;
pDst[x+iDstStride*3] = ( 15 * pDst[x+iDstStride*3] + pSrc[x - iSrcStride + 4] + 8 ) >> 4;
#endif
}
xIntraPredFilteringModeDGL
,对最上侧1行或最左侧1列进行滤波处理,对不同的mode滤波器参数分别设置,具体地见数组aucAngPredFilterCoef
和aucAngPredPosiOffset
if(bHorz)
{
for ( Int x = 0; x < iWidth; x++ )
{
pDst[x] = ( filter[0] * pDst[x]+ filter[1] * pSrc[x - iSrcStride + offset[0]] + filter[2] * pSrc[x - iSrcStride + offset[1]] + 8) >> 4;
}
}
else
{
for ( Int y = 0; y < iHeight; y++ )
{
pDst[y * iDstStride] = ( filter[0] * pDst[y * iDstStride] + filter[1] * pSrc[(y + offset[0] ) * iSrcStride -1 ] + filter[2] * pSrc[(y + offset[1] ) * iSrcStride -1 ] + 8) >> 4;
}
}
- -
- 见宏
Intra Mode Coding With Boundary Prediction Filters
最新推荐文章于 2018-07-27 16:15:07 发布