首先介绍一下帧间的划分
264的帧间预测块尺寸包含了16x16到4x4。
每个宏块(16x16)可以使用4种方式进行划分:1个16x16,2个16x8,2个8x16,4个8x8,叫做宏块划分。
在8x8的情况下,子宏块还可以继续划分:1个8x8,2个4x8,2个8x4,4个4x4,叫做子宏块划分。
上述划分方式的简单示意图如下:
上述划分描述的是亮度分量,对于色度分量来说,色度块的尺寸是亮度块的一半,且色度块的划分方式和亮度块相同。
每个宏块划分和子宏块划分都有一个或两个MV(P/B),每个MV都指向一个位于参考帧里的用于预测当前划分块的区域,这个区域的尺寸和当前的块相同。每个宏块划分可以利用不同的参考帧进行预测。然而,子宏块划分只能使用同一个参考帧进行预测。
然后介绍一下分数像素插值
亮度分量的分数像素只有1/4精度,色度只有1/8精度。
如何获取分数像素位置的像素值呢?这通过利用整数像素进行内插生成。
首先会生成1/2精度的像素,结合下图说明
上图中,正常的A、B、C这种小灰块代表整数像素,在内插的过程中,先插值得到b再插值得到h。得到b的过程是利用E、F、G、H、I、J这六点的像素值做一个加权和;得到h的过程是利用A、C、G、M、R、T这六点的像素值做一个加权和。有了aa、bb、cc、dd、b、h这一类型的像素值,就可以通过加权求和得到i的像素值。
然后通过1/2精度的像素值再内插出1/4精度的像素值,结合下图说明
1/4精度的像素值的计算过程要更简单,只不过是相邻/对角像素值的平均值。
上面介绍了亮度像素的分数像素插值过程,下面再简单说说色度像素的。
色度像素也是需要通过整像素插值得到,简单示意图如下:
A、B、C、D是整数像素,a是1/8精度的分数像素,a点像素值的计算公式如下,朴实无华:
接着介绍一下MV的预测
当前块的MV可以由相邻块的MV预测得到,把预测值记作MVP,下图解释了相邻块如何确定:
假设E是当前宏块,A是E左边的,B是E上边的,C是E右上角的。如果A这个区域里有很多宏块划分/子宏块划分,那么选择最上边的作为A;如果B这个区域里有很多宏块划分/子宏块划分,那么选择最左边的作为B。
1. 如果要传输的划分不包含16x8或者8x16的划分尺寸,那么MVP 就是A、B、C的MV的中值。
2. 如果是16x8的划分,那么上边的16x8的MVP就是B的,下边的16x8的MVP就是A的。
3. 如果是8x16的划分,那么左边的8x16的MVP就是A的,右边的8x16的MVP就是B的。
4. 如果是skip的宏块,那么就按着第1种方式预测
(这里有个小疑问,书本里只举了宏块划分获取MVP的例子,没有说子宏块划分获取MVP的例子,个人推测应该也是按着这种方式来。)
双向MVP
双向的分为两种情况,我们都知道这时候有两个参考帧a和b,从播放顺序考虑
1. 假如a和b一个在前一个在后,那么当前块在利用相邻块获取两个MVP的时候,一个相邻块的MV是指向前的,一个是指向后的。
2. 假如a和b都在前或者都在后,那么相邻块的MV都是指向前的,或者都是指向后的。在这时候有个很奇怪的操作:现在我有俩MV,一个是MVa,一个是MVb,这俩里就有一个MV需要做些变动。假设我当前帧的播放顺序是第5帧,a是第4帧,b是第2帧,MVa是(1,-1),MVb是(1.5,-2.5)。传输MVa的时候没有操作,传输MVb的时候,首先根据播放距离对MVa进行缩放,得到(3,-3),因为a和b相对于当前帧的距离比是3:1,所以MVa放大3倍,然后(1.5,-2.5)-(3,-3)得到(-1.5,0.5),传输这个(-1.5,0.5)作为MVb。(这操作是真滴离谱。这样能够减轻码流的压力吗????)
直接模式(Direct Mode)MVP
对于B slice的块来说,如果是direct mode,就不会传输MV。解码器会根据前面已编码的MV来计算list0和list1的MV,然后使用计算结果进行运动补偿。
这个direct mode分为spatial direct mode和temporal direct mode两种。
1. spatial
在同一个slice里前面已编码块的list0和list1的MV直接用作当前块的list0和list1的MV。
2. temporal
1)把list1参考帧里的co-located块的list0参考帧作为当前块的list0参考帧(假设list1与当前帧乡相距2,list0与当前帧相距3)
2)把list1参考帧里的co-located块的指向list0的MV记录下来(假设这个MV是(2.5,5))
3)依据当前帧和list1参考帧的距离,缩放MV,作为指向list1参考帧的MV((2.5,5)的2/5,得到(-1,-2))
4)依据当前帧和list0参考帧的距离,缩放MV,作为指向list0参考帧的MV((2.5,5)的3/5,得到(1.5,3))
加权预测
264有三种加权预测方式
1. P slice的显式加权
slice头里会写清楚权重是多少,curr_pixel = weight * ref_pixel
2. B slice的显示加权
slice头里会写清楚权重是多少,curr_pixel = weight_1 * ref1_pixel + weight_2 * ref2_pixel
3. B slice的隐式加权
weight_1和weight_2会根据与当前帧距离的远近分配权重
---------------------
吐槽一下两本教材对inter prediction的描述真没有265的教材写得清楚……我如果没有265和266的积累,应该很难看懂教材写的是什么……