5.2.6 运动模式(SIMPLE/OBMC/LOCALWARP)

作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

引言

运动模式解码确定当前块使用的运动补偿模式,包括SIMPLE(简单运动补偿)、OBMC(重叠块运动补偿)和LOCALWARP(局部warp变换)。不同的运动模式适用于不同的运动类型。

源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning


运动模式解码概述

位置: src/tile/tile_group.py - __read_motion_mode()

规范文档: 5.11.27 Read motion mode syntax

功能说明

确定当前块使用的运动补偿模式,包括SIMPLE、OBMC和LOCALWARP。

运动模式类型

  • SIMPLE: 简单运动补偿,标准块匹配
  • OBMC: 重叠块运动补偿,减少块边界伪影
  • LOCALWARP: 局部warp变换,处理旋转、缩放等复杂运动
  • GLOBALWARP: 全局warp变换,通过全局运动参数

解码条件

运动模式解码需要满足多个条件,如果任何条件不满足,将直接使用SIMPLE模式:

  1. 非skip模式skip_mode == 0
  2. 运动模式可切换is_motion_mode_switchable == 1
  3. 块大小限制min(Block_Width, Block_Height) >= 8
  4. 全局运动检查:如果使用GLOBALMV且GmType > TRANSLATION,则只能使用SIMPLE
  5. 非复合预测且无Inter-IntraisCompound == 0RefFrame[1] != INTRA_FRAME
  6. 有可重叠候选has_overlappable_candidates() == 1

解码流程

# 1. Skip模式检查
if skip_mode == 1:
    motion_mode = SIMPLE
    return

# 2. 运动模式可切换检查
if not is_motion_mode_switchable:
    motion_mode = SIMPLE
    return

# 3. 块大小检查
if min(Block_Width[MiSize], Block_Height[MiSize]) < 8:
    motion_mode = SIMPLE
    return

# 4. 全局运动检查
if YMode in [GLOBALMV, GLOBAL_GLOBALMV]:
    if GmType[RefFrame[0]] > TRANSLATION:
        motion_mode = SIMPLE
        return

# 5. 复合预测和Inter-Intra检查
if isCompound or RefFrame[1] == INTRA_FRAME or not has_overlappable_candidates():
    motion_mode = SIMPLE
    return

# 6. 查找warp样本
find_warp_samples_process()

# 7. 根据条件选择运动模式
if (force_integer_mv or 
    NumSamples == 0 or 
    not allow_warped_motion or 
    is_scaled(RefFrame[0])):
    # 只能选择SIMPLE或OBMC
    use_obmc = read_S(av1, 'use_obmc')
    motion_mode = OBMC if use_obmc == 1 else SIMPLE
else:
    # 可以选择SIMPLE、OBMC或LOCALWARP
    motion_mode = read_S(av1, 'motion_mode')
    # motion_mode: SIMPLE, OBMC, LOCALWARP

运动模式解码流程图

运动模式解码主流程

graph TD A[运动模式解码开始<br/>__read_motion_mode] --> B{skip_mode == 1?} B -->|是| SI[motion_mode = SIMPLE] B -->|否| D{is_motion_mode_switchable == 0} SI --> END[运动模式解码完成] D -->|是| SI D -->|否| F{min Block_Width Block_Height < 8?} F -->|是| SI F -->|否| H{YMode是GLOBALMV<br/>或GLOBAL_GLOBALMV?} H -->|是| I{非恒等变换或纯平移?} H -->|否| J{复合预测或Inter-Intra<br/>或无重叠候选?} I -->|是| SI I -->|否| J J -->|是| SI J -->|否| M[查找warp样本<br/>find_warp_samples_process] M --> N{force_integer_mv<br/>或NumSamples == 0<br/>或不允许warped_motion<br/>或参考帧缩放?} N -->|是| O[解码use_obmc] N -->|否| P[解码motion_mode] O --> Q{use_obmc == 0?} Q -->|是| SI Q -->|否| S[motion_mode = OBMC] P --> END S --> END style A fill:#e1f5ff style B fill:#fff9c4 style D fill:#fff9c4 style F fill:#fff9c4 style I fill:#fff9c4 style J fill:#fff9c4 style N fill:#fff9c4 style Q fill:#fff9c4 style END fill:#c8e6c9

总结

运动模式解码确定当前块使用的运动补偿模式。不同的运动模式适用于不同的运动类型:SIMPLE适合简单平移,OBMC减少块边界伪影,LOCALWARP处理复杂运动。


参考资源:

上一篇: Inter-Intra模式解码
下一篇: 复合类型解码

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