重叠块的运动补偿 Overlapped Block Motion Compensation (OBMC)
OBMC可以在CU级别通过采用语法元素进行开关。当JEM中使用OBMC时,对CU除去右侧和底部所有边界的运动补偿MC都使用OBMC,包括亮度及色度。JEM中,MC块对应一个编码块。当CU采用子CU模式编码(包括子CUmerge,affine以及FRUC模式),CU的每个子块都是一个MC块。为了统一处理CU的边界,当子CU块大小设为4x4时,OBMC对所有的子CU级别的MC块的边界均使用。
在当前子CU使用OBMC时,当前MV,四个相邻的子块的MV,如果可获取且与当前MV不完全相同,也会被用来获取当前子CU的预测块。这些基于多MV的多预测块结合起来,得到当前子CU最终的预测信号。
Pn为基于相邻子块MV得到的预测块,N为相邻上方,下方,左侧和右侧子块的索引,基于当前子块MV得到的预测块为Pc。当Pn是根据相邻子块的运动信息得到的,且此运动信息与当前子块运动信息相同,Pn中不使用OBMC。否则,Pn的每个样本均被加入到Pc的相同样本中。如,Pn的四行/列加到Pc上。Pn权重为{1/4, 1/8, 1/16, 1/32} ,Pc为 {3/4, 7/8, 15/16, 31/32}。预测为小MC块(当编码块的宽/高=4或者CU是子CU模式编码的),此时Pn的两行/列加入Pc。此时Pn权重 {1/4, 1/8},Pc为 {3/4, 7/8}。对于根据水平/垂直相邻子块得到的Pn而言,Pn相同列/行采用相同的权重增加到Pc上。
JEM中,对于亮度样本小于等于256的CU而言,CU级别一个标志位需要传输来表示OBMC是否使用。对于亮度样本大于256或者不是AMVP模式的CU,OBMC默认使用。编码端,当OBMC使用时,在运动估计层面考虑了其影响。OBMC使用上方和左侧相邻块的运动信息生成的预测信号被用于补偿当前CU上方和左侧边界的原始信号,然后进入运动估计过程。
OBMC技术在JEM中对应的主要函数为:
TComPrediction::subBlockOBMC()
此函数中主要调用了:
TComPrediction::xSubBlockMotionCompensation()
TComPrediction::xSubtractOBMC() || xSubblockOBMC()
前者通过调用xPredInterUni及xPredInterBi完成运动补偿。后者中,如果bOBMC4ME为true(传入参数,只有在predInterSearch中为true),此时需要在运动补偿中考虑OBMC,选择xSubtractOBMC;否则选择xSubblockOBMC,对当前块的预测器和通过当前块的相邻运动的预测器求平均,对Y、Cb、Cr分量均运行一次。