VVC/H.266代碼閱讀(VTM8.0)(五. CU語法語義解析 )

本文是本系列的第五篇博客,內容是分析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常見資源整理(提案地址、代碼、資料等)

注:

  1. 考慮到從解碼端分析代碼,一是更加簡單(解碼流程無需編碼工具和編碼參數的擇優),二是可以配合Draft文本更好地理解視頻編解碼的流程(解碼端也都包含預測、量化、環路濾波、熵解碼等流程),所以本系列從解碼端入手分析VVC解碼大致流程。等到解碼端代碼分析完後,再從編碼端深入分析。
  2. 本文分析的bin文件是利用VTM8.0的編碼器,以All Intra配置(IBC 打開)編碼100幀得到的二進制碼流(TemporalSubsampleRatio: 8,實際編碼 ⌈100 / 8⌉ = 13幀)。
  3. 解碼用最簡單的:-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 );

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章