H.264 入门篇 - 12 (帧间预测 - MVP 求解)

目录

1. 亮度分量 mvp 的推导过程

1.1、mvp 中值预测过程

2、色度分量 mvp 的推导过程

3、P_Skip 宏块 mv 推导过程

4、B_Skip/Direct 模式

5、B 帧的预测

5.1、双向预测

5.2、 List0和List1模式

5.3、直接模式

5.3.1、时间 Direct 模式

5.3.2、空间 Direct 模式


H.264 利用相邻帧之间的相似性,用参考帧(可能多参考帧)和目标帧之间,以宏块为基本单位进行帧间预测

  • 进行运动估计 (搜索、匹配) 得到运动向量 mv
  • 根据帧间编码规则,进行运动向量预测得到 mvp
  • 根据 mv 和 mvp 得到运动向量残差 mvd,用于编码

在帧间预测编码模式下,每个块都有一个或两个 mv 需要编码。当采用小尺寸编码时,一个宏块内需要编码的 mv 也越多,所需比特额越多。同时,mv 有两个值并且以1/4像素为单位,这也就意味着mv的数值还不小,因此有必要对 mv 进行压缩。

H.264 标准利用临近块 mv 的相关性对当前块 mv 进行预测,只对实际 mv 与预测 mv(mvp)的差值 mvd 进行编码。

mv 预测值的推导过程可分为亮度分量mvp和色度分量mvp

另外还需要注意的一点是,mvp是具有方向性的。意思是说在预测B slice的mvp时,需要分为:

  • 前向 mvp :mvL0;
  • 后向 mvp :mvL1;

他们分别对应的参考图像索引为 refIdxL0 与 refIdxL1。也就是说,当在进行前向运动预测时,计算mvp阶段得到的是mvL0以及refIdxL0;当在进行后向运动预测时,计算mvp阶段得到的是mvL1以及refIdxL1。

1. 亮度分量 mvp 的推导过程

mvp 由当前块(任意分块大小)左边分块A、上边分块B、右上分块 C 的 mv 预测得到。亮度分量 mv预测值推导过程分为两步:

  • 获取当前分块(任意分块大小)相邻块是否可用和 mv 等信息;
  • 根据相邻块信息通过中值预测得到当前块 mv;

H.264 入门篇 - 12 (帧间预测 - MVP 求解)_第1张图片

如果 mbAddr C 不可用,那么用 mbAddr D 来替代 mbAddr C;

1.1、mvp 中值预测过程

中值预测规则如下:

  • 当前块为16x8大小,上面的16x8块由B预测,下面的16x8块由A预测;
  • 当前块为8x16大小,左边的8x16块由A预测,右边的8x16块由C预测;
  • 如果有且仅有一个相邻块的参考索引等于当前分块的参考索引,则mvp等于该块mv;
  • 其余情况,取A、B、C块 mv 的中值,即 mvp = mid(mvA, mvB, mvC)。

H.264 入门篇 - 12 (帧间预测 - MVP 求解)_第2张图片

在进行上面的 mvp 计算时,还要满足下面的限制条件:

  1. 只有当当前块E的参考帧和临近块(A、B、C)的参考帧为同一帧,那么才可以使用MVA、MVB、和MVC进行预测;
  2. 如果MVC不可用,则用当前块的左上边块的运动矢量MVD代替MVC;
  3. 如果MVA、MVB和MVC中没有可用的,那么不进行运动矢量预测,直接编码当前块的运动矢量MV;
  4. 如果MVA、MVB和MVC中只有一个可用的,那么MVP就是该可用的临近块运动矢量;
  5. 如果MVA、MVB和MVC中有两个可用的,那么将另一个不可用的当作0,然后按照3个都可用的策略计算MVP。

2、色度分量 mvp 的推导过程

一般情况下色度分量 mv 等于亮度分量 mv,只有一种特殊情况:

场宏块色度mv的垂直分量按下表计算。

H.264 入门篇 - 12 (帧间预测 - MVP 求解)_第3张图片

3、P_Skip 宏块 mv 推导过程

P_Skip宏块表示该宏块没有编码任何宏块信息,残差数据全为0,mv和参考帧索引(等于0)也没有编码。

P_Skip宏块亮度分量mv预测过程如下:

  1. 如果以下任意一个条件为真,则mvp两个分量都为0;
    1. 相邻宏块A不可用;
    2. 相邻宏块B不可用;
    3. 相邻宏块A参考帧索引为0,并且mv都为0;
    4. 相邻宏块B参考帧索引为0,并且mv都为0;
  2. 如果是其他情况,使用上面章节的中值预测推导。

4、B_Skip/Direct 模式

B slice中skip宏块和direct宏块需要使用一种特殊的预测方式direct预测。B_Skip既没有编码残差数据,也没有编码mv和refidx信息。B_Direct则编码残差数据,但没有编码mv和refidx信息,可以认为B_Skip是B_Direct的特例。只有16x16和8x8块存在direct模式。

Direct模式不需要传输mvd和ref_idx,因而能节省大量比特,mv和ref_idx通过已经解码帧计算得到。Direct预测分为两种模式:时域直接模式(temporal direct)、空域直接模式(spatial direct)。

5、B 帧的预测

B帧是双向预测,分别参考List0和List1两个参考帧列表进行前向和后向预测,这里的前和后是针对播放顺序而不是编码顺序。

H.264编码是以GOP分组处理,每个GOP的编码结构有

  • III……:一般不使用,编码效率太低
  • IPP……:H.264的基本档次
  • IBB……P:主要档次
  • 分层B帧结构:扩展档次

B宏块预测有4种模式 (对应到 B 宏块的 type):

  1. 直接模式(Direct)
  2. 双向模式(Bipred)
  3. List0
  4. List1

其中16x8和8x16大小的块只能使用Direct、List0和List1,其他子块大小可以使用所有的模式。

5.1、双向预测

从List0和List1两个参考帧列表中选择最佳匹配块进行预测。过程如下:

  • 在List0和List1中查找最佳匹配块,得到运动矢量MV(MV1,MV2)
  • 利用临近块的同方向MV,估计当前块的两个方向的MV预测值MVp(MVp1,MVp2,方法见前面:MV中值预测)。PS:该步骤可以和上一步对换,即:先估计得到MVp1和MVp2,然后以MVp1和MVp2为起点进行搜索得到运动矢量MV1和MV2;
  • 得到MV和MVp,就可以计算两个MVD(MVD1和MVD2),然后对MVD进行编码。
  • 得到两个预测参考块和运动矢量后,就可以计算像素块的像素预测值。

// 其中P1和P2是两个方向的参考帧的权重。

pred(i,j) = (P1 * pred_L0(i,j) + P2 * (pred_L1(i,j))) / (P1 + P2);

5.2、 List0和List1模式

这两种模式和双向模式类似,只不过只进行一个方向的预测 。

5.3、Direct 直接模式

直接模式应用于16x16、8x8以及8x8块中的所有子块。

直接模式只编码预测残差,而不编码运动矢量(或MVD)和参考帧序列号,运动矢量和参考帧序列号在解码端通过计算前、后向MV,利用前后向MV得到像素预测值。

有两种计算MV的方法:时间模式和空间模式。

5.3.1、时间 Direct 模式

基于假设“被预测的块在前后两个参考块间是均匀运动的”,所以场景切换和非均匀运动的块,预测效果不好。

运动估计时,假设当前B块在List0和List1中参考帧分别为F0和F1,对应的最佳匹配块(预测块)分别为B0和B1。如果在之前对B1块进行帧间预测时,B0是B1的前向最佳匹配块,即:存在当前块在List0中的参考块B0相对于当前块在List中的参考块B1的运动矢量MV,那么就可以根据这个运动矢量和当前帧与F0、F1之间的帧间隔(记为d0,d1)算出前向和后向的运动矢量MV0和MV1。

如:MV=(2.5,5),当前帧与F0和F1分别间隔2帧和1帧,

即:d0=3,d1=2;于是MV0 = d0/(d0+d1) * MV = (1.5,3),MV1 = -d1 / (d0+d1) * MV =(-1,-2)。

5.3.2、空间 Direct 模式

利用当前帧的相邻块的运动信息估计当前块的MV和参考帧序号;

主要过程包括“参考帧选择”和“运动矢量选择”。

  • 参考帧选择:利用当前块的邻近块A、B、C(位置见后面MV的编码)的参考帧中非负帧号最小的帧作为当前块的参考帧,这是为了选择离当前块最近的帧作为参考帧。如果有一个方向上A、B、C都没有参考帧,那么就采用单项帧间预测。如果A、B、C在两个方向都没有参考帧(即A、B、C都是帧内预测),那么当前块分别选择两个方向离当前帧最近的参考帧为当前块的参考帧。
  • 运动矢量选择:若List1中第一帧(当前帧的播放顺序后一帧)对应位置块的运动适量MV1和MV2小于1/4像素(即:当前块到下一帧运动的比较少),且该帧为短期参考帧,且当前块的某个方向的参考帧帧号为0,则该方向的MV为0。如果不满足,则按照后面MV的编码中描述的方法计算两个方向(A、B、C的运动矢量的中值,不是均值)的MVP作为当前块的MV

你可能感兴趣的:(#,H.264,mvc,python,开发语言,视频编解码)