如上过程,底层编码方式是算数编码。
1 较重要的熵编码的函数:
virtual void encodeBin ( unsigned bin, unsigned ctxId ) = 0;
virtual void encodeBinEP ( unsigned bin ) = 0;
virtual void encodeBinsEP ( unsigned bins, unsigned numBins ) = 0;
2 函数和参数意义:
编码器类型 | 函数 | 参数1 | 参数2 | 注意 |
---|---|---|---|---|
常规编码器 | encodeBin | 要编的数 | 要用的上下文模型 | 常规编码器收到n位要编的数,通过上下文模型,可以编成<n位 |
旁路编码器 | encodeBinEP | 要编的数 | 要编的数一定是0或1,收到几就编几。旁路用等概模型去编 | |
旁路编码器 | encodeBinsEP | 要编的数 | 用几位编 | 要编的数可能大于1,收到几就编几的二进制数。旁路用等概模型去编 |
3 上下文模型:
const CtxSet ContextSetCfg::IntraChromaPredMode = ContextSetCfg::addCtxSet
({
//0 1 2
//DM CCLM MDLM
{ 152, 139, 154,},//B帧
{ 138, 139, 169,},//P帧
{ 109, 139, 154,},//I帧
});
m_BinEncoder.encodeBin(isDerivedMode ? 0 : 1, Ctx::IntraChromaPredMode(0));
当要编码的帧为I帧时,若选中模式DM。可见encodeBin常规编码器,是DM模式,故编码0,用的则在第三行I帧的数组中找到DM对应标号0,此时Ctx::IntraChromaPredMode(0)即109。
在JVET-M0453中提出coding engines被VTM4.0接收,所以上下文模型增加一行。详细了解请看JVET-M0453
4 熵解码
virtual unsigned decodeBin ( unsigned ctxId ) = 0;
unsigned decodeBinEP ();
unsigned decodeBinsEP ( unsigned numBins );
decodeBin为常规解码器,接收上下文模型。
decodeBinEP和decodeBinsEP为旁路解码器,接收解码的比特数。