VTM10.0代码学习2:NALU的解码

此系列是为了记录自己学习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]
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值