目录
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 需要编码。当采用小尺寸编码时,一个宏块内需要编码的 mv 也越多,所需比特额越多。同时,mv 有两个值并且以1/4像素为单位,这也就意味着mv的数值还不小,因此有必要对 mv 进行压缩。
H.264 标准利用临近块 mv 的相关性对当前块 mv 进行预测,只对实际 mv 与预测 mv(mvp)的差值 mvd 进行编码。
mv 预测值的推导过程可分为亮度分量mvp和色度分量mvp
另外还需要注意的一点是,mvp是具有方向性的。意思是说在预测B slice的mvp时,需要分为:
他们分别对应的参考图像索引为 refIdxL0 与 refIdxL1。也就是说,当在进行前向运动预测时,计算mvp阶段得到的是mvL0以及refIdxL0;当在进行后向运动预测时,计算mvp阶段得到的是mvL1以及refIdxL1。
mvp 由当前块(任意分块大小)左边分块A、上边分块B、右上分块 C 的 mv 预测得到。亮度分量 mv预测值推导过程分为两步:
如果 mbAddr C 不可用,那么用 mbAddr D 来替代 mbAddr C;
中值预测规则如下:
在进行上面的 mvp 计算时,还要满足下面的限制条件:
一般情况下色度分量 mv 等于亮度分量 mv,只有一种特殊情况:
场宏块色度mv的垂直分量按下表计算。
P_Skip宏块表示该宏块没有编码任何宏块信息,残差数据全为0,mv和参考帧索引(等于0)也没有编码。
P_Skip宏块亮度分量mv预测过程如下:
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)。
B帧是双向预测,分别参考List0和List1两个参考帧列表进行前向和后向预测,这里的前和后是针对播放顺序而不是编码顺序。
H.264编码是以GOP分组处理,每个GOP的编码结构有
B宏块预测有4种模式 (对应到 B 宏块的 type):
其中16x8和8x16大小的块只能使用Direct、List0和List1,其他子块大小可以使用所有的模式。
从List0和List1两个参考帧列表中选择最佳匹配块进行预测。过程如下:
// 其中P1和P2是两个方向的参考帧的权重。
pred(i,j) = (P1 * pred_L0(i,j) + P2 * (pred_L1(i,j))) / (P1 + P2);
这两种模式和双向模式类似,只不过只进行一个方向的预测 。
直接模式应用于16x16、8x8以及8x8块中的所有子块。
直接模式只编码预测残差,而不编码运动矢量(或MVD)和参考帧序列号,运动矢量和参考帧序列号在解码端通过计算前、后向MV,利用前后向MV得到像素预测值。
有两种计算MV的方法:时间模式和空间模式。
基于假设“被预测的块在前后两个参考块间是均匀运动的”,所以场景切换和非均匀运动的块,预测效果不好。
运动估计时,假设当前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)。
利用当前帧的相邻块的运动信息估计当前块的MV和参考帧序号;
主要过程包括“参考帧选择”和“运动矢量选择”。