5.2.4 运动向量分配
作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
引言
运动向量分配是帧间预测模式信息解码的重要步骤,它根据Y模式从MV栈中选择预测MV,并解码MV差值(如果是NEWMV模式),最终确定当前块的实际运动向量。
源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning
运动向量分配概述
位置: src/tile/tile_group.py - __assign_mv()
规范文档: 5.11.26 Assign MV syntax
功能说明
根据Y模式从MV栈中选择预测MV,并解码MV差值(如果是NEWMV模式),最终确定当前块的实际运动向量。
分配流程
-
预测MV(PredMv)确定
if compMode == GLOBALMV: PredMv = GlobalMvs[i] elif compMode == NEWMV and NumMvFound <= 1: PredMv = RefStackMv[0][i] elif compMode == NEARESTMV: PredMv = RefStackMv[0][i] else: PredMv = RefStackMv[RefMvIdx][i] -
实际MV确定
if compMode == NEWMV: MvDelta = __read_mv(av1) # 解码MV差值 Mv = PredMv + MvDelta else: Mv = PredMv
运动向量分配流程图
graph TD
A[运动向量分配开始<br/>__assign_mv] --> B[遍历参考列表<br/>i in range 1+isCompound]
B --> C{使用IntraBC?}
C -->|是| D[IntraBC特殊处理<br/>PredMv从RefStackMv选择]
C -->|否| E{compMode}
E -->|GLOBALMV| F[PredMv = GlobalMvs i]
E -->|NEWMV<br/>MV候选数量少于2个| G[PredMv = RefStackMv 0 i]
E -->|NEARESTMV| H[PredMv = RefStackMv 0 i]
E -->|其他| I[PredMv = RefStackMv RefMvIdx i]
D --> J{compMode}
F --> J
G --> J
H --> J
I --> J
J -->|NEWMV| K[解码MV差值<br/>__read_mv<br/>Mv = PredMv + MvDelta]
J -->|其他| L[Mv = PredMv]
K --> M{还有参考帧?}
L --> M
M -->|是| B
M -->|否| N[验证MV有效性<br/>is_mv_valid]
N --> O[运动向量分配完成]
style A fill:#e1f5ff
style E fill:#fff9c4
style J fill:#fff9c4
style O fill:#c8e6c9
总结
运动向量分配根据Y模式从MV栈中选择预测MV,并解码MV差值(如果是NEWMV模式),最终确定当前块的实际运动向量。这是帧间预测模式信息解码的关键步骤。
参考资源:
- AV1规范文档
- 源码实现: GitHub - av1_learning
- Tile解码:
src/tile/tile_group.py
- Tile解码:
上一篇: Y模式解码
下一篇: Inter-Intra模式解码

浙公网安备 33010602011771号