之前VTM3.0色度帧内预测跟进中学习了VTM3.0的色度帧内预测过程,今天来看下具体函数estIntraPredChromaQT
。
VTM3.0色度帧内预测分成两个阶段:
1.粗选:按DC、Ver、Hor、LM_L、LM_T进行预测,按SATD排序,去掉两个SATD最大的模式。
2.细选:粗选剩下三个模式和Planar、LM、DM(共六种)进行RD检测选最优。其中当DM借用的亮度角度模式与前四种模式相同时,会将与DM重复的模式换为角度66模式。
其中调用的重要函数有:getIntraChromaCandModes
(获取色度帧内候选),xGetLumaRecPixels
(获取亮度重构像素值,填充LM预测的参考像素),predIntraChromaLM
(色度LM预测),predIntraAng
(角度预测)。
色度候选列表如下:
modeList[ 0 ] = PLANAR_IDX;
modeList[ 1 ] = VER_IDX;
modeList[ 2 ] = HOR_IDX;
modeList[ 3 ] = DC_IDX;
modeList[4] = LM_CHROMA_IDX;
modeList[5] = MDLM_L_IDX;
modeList[6] = MDLM_T_IDX;
modeList[7] = DM_CHROMA_IDX;
//其中当DM借用的亮度角度模式与前四种模式相同时,会与DM重复的模式换为角度66模式。
代码分析:
void IntraSearch::estIntraPredChromaQT(CodingUnit &cu, Partitioner &partitioner)
{
const ChromaFormat format = cu.chromaFormat;
const uint32_t numberValidComponents = getNumberValidComponents(format);
CodingStructure &cs = *cu.cs;
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;
//----- check chroma modes -----
uint32_t chromaCandModes[ NUM_CHROMA_MODE ];
PU::getIntraChromaCandModes( pu, chromaCandModes ); //获取色度候选模式
// create a temporary CS
CodingStructure &saveCS = *m_pSaveCS[0];
saveCS.pcv = cs.pcv;
saveCS.picture = cs.picture;
saveCS.area.repositionTo( cs.area );
saveCS.clearTUs();
if( CS::isDualITree( cs ) )
{
if( parti