3、CABAC的细节详述
A. 宏块类型、预测模式和控制信息的编码
1). 宏块和子宏块类型编码:mb_skip_flag表示在P/SP帧中当前宏块是否被跳过,若非跳过宏块,则mb_type表示该宏块的的类型。对于P8×8和B8×8宏块,对于每一个子宏块都有一个语法元素sub_mb_type表示其类型。
编码mb_skip_flag:对于任意一个宏块C,对应的上下文模型包含了该宏块左侧(宏块A)和上方(宏块B)的mb_skip_flag的值。根据这两个参数的取值,当前宏块的取值可能为0、1或2。
编码mb_type:下图表示了宏块和子宏块类型的二值化方法。
在P条带中,mb_type不使用4这个模式,而5-30的值表示P条带中帧内宏块的类型,此类情况下,二值化的第一位为1。对上图中的各个二值化结果,对mb_type取值分别为C0-C3,对sub_mb_type分别为C0, C1, C2。
2). 预测模式的编码
对于帧内宏块,需编码的语法元素有亮度和色度分量的预测模式;对于帧间宏块,则包含参考帧的索引和相关的运动矢量残差信息。
(1).帧内4×4模式的亮度分量:用到两个语法元素prev_intra4x4_pred_mode_flag和rem_intra4x4_pred_mode(只有在前者=0的时候有效,二值化用3位定长码);采用两个不同概率模型;
(2).帧内模式的色度分量:ChPredInDcMode表明了相应的宏块是否采用DC预测模式,而当前宏块则依据左、上方的相邻宏块的ChPredInDcMode是否为1决定上下文模型索引值为0、1或2。这些上下文模型用于编码intra_chroma_pred_mode(二值化用截断1元码)的第一个二进制码字。剩余的码字采用其他固定的概率模型。
(3).参考帧索引:同上类似,语法元素ref_idx的上下文模型索引号有当前宏块左侧和上方的宏块信息(RefIdxZeroFlag,表示该区域的ref_idx是否为0)决定,有0-3共4种可能取值。采用该模型编码第一个码字,其他码字用另外两个模型完成。
(4).MVD分量:其选择的上下文模型,根据左和上方宏块或子宏块的MVD模的和值的范围分为0.1.2三个值。MVD的二值化采用3阶指数哥伦布编码,只有前缀部分的第一个码字采用上述模型,第2-9个码字使用另外的4个模型编码。后缀部分都采用旁路编码模式。
3). 控制信息的编码:
主要包三个元素的处理:mb_qp_delta, end_of_slice_flag和mb_field_decoding_flag。
(1)mb_qp_delta:用于可变宏块量化参数,包含在coded_block_pattern=0的非跳过模式的宏块中。第一步Δ(C)映射为一个对应的非负值并采用二院码二值化。根据之前编码宏块的Δ(P)是否为0决定为第一个码字选取哪一个概率模型,其余码字采用另外的模型。
(2)end_of_slice_flag:标识当前宏块是条带内的最后一个宏块。采用某个特别设计的非自适应概率模型。
(3)mb_field_decoding_flag:标识在帧场自适应模式中,该宏块使用帧编码还是场编码。其上下文模型索引通过对比左、上方相邻块的mb_field_decoding_flag值取0、1或2;
B. 残差数据的编码
1)特点:
针对残差数据,H.264/AVC的CABAC定义了多种特定的语法元素进行处理,其中有:
(1)1位标识位coded_block_flag和二元重要性图结构,表示某个块结构中非0变换系数的位置;
(2)非零值level按反向扫描顺序进行编码;
(3)依据之前传输的非零level值,反向扫描确定非零变换系数的上下文;
2)编码残差数据的过程
下图表示对残差进行CABAC的流程框图:
首先,除非coded_block_pattern或宏块模式表明,该块内不存在非零变化系数,则首先传递的是coded_block_flag这个值。如果这个值为0,则该block不会再传输任何信息;如果不为0,则编码该块的重要性图,指示非0系数的位置。最后对每一个非零系数,编码其符号和绝对值。所有数值按照反向扫描顺序传输。具体细节如下:
(1)编码块模式coded_block_pattern:针对非intra16x16模式的非跳过宏块,这个值表示六个8×8子块(亮度×4+色度×2)中的哪一个包含非零系数。采用4位定长码和截断值=2的截断一元码进行二值化;
(2)编码块标志coded_block_flag:1位符号,表示当前块内存在非零变换系数。若不存在,则跳过该块后期的处理;
(3)变换系数的扫描:第一步是以某种扫描模式,将2D的变换系数矩阵映射为一个一维序列;
(4)重要性表significant map:在coded_block_flag表明该块内存在非零系数的情况下,编码该块的重要性表;对于每一个系数,对应存在一个1位标志significant_coeff_flag,该标志=1,则存在另一个标志last_significant_coeff_flag,该符号表示当前系数是否是该块中的最后一个非零系数还是后面还有其他的。对于块的最后一个而言,这两个标识位不需要也不会发送。
(5)级别信息Level Information:块的重要性表决定了块内非零系数的位置,非零系数的值以级别level表示,在编码中编成两个符号coeff_abs_level_minus1和coeff_sign_flag,分别代表系数的绝对值和符号。系数的绝对值信息用0阶指数哥伦布编码二值化。级别信息以反向扫描顺序传输,即从最后一个重要系数开始想第一个传递。
3).残差信号的上下文建模
在H.264/AVC中,共把变换系数矩阵分为12中不同类型,分别代表了不同的统计特性,并针对实际情况将这12中类型分成5大类。对每一个大类,都制定一个上下文模型的集合用于编码残差数据相关的语法元素(coded_block_pattern除外)。下面说明对coded_block_pattern所采用的方法。
coded_block_pattern:该语法元素中的每一位都表示相应变换系数块的编码判定,因此语法元素的概率模型取决于码元的索引值。对表示4个8×8亮度块的前四个码元,上下文模型索引根据左方和上方8×8块的coded_block_pattern是否为0的值取0-3;第四个和第五个码元与色度分量相关,上下文的分配模型同亮度码元类似,共额外定义了8种概率模型。
coded_block_flag:对于5中类别任意之一,采用了4种不同的概率模型,根据左、上方块的coded_block_flag的取值可能取0-3。只有相同类型的块才用作判决。
significant map:【为什么文献中前面讲了一个15而后面却又提到61中呢?不明白。】
级别信息level information:CABAC中采用了反向扫描,因为这样更有利于获取稳定的统计信息。在编码coeff_abs_level_minus1时,选用两个上下文模型集合,其中之一用于第一个二元码,另一个用于其他的二值化码字。
C. 概率估计
CABAC定义了64中概率值,有以下公式推出:
在上式中,α≈0.95,N=64,这两个取值确保算法在稳定、精确估计以及快速自适应之间取得一个平衡。这些概率值通过对应的索引值隐式地包含在了算数编码引擎中。这样,CABAC的每一个上下文模型可以用两个参数完全表示:一个LPS的当前估计值(0-63的索引)和MPS的值(0/1),实际在CABAC中仅有126个模型状态是有效的。
1). 更新概率状态:
CABAC中的概率模型基本上都是自适应模型,在没编码完成一个符号之后会更新状态。对于给定状态,更新的结果取决于当前状态以及当前的符号是按照LPS/MPS编码。更新完成之后将产生一个新的概率模型。在一个MPS事件发生时,给定状态索引加1,除非状态索引已经为62,此时LPS概率估计已经为最小值,或者MPS概率估计已经达到上限(此情况下,状态索引保持为62直到遇到LPS,此时状态索引将减小)。
2). 概率状态的初始化与重置
所有的概率状态在条带的边界处都应初始化为某种预定义的初始状态(如全部初始化为等概率状态)。CABAC提供的“上下文模型初始化机制”利用了先验知识,在两个层次上对上下文模型进行初始化:
(1)依赖于量化参数的初始化:
此方法预设了一个初始化值的集合,通过初始设定的SliceQP导出。
(2)依赖于条带的初始化:
通过定义两个附加的上下文初始化集合实现,特定用于P和B条带的上下文建模。编码器通过在三个初始化表中选择以适应不同的条带类型。
D: 基于表的二进制算数编码
关于CABAC的算术编码引擎,共存在两种引擎:其一为常规编码引擎,此类方法利用了自适应概率模型进行算术编码;另一种为旁路编码引擎用于快速编码,利用一种近似等概率模型。
1).常规编码模式的区间分割:
下图表示了某一个二进制值binVal进行常规模式算术编码的流程。
在CABAC的过程中,区间的状态可以用当前区间范围R和区间下限L表示,在寄存器中这两个值的精度可达9和10位。编码binVal这个值需要上下文模型,其中包含概率状态索引σ和MPS的值ω,具体步骤分为以下四步:
第一步也是最主要的一部,是根据给定的概率估计,将当前区间进行分割成两个子区间。首先采用将2^8<=R<=2^9区间等分为4份获得某个量化的Q(R)值,近似表示当前区间长度R。Q(R)由其量化索引表示,ρ=(R>>6)&3。
第二步,这个索引值ρ和概率状态索引值σ用于在二维表TabRangeLPS中查找与LPS相关的子区间范围RLPS。同时可以获得的是对应MPS的子区间R-RLPS。选定给定的二进制值binVal对应的子区间,若binVal等于MPS对应的值ω,则选定低子区间,否则选定高子区间;
第三步,采用2.C中的方法更新概率模型;
第四步,将寄存器复位,即图中的RenormE;
2).旁路编码模式
为了加快编解码的速度,对于近似等概率的情况,CABAC提供了简化版本——旁路编码模式。该模式绕过了概率模型的估计和更新,并对区间进行平均分割。下图表示旁路模式的流程框图。
3).归一化:
在区间范围R离开合法范围之后,分割过程终止,并进行归一化操作。每次归一化时,会输入1个或多个码流字符,编码器中存在进位传送现象。
4).编码终止:
索引值为63的概率模型是特别设计的、非自适应的模型。这样,相关的表的入口TabRangeLPS[63,ρ]和Rlps由固定值2确定。这样确保在编码条带的终止语法元素end_of_slice_flag的时候输出7bit码字。
4、实验结果和总结
采用了CABAC后,H.264的编码效率远远超过了基准档次、采用CAVLC的算法。在视频广播应用中,30-38db可接受的视频质量范围下,CABAC比CAVLC节省了9%-14%的码率,并且在更低码率的情况下,编码增益也更高。
【由于平时上班没多少时间,只能抽业余时间学,所以进度太慢,而且难以深入,单单是这一篇论文竟然看了将近一个月,而且也没能完全理解透彻。之前还剩下了一些问题没有解决,比如GOP、hierarchy B和IntraPeriod等等的概念,这些会在未来几天理解清楚。然后会找H.264的代码在实际场景中走一遍CABAC的过程。】