本文是本系列的第五篇博客,內容是分析CU的語法語義。
該系列相關博客爲:
VVC/H.266代碼閱讀(VTM8.0)(一. NALU提取)
VVC/H.266代碼閱讀(VTM8.0)(二. non-VCLU解碼)
VVC/H.266代碼閱讀(VTM8.0)(三. Slice到CTU的處理 )
VVC/H.266代碼閱讀(VTM8.0)(四. CU劃分 )
VVC/H.266常見資源爲:
VVC/H.266常見資源整理(提案地址、代碼、資料等)
注:
- 考慮到從解碼端分析代碼,一是更加簡單(解碼流程無需編碼工具和編碼參數的擇優),二是可以配合Draft文本更好地理解視頻編解碼的流程(解碼端也都包含預測、量化、環路濾波、熵解碼等流程),所以本系列從解碼端入手分析VVC解碼大致流程。等到解碼端代碼分析完後,再從編碼端深入分析。
- 本文分析的bin文件是利用VTM8.0的編碼器,以All Intra配置(IBC 打開)編碼100幀得到的二進制碼流(TemporalSubsampleRatio: 8,實際編碼 ⌈100 / 8⌉ = 13幀)。
- 解碼用最簡單的:-b str.bin -o dec.yuv
上一篇博客的最後寫道“調用CABACReader::coding_unit()分析該CU的預測模式、MV等信息 ”。所以,本篇博客從該函數開始分析。遵循draft內7.3.10.5 Coding unit syntax。
void CABACReader::coding_unit( CodingUnit &cu, Partitioner &partitioner, CUCtx& cuCtx )
{
CodingStructure& cs = *cu.cs;
//之前博客說過,CodingStructure結構非常重要,管理了一幀中所有的CU,PU和TU,方便讀取等操作。
PredictionUnit& pu = cs.addPU(cu, partitioner.chType);
//PU內存儲了和預測有關的信息,比如幀內預測模式、幀間預測MV等信息
// skip flag
if ((!cs.slice->isIntra() || cs.slice->getSPS()->getIBCFlag()) && cu.Y().valid())
{
cu_skip_flag( cu );
//開啓了IBC的I幀、P、B幀會先傳輸skip_flag。
}
// skip data
if( cu.skip )
{
cu.colorTransform = false;
cs.addTU ( cu, partitioner.chType );
MergeCtx mrgCtx;
prediction_unit ( pu, mrgCtx );
//skip模式下,調用CABACReader::prediction_unit()、 CABACReader::merge_data()獲取mergeIdx等信息
end_of_ctu( cu, cuCtx );
return;
}
// prediction mode and partitioning data
pred_mode ( cu );
//判斷是intra ibc PLT 還是inter modea
if (CU::isIntra(cu))
{
adaptive_color_transform(cu);
//ACTflag
}
if (CU::isPLT(cu))
{
……
//PLT調色板模式相關參數的解析,未開啓調色板,此處省略
……
}
// --> create PUs
// prediction data ( intra prediction modes / reference indexes + motion vectors )
cu_pred_data( cu );
//獲得CU的預測模式信息,比如intra mode 的IPM、Inter mode的MVD、參考幀信息
// residual data ( coded block flags + transform coefficient levels )
cu_residual( cu, partitioner, cuCtx );
//殘差信息解碼
// check end of cu
end_of_ctu( cu, cuCtx );
}
void CABACReader::cu_pred_data( CodingUnit &cu )
{
if( CU::isIntra( cu ) )
{
#if JVET_Q0110_Q0785_CHROMA_BDPCM_420
if( cu.Y().valid() )
{
bdpcm_mode(cu, COMPONENT_Y );
//BDPCM Block-based Delta Pulse Code Modulation
//BDPCM模式相關參數解析
}
#endif
intra_luma_pred_modes( cu );
//亮度MPM mip isp等參數解析
#if JVET_Q0110_Q0785_CHROMA_BDPCM_420
if( ( !cu.Y().valid() || (!cu.isSepTree() && cu.Y().valid() ) ) && isChromaEnabled(cu.chromaFormat) )
{
bdpcm_mode(cu, ComponentID(CHANNEL_TYPE_CHROMA));
}
#endif
intra_chroma_pred_modes( cu );
//色度intra相關參數解析
return;
}
if (!cu.Y().valid()) // dual tree chroma CU
{
cu.predMode = MODE_IBC;
return;
}
MergeCtx mrgCtx;
for( auto &pu : CU::traversePUs( cu ) )
{
prediction_unit( pu, mrgCtx );
}
imv_mode ( cu, mrgCtx );
affine_amvr_mode( cu, mrgCtx );
cu_bcw_flag( cu );
}