为了适应更多的预测方向,VVC的帧内角度预测模式增加为65个,加上DC模式和planar模式,VVC的帧内预测模式有67个。下图中红色的线是VVC比HEVC增加的预测方向。
在HEVC中,每个帧内预测块都是正方形,且边长是2的幂次方,在用DC模式进行帧内预测时不需要使用除法运算。而在VVC中,由于帧内预测块可能是矩形,为了避免用DC模式进行帧内预测时需要进行除法运算只计算较长边的均值作为预测值。
如果直接对预测块的模式进行编码,那么对于67种模式需要7bit来编码,数据量很大。VVC采取和HEVC一样的方法,先构建最可能模式列表(most probable mode ,MPM),在VVC内MPM list里有6个预测模式,如果该块的预测模式在MPM中只需要编码其索引号(只需要3bit),如果该块的预测模式不在MPM中而是在61个non-MPM模式在,在熵编码阶段使用截断二元码(Truncated Binary Code ,TBC)编码其模式。
MPM构建过程如下:
当该编码块左边和上边块的模式不可参考时,其帧内模式默认设为Planar模式。
当该编码块左边和上边块的模式都不是角度模式时:
MPM list = {Planar,DC,V,H,V-4,V+4}
当该编码块左边和上边块的一个是角度模式,另一个是非角度模式时:
Max=(左边和上边较大的模式)
MPM list = {Planar,Max,DC,Max-1,Max+1,Max-2}
当该编码块左边和上边块的模式都是角度模式,且角度不同时:
Max=(左边和上边较大的模式)
如果左边和上边模式差值在2到62间,MPM list = {Planar,Left,Above,DC,Max-1,Max+1}
否则,MPM list = {Planar,Left,Above,DC,Max-2,Max+2}
当该编码块左边和上边块的模式都是角度模式,且角度相同时:
MPM list = {Planar,Left,Left-1,Left+1,DC,Left-2}
在构建MPM过程中,如果MPM内有重复模式则剔除。
在HEVC中,由于帧内预测块都是正方形的所以各个角度预测模式使用的概率是相等的。而在VVC中,帧内预测块可能是矩形块,对于水平类的块(宽大于高)上边的参考像素使用概率大于左边参考像素的使用概率,对于垂直类的块(高大于宽)上边的参考像素使用概率小于左边参考像素的使用概率。所以VVC中提出了WAIP,在对非正方形块进行帧内角度预测时用宽角度方向替换原始的方向。
如上图所示,其中模式2 ~ 66表示传统的帧内预测模式,模式 -1 ~ -14以及模式67 ~ 80表示WAIP预测模式。
但是在传输预测模式时还是传输原始的预测模式,在解码端会将该模式映射到宽角度模式,这样总的帧内预测模式数量和编码方式都没有变化。
要替换为宽角度的模式与预测块的宽高比有关,如下表。
Aspect ratio | Replaced intra prediction modes |
---|---|
W / H == 16 | Modes 12, 13,14,15 |
W / H == 8 | Modes 12, 13 |
W / H == 4 | Modes 2,3,4,5,6,7,8,9,10,11 |
W / H == 2 | Modes 2,3,4,5,6,7, |
W / H == 1 | None |
W / H == 1/2 | Modes 61,62,63,64,65,66 |
W / H == 1/4 | Mode 57,58,59,60,61,62,63,64,65,66 |
W / H == 1/8 | Modes 55, 56 |
W / H == 1/16 | Modes 53, 54, 55, 56 |
例如当宽高比为2时(水平类块),模式2、3、4、5、6、7要替换为宽角度模式。
在VTM5中具体传统模式和宽角度模式间的映射关系实现如下:
int IntraPrediction::getWideAngle( int width, int height, int predMode )
{
if ( predMode > DC_IDX && predMode <= VDIA_IDX )
{
int modeShift[] = { 0, 6, 10, 12, 14, 15 };
int deltaSize = abs(g_aucLog2[width] - g_aucLog2[height]);
if (width > height && predMode < 2 + modeShift[deltaSize])
{
predMode += (VDIA_IDX - 1);
}
else if (height > width && predMode > VDIA_IDX - modeShift[deltaSize])
{
predMode -= (VDIA_IDX - 1);
}
}
return predMode;
}
如上图所示,在对矩形块进行WAIP预测时,垂直相邻的两个像素可能使用不相邻的参考像素,为了减少参考像素间距过大的影响,需要对参考像素进行低通滤波和平滑处理。当预测模式是[-14, -12, -10, -6, 72, 76, 78, 80]时,参考像素可以不经处理直接使用。
在VVC中使用6bit 4抽头高斯插值滤波器对角度模式的参考像素进行滤波,对非角度模式(planar模式和DC模式)不进行滤波。对模式2, HOR_IDX, DIA_IDX, VER_IDX, 66也不进行处理。其处理过程如下:
将帧内预测模式分类如下:
A:垂直或水平模式(HOR_IDX,VER_IDX)
B:对角线模式(2, DIA_IDX, VDIA_IDX)
C:其他
如果角度模式属于A,不进行滤波处理,直接将参考像素作为预测像素。
如果角度模式属于B,使用[1, 2, 1]滤波器对参考像素进行滤波,直接将滤波后的值作为预测像素不进行插值处理。
如果角度模式属于C,对落到非整数位置的参考像素进行插值处理(不再进行滤波)。
下面是VTM5内滤波相关的代码:
//left column (bottom to top)
for( int i = 1; i < predHSize; i++, piDestPtr -= predStride, piSrcPtr -= predStride)
{
*piDestPtr = (piSrcPtr[predStride] + 2 * piSrcPtr[0] + piSrcPtr[-predStride] + 2) >> 2;
}
//top row (left-to-right)
for( uint32_t i=1; i < predSize; i++, piDestPtr++, piSrcPtr++ )
{
*piDestPtr = (piSrcPtr[1] + 2 * piSrcPtr[0] + piSrcPtr[-1] + 2) >> 2;
}
感兴趣的可以关注微信公众号Video Coding