此系列是为了记录自己学习VTM10.0的过程和锻炼表达能力,主要是从解码端进行入手。由于本人水平有限,出现的错误恳请大家指正,欢迎与大家一起交流进步。
1. m_cDecLib.decode
接着本系列的上一篇博客继续讲,之前的2.1.1小节讲到函数m_cDecLib.decode是调用解码器类进行NALU解码。NALU分两大类VCL和non-VCL类型,这两种类型下面又有很多细分,相应的解码也要把不同类型的NALU分开解码。
bool ret;
// ignore all NAL units of layers > 0
//将NALU的头信息存入顺序容器
AccessUnitInfo auInfo;
auInfo.m_nalUnitType = nalu.m_nalUnitType;
auInfo.m_nuhLayerId = nalu.m_nuhLayerId;
auInfo.m_temporalId = nalu.m_temporalId;
m_accessUnitNals.push_back(auInfo);
m_pictureUnitNals.push_back( nalu.m_nalUnitType );
switch (nalu.m_nalUnitType)//根据NALU的类型分别解码
{
case NAL_UNIT_VPS:
xDecodeVPS( nalu );//解码VPS 参考JVET-S2001 7.3.2.3 P83
m_vps->m_targetOlsIdx = iTargetOlsIdx;//设置m_vps的目标输出层集的索引
return false;
case NAL_UNIT_DCI:
xDecodeDCI( nalu );//解码DCI 参考JVET-S2001 7.3.2.1 P83
return false;
case NAL_UNIT_SPS:
xDecodeSPS( nalu );//解码SPS 参考JVET-S2001 7.3.2.4 P86
return false;
case NAL_UNIT_PPS:
xDecodePPS( nalu );//解码PPS 参考JVET-S2001 7.3.2.5 P91
return false;
case NAL_UNIT_PH:
xDecodePicHeader(nalu);//解码picture header,如果解码过程处于一帧中的第一个slice,那么返回false。参考JVET-S2001 7.3.2.7 P95
return !m_bFirstSliceInPicture;
case NAL_UNIT_PREFIX_APS:
case NAL_UNIT_SUFFIX_APS:
xDecodeAPS(nalu);//解码APS 参考JVET-S2001 7.3.2.6 P94
return false;
case NAL_UNIT_CODED_SLICE_TRAIL:
case NAL_UNIT_CODED_SLICE_STSA:
case NAL_UNIT_CODED_SLICE_IDR_W_RADL:
case NAL_UNIT_CODED_SLICE_IDR_N_LP:
case NAL_UNIT_CODED_SLICE_CRA:
case NAL_UNIT_CODED_SLICE_GDR:
case NAL_UNIT_CODED_SLICE_RADL:
case NAL_UNIT_CODED_SLICE_RASL:
ret = xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay);//解码VCL类型的NALU 参考JVET-S2001 7.3.2.14 P99
return ret;
case NAL_UNIT_EOS://遇到EOS,重置解码器类中的一些属性
m_associatedIRAPType[nalu.m_nuhLayerId] = NAL_UNIT_INVALID;
m_pocCRA[nalu.m_nuhLayerId] = MAX_INT;
m_prevGDRInSameLayerPOC[nalu.m_nuhLayerId] = MAX_INT;
std::fill_n(m_prevGDRSubpicPOC[nalu.m_nuhLayerId], MAX_NUM_SUB_PICS, MAX_INT);
memset(m_prevIRAPSubpicPOC[nalu.m_nuhLayerId], 0, sizeof(int)*MAX_NUM_SUB_PICS);
memset(m_prevIRAPSubpicDecOrderNo[nalu.m_nuhLayerId], 0, sizeof(int)*MAX_NUM_SUB_PICS);
std::fill_n(m_prevIRAPSubpicType[nalu.m_nuhLayerId]