CABAC编码协议详细分析(初稿)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CABAC详细分析
CABAC的三个步骤:
1.二进制转换:把非二进制语法元素唯一映射到一个二进制码字
2.上下文建模:利用已编码的符号为语法元素选择合适的上下文模型并自动更新概率模型3基于表格的算术编码:利用查表的方式进行算术编码,有效地避免了乘法运算
二进制转换
一.一元码
对于一个非二进制数C来说,编码个1并在最后加上一个
c
二.一元截断码
对于C小于Cmax时,用一元码的编码方法,当C=Cmax时,编码
个1而不在最后加0
三.UEGK二进制转换
前缀由Cmax=UCoff的一元截断码组成,后缀用k阶哥伦布编码数字C—Ucoff,其中k阶哥伦布编码用以下程序编码(对于要编码符号S)
四.固定长度二进制转换
对于字母表【0,1,2,…,Cmax】,编码的二进制长度
其中,二进制1对应其中重要性最低的符号,随着重要性的增加,二进制也会跟着增加
五.对于宏块与子宏块类型的具体二进制化对应
当adaptive_block_size_transform_flag==0时(非ABT变换,以下都针对非ABT变换),参看表格9-20,9-21,9-22:
关于表格的说明:
对应在SI帧内的宏块类型二进制转换按以下方法:
前缀构成:
当类型为mb_type_Sintra_4*4没有后缀,否则由表9-20给出
对于在P和SP图像的帧内预测宏块,mb_type=7~30的前缀由表9-21给出,后缀用表9-20 对于在B图像中的帧内预测宏块,mb_type=23~47的前缀由表9-21给出,后缀用表9-20
以上都是对非ABT变换来说的,对于ABT变换,要参考其他二进制方案表格,此处略去。

各种不同的语法元素,都是用到前面的4种二进制方案或者某两种二进制方案的串接,下面举例对变换系数的二进制方案进行说明:
首先该过程分为3个步骤:
1.如果coded_block_flag=0,说明没有重要系数(非0系数),不需要对宏块的信息进行编码,否则进行第二步
2.在扫描的过程中,对于每个扫描位置i,如果i位置的系数是0,那么significant_coeff_flag[i]=0,否则significant_coeff_flag[i]=1,当significant_coeff_flag[i]=1时,继续编码last_ significant_coeff_flag[i],如果该系数不是最后一个非0系数,last_ significant_coeff_flag[i]=0,否则=1,当等于1时不需要再对宏块剩余的0系数进行编码
3.对应那些significant_coeff_flag[i]=1的系数,要编码coeff_absolute_value_minus_1和coeff_sign,对于前者,采用UEG0编码(UCoff=14),对于后者直接采用旁路编码器(将在后文说到)
上下文定义与分配
首先,每个语法元素对应一个或者多个上下文指示器context_id,经过二进制转换后的语法元素可能有不止一位的二进制值,以mb_type_I(I帧图像内的宏块类型)为例,对应的context_id为ctx_mb_type_I,该语法元素二进制化后有6位二进制值,分别对应ctx_mb_type_I[k],1<=k<=6即max_idx_ctx_id=6,而每个context_id 对应一定范围内的上下文变量context label,可参看下表:
具体每个CTX_ID[K]对应哪几个LABEL可进一步参考下表:
上下文模板
具体某一位context_id[k]可能对应几个不同的context label,那么究竟具体对应哪个就由上下文模板来决定,上下文模板将在下面进行说明;
一.利用两个相邻符号的上下文模板
如图所示,正要编码的符号S是在当前宏块块C中,A,B是C的相邻宏块
通过关系式:ctx_var_spat=cond_term(A,B) (9-1)
计算出符号S的上下文增量X,通过用OFFSET+X得出对应的context label的值。

其中cond_term()表示的是一种函数关系,对于9-1式,有以下3种具体情况:
此外,ctx_coded_block依赖的是表9-28中的6种块类型,对于上下文变量ctx_abs_mvd_h[1]和ctx_abs_mvd_v[1],按以下式子编码:
二、利用先前bin值的上下文模板
关系式:
对应的表格:
三.关于变换系数信息的上下文定义
有关变换系数的上下文信息都由context_category决定,参看context_category的定义表:
ctx_sig
_coeff

ctx_last
_coeff
对应的

signific
ant_coe
ff_flag

last_sig
nificant
_coeff_
flag,有
以下关系式:
其中scanning_pos指示的位置与zig-zag扫描相关,对于ctx_abs_level包含2个变量ctx_abs_level[1]和ctx_abs_level[2],有以下关系式:
其中num_decod_abs_lev_eql指的是已编码的绝对值等于1的系数,
Num_decod_abs_lev_gtl指的是已编码的绝对值大于1的系数(两者都在当前宏块中计算)上下文模型的初始化
前文解决了如何给语法元素的每一位分配context label的问题,现在来解决一下究竟每一个
context label对应什么样的状态。

首先是状态的初始化问题,状态包含一个代表状态的数字和MPS(最大概率符号),实质上上下文模型状态的初始化是由该帧图像的量化参数QP决定的,对于每一个context label都分配一对数组{m,n},状态的初始化按以下的三步进行:
1.计算pre_state=((m*(QP-12))>>4)+n;
2.对于P和B帧图像限制pre_state在[0,101]内,对于I帧图像,限制pre_state在[27,74]
内,即pre_state= min(101,max(0, pre_state)) (对P 和B帧),
pre_state=min (74,max(27, pre_state)) (对I帧)
3.将pre_state按以下规则映射到数组{state,MPS},规则:
如果pre_state<=50, {state=50- pre_state,MPS=0},否则{state= pre_state-51,MPS=1}
对于不同context label的{m,n}分配,参看以下表格:
基于表格的算术编码
算术编码是基于区间细分的,CABAC的算术编码有以下3个明显性质:
1.概率的估计是对小概率符号LPS的概率而言的,是通过基于表格中64个不同状态之间的转换而实现的。

2.区间长度R通过一组预先量化的值{Q1,Q2,Q3,Q4}进行量化以计算新的间隔区间。

通过储存一个64*4的表格(Qi*Pk)来避免R*Pk的乘法运算。

3.一个独立的编码路径(旁路编码)用于对近似均匀分布(Plps=0.5)的语法元素
一. 概率估计
概率估计
在H.264/A VC 中的免除乘法的二进制编码基本思想依赖于一个假设:每一个上下文模型估计的概率可以用一个有效的有限的特征值集合来表征。

对于CABAC ,对LPS 有64个特征概率值[0.01875,0.5]p σ∈。

11/6301 (63)
0.01875()0.50.5
p p for all and p σσασα-==== 伸缩因子0.95α≈,N =64
一方面想要获得快速的自适应0;α→N 要小;另一方面,如果想获得更加稳定更加精确的估计,则1;α→需要更大的N 。

注意在MQ 编码中,在CABAC 方法中,不需要对LPS 的概率值{|063}p σσ≤≤进行表格化。

在算术编码中,每一
个概率p σ仅仅用其相关的索引σ作为地址。

这样设计的结果导致,CABAC 中的每一个上下文模型可以有两个参数完全决定:LPS 概率当前估计值(063σ≤≤)和MPS 的值ϖ(0或者1)。

这样,在CABAC 的概率估计中有128个不同的状态,每一个状态用一个7位整型数来表达。

实际上,有一个状态的索引(63σ=)与一个自治的非自适应的状态相关,它带有一个固定值的MPS ,它仅仅在算术码字终止前用于编码二进制决定位(binary decisions ).因此只有126个有效概率状态。

1)概率状态的更新
对于一个给定概率状态,概率的更新取决于状态索引和已经编码的符号值(MPS or LPS )。

更新过程导致一个新的概率状态,潜在的LPS 概率修正,如果有必要需要修改MPS 的值。

62max(,),,MPS (1),MPS LPS old new old p p if a MPS occurs p p if a LPS occurs ααα⋅⎧=⎨⋅+-⎩
保持不变,与切换
表格9-35显示的是编码MPS 或LPS 后的状态转移规则。

对于I 帧图像来说把状态控制在前24个内是有利的,因此,表9-35包含了独立的一列用作I 帧图像。

在编码一个MPS 或者LPS 后,概率估计自动从一个状态转移到另外一个状态进行自动更新,对于I 帧图像来说,有:
If (decision==MPS)
State<-Next_State_MPS_INTRA(State)
Else
State<-Next_State_LPS (State)
对于其他帧的图像来说,有:
If (decision==MPS)
State<-Next_State_MPS (State)
Else
State<-Next_State_LPS (State)
此外,当状态在0的时候(就是Plps=0.5), 如果编码得到的是一个LPS,那么LPS的概率就超过了原来MPS的概率,因此,LPS与MPS的值要进行交换。

二.算术编码器的总体描述
算术编码器的情形是由一个指向编码子区间的V值和一个表示该区间长度的R值描述的。

图9-3显示了编码的流程:对于编码器的初始化(InitDecoder),将在后文中谈到,其中V和R将被初始化。

对于每一个编码决定的S(具体说编1或者0),有两个步骤。

一是读取上下文模型,上文已经解决了该问题;二是根据上下文决定S的值,这将在后面给出。

A.算术编码器的初始化
初始化如图9-4所示,V是通过GetByte函数获得2个压缩数据的字节,R的初始化设置为0x8000。

关于GetByte函数:图9-7显示了压缩数据是如何输入的;首先,一个新的压缩数据的字节从比特串C中读取,然后指向当前比特串位置的CL增加1,比特计算器BG被设置成7
B.编码决定
图9-5显示的是一个编码决定,即决定具体编码的符号是MPS还是LPS。

图中RTAB[State][Q]可参看表格9-36,表中的值用16位表示,列表显示的值实际上是8位精度的,RTAB中的最大值对应的是14位,里面所有的值都左移了6位为了更好地在16位结构中存取。

C.编码的重整化
重整化过程参看图像9-6
D.旁路编码器
这个特殊的编码程序是为运动矢量数据的符号和非0变换系数的符号(正负)而设定的,这些符号被认为是均匀分布的,因此编码的时候省去概率估计一项以加快编码速度,具体过程参看图9-8:
仅供个人用于学习、研究;不得用于商业用途。

For personal use only in study and research; not for commercial use.
Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden.
Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.
толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.
以下无正文。

相关文档
最新文档