x264_mb_predict_mv_16x16
由于色度块帧间预测使用的是相应亮度块的运动矢量,所以视频解码中只需要对亮度块的运动矢量进行预测。一个亮度块E和它相邻亮度8×8块A、B、C和D之间的空间位置如图1所示。E的大小可以是16×16、16×8、8×16或8×8。A、B、D都是与E的左上角样本紧邻的块,C是与E的右上角样本紧邻的块。
图1中,A、B、C、D的原始运动矢量分别为mvA、mvB、mvC、mvD,对应的BlockDistance分别为BlockDistanceA、BlockDistanceB、BlockDistanceC、BlockDistanceD,对应的参考索引值分别为refA、refB、refC、refD。其中BlockDistance是当前块(属于当前图像)和它的运动矢量所指向的参考块(属于参考图像)之间的距离;参考索引值用来确定当前图像进行解码处理所用的参考图像,参考图像的两场可有不同的参考索引值,因此参考索引取值范围是0~3。下面如果将参考索引值赋值为-1,那仅仅是运动矢量预测中的一个标记,不代表实际的参考索引值。具体预测过程如下:
--如果A"不可用"或者采用帧内预测,或与当前块没有同一个预测方向的运动矢量,则mvA为零矢量,BlockDistanceA等于1,refA为-1;B和D块的处理方式和A块完全相同。
![]() |
上面提到的块"不可用"指该块不存在,或者尚未解码。
当前块E的运动矢量预测值MVEPred主要有三步:
第一步,如果A、B、C三者中只有一个块X的参考索引值不为-1,那么MVEPred等于mvx(x为A、B或C);否则进行第二步;第二步,如果E所在宏块按16×8或8×16模式编码,且E的参考索引和相应周围块参考索引满足一定的条件,则MVEPred等于相应的mvX,否则进行第三步;第三步,根据缩放公式MVX=(mvX×BlockDistanceE ×(256/BlockDistanceX)+128)>>8(X为A、B或C)对mvA、mvB、mvC进行缩放,得到MVA、MVB、MVC,再计算各MVX之间的距离,根据距离的中间值选择MVX作为MVEPred。