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 )