H.266/VVC代码学习笔记9:即将接收到VTM6.0中的新技术——帧内色度预测模式编码的简化统一

关于该技术的技术细节我在之前的博客讲过啦,大家可以直接去看那篇博客: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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值