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

主要工作:

  1. 解析IVF文件头(签名、版本、编解码器标识、分辨率等)
  2. 提取每帧的时间戳和大小
  3. 提取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: 元数据

主要工作:

  1. 解析OBU头(类型、大小、时间ID、空间ID)
  2. 根据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

主要工作:

  1. 读取符号的概率分布
  2. 使用CDF进行符号解码
  3. 更新CDF(自适应解码)
  4. 多符号解码优化

阶段五:帧头解析

功能: 解析帧级别的配置信息,包括帧类型、参考帧配置、滤波参数等。

源码位置: src/frame/frame_header.py

主要信息:

  • 帧类型(KEY_FRAME / INTER_FRAME)
  • 参考帧索引
  • 全局运动参数
  • 滤波参数(Loop Filter、CDEF、Loop Restoration)
  • Tile配置
  • 分段信息

阶段六:Tile解码

功能: 解码Tile中的图像数据,包括块划分、模式信息、预测、残差等。

源码位置: src/tile/tile_group.py

主要工作:

  1. Superblock解码: 遍历每个Superblock(64x64或128x128)
  2. 块划分解码: 递归解码块的划分方式
  3. 模式信息解码:
    • 帧内模式:Y模式、UV模式、角度信息
    • 帧间模式:参考帧、运动向量、运动模式
  4. 预测解码: 帧内预测或帧间预测
  5. 残差解码: 变换树、变换块、系数解码

阶段七:预测

功能: 根据模式信息生成预测块。

源码位置: src/reconstruction/prediction.py

预测类型:

帧内预测

  • 方向预测: 8个方向的角度预测
  • DC预测: 平均值预测
  • 平滑预测: 平滑插值预测
  • 递归预测: Filter Intra预测
  • 基本预测: Paeth预测器
  • 调色板预测: 颜色索引预测
  • CFL预测: Chroma from Luma预测

帧间预测

  • 单参考预测: 使用一个参考帧
  • 复合预测: 使用两个参考帧加权混合
  • 运动模式:
    • SIMPLE: 简单运动补偿
    • OBMC: 重叠块运动补偿
    • LOCALWARP: 局部warp变换
    • GLOBALWARP: 全局warp变换

阶段八:重建

功能: 将预测块和残差块合并,生成重建块。

源码位置: src/reconstruction/reconstruct.py

主要步骤:

  1. 逆量化: 将量化系数还原为变换系数
  2. 逆变换: 将变换系数还原为残差块
  3. 合并: 重建块 = 预测块 + 残差块
  4. 裁剪: 裁剪到有效像素范围

阶段九:后处理滤波

功能: 对重建帧进行滤波,提高视觉质量。

源码位置: src/frame/decoding_process.py

滤波类型:

  1. Loop Filter(环路滤波)

    • 去块效应滤波
    • 减少块边界伪影
  2. CDEF(Constrained Directional Enhancement Filter)

    • 方向增强滤波
    • 减少振铃效应
  3. Upscaling(超分辨率)

    • 如果帧尺寸小于显示尺寸,进行上采样
  4. Loop Restoration(环路恢复)

    • Wiener滤波
    • SGR(Self-Guided Restoration)

阶段十:输出处理

功能: 生成最终输出帧,包括Film Grain合成和参考帧更新。

源码位置: src/frame/decoding_process.py

主要工作:

  1. Film Grain合成: 如果启用,添加Film Grain噪声
  2. 参考帧更新: 更新参考帧存储
  3. YUV输出: 输出YUV格式的帧数据

解码流程图

整体解码流程图

graph TD A[开始解码] --> B[容器格式解析<br/>IVF解析] B --> C[OBU解析] C --> D{OBU类型} D -->|SEQUENCE_HEADER| E[序列头解析] D -->|FRAME_HEADER| F[帧头解析] D -->|TILE_GROUP| G[Tile解码] D -->|FRAME| H[帧OBU解析] E --> C F --> I[帧头处理] I --> J[参考帧配置] I --> K[全局运动参数] I --> L[滤波参数] H --> F H --> G G --> M[Superblock解码] M --> N[块划分解码] N --> O[模式信息解码] O --> P{预测类型} P -->|帧内| Q[帧内预测] P -->|帧间| R[帧间预测] Q --> S[残差解码] R --> S S --> T[变换树解码] T --> U[系数解码] U --> V[重建] V --> W[预测+残差合并] W --> X[后处理滤波] X --> Y[Loop Filter] Y --> Z[CDEF] Z --> AA[Upscaling] AA --> AB[Loop Restoration] AB --> AC[Film Grain合成] AC --> AD[参考帧更新] AD --> AE[输出帧] AE --> AF{还有帧?} AF -->|是| C AF -->|否| AG[解码完成] style A fill:#e1f5ff style D fill:#fff9c4 style P fill:#fff9c4 style AG fill:#c8e6c9

解码流程的关键特点

1. 分层结构

AV1解码采用分层结构:

  • 序列层: 序列头定义整体配置
  • 帧层: 帧头定义帧级别配置
  • Tile层: Tile组包含图像数据
  • 块层: Superblock和块是基本处理单元

2. 并行处理

  • Tile并行: 不同Tile可以并行解码
  • 块并行: 在Tile内部,某些块可以并行处理

3. 自适应解码

  • CDF更新: 熵解码使用自适应CDF
  • 上下文选择: 根据上下文选择不同的概率模型

4. 多模式预测

  • 帧内预测: 5种主要模式 + 调色板 + CFL
  • 帧间预测: 单参考、复合、OBMC、Warp

总结

AV1解码过程是一个复杂的多阶段流水线,从比特流解析到最终图像输出,每个阶段都有其特定的职责。理解整体架构是深入理解各个阶段的基础。

在后续文章中,我们将逐一深入解析每个阶段的实现细节,帮助您全面理解AV1解码过程。


参考资源:

posted @ 2026-01-07 19:03  chai51  阅读(14)  评论(0)    收藏  举报