标签:tom 参考 模式 分享图片 步骤 element 建模 ice normal
转自:https://www.cnblogs.com/TaigaCon/p/5304563.html
算术编码是基于区间划分的,普通的概率划分需要使用到多位乘法。CABAC的算术编码为了降低计算复杂度,并便于硬件实现,采取了如下一些方法:
该过程可分为5个步骤
在CABAC编码过程中,在输入符号后,进行区间更新,接下来就是重归一化过程。下面就以[0,210)[0,210)表示区间[0,1)[0,1)为例,分析重归一化过程
(请注意,在该过程中,[0,210)[0,210)只起到辅助作用,实际的区间为RR)
在编码输出“0”或者“1”的阶段,用PutBit(B)表示
关于PutBit(B)的分析,参考上面重归一化的区间图,可以看到有三种情况
另外,PutBit(B)不会编码第一个bit。原因是CABAC在初始化的时候,会以[0,210)[0,210)表示区间[0,1)[0,1),而在初始化区间时R=510,L=0R=510,L=0,这意味着已经进行了第一次区间选择,区间为[0,0.5)[0,0.5),需要输出“0”。PutBit(B)在此阻止这个“0”的输出,这样就能得到正确的算术编码结果了。
有些语法元素在二值化后选择的可能不是上述的算术编码,而是旁路编码,具体情况请查看h.264标准9.3.2的第一个表格。旁路编码中,假设待编码的符号符合近似的均匀分布。下图给出了旁路模式下的编码过程。
旁路模式有几个特点:符号均匀分布,无需对RR进行量化与查表;每编码完一个符号后,RR总是会小于2828,因此每次都需要对概率区间进行放大;把对LL的移位操作提到了前面,因此旁路编码的重归一化的区间可以看作由[0,210)[0,210)变成了[0,211)[0,211)。
下面是旁路编码的一个例子
在编码语法元素end_of_slice_flag以及I_PCM mb_type时(ctxIdx = 276)会调用EncodeTerminate这个编码过程。
在EncodeTerminate中,采用的是pStateIdx = 63的状态,这个状态表示的是当前宏块是否为该slice的最后一个宏块的概率。在该状态下,对概率区间的划分跟概率区间量化值无关。在编码end_of_slice_flag以及I_PCM的mb_type时,概率区间固定为RLPS=2RLPS=2。如果当前宏块为slice的最后一个宏块(end_of_slice_flag = 1)或者当前编码为PCM宏块并且编码它的mb_type I_PCM时,结束CABAC编码,调用EncodeTerminate中的EncodeFlush。具体情况请参考标准中的9.3.4.5小节以及CABAC补充讨论。
在编码完成slice的最后一个宏块后,将会调用字节填充过程。该过程会往NAL单元写入0个或者更多个字节(cabac_zero_word),目的是完成对NAL单元的封装(标准9.3.4.6)。这里有计算如下
k=?(?3×(32×BinCountsInNALunits?RawMbBits×PicSizeInMbs1024)??NumBytesInVclNalunits)/3?k=?(?3×(32×BinCountsInNALunits?RawMbBits×PicSizeInMbs1024)??NumBytesInVclNalunits)/3?
如果k>0k>0,则需要将3字节长的0x000003添加到NAL单元kk次。这里的前两字节0x0000代表了cabac_zero_word,第三个字节0x03代表一个emulation_prevention_three_byte,这两个语法元素请参考h.264语法结构分析的相关部分。
如果k?0k?0,则无需添加字节到NAL单元。
式子中的各个变量所代表的意思请查看标准
标签:tom 参考 模式 分享图片 步骤 element 建模 ice normal
原文地址:https://www.cnblogs.com/qing1991/p/10111376.html