1. AV1解码过程总览
作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
引言
AV1(AOMedia Video 1)是由Alliance for Open Media开发的新一代开源视频编解码标准。本文作为"AV1解码过程规范"专栏的开篇,将为您介绍AV1解码器的整体架构和解码流程的十个主要阶段。
源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning
AV1解码器整体架构
AV1解码过程是一个多阶段的流水线,从比特流输入到最终视频帧输出,涉及以下主要阶段:
容器解析 → OBU解析 → 比特流读取 → 熵解码 → 帧头解析 → Tile解码 → 预测 → 重建 → 滤波 → 输出
解码器核心组件
主解码器类: AV1Decoder
- 位置:
src/obu/decoder.py - 职责: 管理解码器状态,协调各个解码阶段
关键数据结构:
SequenceHeader: 序列级别配置FrameHeader: 帧级别配置TileGroup: Tile数据组织RefFrameStore: 参考帧存储
解码流程的十个主要阶段
阶段一:容器格式解析
功能: 解析视频流的容器格式(如IVF格式),提取AV1比特流数据。
源码位置: src/container/ivf_parser.py
主要工作:
- 解析IVF文件头(签名、版本、编解码器标识、分辨率等)
- 提取每帧的时间戳和大小
- 提取AV1比特流数据
阶段二:OBU解析
功能: 解析AV1的OBU(Open Bitstream Unit)单元,这是AV1比特流的基本组织单位。
源码位置: src/obu/decoder.py, src/obu/obu.py
OBU类型:
OBU_SEQUENCE_HEADER: 序列头,包含序列级别配置OBU_TEMPORAL_DELIMITER: 时间分隔符OBU_FRAME_HEADER: 帧头,包含帧级别配置OBU_TILE_GROUP: Tile组,包含实际图像数据OBU_FRAME: 帧OBU,包含帧头和Tile组OBU_METADATA: 元数据
主要工作:
- 解析OBU头(类型、大小、时间ID、空间ID)
- 根据OBU类型分发到相应的处理函数
阶段三:比特流读取
功能: 实现比特流的底层读取操作,包括位读取、字节对齐等。
源码位置: src/bitstream/bit_reader.py
主要操作:
read_bits(n): 读取n位数据read_literal(n): 读取n位字面量read_f(): 有限符号集读取read_leb128(): LEB128变长编码读取read_uvlc(): UVLC变长编码读取
阶段四:熵解码
功能: 使用CDF(累积分布函数)进行符号解码,将比特流转换为符号序列。
源码位置: src/entropy/symbol_decoder.py
主要工作:
- 读取符号的概率分布
- 使用CDF进行符号解码
- 更新CDF(自适应解码)
- 多符号解码优化
阶段五:帧头解析
功能: 解析帧级别的配置信息,包括帧类型、参考帧配置、滤波参数等。
源码位置: src/frame/frame_header.py
主要信息:
- 帧类型(KEY_FRAME / INTER_FRAME)
- 参考帧索引
- 全局运动参数
- 滤波参数(Loop Filter、CDEF、Loop Restoration)
- Tile配置
- 分段信息
阶段六:Tile解码
功能: 解码Tile中的图像数据,包括块划分、模式信息、预测、残差等。
源码位置: src/tile/tile_group.py
主要工作:
- Superblock解码: 遍历每个Superblock(64x64或128x128)
- 块划分解码: 递归解码块的划分方式
- 模式信息解码:
- 帧内模式:Y模式、UV模式、角度信息
- 帧间模式:参考帧、运动向量、运动模式
- 预测解码: 帧内预测或帧间预测
- 残差解码: 变换树、变换块、系数解码
阶段七:预测
功能: 根据模式信息生成预测块。
源码位置: src/reconstruction/prediction.py
预测类型:
帧内预测
- 方向预测: 8个方向的角度预测
- DC预测: 平均值预测
- 平滑预测: 平滑插值预测
- 递归预测: Filter Intra预测
- 基本预测: Paeth预测器
- 调色板预测: 颜色索引预测
- CFL预测: Chroma from Luma预测
帧间预测
- 单参考预测: 使用一个参考帧
- 复合预测: 使用两个参考帧加权混合
- 运动模式:
- SIMPLE: 简单运动补偿
- OBMC: 重叠块运动补偿
- LOCALWARP: 局部warp变换
- GLOBALWARP: 全局warp变换
阶段八:重建
功能: 将预测块和残差块合并,生成重建块。
源码位置: src/reconstruction/reconstruct.py
主要步骤:
- 逆量化: 将量化系数还原为变换系数
- 逆变换: 将变换系数还原为残差块
- 合并:
重建块 = 预测块 + 残差块 - 裁剪: 裁剪到有效像素范围
阶段九:后处理滤波
功能: 对重建帧进行滤波,提高视觉质量。
源码位置: src/frame/decoding_process.py
滤波类型:
-
Loop Filter(环路滤波)
- 去块效应滤波
- 减少块边界伪影
-
CDEF(Constrained Directional Enhancement Filter)
- 方向增强滤波
- 减少振铃效应
-
Upscaling(超分辨率)
- 如果帧尺寸小于显示尺寸,进行上采样
-
Loop Restoration(环路恢复)
- Wiener滤波
- SGR(Self-Guided Restoration)
阶段十:输出处理
功能: 生成最终输出帧,包括Film Grain合成和参考帧更新。
源码位置: src/frame/decoding_process.py
主要工作:
- Film Grain合成: 如果启用,添加Film Grain噪声
- 参考帧更新: 更新参考帧存储
- YUV输出: 输出YUV格式的帧数据
解码流程图
整体解码流程图
解码流程的关键特点
1. 分层结构
AV1解码采用分层结构:
- 序列层: 序列头定义整体配置
- 帧层: 帧头定义帧级别配置
- Tile层: Tile组包含图像数据
- 块层: Superblock和块是基本处理单元
2. 并行处理
- Tile并行: 不同Tile可以并行解码
- 块并行: 在Tile内部,某些块可以并行处理
3. 自适应解码
- CDF更新: 熵解码使用自适应CDF
- 上下文选择: 根据上下文选择不同的概率模型
4. 多模式预测
- 帧内预测: 5种主要模式 + 调色板 + CFL
- 帧间预测: 单参考、复合、OBMC、Warp
总结
AV1解码过程是一个复杂的多阶段流水线,从比特流解析到最终图像输出,每个阶段都有其特定的职责。理解整体架构是深入理解各个阶段的基础。
在后续文章中,我们将逐一深入解析每个阶段的实现细节,帮助您全面理解AV1解码过程。
参考资源:
- AV1规范文档
- 源码实现: GitHub - av1_learning - 作者自己编写的AV1解码器Python实现

浙公网安备 33010602011771号