前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[强基固本-视频压缩] 第十章:上下文自适应二进制算术编码 第五部分

[强基固本-视频压缩] 第十章:上下文自适应二进制算术编码 第五部分

作者头像
用户1324186
发布2024-03-07 17:59:20
1350
发布2024-03-07 17:59:20
举报
文章被收录于专栏:媒矿工厂媒矿工厂

题目:Context-adaptive binary arithmetic coding. Part 5 作者:Oleg Ponomarev 文章地址:https://www.elecard.com/page/article_context_adaptive_binary_arithmetic_coding_5 内容整理:杨晓璇 使用整数运算进行编码,以及 CABAC 术语中 "上下文自适应 "部分的实际含义。

引言

现在我们对算术编解码算法进行了简要的分析,并讨论了将编码流中描述视频帧内容的语法元素的值转换为二进制 bin 流的过程,这才是实际进行二进制算术的过程编码。然而,有一些重要的事情我们还没有讨论。首先,在迄今为止所考虑的算法中,编码和解码都是通过分割当前区间来完成的。区间长度始终小于 1,因此必须使用非整数算术执行计算。其次,编码和解码需要有关被编码符号出现概率的信息,即最不可能出现的符号 的概率 以及该符号的值。编码器和解码器从哪里获取这些信息?最后,我们仍然没有解决 CABAC 术语中“上下文自适应”的实际含义。现在让我们来解决这些剩下的问题。

整数运算编码

要回答第一个问题,使用整数运算进行编码乍看起来是一种显而易见的可能性。我们只需用一个整数乘数(如 512)拉伸初始区间,用一个整数除数表示概率 作为整数除数来表示概率,并对它们的商进行四舍五入,之后所有的区间分割运算都可以使用指定分辨率的整数算术进行近似计算。这里唯一未知的是由于近似会损失多少效率(即压缩比)。早在 20 世纪 90 年代初,就发表并证明了许多定理,使得估计压缩率损失成为可能(例如,参见 P. G. Howard、J. S. Vitter Analysis of Arithmetic Coding for Data Compression、Information Processing and Management 28 (1992), 749 – 763)。结果表明,由于计算的近似性而造成的损失微乎其微。由此证明,基于整数运算的二进制算术编码算法是可以高效实现的。

CABAC 的开发人员在这个方向上走得更远。他们建议粗化当前区间长度 和概率 的值以便提前出计算出乘积 的所有可能值。由此提出的 CABAC 算法将计算密集型的乘法运算替换为从预先计算出乘法结果的表格中进行查找(在标准中,请参见表 9-40 - 根据 pStateIdx 和 qRangeIdx 的值对 rangeTabLps 的规范)。让我们更详细地考虑这个问题。

在 CABAC 中,当前区间长度 由一个名为 的 9 位变量表示。在编码/解码过程的初始化阶段,该变量的初始值为 510。在对每个分区进行编码/解码并执行重正化程序后,该变量的值始终在 257 至 511 之间。在进行乘法运算 之前,数值 被量化,即除以 64(量化是通过右移 6 位来实现的)。由于该变量的第 8 位(以 0 为基础的编号,此处为 0 至 8)始终为 1,因此 的四种可能的量化值代表 的第 6 和第 7 位。的值作为地址之一,用于从二维 rangeTabLps 表中查找乘法结果的预计算值。第二个指数从 0 到 63,代表 的 64 个可能值。下面我们来回答第二个问题::编码/解码过程中如何计算概率 ?

每次获得要编码/解码的 bin()的新值时,概率值 都会递归更新。在 第 k 步时(即在对第 k 个 bin 进行编码或解码期间), 的新值计算如下:

P^k_{LPS}=\left\{\begin{array} \alpha P^{k-1}_{LPS},\quad\quad\quad\quad\quad binVal=valMPS, \\ 1-\alpha(1-P^{k-1}_{LPS}), \ binVal\neq valMPS, \end{array}\right. \quad(1)

其中 , 是最可能的符号的值(0 或 1)。正如已经提到的, 有 64 个可能的值,这些值由 CABAC 中的 6 位变量 变量索引。更新概率值相当于更新索引 并从预先计算的表格中查找值(参见标准中的表 9-41,State transition table)。当 的值为 0 时, 的值会反向变化。从 rangeTabLps 表中查找值时, 的值也会被用作第二个索引,即在确定乘积 的值时。

改用整数运算的解码算法流程图如图 1 所示。

图 1. bin 解码的流程图

解码器重正化过程的流程图如图 2 所示。

图 2. 解码器重正化的流程图

编码和编码器重正化算法的流程图如图 3 和 4 所示。

图 3. 编码的流程图

图 4. 编码器重正化的流程图

上下文自适应

最后,让我们来理解一下 CABAC 编码程序名称中的 "上下文自适应 "部分。这也很简单。通过对不同语法元素的值进行二值化处理,可以得到所有进行算术编码的分区的值。不同元素的二值化算法是不同的。因此,代表不同语法元素值的 bins 具有不同的 "0 "和 "1 "概率。此外,概率 通常取决于语法元素值二值化表示中的分区序号。这个概率以及 值会随着视频帧相邻块中该语法元素值的变化而变化。在这种情况下,对具有大致相同统计量的每组 bins 分别评估概率 和 是非常有意义的。这就是 CABAC 编码/解码程序的作用。如上所述,概率的离散值在 CABAC 中使用 7 位索引 来定义。该索引与 1 位 值一起完全定义了 bin 统计量。 和 的值会针对每一组同类 bins 单独更新。对于所有这些 bins,这两个值(合并为一个 8 位值)都存储在一个名为 ctxTable 的特殊表中。该表中的元素在标准中称为上下文。上下文建模过程是 CABAC 编码/解码算法的一部分,包括确定索引 ,以便从该表中获取 和 的值。索引值 取决于当前二进制表示法所属语法元素的类型、该二进制表示法中当前二进制的数目,以及正在编码的视频帧相邻块中该语法元素的可能值。因此,上下文是根据当前片段所属的统计相似 bins 自适应选择的。在 和 更新的编码/解码过程完成后,更新后的值将被存储在相应地址 的 ctxTable 中。

结语

至此,我们结束了对 CABAC 编码/解码算法的讨论。还有许多其他方面的问题没有在此讨论,这些都可以成为后续文章的主题。另一方面,我们已经成功地分析了 CABAC 实现的主要思想,并从一个简单的算术编码示例上升到描述 HEVC 标准中编码/解码算法的流程图。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 媒矿工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 整数运算编码
  • 上下文自适应
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档