英语水平有限,基础知识也欠缺太多,翻译的不是很好,只是在看论文的时候随手记的一些东西,红色部分就是我自己存在疑问的地方,我看论文的时候随手从论文中截了一些图,但是复制粘贴不进来,少图的地方大家就自己去论文中找吧,麻烦了!如果能有大神看到的话敬请赐教,提前奉上我的膝盖!
1. PB partitioning
和帧内预测的CBs,在帧间预测图像中,HEVC支持更多的PB分割形状:
其中M/2xM/2只允许应用在最小的CB上,如果应用在大一点的CB上,有可能会把CB和PB混淆。第二行的四种模式是asymmetricmotion partitions
2. Fractional sample interpolation
帧间预测的CB上的samples是由他的参考图像上对应的块区域得到的。他的reference sample由reference picture index和motion vector表示,其中motionvector有竖直分量和水平分量表示。当motion vector指向的不是整数像素位置时,就要用到fractional sample interpolation。精确度支持到色度sample之间距离的四分之一。对于色度像素,motion vector的精确度取决于色度像素的格式,对于4:2:0模式,精确度是色度sample之间距离的八分之一(但是色度sample之间的距离是比亮度的要大的注意这一点)。
亮度sample的Fractionalsample interpolation应用可分离的八抽头滤波器(half-sample位置)和七抽头的滤波器(quarter-sample位置)。对比看x264中,应用的是two-stage插值过程,首先用六抽头的滤波器在相邻的一个或两个half-sample的位置生成一些中间值,对得到的这个中间值进行rounding,然后对中间值和整数像素点上的值求平均值。在HEVC中用了一个one-stage插值过程生成了所有的分像素位置的值,并不需要中间的rounding的过程,这样一来提高的精确度,简化了分像素差值的结构。差值的精确程度的提高还体现在使用的longer filter,七抽头和把抽头代替了X264中的六抽头。在quarter-sample的位置的插值使用七抽头已经足够,因为quarter-sample位置距离integer-sample更近,如果选用八抽头插值器的话,选用的左右两边integer-sample的位置到需要计算的quarter-sample位置的距离相差太多,这样一来反而影响了精确度,而且其中最远的像素点也比在计算half-sample位置插值时的最远像素点要远一些,会导致不同位置的精确度不一样。实际上,滤波器各抽头的权值部分是由DCT急函数方程推得的。
插值过程:
其中B是参考sample的比特深度,通常B=8,当B>8时,计算出的插值右移,把它缩小到8 bit之内。其他位置的计算如下:
系数:
当B=8时,插值滤波器是可以分离的,相同的值可以通过先水平滤波再垂直滤波得到,正确实现后HEVC的运动补偿过程可以只占用16 bit的内存单元。
Encoder可以选择在该过程中应用加权预测。X264中既有temporally-implicit也有temporally-explicit加权预测,在HEVC中只有explicit加权预测,通过用encoder发送(explicitly)加权系数对预测值进行scaling和offsetting。然后要再对预测值进行处理,使预测值的比特深度适应于referencesample的原始比特深度。(在前面的公式里可以看出,当referencesample的比特深度超过8时,是对插值结果进行了右移处理,将其比特深度约束到了8)在uni-prediction的时候,插值预测值通过rounded、右移、clipped处理,最终适应于原始比特深度。在bi-prediction中,两个PB的差值预测值先相加,在进行rounded、右移、clipped。有两个reference picture,所以得到两个预测值。
加权预测是一种用来修正slice中的运动补偿预测像素的方法。每一个预测像素在运动补偿之前都要通过加权系数进行修正(scaling和offsetting)上文中说的implicit类型是指,这个加权系数是由相应的list 0和list 1中参考图像的时域位置推出的。不过无所谓,HEVC中只有explicit类型,就是直接把系数发送过去。
在264中,最终得到一个prediction sample(quarter-sample位置)需要三个rounding操作。当使用bi-prediction的时候,最多一共要进行七次rounding操作,其中包括对intermediateresult进行一次,得到的prediction value一次,还原成original bit depth一次,(双向就要七次了,averageing也是一次)在HEVC中,得到一个quarter-sample位置的最终预测值最多需要两次的rounding操作,省去了对intermediate result的rounding处理,双向的情况最多需要五次rounding。通常情况下B=8,这样一来,在计算差值的过程中就减少了一次右移(>>B-8),这样一来就将最多的rounding操作减少到了三次,减少了叠加的误差,在解码器端所需进行的操作也更加灵活。
色度sample的Fractional sample interpolation和亮度分量的类似,只是滤波器抽头变成了4,并且精确度变为1/8(4:2:0格式下),然而在264中色度分量只使用两抽头滤波器。在eighth-sample的位置HEVC定义的四抽头滤波器的系数如下:
上表中的filter1、2、3、4分别用于插值1/8,2/8, 3/8, 4/8。对于5/8, 6/8, 7/8位置,使用镜像对称的系数filter3[1-i]、filter2[1-i]、filter[1-i]。
1. merge mode
运动信息通常包括水平和垂直的运动向量位移值、一或两个参考图像indices,当B slice中,还包括每一个index来源于哪个参考图像列表。HEVC中有一种mergemode,这种mode下,由空域或时域相邻block生成当前block的运动信息。之所以将其称为merge mode是因为应用这种模式会导致一些block共享全部的运动信息形成一些合并区域。
Merge mode理论上和264中的direct andskip mode类似,但是有两点不同。第一点,它从几个有效的candidate中选择一个作为最终用于生成运动信息的参考块儿,并发送该candidate的index信息,称为运动向量竞争模式。它还明确地指明了参考图像列表和参考图像index。在264中的direct mode是假定了一些预设值
Merge mode中的candidate包括了几个空域相邻的candidate,一个时域相邻的candidate和几个generated candidate。五个空域的candidate位置如下:
注意,图中的candidate和当前的预测块大小差这么多是由于分割深度不同,但是都是在PU level上进行的。
在选取最终使用的candidate之前,要检查这几个candidate的有效性,检查顺序是{a1,b1,b0,a0,b2}({左,上,右上,左下,左上})。如果candidate所在位置的block是要进行帧内编码的或者这个位置是在当前slice或tile之外的,那么该candidate就是无效的。
验证完空域candidates的有效性还要移除两种redundancy。如果当前预测PU的一个candidate位于当前CU的第一个PU的位置,要移除这个candidate,因为如果CU不分割成PU也可以得到相同的merge。我理解的意思就是merge region不要完全覆盖在一个完整的CU上,这样就分不清到底是CU还是merge region了。 除此之外,拥有相同运动信息的candidate也会被移除。
对于时域candidate,找到referencepicture中与当前预测PU对应的PU,检查他的右下位置的block是否有效,如果有效就选用这个作为时域candidate,否则使用中央位置的block代替。选择对应参考图像和对应PU的方式和之前的标准相同,但是HEVC在传输参考图像所在list的index时更加灵活。
使用时域candidate时面临的一个问题是内存问题,存储参考图像的运动信息要占用大量内存。这个问题通过限制间隔尺寸来解决,把时域motion candidate存储到16x16的亮度grid中,即使在参考图像的对应位置的PB尺寸小于16。(这样为什么就解决了memory的问题?)。除此之外,在PPS参数集中有一个flag控制着是否使用时域candidate,这对于容易出错的传输环境下的应用是很有用的。
在slice header中指定了merge candidate的最大数量C。如果找到的merge candidate的数目超过了C,所以只保留C-1个空域candidates和一个时域candidate。如果merge candidate的数目小于C,要再生成一些candidate补上。这样简化了解析过程,增强了robust,因为解析已编码数据的能力和mergecandidate的有效性是独立的。
对于B slice,additionalmerge candidates是按照针对list 0和list 1给出的预定次序从现有的candidate中选取。例如,list 0的第一个generated candidate使用第一个merge candidate,list 1的第一个generated candidate使用第二个merge candidate。HEVC一共指定了12个预设的candidates对儿,分别应用于list 0和list 1,这些预设对儿是(0, 1), (1, 0), (0, 2), (2, 0), (1, 2), (2, 1), (0, 3), (3, 0), (1,3), (3, 1), (2, 3) 和(3, 2)。在remove redundancy之后,会从他们当中最多选取五对candidates。(这些additional merge candidates指的是combined bi-predictive candidates,既不是spatial也不是temporal,是基于前面已经生成的spatial和temporal candidates生成的)
对于P slice,或者B slice从上述的candidate对儿中已经选了五对之后还是不到C个candidates,用reference indices相关的zero motion vector(从0到参考图像总数减一)填满merge candidate list中的剩余位置。
在HEVC中,skip mode就是merge mode的一种特殊情况,当所有的codedblock flags都为0时,就是skip mode。在skip mode下,只传输一个skip flag和对应的merge index发送给 decoder。通常情况下从merge mode生成的candidate中得到预测motion information,然后在对其进行残差编码。而skip mode是直接将candidate的motion information拿来用。
2. Motion vector prediction for non-merge mode
问题:什么样的用merge mode,什么样的用non-merge mode?
我的理解是在merge mode中生成了一个merge candidate list(检查有效性、remove redundancy),在skip mode下,直接从这个candidate list里面选一个candidate,直接使用他的运动参数;
在non-merge mode下,也生成一个motion vectorcandidate list,这个list的生成跟上面的merge candidate的生成过程有类似之处。现在不明白的是在生成这两个list之后两种模式的编码方式有什么不同。
当帧间编码的CB既不用skip mode也不用merge mode时,motionvector使用一个motion vector predictor进行编码。和merge mode类似,HEVC允许encoder从几个predictor candidate中选择一个,编码predictor和实际的motion vector之差,和candidate的index一起发送给解码器。
前面给出过一个spatial candidate position的图(fig 8),对于非merge mode的预测块,只从这五个candidate中选择两个。第一个空域motion candidate从左侧选{a0,a1},第二个candidate从上边选{b0,b1,b2},要按照这两个指定的顺序,依据candidate的有效性进行选择。
HEVC在non-merge mode的motion vector预测过程中使用了更少的candidates,因为encoder会编码发送残差来修正motion vector。而且,encoder还需要进行运动估计,运动估计是encode中计算成本最大的行为之一,使用较少的candidates也可以减小它的运算复杂度。
当相邻PU的参考index不等于当前PU的参考index,也就是说当前PU和相邻PU的参考图像不是同一个时,使用一个scaled motion vector。根据当前图像和参考图像的时域距离对相邻PU的motion vector进行scale,这个参考图像有两个,分别是相邻PU的reference index所指的图像和当前PU的reference index所指的图像。当两个空域candidates有相同的motion vector分量时,就去掉其中一个。
如果motion vector predictors的数量不够两个,并且并没有明确地禁止使用temporal MV预测,这时temporal MV prediction candidate也可以包括在predictors中。这种情况下,当存在两个有效的空域candidate时就不使用时域candidate。为了确保motion vector predictor达到两个,最后还可以用zeromotion vector来填补。因此在non-merge mode下只需要一个coded flag来指明使用哪一个motion vector。