CABAC编码协议详细分析初稿.docx

上传人:b****9 文档编号:25107166 上传时间:2023-06-05 格式:DOCX 页数:22 大小:846.04KB
下载 相关 举报
CABAC编码协议详细分析初稿.docx_第1页
第1页 / 共22页
CABAC编码协议详细分析初稿.docx_第2页
第2页 / 共22页
CABAC编码协议详细分析初稿.docx_第3页
第3页 / 共22页
CABAC编码协议详细分析初稿.docx_第4页
第4页 / 共22页
CABAC编码协议详细分析初稿.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

CABAC编码协议详细分析初稿.docx

《CABAC编码协议详细分析初稿.docx》由会员分享,可在线阅读,更多相关《CABAC编码协议详细分析初稿.docx(22页珍藏版)》请在冰豆网上搜索。

CABAC编码协议详细分析初稿.docx

CABAC编码协议详细分析初稿

CABAC详细分析

CABAC的三个步骤:

1.二进制转换:

把非二进制语法元素唯一映射到一个二进制码字

2.上下文建模:

利用已编码的符号为语法元素选择合适的上下文模型并自动更新概率模型

3基于表格的算术编码:

利用查表的方式进行算术编码,有效地避免了乘法运算

二进制转换

一.一元码

对于一个非二进制数C来说,编码个1并在最后加上一个0

二.一元截断码

对于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对应一定范围内的上下文变量contextlabel,可参看下表:

具体每个CTX_ID[K]对应哪几个LABEL可进一步参考下表:

上下文模板

具体某一位context_id[k]可能对应几个不同的contextlabel,那么究竟具体对应哪个就由上下文模板来决定,上下文模板将在下面进行说明;

一.利用两个相邻符号的上下文模板

如图所示,正要编码的符号S是在当前宏块块C中,A,B是C的相邻宏块

通过关系式:

ctx_var_spat=cond_term(A,B)(9-1)

计算出符号S的上下文增量X,通过用OFFSET+X得出对应的contextlabel的值。

其中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对应的是significant_coeff_flag和last_significant_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的系数(两者都在当前宏块中计算)

上下文模型的初始化

前文解决了如何给语法元素的每一位分配contextlabel的问题,现在来解决一下究竟每一个contextlabel对应什么样的状态。

首先是状态的初始化问题,状态包含一个代表状态的数字和MPS(最大概率符号),实质上上下文模型状态的初始化是由该帧图像的量化参数QP决定的,对于每一个contextlabel都分配一对数组{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}

对于不同contextlabel的{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/AVC中的免除乘法的二进制编码基本思想依赖于一个假设:

每一个上下文模型估计的概率可以用一个有效的有限的特征值集合来表征。

对于CABAC,对LPS有64个特征概率值

伸缩因子

,N=64

一方面想要获得快速的自适应

N要小;另一方面,如果想获得更加稳定更加精确的估计,则

需要更大的N。

注意在MQ编码中,在CABAC方法中,不需要对LPS的概率值

进行表格化。

在算术编码中,每一个概率

仅仅用其相关的索引

作为地址。

这样设计的结果导致,CABAC中的每一个上下文模型可以有两个参数完全决定:

LPS概率当前估计值(

)和MPS的值

(0或者1)。

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

实际上,有一个状态的索引(

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

1)概率状态的更新

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

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

表格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:

仅供个人用于学习、研究;不得用于商业用途。

Forpersonaluseonlyinstudyandresearch;notforcommercialuse.

NurfürdenpersönlichenfürStudien,Forschung,zukommerziellenZweckenverwendetwerden.

Pourl'étudeetlarechercheuniquementàdesfinspersonnelles;pasàdesfinscommerciales.

 толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях. 

以下无正文

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1