H265 CABAC学习笔记

编码部分

编码部分来源于https://blog.csdn.net/novice_growth/article/details/70830835

在复旦大学的开源H265代码cabac_se_prepare.v中,lcu_curr_state_r表示输出到二进制化模块的
数据的类型,由参数到残差数据变化。
根据cabac_se_prepare.v文件,每个参数会带特定的后缀,如
sao_merge_left_flag_w  =   {7'h00,sao_merge_left_flag_r,4'h1,9'h0b5}
sao_merge_up_flag_w    =   {7'h00,sao_merge_up_flag_r,4'h1,9'h0b5}
sao_type_idx_o         =   {6'h00,2'b??,4'h1,9'h0b6}
sao_offset_abs_o       =   {5'h0,sao_offset_abs,4'h7,9'h0bc}
    
cabac_bina.v中,将cabac_se_prepare.v输入的语法元素通过cabac_bina_lut.v文件查表,比对那些
参数得后缀,得到相应的二进制数输出,如sao_merge_left_flag的后缀是9'h0b5 = 181。

解码部分

解码部分参考https://blog.csdn.net/LBO4031/article/details/84332897

1、解出语法元素

 解出《Rec. ITU-T H.265 v6》Table 9-48中相应的语法元素。binIdx的初始值为0,
 依次递增1。

2、沿用编码部分的上下文模型模块

沿用上下文模型模块,初始化pStateIdx和valMps值。具体方法见
《Rec. ITU-T H.265 v6》9.3.4.2
其中InitType由slice header所给的当前帧类型指出。
if( slice_type = = I ) 
   initType = 0 
else if( slice_type = = P ) 
   initType = cabac_init_flag ? 2 : 1 
else 
   initType = cabac_init_flag ? 1 : 2

3、确定输出给算术解码模块的参数

输出到算术解码模块的参数除了pStateIdx和valMps之外,还有ivlCurrRange和ivlOffset。
ivlCurrRange初始设定为510,ivlOffset从码流中读取9 bit作为初始值,即:
ivlCurrRange = 510
ivlOffset = read_bits( 9 )

4、算术解码

4.1 常规算术解码

常规算术解码的过程如《Rec. ITU-T H.265 v6》Pic 9-6所示

H265 CABAC 算术解码流程图

图中rangeTabLps由《Rec. ITU-T H.265 v6》Table 9-52所定义
tansIdxMps,transIdxLps由Table 9-53定义
RenormD由Pic 9-7定义

H265 CABAC 归一化流程图

Syntax element的长度说明
Syntax element长度如Table 9-43所示
其中
FL: fixed-length定长编码
TR: truncated Rice 截断莱斯编码
EGk: the k-th order Exp-Golomb k阶哥仑布编码
TB: truncated binary 截断二进制编码
cMax = 2代表最多只有2位

对应Table 9-48解析不同的bit会走不同的decode流程
如Table 9-43指出sao_type_idx_luma长度cMax = 2,最多2 bit,因此binIdx = 0,binIdx = 1。
当解码第1 bit (binIdx = 0)时,使用常规解码(DecodeDecision)。当解码到第2 bit(binIdx = 1)时,
使用旁路解码(DecodeBypass)。

4.2 旁路算术解码

DecodeBypass见《Rec. ITU-T H.265 v6》 9.3.4.3.4 Bypass decoding process for binary decisions。

旁路算术解码输入二进制数据流和ivlCurrRange, ivlOffset
输出binVal和更新ivlOffset

4.3 终止算术解码

DecodeTerminate,见9.3.4.3.5 Decoding process for binary decisions before termination。
终止算术解码输入二进制数据流和ivlCurrRange, ivlOffset
输出binVal和更新ivlCurrRange, ivlOffset

5、反二进制化

在HEVC中,不同的语法元素(Syntax element)采用了不同的二进制化方法,其长度如
《Rec. ITU-T H.265 v6》Table 9-43所示。反二进制化模块将由算术解码模块输入的bit_string
选择相应的二进制化方法进行反二进制化,再对bit_string进行串匹配,以决定是否完成一个语法元素
的解码。如果匹配成功,则根据码流语法规定,进行ctxIdx更新,用来选择下一个语法元素的概率模型。
FL: 定长编码 固定编码长度l = Ceil(log2(cMax + 1)),输出2进制串为输入的10进制数对应的值
TR: 截断莱斯编码  《Rec. ITU-T H.265 v6》9.3.3.2
EGk: k阶哥仑布编码 9.3.3.3和9.3.3.4
TB: 截断二进制编码 9.3.3.6

Table 9-43中,sao_offset_abs[][][][]为sao_offset_abs_0~sao_offset_abs_3,
sao_offset_sign[][][][]为sao_offset_sign_0~sao_offset_sign_3

在复旦大学的开源H265代码cabac_se_prepare.v中,lcu_curr_state_r表示输出到二进制化模块的
数据的类型,首先输出的是sao的参数(当SAO_OPEN宏定义开启时),然后输出的是split_cu_flag,然后
是CU的残差数据(CU 8x8,16x16,32x32,64x64),然后再是新的split_cu_flag,再是CU残差数据...,
最后是finial_bit(一个LCU结束是0x2ba,一个slice结束是0x22ba)。

解码时,根据每个数据的后缀(cabac_bin_lut.v),确定该数据是sao参数还是残差值。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值