H265 CABAC学习笔记

  • 编码部分
  • 解码部分
    • 1、解出语法元素
    • 2、沿用编码部分的上下文模型模块
    • 3、确定输出给算术解码模块的参数
    • 4、算术解码
      • 4.1 常规算术解码
      • 4.2 旁路算术解码
      • 4.3 终止算术解码
    • 5、反二进制化

编码部分

编码部分来源于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所示

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

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.6Table 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参数还是残差值。

H265 CABAC学习笔记相关推荐

  1. H264和H265的学习笔记

    H264和H265的学习笔记记录分享 一.H264的组成: 二.H265的组成: 三.H264和H265由es打包为pes再打包为ps的代码思路如下: 四.补充说明 一.H264的组成: 1.H264 ...

  2. FFmpeg基础到工程-多路H265监控录放开发学习笔记

    多路H265监控录放开发学习笔记 课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等.包括:音视频.流媒体.直播.Android.视频监控28181.等. 具体 ...

  3. 学习笔记(一)(x264编码流程)

    学习笔记(一)(x264编码流程) 作者 张士辉 11月 2, 2007 <script type=text/javascript></script> <script s ...

  4. 我的Android进阶之旅------gt;Android中编解码学习笔记

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  5. 编解码学习笔记(四) Mpeg系列——Mpeg 4

    在上次对MPEG-2的学习整理中,有一个疑惑,双声道理解,就是左右立体声,但是5.1声道是什么?我们经常看到杜比5.1声道的说法."0.1"声道具体指什么?今天去wiki查了一下, ...

  6. 各种音视频编解码学习详解之 编解码学习笔记(四):Mpeg系列——Mpeg 4

    最近在研究音视频编解码这一块儿,看到@bitbit大神写的[各种音视频编解码学习详解]这篇文章,非常感谢,佩服的五体投地.奈何大神这边文章太长,在这里我把它分解成很多小的篇幅,方便阅读.大神博客传送门 ...

  7. 编解码学习笔记(基础)

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  8. deepstream学习笔记(三):deepstream-imagedata-multistream解析与接入适配yolov5模型测试

    引言 上一节重点介绍了gstreamer架构图与各部分组成原理说明,并且针对deepstream-test1介绍了它的整体功能和画出了管道图,本篇博文将详细介绍deepstream-imagedata ...

  9. Android组件化架构实践,字节跳动学习笔记

    前言 2021全年从开头到结尾似乎就没多少好消息.这里我说的是整个互联网行业,并没有单单挑出某个公司或者某个细分领域.而对于广大Android开发者来说,找工作似乎也变得越来越难了. 2021年1月, ...

最新文章

  1. 洛谷-题解 P2672 【推销员】
  2. Python学习之路-装饰器生成器正则表达式
  3. DL之DNN优化技术:自定义MultiLayerNet【5*100+ReLU】对MNIST数据集训练进而比较三种权重初始值(Xavier参数初始化、He参数初始化)性能差异
  4. springMVC+ajaxFileUpload中文名乱码的问题
  5. 算法设计与分析——回溯法——装载问题
  6. Extension Method - c#3.0
  7. visio网络拓扑图 下载_Visio2019软件下载及安装教程
  8. ROC曲线与AUC区域的理解与实践
  9. 数据分析项目实战:大型商场销售预测(带你挤进比赛前100名)
  10. 矩阵运算_SLAM中用到的矩阵计算_基本公式及知识汇总
  11. SQL Server 修改字段名
  12. 计算机1级考试试题ps,2016年计算机等级考试一级ps模拟练习题及答案
  13. 1W字看懂互联网知识经济
  14. 入门二叉树,三种遍历,计算结点个数 ,深度 叶子结点个数,第k层结点个数
  15. 2020-10-16
  16. GRUB2配置文件grub.cfg详解
  17. 发展数字经济具有重要意义
  18. SuperMap之等高线制作
  19. python:for循环和range()函数用法
  20. 上手树莓派第一步(树莓派的的网络连接及屏幕分辨率设置)

热门文章

  1. 帆软FCP模拟试卷第4题(第6题)
  2. linux添加硬盘及分区格式化
  3. 《雍正皇帝》文化专有词翻译策略的研究现状
  4. 107. 二叉树的层次遍历 II(JavaScript)
  5. pandas统计重复值次数
  6. 《行为经济学》学习_北大光华_中国大学MOOC
  7. b站计算机考研大师兄数据结构代码打卡第2天
  8. mysql tinyint 与char_mysql tinyint和char(1)性能对比
  9. 跟着知识追寻者学BeautifulSoup,你学不会打不还口,骂不还手
  10. 老丁带你学USB-解疑2:USB协议中的ACK、NAK、STALL三种返回包含义