5.3 熵编码器对照:CABAC 两代与多符号算术编码


5.3 熵编码器对照:CABAC 两代与多符号算术编码

本节摘要:H.264 与 HEVC 的 CABAC 用"概率状态机"近似概率并逐符号二值化,AV1 换成多符号算术编码:CDF 以 15 比特精度直接维护,最多十六符号的字母表一次编码,概率随解码同步连续自适应。本节对照三种引擎的机制差异,并解释硬件实现为什么仍偏爱二值化。

一次符号的旅程:三种写法

先跟上同一个语法元素的旅程。假设要编码"帧内模式 = 7"这样一个多值信息:

H.264/HEVC CABAC 的走法(二值化 + 状态机): 7 → 二值化 "00111" → 逐 bit 用上下文模型编码 每个 bit 查表: 概率状态(0..62) → 区间细分 → 跳转下一状态 概率更新: 状态 ±1(查表步长),大误差走 MPS/LPS 切换 AV1 多符号算术编码的走法: "7" 属于 9 符号字母表 {0,1,...,8} CDF: [P(0..6), P(7), P(8)] 直接按累积概率切区间 一次编码完成,无二值化 更新: 编完按自适应速率微调整条 CDF(精度 15 比特)

两种走法都能逼近熵极限,差异在工程形状。CABAC 的状态机把概率量化成六十四档(H.264)/ 九十五态左右(HEVC 变体),查表快、逻辑浅,2003 年的 ASIC 也能流水化实现;代价是概率精度粗、二值化引入额外符号数。AV1 的多符号方案概率精度高一个数量级、每个符号一次搞定,软件解码器(dav1d)里表现极好;代价是区间划分的计算在硬件里要做多路比较,早期 AV1 硬解设计因此多花了一番功夫。

对照项 H.264 CABAC HEVC CABAC AV1 多符号
符号形态 二值化后逐比特 二值化 + 分割合并树 原生多符号(至多 16)
概率表示 64 态状态机 状态机 + 终止态 15 比特 CDF 连续更新
自适应 查表步进 查表步进 + 计数器 按自适应速率(3/4、5/6、7/8)连续微调
上下文数量 约 400 组 约 900 组 语法元素级 CDF,帧级初始化
软件亲和 一般 一般 好(SIMD 友好)
硬件亲和 需多路比较,可流水

上下文建模:查重的哲学

熵编码省比特的另一半来自上下文建模:同一个语法元素,在"上邻块是帧内"与"上邻块是跳过"两种语境下概率分布不同,分开建模就能省。H.264 用了约四百组上下文,HEVC 扩到九百组左右,AV1 的做法不同——按语法元素建 CDF,并在帧头带一组初始化表,解码器按 QP 与帧类型选初始概率。对比之下,AV1 的上下文选择对解码器的并行更友好:CDF 按符号流分区,tile 之间天然独立。

一个常被忽略的对照点是概率更新的同步性。三家都是"解码端同步更新"——编码器写符号时更新概率,解码器读完同一个符号做同样的更新,全程无额外信令。这让概率状态成为"编解码共享的隐形账本"。理解了这一点,就明白为什么熵编码器改动必须整体进标准:账本规则改一个字,两端立即失配。

并行与延迟:熵编码的现实约束

算术编码天然是串行的——下一个符号的区间依赖上一个符号的结果。四代标准都用"分区"来化解:H.264/HEVC 靠切片/波前(WPP)切开依赖链,AV1 靠 tile 与 tile group。对照粒度:AV1 最多六十四个 tile,每个 tile 有独立熵编码状态,多核解码器可以按 tile 完全并行;这对软件解码器的多核伸缩贡献巨大,dav1d 在桌面 CPU 上把 4K 解码跑满实时靠的就是这套并行骨架加 SIMD 的组合。

VVC 在这条线上继续加码:依赖切片与更细的波前把并行度推得更高,代价是缓冲与首块延迟。把三家的并行方案排在一条线上看,趋势清晰:熵编码从"单流串行"演进为"多流可并行",标准必须为多核时代重新设计依赖结构

⚠️ 教学提醒:很多资料把 AV1 的熵编码写作"CABAC 变体",这是误导。它与 CABAC 同属自适应算术编码家族,但概率表示、字母表、更新机制都不同——把差异讲清,才能理解为什么 AV1 硬解的早期实现成本偏高。

常见追问

问:既然多符号这么好,HEVC 当年为什么不改?
答:因为硬件契约。HEVC 定稿时,硬解是绝对主导的落地形态,二值化状态机对流水线友好、面积小、时序好收敛;多符号方案的区间运算要更多比较逻辑。AV1 敢改,一半是十年间软件解码地位上升给了底气,一半是工艺进步把多路比较的成本磨平了。技术没有绝对先进,只有与时代约束的匹配度。

问:熵编码的收益在整条链路里占多少?
答:它与上下文建模一起决定"最后百分之十到二十"的压缩效率,单看"编码器核心算法"不如预测与划分显眼,但它是唯一"零画质代价"的环节——纯粹把同样的信息写得更短。这也是为什么每代标准都愿意在熵编码上重投入:只有收益、没有画质账单。

问:学习编码器实现,从熵编码入手合适吗?
答:入门不建议——它数学密度最高、又最不容许近似。建议路径是先读码流结构(第 2 章)建立全貌,再读预测(第 3、4 章)理解主体逻辑,最后攻熵编码。dav1d 的实现脉络恰好也是这个顺序,读代码时可以互相印证。

本节要点回顾

  • 两种引擎形态:状态机加二值化(软硬折中)与多符号 CDF(精度优先),分别服务不同年代的实现约束。
  • 上下文哲学:四百组、九百组、语法元素级 CDF 加帧级初始化表,建模粒度逐代演进。
  • 共享账本:概率状态编解码两端同步更新,零信令成本,但规则必须整体标准化。
  • 并行是硬约束:tile 化让熵编码进入多核时代,dav1d 的实时性能一半功劳在这里。

残差链路到此走完。下一步是修补:量化留下的块效应与振铃,交给第 6 章的滤波体系。

再补一条实现层对照:CABAC(HEVC/AV1 同用)与 H.264 时代 CAVLC 的并行化难度差异,是硬件解码器设计的关键约束——算术编码的上下文模型依赖前一个语法元素的解码结果,天然串行;AV1 的 symbol decoder 在硬件实现里用多上下文并行预判加回滚的策略来提升吞吐,4K120 实时解码的需求把这指标推到每秒数十亿次符号更新。这个背景解释了为什么"熵编码对照"从来不只是压缩率对照——编码器侧的上下文初始化速度(每次帧头重置)和解码器侧的符号吞吐,都是生态成熟度的硬指标;AV1 选择复用成熟 CABAC 框架而非发明新熵编码,被业界普遍解读为给硬件实现降低门槛的务实决策。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U