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模式),最终确定当前块的实际运动向量。

分配流程

  1. 预测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]
    
  2. 实际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模式),最终确定当前块的实际运动向量。这是帧间预测模式信息解码的关键步骤。


参考资源:

上一篇: Y模式解码
下一篇: Inter-Intra模式解码

posted @ 2026-01-10 07:52  chai51  阅读(0)  评论(0)    收藏  举报