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模式:
- 非skip模式:
skip_mode == 0 - 运动模式可切换:
is_motion_mode_switchable == 1 - 块大小限制:
min(Block_Width, Block_Height) >= 8 - 全局运动检查:如果使用GLOBALMV且GmType > TRANSLATION,则只能使用SIMPLE
- 非复合预测且无Inter-Intra:
isCompound == 0且RefFrame[1] != INTRA_FRAME - 有可重叠候选:
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处理复杂运动。
参考资源:
- AV1规范文档
- 源码实现: GitHub - av1_learning
- Tile解码:
src/tile/tile_group.py
- Tile解码:
上一篇: Inter-Intra模式解码
下一篇: 复合类型解码

浙公网安备 33010602011771号