HEVC 中主要LCU分析函数xCompressCU说明

来源:互联网 发布:聚划算往期数据 编辑:程序博客网 时间:2024/05/21 17:07

 

所有LCU都是通过调用xCompressCU来实现其CU/PU划分. 然后通过其结果再调用 TEncCu::xencodeCU 函数来实现对所有CUs进行压缩编码.

 

xCompressCU大体可分为一下三块.

Void TEncCu::xCompressCU(){           //第一块 for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++)// do inter modes, SKIP and 2Nx2N      if( rpcBestCU->getSlice()->getSliceType() != I_SLICE )      {        xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2Nx2N );      xCheckRDCostMerge2Nx2N( rpcBestCU, rpcTempCU, &earlyDetectionSkipMode );      }     //第二块 for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++)      // do inter modes, NxN, 2NxN, and Nx2N      if( rpcBestCU->getSlice()->getSliceType() != I_SLICE )      {      xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_NxN   );      xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_Nx2N  );      xCheckRDCostInter      ( rpcBestCU, rpcTempCU, SIZE_2NxN  );      }      //! Try AMP (SIZE_2NxnU, SIZE_2NxnD, SIZE_nLx2N, SIZE_nRx2N)        // do normal intra modes // speedup for inter frames        {        xCheckRDCostIntra( rpcBestCU, rpcTempCU, SIZE_2Nx2N );        xCheckRDCostIntra( rpcBestCU, rpcTempCU, SIZE_NxN   );        }               // test PCM        xCheckIntraPCM (rpcBestCU, rpcTempCU);      第三块//for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++)        // further split      for ( UInt uiPartUnitIdx = 0; uiPartUnitIdx < 4; uiPartUnitIdx++ )      {          if ( rpcBestCU->isIntra(0) )            xCompressCU( pcSubBestPartCU, pcSubTempPartCU, uhNextDepth, SIZE_NONE );          else            xCompressCU( pcSubBestPartCU, pcSubTempPartCU, uhNextDepth, rpcBestCU->getPartitionSize(0) );      }      //check是否使用split      xCheckBestMode( rpcBestCU, rpcTempCU, uiDepth);}

前2块实现对本层LCU的模式选择RDcost计算, 最后一块实现下层分割的计算,最后通过xCheckBestMode来比较是否选用分割!