此系列是为了记录自己学习VTM10.0的过程,目前正在看编码端。主要的参考文档有JVET-S2001-vH和JVET-S2002-v1。由于本人水平有限,出现的错误恳请大家指正,欢迎与大家一起交流进步。
从这篇博文开始就会进入到如何测试当前CU的帧内模式的内容,编码端的帧内模式的入口就是xCheckRDCostIntra()。这个函数的作用是确定MTS和LFNST的模式,然后分成亮度和色度单独处理,接下来就详细说说。本篇内容是默认cfg文件中MTS和LFNST都允许开启的
1. 变量解释
double bestInterCost = m_modeCtrl->getBestInterCost();//最佳的帧间预测模式的RDcost
double costSize2Nx2NmtsFirstPass = m_modeCtrl->getMtsSize2Nx2NFirstPassCost();//MTS不开启情况下的RDcost
bool skipSecondMtsPass = m_modeCtrl->getSkipSecondMTSPass();//为true表示跳过测试除了第一个trGrp之外的情况
const SPS& sps = *tempCS->sps;
const int maxSizeMTS = MTS_INTRA_MAX_CU_SIZE;
//为True表示测试MTS开启的情况
uint8_t considerMtsSecondPass = ( sps.getUseIntraMTS() && isLuma( partitioner.chType ) && partitioner.currArea().lwidth() <= maxSizeMTS && partitioner.currArea().lheight() <= maxSizeMTS ) ? 1 : 0;
bool useIntraSubPartitions = false;//为1表示当前CU开启ISP
double maxCostAllowedForChroma = MAX_DOUBLE;//色度分量最大允许RDcost
const CodingUnit *bestCU = bestCS->getCU( partitioner.chType );//当前CU的最佳模式
Distortion interHad = m_modeCtrl->getInterHad();
具体参见注释
double dct2Cost = MAX_DOUBLE;//不开启MTS且不开启LFNST情况下的RDcost
double bestNonDCT2Cost = MAX_DOUBLE;//开启MTS或开启LFNST情况下的最佳RDcost
double trGrpBestCost [ 4 ] = {
MAX_DOUBLE, MAX_DOUBLE, MAX_DOUBLE, MAX_DOUBLE };//如果对应的trGrp中有测试的模式成为最佳模式,此为对应的trGrp的最佳RDcost
double globalBestCost = MAX_DOUBLE;//如果有测试的模式成为最佳模式,此为最佳RDcost
bool bestSelFlag [ 4 ] = {
false, false, false, false };//如果对应的trGrp中有测试的模式成为最佳模式,此为true
bool trGrpCheck [ 4 ] = {
true, true, true, true };//如果对应的trGrp需要测试,此为true
//对应trGrp要测试MTS中的哪些情况由下面两个变量决定
int startMTSIdx [ 4 ] = {
0, 1, 2, 3 };
int endMTSIdx [ 4 ] = {
0, 1, 2, 3 };
//当前trGrp的最佳RDcost与不开启MTS且不开启LFNST情况下的RDcost的比例如果超过阈值,就会停止测试下一个trGrp。这个阈值就由trGrpStopThreshold决定
double trGrpStopThreshold[ 3 ] = {
1.001, 1.001, 1.001 };
int bestMtsFlag = 0;//如果有测试的模式成为最佳模式,此为最佳模式的mtsFlag
int bestLfnstIdx = 0;//如果有测试的模式成为最佳模式,此为最佳模式的lfnstIdx
具体参见注释
//如果当前CU可以测试LFNST开启的情况,此为2否则就为0
const int maxLfnstIdx = ( partitioner.isSepTree( *tempCS ) && partitioner.chType == CHANNEL_TYPE_CHROMA && ( partitioner.currArea().lwidth() < 8 || partitioner.currArea().lheight() < 8 ) )
|| ( partitioner.currArea().lwidth() > sps.getMaxTbSize() || partitioner.currArea().lheight() > sps.getMaxTbSize(