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