[总结]HEVC熵编码和HM具体实现

本文深入探讨HEVC的熵编码原理,包括定长和变长编码,重点讲解了CABAC(上下文自适应二进制算术编码)机制。详细阐述了CABAC的特点、二进制化、上下文模型的建立与更新,以及HM(HEVC参考模型)中熵编码的具体实现,包括相关类和关键函数。
摘要由CSDN通过智能技术生成

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=[M0][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+12M
算术编码AC
  • 解决了现实计算机中整数位编码问题,算法中只有加法和移位运算
  • 自适应算术编码:符号初始概率为均匀分布,编码过程不断调整
  • 二进制算术编码:信源为二进制化后的符号
  • 基于上下文的自适应二进制算术编码CABAC:上下文模型 + 自适应二进制算术编码

HEVC的CABAC

HEVC的CABAC特点

  • 采用二进制算术编码,将所有语法元素转换为二进制符号串,无乘法运算,降低计算复杂度
  • 上下文建模:根据已编码语法元素为待编码语法元素建立概率模型并自适应进行概率估计和模型更新
  • 旁路编码:假定二进制0/1等概分布进行二进制算术编码

HEVC的CABAC框架

常规编码
旁路编码
更新上下文模型
输入符号
二进制化
上下文模型
旁路二进制编码
常规二进制编码
编码输出

二进制化

  • 一元码 U与截断一元码 TU:二进制化 mvp_idxdelta_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 之间
上下文关系
  1. 根据已编码相邻块(左侧和上方)语法元素对当前语法元素进行模型预测

  2. 局限于对块和子块类型应用,第 n n n比特根据前面已编码的 n − 1 n-1 n1比特所采用的模型进行模型预测

  3. 仅用于残差数据编码,根据待编码的残差系数在扫描路径中的位置进行模型预测

  4. 仅用于残差数据编码,根据已编码系数幅度中某个特定幅度出现次数作为参考进行模型预测

上下文模型初始化
  • 上下文模型初始化负责将概率区间复原到 ( 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×545,n=offsetIdx<<

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值