4.1 帧内预测概述
作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
引言
帧内预测(Intra Prediction)是AV1视频解码中的核心预测技术之一。与帧间预测不同,帧内预测仅利用当前帧内已解码的相邻像素来预测当前块的像素值,无需参考其他帧。这使得帧内预测成为关键帧(KEY_FRAME)的主要预测方法,同时在帧间帧中也有广泛应用。
源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning
帧内预测概述
功能说明
帧内预测通过分析已解码的相邻像素(上方行和左侧列),利用空间相关性来预测当前块的像素值。AV1支持多种帧内预测模式,每种模式针对不同的图像特征进行优化。
应用场景
-
关键帧(KEY_FRAME)
- 所有块都使用帧内预测
is_inter = 0
-
帧间帧中的帧内块(INTER_FRAME中的帧内块)
- 部分块可能选择帧内预测
is_inter = 0且RefFrame[0] == INTRA_FRAME
-
Inter-Intra混合模式
- 帧间预测和帧内预测的组合
- 在
__compute_prediction中处理
预测模式类型
AV1支持以下帧内预测模式:
- 方向预测(Directional):8个方向的角度预测
- DC预测:使用平均值预测
- 平滑预测(Smooth):平滑插值预测
- 递归预测(Filter Intra):使用滤波器的递归预测
- 基本预测(Paeth):Paeth预测器
- 调色板预测(Palette):颜色索引预测
- CFL预测(Chroma from Luma):基于亮度的色度预测
预测过程概述
预测主函数
位置: src/reconstruction/prediction.py - predict_intra()
规范文档: 7.11.2 Intra prediction process
主要步骤
-
准备参考像素
- 提取上方行(AboveRow)
- 提取左侧列(LeftCol)
- 处理边界情况(块在图像边界时)
-
根据预测模式选择预测方法
if plane == 0 and use_filter_intra: # 递归帧内预测(滤波器内) pred = _recursive_intra_prediction_process() elif is_directional_mode(mode): # 方向帧内预测 pred = _directional_intra_prediction_process () elif mode == SMOOTH_PRED or SMOOTH_V_PRED or SMOOTH_H_PRED: # 平滑帧内预测 pred = _smooth_intra_prediction_process() elif mode == DC_PRED: # DC帧内预测 pred = _dc_intra_prediction_process() else: # 基本帧内预测(PAETH_PRED) pred = _basic_intra_prediction_process() -
CFL预测(如果是色度平面且使用CFL)
if isCfl: predict_chroma_from_luma() -
存储预测结果
- 将预测块存储到
CurrFrame[plane]
- 将预测块存储到
预测流程图
graph TD
A[帧内预测开始<br/>predict_intra] --> B[准备参考像素]
B --> C[提取上方行<br/>AboveRow]
B --> D[提取左侧列<br/>LeftCol]
C --> E[处理边界情况]
D --> E
E --> F{预测模式}
F -->|Filter Intra| G[递归帧内预测]
F -->|方向模式| H[方向帧内预测]
F -->|平滑模式| I[平滑帧内预测]
F -->|DC模式| J[DC帧内预测]
F -->|其他| K[基本帧内预测]
G --> L{是色度平面<br/>且使用CFL?}
H --> L
I --> L
J --> L
K --> L
L -->|是| M[CFL预测]
L -->|否| N[存储预测结果]
M --> N
N --> O[帧内预测完成]
style A fill:#e1f5ff
style F fill:#fff9c4
style L fill:#fff9c4
style O fill:#c8e6c9
关键数据结构
TileGroup中的帧内预测相关字段
class TileGroup:
# 预测模式
YMode: Y_MODE # 亮度预测模式
UVMode: Y_MODE # 色度预测模式
# 角度信息
AngleDeltaY: int # 亮度角度增量
AngleDeltaUV: int # 色度角度增量
# 滤波器内
filter_intra_mode: int # 滤波器内模式
use_filter_intra: int # 是否使用滤波器内
# CFL
CflAlphaU: int # CFL U分量alpha
CflAlphaV: int # CFL V分量alpha
# 调色板
PaletteSizeY: int # 亮度调色板大小
PaletteSizeUV: int # 色度调色板大小
PaletteColorsY: List # 亮度调色板颜色
PaletteColorsUV: List # 色度调色板颜色
Prediction类中的临时数据
class Prediction:
_AboveRow: List[int] # 上方参考像素行
_LeftCol: List[int] # 左侧参考像素列
_LocalValid: int # 局部有效性标志
与解码流程的集成
在关键帧中的调用
Tile解码
→ 解码块划分
→ 解码预测模式(仅帧内)
→ 解码调色板语法
→ 解码变换信息
→ 残差解码
→ 变换块解码
→ 帧内预测(predict_intra)
→ 解码系数
→ 重建
在帧间帧中的调用
Tile解码
→ 解码块划分
→ 解码is_inter标志
→ 如果is_inter=0:
→ 解码帧内块模式信息
→ 解码调色板语法
→ 解码变换信息
→ 残差解码
→ 变换块解码
→ 帧内预测(predict_intra)
→ 解码系数
→ 重建
在Inter-Intra模式中的调用
计算预测(__compute_prediction)
→ 如果是Inter-Intra模式
→ 帧内预测(Inter-Intra的帧内部分)
→ 帧间预测
→ 混合预测结果
总结
本文介绍了AV1帧内预测的基本概念、应用场景和预测过程。帧内预测通过利用空间相关性来预测当前块的像素值,是AV1压缩效率的重要来源。
参考资源:
- AV1规范文档
- 源码实现: GitHub - av1_learning
- 预测实现:
src/reconstruction/prediction.py
- 预测实现:
下一篇: 模式信息解码

浙公网安备 33010602011771号