Skip 模式Direct 模式的核心思想都是利用时域或空域上运动矢量的相关性,通过 继承推算 的方式来获得当前宏块的运动信息,从而省去编码运动矢量和参考帧索引本身,甚至连残差数据(Residual)都不用编码,因此能达到极高的压缩率。

它们通常被用于画面中运动很小或者运动规律很强的区域,例如静止的背景或匀速运动的物体。

Skip 模式

Skip模式是 P 帧(或 P-slice)中使用的一种极其高效的模式。当编码器判断一个宏块的运动矢量与其相邻块的运动矢量非常相似,并且经过运动补偿后,预测块与原始块的残差几乎为零(或低于一个特定的阈值)时,就会采用 Skip 模式。

工作机制

  1. 运动矢量推导 (MV Derivation)
    • Skip 模式的宏块 不传输自己的运动矢量。它的运动矢量是通过一个运动矢量预测(Motion Vector Prediction, MVP)机制,根据其左边、上边和左上角相邻块的运动矢量中值(Median)计算出来的。
    • 解码器会执行完全相同的推导过程,从而得知这个宏块的运动矢量。
  2. 参考帧索引
    • 由于 P 帧只有一个前向参考帧列表(List 0),Skip 模式的宏块默认使用该列表中的第一个参考帧(ref_idx=0)。这个信息也是约定好的,不需要传输。
  3. 无残差数据
    • 这是 Skip 模式最关键的特点:它假设预测已经足够完美,因此不编码也不传输任何残差数据。整个宏块的信息在码流中只有一个标识(mb_type)指出这是一个 Skip 宏块。

总结 Skip 模式

  • 适用对象:P 帧中的宏块。
  • 编码内容几乎为零,只在宏块级别有一个非常短的标识符。
  • 解码过程:解码器看到 Skip 标识后,自己推算出运动矢量,并从 0 号参考帧中复制出预测块,这个预测块就是最终的重建块(因为没有残差)。
  • 应用场景:大面积的静止或缓慢、匀速平移的区域(如静止的背景)。

Direct 模式

含义: Direct(直接)模式是 B 帧(或 B-slice)独有的模式,它与 Skip 模式类似,也是一种“零运动信息”的编码方式。它充分利用了 B 帧可以双向参考的特性,通过推导得出前向(L0)和后向(L1)的两个运动矢量。

Direct 模式分为两种推导方法:时间模式空间模式

Temporal Direct Mode

这是更常用的一种方法。它假设当前块的运动是线性和匀速的。

  • 工作机制
    1. 它找到 当前块在后向参考帧(L1)中对应位置的那个块
    2. 读取那个块当时编码时所用的 前向运动矢量(MV_col)
    3. 基于 当前帧后向参考帧(L1)前向参考帧(L0) 之间的时间距离(以帧序号 POC 计算),按比例缩放 MV_col,从而计算出当前块的前向 MV(mvL0)和后向 MV(mvL1)。
  • 举例:假设当前帧是第 5 帧,后向参考是第 6 帧(L1),前向参考是第 3 帧(L0)。解码器会去看第 6 帧中同一位置的块,发现它当时是参考第 3 帧得到的,运动矢量为 MV_col = (15, 6)。那么解码器就会按时间比例计算:
    • mvL0 (从 3->5) = MV_col * (5-3)/(6-3) = (15, 6) * 2/3 = (10, 4)
    • mvL1 (从 6->5) = MV_col * (5-6)/(6-3) = (15, 6) * -1/3 = (-5, -2)

Spatial Direct Mode

这种方法与 P 帧的 Skip 模式非常相似。

  • 工作机制
    • 它不依赖后向参考帧的运动信息,而是像 Skip 模式一样,根据当前块的左边、上边、左上角相邻块的运动矢量,分别推导出前向(L0)和后向(L1)的运动矢量。

Direct 模式与 Skip 模式的关键区别

  • 残差数据:这是最大的区别。Direct 模式的宏块 可以编码并传输残差数据。编码器在推导出运动矢量并完成运动补偿后,如果发现预测块和原始块之间仍有不可忽略的差异,它会将这些差异编码为残差。
  • B-Slice Skip 模式:在 B 帧中,也存在一种特殊的 Skip 模式。它其实就是 Direct 模式的一种特例,即当编码器判定一个 B 宏块可以使用 Direct 模式,并且其残差为零时,就会将其标记为 B_Skip_Direct。这种情况下,它就和 P 帧的 Skip 模式一样,既不传 MV 也不传残差。