HEVC熵编码
文章目录
熵编码原理
熵编码的基本要求
- 唯一可译编码:码字序列能被唯一地译码
- 非续长代码:任何码字都不是其他码字的续长
定长熵编码
- 每个编码符号分配等长的码字
- HEVC中定长编码主要应用于NAL单元头、Slice分割头和参数集编码
- HEVC中规定 f ( n ) f(n) f(n)描述语法元素的固定 n n n比特的预定义值
变长熵编码 VLC
霍夫曼编码
- 高概率符号分配短码
- 低概率符号分配长码
指数Golomb编码
- 结构明确,较霍夫曼编码简单
- 编码规则
- C o d e = [M个0][1][携带信息的M位数据INFO] Code = \text{[M个0][1][携带信息的M位数据INFO]} Code=[M个0][1][携带信息的M位数据INFO]
- 待编码符号的根据出现概率排列,当前符合的索引为 n n n
- M = floor [ log 2 ( n + 1 ) ] , INFO = n + 1 − 2 M M = \text{floor}[\log_2(n+1)],\;\;\;\text{INFO} = n + 1 - 2^M M=floor[log2(n+1)],INFO=n+1−2M
算术编码AC
- 解决了现实计算机中整数位编码问题,算法中只有加法和移位运算
- 自适应算术编码:符号初始概率为均匀分布,编码过程不断调整
- 二进制算术编码:信源为二进制化后的符号
- 基于上下文的自适应二进制算术编码CABAC:上下文模型 + 自适应二进制算术编码
HEVC的CABAC
HEVC的CABAC特点
- 采用二进制算术编码,将所有语法元素转换为二进制符号串,无乘法运算,降低计算复杂度
- 上下文建模:根据已编码语法元素为待编码语法元素建立概率模型并自适应进行概率估计和模型更新
- 旁路编码:假定二进制0/1等概分布进行二进制算术编码
HEVC的CABAC框架
二进制化
- 一元码
U
与截断一元码TU
:二进制化mvp_idx
,delta_qp
等语法元素 - 截断Rice码
TR
- k阶指数Golomb码
EGK
:二进制化mvd
等语法元素 - 定长码
FL
上下文模型
变量定义
6
比特量化概率状态索引 pStateIdx = σ \text{pStateIdx} =\sigma pStateIdx=σ,1
比特最大概率符号值 valMPS = ω \text{valMPS} = \omega valMPS=ω- 上下文模型状态 ( σ , ω ) (\sigma, \omega) (σ,ω) 仅需要7比特数即可表示
- 量化参数 Q P QP QP
- 起始类型 initTpye \text{initTpye} initTpye,上下文索引 ctxIdx \text{ctxIdx} ctxIdx,上下文初始值 initValue \text{initValue} initValue
- 限幅函数 Clip3 ( a , b , c ) \text{Clip3}(a,b,c) Clip3(a,b,c) 将 c c c 的值限制在 a a a 和 b b b 之间
上下文关系
-
根据已编码相邻块(左侧和上方)语法元素对当前语法元素进行模型预测
-
局限于对块和子块类型应用,第 n n n比特根据前面已编码的 n − 1 n-1 n−1比特所采用的模型进行模型预测
-
仅用于残差数据编码,根据待编码的残差系数在扫描路径中的位置进行模型预测
-
仅用于残差数据编码,根据已编码系数幅度中某个特定幅度出现次数作为参考进行模型预测
上下文模型初始化
- 上下文模型初始化负责将概率区间复原到 ( 0 , 1 ) (0,1) (0,1)并为上下文模型确定初始值 ( ω , σ ) (\omega, \sigma) (ω,σ)
- 根据量化参数 Q P QP QP 查找上下文模型的经验分布,并作为上下文模型初始值
查表确定上下文索引值和初始值
-
根据Slice的类型确定起始类型 initTpye \text{initTpye} initTpye
- slice_type == I: initType = 0 \text{slice\_type == I: initType = 0} slice_type == I: initType = 0
- slice_type == P: initType = cabac_init_flag ? 2 : 1 \text{slice\_type == P: initType = cabac\_init\_flag ? 2 : 1} slice_type == P: initType = cabac_init_flag ? 2 : 1
- slice_type == B: initType = cabac_init_flag ? 1 : 2 \text{slice\_type == B: initType = cabac\_init\_flag ? 1 : 2} slice_type == B: initType = cabac_init_flag ? 1 : 2
-
根据语法元素和起始类型 initTpye \text{initTpye} initTpye查表确定上下文索引 ctxIdx \text{ctxIdx} ctxIdx和初始值 initValue \text{initValue} initValue
确定概率状态索引和大概率符号值
-
导出比特长度为
4
的变量 slopeIdx = initValue > > 4 , offsetIdx = initValue & 15 \text{slopeIdx} = \text{initValue} >> 4, \;\text{offsetIdx} = \text{initValue}\, \& \,15 slopeIdx=initValue>>4,offsetIdx=initValue&15 -
计算中间变量 m = slopeIdx × 5 − 45 , n = offsetIdx < < 3 − 16 m = \text{slopeIdx} \times 5 - 45,\;n = \text{offsetIdx}<<3 - 16 m=slopeIdx×5−45,n=offsetIdx<<