1.前言
本文章所说的MV预测是指计算当前块MV向量的预测值,该值与码流中传输的MV残差值相加即可得到实际的MV向量。请注意,在某些宏块类型的某种情况下是不需要进行MV预测的,他们的MV可以通过其他方法得出,本文只介绍MV预测过程。另外,本文所介绍的内容在H264标准文档中的8.4.1.3小节有详细介绍,这里做个讲解方便读者理解。
2.原理说明
当前预测块的MV向量预测值(MVP)由其三个相邻宏块的预测块经过一定的规则得到。相邻块分别为左、上、右上三个块,分别命名为A块、B块、C块,且三个块可能在同一个宏块内,也可能在不同宏块内,这三个块的识别是有一套规则的,在标准文档的6.4.8.5有详细介绍,下面对当前块的不同的形状下的A、B、C块的标识及其预测方法。
2.1 8x16预测块的MV预测
(1)如果当前预测块处于宏块的左半部分,其参考索引RefIdx与A块的参考索引RefIdx相同时,当前块MVP由A块预测得到;同理如果当前预测块处于宏块的右半部分,其参考索引RefIdx与C块的参考索引RefIdx相同时,当前块MVP由C块预测;
16x16预测块的MV预测
取A、B、C块 mv 的中值,即 mvp = mid(mvA, mvB, mvC),三个块分别处于不同的宏块中。
16x8预测块的MV预测
(1)如果当前块处于宏块的上半部分,其参考索引与B块的参考索引相同时,当前块MVP由B块预测得到;同理如果当前块处于宏块的下半部分,其参考索引与A块的参考索引相同时,当前块MVP由A块预测;
8x8预测块的MV预测
取A、B、C块 mv 的中值,即 mvp = mid(mvA, mvB, mvC)。但要注意,C块处于B宏块内。这里只画出了8x8预测块在左上角的情况,其他位置上的8x8预测块的A、B、C块的位置绝对位置有变化,但是相对位置是固定的。这就意味着,A、B、C块可能有可能分别处于不同宏块中,也有可能有两个块处于相同宏块中,不存在3个块都处于同一宏块中。
8x4预测块的MV预测
取A、B、C块 mv 的中值,即 mvp = mid(mvA, mvB, mvC),描述同8x8预测块一致。
4x8预测块MV预测
取A、B、C块 mv 的中值,即 mvp = mid(mvA, mvB, mvC)。这里只画出了8x8预测块在右下角的情况,其他位置上的8x8预测块的A、B、C块的位置绝对位置有变化,但是相对位置是固定的。这就意味着,A、B、C块可能有可能分别处于不同宏块中,也有可能有两个块处于相同宏块中,甚至3个块都处于同一宏块中。
4x4预测块MV预测
取A、B、C块 mv 的中值,即 mvp = mid(mvA, mvB, mvC),描述同4x8预测块一致。
特殊说明
在进行上面的 mvp 计算时,还要满足下面的限制条件:
(1)只有当当前块E的参考帧和临近块(A、B、C)的参考帧为同一帧,那么才可以使用MVA、MVB、和MVC进行预测;
(2)如果MVC不可用,则用当前块的左上边块的运动矢量MVD代替MVC;
(3)如果MVA、MVB和MVC中没有可用的,当前块mvp等于0;
(4)如果MVA、MVB和MVC中只有一个可用的,那么MVP就是该可用的临近块运动矢量;
(5)如果MVA、MVB和MVC中有两个可用的,那么将另一个不可用的当作0,然后按照3个都可用的策略计算MVP。