介绍
CABAC(Context-Based Adaptive Binary Arithmetic Coding,基于上下文的自适应二进制算术编码)是H.265/HEVC视频编码标准中使用的一种高效的熵编码技术。其核心原理是将自适应二进制算术编码与上下文模型相结合,以实现对视频数据的有效压缩。CABAC主要包括以下几个步骤:二进制化、上下文建模、二进制算术编码以及概率更新 。
- 二进制化:将输入的语法元素转换为二进制形式。H.265/HEVC中包括截断莱斯二元化(TR)、K阶指数哥伦布二元化(EGK)和定长二元化(FL)等方法 。
- 上下文建模:利用已编码元素的相关性,通过上下文模型对概率进行条件编码。上下文模型使用两个变量:最大概率符号MPS和概率状态索引pStateIdx。CABAC中预设了64个概率值,用于初始化概率模型 。
- 二进制算术编码:对每个二元化后的Bin根据概率模型进行编码。CABAC使用区间划分方式,递归地保存编码区间的长度和下限。包括常规编码和旁路编码两种方式。常规编码利用自适应概率模型,旁路编码则以等概率方式进行,不更新概率状态 。
- 概率更新:编码过程中,根据编码的符号更新概率模型。如果编码的Bin等于MPS,则增加概率索引值,表示MPS的概率增大;如果等于LPS,则减小概率索引值,表示LPS的概率增大 。
CABAC的优势在于其自适应性,能够根据视频内容的统计特性动态调整概率模型,从而提高编码效率。此外,CABAC还采用了多种二值化方案,以适应不同的编码场景。
此外,关于算术编码的原理可以参考:视频编码中算术编码原理详解。
CABAC 原理
- 原理框架图
- 二值化
- CABAC 中对不同的句法元素一共应用了四种二进制化方法:一元码二元化 U、截断莱斯二元化TR、K 阶指数哥伦布二元化EGK、定长二元化FL。
- 针对不同的语法元素, 根据其不同的概率分布特性来选择不同的二元化方案。
- 上下文建模
- cabac 将 slice 片作为整个 cabac 算法的生命周期;
- 编码中,语法元素使用的上下文概率模型都被唯一的上下文索引号 r 标识,每一个 r 涉及两个概率模型变量: 最大概率符号MPS 和 概率状态索引;
- 在CABAC中,根据先验知识为 LPS 的概率设定了64 个代表值。概率状态索引与 LPS 的概率值一一对应,LPS 概率自适应的更新就表现为概率状态索引的变化。
- 概率状态更新:CABAC在编码每个二进制值后,会根据编码的符号更新概率模型,这是自适应过程的一部分。上下文模型存储与每位是1或0的概率有关的参数,并根据编码的符号进行更新。CABAC 在计算的复杂度和编码效率之间作了折中,建立了一个基于查表的概率模型,将从 0 到 0.5 范围内的概率量化为 64 个值,这些概率对应于 LPS(Least ProbabilitySymbol)字符,则 MPS(Most Probability Symbol)字符的概率为 1- Plps 。字符的概率估计值被限制在表内,概率的刷新也不是去计算 P(binval|z),而是按照某种法则在表中查找。
- 二进制算术编码
- 旁路编码
- 旁路编码无需对概率进行自适应更新,而是采用 0 和 1 各占 1/2 概率进行编码;为了使区间划分操作更加简便,不采用直接对区间长度二等分的方法,而采用保存编码区间长度不变 , 使区间下限 L值加倍的方法来实现区间划分 ,效果是一样的。随后进行重归一化操作;
- 一般在近似均匀分布的符号、特定的语法元素、特定编码模式等会采用旁路编码;
- 输出码流
- 应用 CABAC 编码相比于其他熵编码,如 CAVLC,可以节约码率 9%~14%。
- 应用 CABAC 编码相比于其他熵编码,如 CAVLC,可以节约码率 9%~14%。