VTM10.0代码学习13:xCheckRDCostIntra()

此系列是为了记录自己学习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(
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值