5.3.2 块间预测(Block Inter Prediction)
作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
引言
块间预测(Block Inter Prediction)是帧间预测生成过程的核心步骤,它使用插值滤波器进行标准运动补偿,生成预测块。块间预测支持子像素精度,使用高质量的8抽头滤波器或快速的双线性滤波器。
源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning
块间预测概述
位置: src/reconstruction/prediction.py - block_inter_prediction()
规范文档: 7.11.3.4 Block inter prediction process
功能说明
使用插值滤波器进行标准运动补偿,生成预测块。块间预测支持子像素精度,使用高质量的8抽头滤波器或快速的双线性滤波器。
过程
-
水平插值
# 使用水平插值滤波器 for r in range(intermediateHeight): for c in range(w): p = x + xStep * c intermediate[r][c] = apply_horizontal_filter(p, ...) -
垂直插值
# 使用垂直插值滤波器 for r in range(h): for c in range(w): p = y + yStep * r pred[r][c] = apply_vertical_filter(p, intermediate, ...)
插值滤波器
- 8抽头滤波器:用于高质量插值,支持子像素精度
- 双线性滤波器:用于快速模式,计算简单
- 根据块大小自动选择滤波器类型
块间预测详细流程图
graph TD
A[块间预测开始<br/>block_inter_prediction] --> B[获取参考帧<br/>FrameStore refIdx]
B --> C[计算子采样参数<br/>subX subY]
C --> D[计算边界<br/>lastX lastY]
D --> E[计算中间高度<br/>intermediateHeight]
E --> F[选择水平插值滤波器<br/>InterpFilters 1]
F --> G{块宽度}
G -->|w <= 4| H[调整滤波器类型]
G -->|w > 4| I[使用原始滤波器]
H --> J[水平插值]
I --> J
J --> K[遍历中间行]
K --> L[遍历列]
L --> M[计算子像素位置<br/>p = x + xStep * c]
M --> N[应用水平滤波器<br/>8抽头插值]
N --> O[存储中间结果<br/>intermediate r c]
O --> P{还有列?}
P -->|是| L
P -->|否| Q{还有行?}
Q -->|是| K
Q -->|否| R[选择垂直插值滤波器<br/>InterpFilters 0]
R --> S{块高度}
S -->|h <= 4| T[调整滤波器类型]
S -->|h > 4| U[使用原始滤波器]
T --> V[垂直插值]
U --> V
V --> W[遍历输出行]
W --> X[遍历列]
X --> Y[计算子像素位置<br/>p = y + yStep * r]
Y --> Z[应用垂直滤波器<br/>8抽头插值]
Z --> AA[存储最终预测<br/>pred r c]
AA --> AB{还有列?}
AB -->|是| X
AB -->|否| AC{还有行?}
AC -->|是| W
AC -->|否| AD[块间预测完成]
style A fill:#e1f5ff
style J fill:#fff9c4
style V fill:#fff9c4
style AD fill:#c8e6c9
总结
块间预测使用插值滤波器进行标准运动补偿,生成预测块。它支持子像素精度,使用高质量的8抽头滤波器或快速的双线性滤波器,是帧间预测生成过程的核心步骤。
参考资源:
- AV1规范文档
- 源码实现: GitHub - av1_learning
- 预测实现:
src/reconstruction/prediction.py
- 预测实现:

浙公网安备 33010602011771号