【VTM10.0】熵编码技术

本文深入探讨了熵编码技术,重点介绍了上下文自适应二进制算术编码(CABAC)及其解码过程,并详细阐述了旁路编码的多位和一位模式,包括解码策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CABAC编码

template <class BinProbModel>
void TBinEncoder<BinProbModel>::encodeBin( unsigned bin, unsigned ctxId )
{
  BinCounter::addCtx( ctxId );
  BinProbModel& rcProbModel = m_Ctx[ctxId];
  uint32_t      LPS         = rcProbModel.getLPS( m_Range );

  DTRACE( g_trace_ctx, D_CABAC, "%d" " %d " "%d" "  " "[%d:%d]" "  " "%2d(MPS=%d)"  "  " "  -  " "%d" "\n", DTRACE_GET_COUNTER( g_trace_ctx, D_CABAC ), ctxId, m_Range, m_Range - LPS, LPS, ( unsigned int ) ( rcProbModel.state() ), bin == rcProbModel.mps(), bin );

  m_Range   -=  LPS;
  if( bin != rcProbModel.mps() )
  {//如果传过来的symbol是LPS,range肯定会小于256,因此要进行归一化操作
    int numBits   = rcProbModel.getRenormBitsLPS( LPS );
    m_bitsLeft   -= numBits;//寄存器中剩余的供Low左移用的位数
    m_Low        += m_Range;//则低位要加上m_Range
    m_Low         = m_Low << numBits;//对low的左移是为了输出比特
    m_Range       = LPS   << numBits;//对range的左移是为了扩大区间宽度,两者左移的位数是相同的
    if( m_bitsLeft < 12 )
    {
      writeOut();
    }
  }
  else//mps
  {
    if( m_Range < 256 )//m_Range表示mps的长度,这里选中了mps,说明下次m_Range是总长度,所以要判断是否小于256
    {
      int numBits   = rcProbModel.getRenormBitsRange( m_Range );
      m_bitsLeft   -= numBits;
      m_Low       <<= numBits;
      m_Range     <<= numBits;
      if( m_bitsLeft < 12 )//如果剩余的比特数小于12,即寄存器高位中剩余比特数小于初始值23 的一半时,写出
      {
        writeOut();
      }
    }
  }
  rcProbModel.update( bin );//上下文模型更新
  BinEncoderBase::m_BinStore.addBin( bin, ctxId );
}

CABAC解码:

template <class BinProbModel>
unsigned T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值