x264代码剖析(十三):核心算法之帧间预测函数x264_mb_analyse_inter_*()
帧间预测是指利用视频时间域相关性,使用临近已编码图像像素预测当前图像的像素,以达到有效去除视频时域冗余的目的。由于视频序列通常包括较强的时域相关性,因此预测残差值接近于0,将残差信号作为后续模块的输入进行变换、量化、扫描及熵编码,可实现对视频信号的高效压缩。
本文将重点讨论基本档次支持的P片帧间预测工具以及主要和扩展档次支持的B片和加权预测等帧间预测工具,最后分析了帧间预测函数的主要功能。
1、可变尺寸块运动补偿
在H.264中,每个16*16大小的宏块可以有4种分割方式:一个16*16,两个16*8,两个8*16,四个8*8,其运动补偿也有相应的四种,如下图所示。
而8*8模式的每个子宏块还可以进一步用4种方式再进行分割:一个8*8,两个8*4,两个4*8,四个4*4,其运动补偿也有相应的四种,如下图所示。
这些分割和宏块大大提高了各宏块之间的关联性,这种分割下的运动补偿称为树状结构运动补偿。每个分割或子宏块都有一个独立的运动补偿,每个运动矢量MV必须被编码和传输,分割的选择也需编码到压缩比特流中。对于大的分割尺寸而言,MV选择和分割类型只需要少量的比特来表征,但是运动补偿残差在多细节区域能量将非常高;对于小的尺寸而言,分割运动补偿残差能量低,但是需要较多的比特来表征MV和分割选择,分割尺寸的选择影响了压缩性能。整体而言,大的分割尺寸适合于平坦区域,而小的尺寸适合于多细节区域。
2、运动矢量
帧间编码宏块的每个分割或者子宏块都是从参考图像的某一相同尺寸区域预测而得。两者之间的差异(MV),对于亮度成分采用1/4像素精度,而对于色度成分则采用1/8像素精度。亚像素位置的亮度和色度像素并不存在于参考图像中,需利用临近已编码点进行内插而得。如果MV的垂直和水平分量为整数,则参考块相应像素实际存在,如果其中一个或两个为分数,则预测像素要通过参考帧中相应像素内插获得。
3、MV预测
每个分割MV的编码需要相当的比特数,特别是使用小的分割尺寸时。为减少传输比特数,利用临近分割的MV较强的相关性,MV可由临近已编码分割的MV预测而得。预测矢量MV(p)基于已计算MV和MVD(预测与当前的差异),并被编码和传送。MV(p)取决于运动补偿尺寸和临近MV的有无。
举例说明:如下图,E为当前宏块或宏块分割子宏块,A/B/C分别为E的左、上、右上方的三个相对应块。如果E的左边不止一个分割,取其最上的一个为A;上方不止一个分割时,取其最左边一个为B,如右下图所示,左下图显示了所有分割有相同尺寸时的临近分割选择,右下图给出了不同尺寸时的临近分割的选择。