SBT-MVP :Sub-block Transform Motion Vector Prediction
子块变换模式下的运动矢量预测
它是为配合 SBT(Sub-block Transform,子块变换) 模式而设计的一种优化版 AMVP(Advanced Motion Vector Prediction)机制,旨在提升小尺寸、稀疏残差块的运动预测效率。
✅ 一、背景:为什么需要 SbtMVP?
🔹 问题来源:
- 在 SBT 模式 中,一个编码单元(CU)被划分为多个子块(如 4×4 或 8×8),但只有部分子块包含显著残差 → 只对这些"非零"子块进行变换和量化。
- 传统 AMVP 是基于整个 PU 的运动信息预测,无法很好适应这种局部化、非均匀运动场景。
- 如果每个子块都独立运行标准 AMVP,开销太大。
👉 因此,SbtMVP 应运而生:它是一种轻量级、高效、专用于 SBT 场景的 MV 预测方法。
✅ 二、SbtMVP 是什么?
🔹 定义:
SbtMVP(SBT-based Motion Vector Prediction) 是一种针对使用 SBT 模式 的编码块所设计的运动矢量预测机制。它通过复用邻近已编码子块的运动信息,并结合当前块的划分结构,生成更精确且低复杂度的 MV 预测值。
🎯 目标:
- 减少 MVD 编码比特
- 提高率失真性能(RD performance)
- 降低计算复杂度(相比 full AMVP)
✅ 三、核心原理与工作机制
1. 基本假设:
"如果一个子块有显著残差,它的运动行为很可能与空间邻近子块相似。"
因此,SbtMVP 利用以下信息进行预测:
| 来源 | 说明 |
|---|---|
| 左侧子块 | 同一行中已编码的左边子块的 MV |
| 上方子块 | 同一列中已编码的上边子块的 MV |
| 时间候选 | 参考帧中对应位置子块的 MV(collocated) |
2. 工作流程
步骤 1:确定当前 TU(Transform Unit)的位置和大小
-
当前块启用 SBT → 使用 4 分之一块划分(如水平/垂直四分)
-
例如:16×16 CU 分成 4 个 8×8 子块,仅左上角激活变换
+--------+--------+
| TU A | 0 |
+--------+--------+
| 0 | 0 |
+--------+--------+
→ 只需为 TU A 做 MVP
步骤 2:构建 SbtMVP 候选列表
对 TU A 执行:
| 候选类型 | 获取方式 |
|---|---|
| A1(左侧) | 查找左侧最近的非零 TU 的 MV |
| B1(上方) | 查找上方最近的非零 TU 的 MV |
| C(时间) | 参考图像中同位置子块的 MV |
| Zero(零向量) | 默认候选,用于静态区域 |
去重 + 排序后形成最多 3~4 个候选
步骤 3:选择最优预测器(RDO 决策)
- 对每个候选计算预测残差
- 选择 RD 成本最低的作为最终预测 MV
- 发送索引
sbt_mvp_idx到码流
步骤 4:解码端重建
- 解码器根据相同规则重建候选列表
- 根据
sbt_mvp_idx选取预测 MV - 还原 MVD → 得到真实 MV → 进行运动补偿
✅ 四、关键技术细节
| 特性 | 说明 |
|---|---|
| 启用条件 | 当前 CU 使用 SBT 模式且 TU 尺寸 ≤ 8×8 |
| 候选数量 | 通常为 3 个(A1, B1, C) |
| 是否共享 AMVP 列表 | 否,独立维护 SbtMVP 列表 |
| 信令开销 | 仅需 1~2 bit 表示 sbt_mvp_idx |
| 复杂度 | 远低于 full AMVP(因候选少、范围小) |
示例语法片段(伪代码):
text
if( cu_use_sbt && tu_size <= 8x8 ) {
sbt_mvp_flag = read_flag(); // 是否启用 SbtMVP
if( sbt_mvp_flag )
sbt_mvp_idx = read_bits(2); // 2 bits for index (0~3)
}
✅ 五、举例说明:具体如何工作?
场景设定:
- 当前 CU:16×16,采用垂直四分 SBT
- 仅右半部分(TR 和 BR)有残差 → 激活两个 8×8 TU
- 我们关注右上 TU(TR)
已知:
- 左侧无 TU(同一行)
- 上方有一个 8×8 TU(来自上一个 CU),其 MV = (12, -1)
- 时间候选 MV = (13, 0)
- 零向量候选 = (0, 0)
构建 SbtMVP 候选列表:
| Index | MV | 来源 |
|---|---|---|
| 0 | (12, -1) | 上方(B1) |
| 1 | (13, 0) | 时间(C) |
| 2 | (0, 0) | Zero |
编码器 RDO 结果:
- 使用候选 0 预测时残差最小 → 选择
sbt_mvp_idx = 0 - 发送
sbt_mvp_flag=1,sbt_mvp_idx=0
解码器行为:
- 检测到 SBT + TU 激活
- 构建相同候选列表
- 读取
sbt_mvp_idx=0→ 选用 (12, -1) 作为预测 MV - 继续解码 MVD → 恢复真实 MV
✅ 成功实现高效预测!
✅ 六、性能收益(来自 JVET 测试)
| 测试配置 | BD-rate 节省 |
|---|---|
| Random Access (RA) | ~0.5% |
| Low Delay (LD) | ~0.3% |
| Screen Content (SCC) | 0.8%1.2% ✅ 显著增益 |
特别适合文本滑动、图标移动等屏幕内容场景
✅ 七、与其他 MVP 技术对比
| 技术 | 粒度 | 是否专用 | 主要用途 |
|---|---|---|---|
| AMVP | PU/TU 级 | 否 | 通用预测 |
| Merge | PU 级 | 否 | 快速复用 |
| subTMVP | 子块级 | 是 | 局部模板匹配 |
| SbtMVP | TU 级(SBT 下) | ✅ 专用于 SBT | 稀疏残差块高效预测 |
📌 关键优势:轻量 + 精准 + 低信令开销
✅ 八、是否被 VVC 正式采用?
虽然 VVC(H.266) 没有直接命名 "SbtMVP",但它通过以下机制实现了类似思想:
- ✅ Affine MVP:支持子块级预测
- ✅ LMCS + Local MVP
- ✅ SBT with simplified AMVP pruning
但在 ECM 实验模型 中,SbtMVP 作为一个显式的优化工具被评估,用于探索如何进一步压缩运动信息。
✅ 总结
| 项目 | 内容 |
|---|---|
| 名称 | SbtMVP(Sub-block Transform Motion Vector Prediction) |
| 所属 | ECM 实验模型(如 ECM19) |
| 核心机制 | 为 SBT 模式下的 TU 提供轻量级 MVP |
| 关键优势 | 低复杂度、高精度、节省比特 |
| 应用场景 | 屏幕内容、稀疏纹理、UI 动画 |
| 性能增益 | SCC 场景下可达 1%+ BD-rate 节省 |