H.266/VVC专栏传送
上一篇:H.266/VVC-VTM代码学习-帧内预测05-Angular模式下计算预测像素值xPredIntraAng
下一篇:H.266/VVC-VTM代码学习-帧内预测07-MIP模式(1)initIntraMip函数初始化Mip
前言
VTM是H.266/VVC视频编码标准的参考软件,研究VTM代码给研究人员解释了VVC编码标准的详细标准规范与细节。
本文是笔者对VTM代码的一点学习记录,成文于笔者刚开始接触VVC期间,期间很多概念和理论框架还很不成熟,若文中存在错误欢迎批评指正,也欢迎广大视频编码学习者沟通交流、共同进步。
VTM代码的下载及编译请参考博文:
【视频编码学习】H.266/VVC参考软件VTM配置运行(VTM-6.0版本)
本文涉及的代码存在于工程下的/lib/CommonLib/SourceFiles/IntraPrediction.cpp文件中。
一、宽角度模式
相比于只需要对方块进行帧内预测处理的HEVC,VVC需要处理长宽不等的矩形块。由于角度模式时只能使用左侧和上方的长为2h和2w的参考像素,长宽不等时帧内预测受到限制。针对矩形块帧内预测的特点,VVC中引入了如上图虚线指示的宽角度模式。
在实际预测时,对于宽大于高且比值大于一定程度的模式,需要将模式2附近(大于模式2)的一些类水平角度模式替换成为模式66附近(大于模式66)的一些类垂直角度模式(是因为此时对于模式2附近(大于模式2)存在块右下角点无法索引到参考像素的情况,而模式66附近(大于模式66)仍有部分能够索引到参考像素)。
对于宽大于高且比值大于一定程度的模式,需要将模式2附近(大于模式2)的一些类水平角度模式替换成为模式66附近(大于模式66)的一些类垂直角度模式(是因为此时对于模式2附近(大于模式2)存在块部分点无法索引到参考像素的情况,而模式66附近(大于模式66)仍有部分能够索引到参考像素)。
如下图所示,宽高比过大时mode2已经索引不到参考像素,而mode76这样的大于mode66的模式变得可以使用。
同理,对于高大于宽且比值大于一定程度的模式,需要将模式66附近(小于模式66)的一些类垂直角度模式替换成为模式2附近(小于模式2)的一些类水平角度模式(是因为此时对于模式66附近(小于模式66)存在部分点无法索引到参考像素的情况,而模式2附近(小于模式2)仍有部分能够索引到参考像素)。
VVC中为使编码方便,仍维持2~66共65种角度模式,帧内预测模式的总数和帧内模式编码方法保持不变。但在解码端对块大小和模式号进行判断是否将模式号映射到宽角度模式。
二、主要函数
1.函数代码
int IntraPrediction::getModifiedWideAngle( int width, int height, int predMode )
{
//The function returns a 'modified' wide angle index, given that it is not necessary
//in this software implementation to reserve the values 0 and 1 for Planar and DC to generate the prediction signal.
//It should only be used to obtain the intraPredAngle parameter.
//To simply obtain the wide angle index, the function PU::getWideAngle should be used instead.
if ( predMode > DC_IDX && predMode <= VDIA_IDX )
{
int modeShift[] = { 0, 6, 10, 12, 14, 15 };
//|floor(log2(width))-floor(log2(height))|
int deltaSize = abs(floorLog2(width) - floorLog2(height));
//若宽大于高,且模式小于与宽高比对应的指定值
if (width > height && predMode < 2 + modeShift[deltaSize])
{
//改变模式标号为原标号+65
predMode += (VDIA_IDX - 1);//改变模式标号为原标号+65
}
//若高大于宽,且模式大于与宽高比对应的指定值
else if (height > width && predMode > VDIA_IDX - modeShift[deltaSize])
{
//改变模式标号为原标号-65
predMode -= (VDIA_IDX - 1);
}
}
return predMode;
2.代码解释
该函数只针对帧内预测模式号在2~66(包括边界)的预测模式,即角度模式使用。对于当前块的不同宽高比,函数定义了如下表所示对应的modeShift。
abs(floor(log2(width))-floor(log2(height))) | modeShift |
---|---|
0 | 0 |
1 | 6 |
2 | 10 |
3 | 12 |
4 | 14 |
5 | 15 |
若当前块宽大于高且模式号小于2+modeShift,则将模式号改变为原模式号+65。
若当前块宽小于高且模式号大于66-modeShift,则将模式号改变为原模式号-65。
这里modeShift的设定是用于调节触发宽角度模式的条件。当宽大于高时,宽高比越大modeShift越大,就会有更多的接近2的类垂直模式号进入宽角度模式转换模式号。当宽小于高时,宽高比越小modeShift越大,就会有更多接近66的类水平模式号进入宽角度模式转换模式号。
上一篇:H.266/VVC-VTM代码学习-帧内预测05-Angular模式下计算预测像素值xPredIntraAng
下一篇:H.266/VVC-VTM代码学习-帧内预测07-MIP模式(1)initIntraMip函数初始化Mip