关于该技术的技术细节我在之前的博客讲过啦,大家可以直接去看那篇博客:H.266/VVC相关技术学习笔记:O次会议新接收的技术——色度预测模式编码的简化和统一
刚把相关的代码看了一下,现在把代码和注释给补上,有疑问的同学可以直接留言~
intra_chroma_pred_mode()函数学习
void CABACWriter::intra_chroma_pred_mode(const PredictionUnit& pu)
{
const unsigned intraDir = pu.intraDir[1];
if (pu.cs->sps->getUseLMChroma())
{
//如果CCLM模式是可用的,这里对第一个比特位编1,标志是CCLM模式
m_BinEncoder.encodeBin(PU::isLMCMode(intraDir) ? 1 : 0, Ctx::IntraChromaPredMode(0));
if (PU::isLMCMode(intraDir))
{
//三种CCLM模式独立的CABAC编码方式,
intra_chroma_lmc_mode(pu);
return;
}
}
const bool isDerivedMode = intraDir == DM_CHROMA_IDX;
//如果CCLM模式不可用,默认第一个比特为0,不需要进行编码,这里直接编码第二个比特位,若为DM模式,编0;否则编1
m_BinEncoder.encodeBin(isDerivedMode ? 0 : 1, Ctx::IntraChromaPredMode(1));
if (isDerivedMode)
{
return;
}
// chroma candidate index
unsigned chromaCandModes[NUM_CHROMA_MODE];
PU::getIntraChromaCandModes(pu, chromaCandModes);
int candId = 0;
for (; candId < NUM_CHROMA_MODE; candId++)
{
if (intraDir == chromaCandModes[candId])
{
break;
}
}
CHECK(candId >= NUM_CHROMA_MODE, "Chroma prediction mode index out of bounds");
CHECK(chromaCandModes[candId] == DM_CHROMA_IDX, "The intra dir cannot be DM_CHROMA for this path");
{
m_BinEncoder.encodeBinsEP(candId, 2);//四种传统角度模式的编码,和VTM5.0中一样,用旁路编码器
}
}
intra_chroma_lmc_mode()函数学习
void CABACWriter::intra_chroma_lmc_mode(const PredictionUnit& pu)
{
const unsigned intraDir = pu.intraDir[1];
int lmModeList[10];
PU::getLMSymbolList(pu, lmModeList);
int symbol = -1;
for (int k = 0; k < LM_SYMBOL_NUM; k++)
{
if (lmModeList[k] == intraDir)
{
symbol = k;
break;
}
}
CHECK(symbol < 0, "invalid symbol found");
#if BINIDX1_SINGLE_CTX
//如果是LM模式,第二个比特位编0,否则编1
m_BinEncoder.encodeBin(symbol == 0 ? 0 : 1, Ctx::IntraChromaPredMode(1));
#else
m_BinEncoder.encodeBin(symbol == 0 ? 0 : 1, Ctx::IntraChromaPredMode(2));
#endif
if (symbol > 0)
{
CHECK(symbol > 2, "invalid symbol for MMLM");//如果symbol > 2,则抛出异常,无效的CCLM模式。
unsigned int symbol_minus_1 = symbol - 1;
//如果是MDLM_L模式,第三位编0;是MDLM_T模式。第三位编1
m_BinEncoder.encodeBinEP(symbol_minus_1);
}
//unary_max_symbol(symbol, Ctx::IntraChromaPredMode(1), Ctx::IntraChromaPredMode(2), maxSymbol - 1);
}