VTM3.0代码阅读:estIntraPredChromaQT函数

本文详细探讨了VTM3.0中estIntraPredChromaQT函数,该函数用于进行帧内色度模式的预测。通过getIntraChromaCandModes获取8个候选模式,包括新增的LM、LM_T和LM_L。首先对这些模式进行SATD粗选,然后排除高成本模式,并最终利用RDO选择最佳色度帧内模式。
摘要由CSDN通过智能技术生成

estIntraPredLumaQT进行帧内色度模式的预测,获取最优的色度帧内模式。
getIntraChromaCandModes函数得到色度的8个候选模式,相比VTM1多了LM、LM_T和LM_L模式。
首先对获取的色度帧内模式SATD粗选择,其中只检查DC、VER、HOR、LM_T、LM_L这几种模式;
去除掉SATD后cost最大的两种帧内色度模式;
最后通过RDO选取最优色度帧内模式。

void IntraSearch::estIntraPredChromaQT(CodingUnit &cu, Partitioner &partitioner)
{
   
  const ChromaFormat format   = cu.chromaFormat;
  const uint32_t    numberValidComponents = getNumberValidComponents(format);
  CodingStructure &cs = *cu.cs;						//这里的cs就是xCheckRDCostIntra函数中的tempCS
  const TempCtx ctxStart  ( m_CtxCache, m_CABACEstimator->getCtx() );

  cs.setDecomp( cs.area.Cb(), false );

  auto &pu = *cu.firstPU;

  {
   
    uint32_t       uiBestMode = 0;
    Distortion     uiBestDist = 0;
    double          dBestCost = MAX_DOUBLE;

    //----- init mode list ----
    {
   
      uint32_t  uiMinMode = 0;
      uint32_t  uiMaxMode = NUM_CHROMA_MODE;		//8

      //----- check chroma modes -----
      uint32_t chromaCandModes[ NUM_CHROMA_MODE ];		 //色度模式列表
      PU::getIntraChromaCandModes( pu, chromaCandModes );//getIntraChromaCandModes得到色度的8个候选模式
														 //色度的8个模式是相对固定的
      // create a temporary CS
      CodingStructure &saveCS = *m_pSaveCS[0];		//临时的cs,saveCS用于存储RDO过程中最优模式的数据
      saveCS.pcv      = cs.pcv;
      saveCS.picture  = cs.picture;
      saveCS.area.repositionTo( cs.area );
      saveCS.clearTUs();

      if( CS::isDualITree( cs ) )
      {
   
        if( partitioner.canSplit( TU_MAX_TR_SPLIT, cs ) )	//是否需要TU的划分
        {
   
          partitioner.splitCurrArea( TU_MAX_TR_SPLIT, cs );	

          do
          {
   
            cs.addTU( CS::getArea( cs, partitioner.currArea(), partitioner.chType ), partitioner.chType ).depth = partitioner.currTrDepth;
          } while( partitioner.nextPart( cs ) );

          partitioner.exitCurrSplit();
        }
        else										//cs添加TU
        cs.addTU( CS::getArea( cs, partitioner.currArea(), partitioner.chType ), partitioner.chType );
      }

      std::vector<TransformUnit*> orgTUs;


      // create a store for the TUs
      for( const auto &ptu : cs.tus )
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值