HEVC代码学习18:运动估计和运动补偿总结

经过了这段时间对帧间预测部分代码的学习,算是大体上了解了其工作原理。只看理论不看代码,体会不深刻,在看了代码后,有了一种恍然大悟的感觉,很多算法实现和看原理时理解的不一样。下面来整理一下之前写的博客,总结一下运动估计和运动补偿具体的代码实现思路,主要谈一下代码处理的思路,

运动估计

运动估计实际就是当前块在参考图像中搜索找到匹配块的处理过程。在实际代码中入口函数是xMotionEstimation,然后分为整像素搜索xPatternSearchxPatternSearchFast和亚像素搜索xPatternSearchFracDIF
详见http://blog.csdn.net/lin453701006/article/details/70860150。

整体思路:整像素搜索后会得到一个整像素单位的最优MV,这个MV值作为新的起始点进行亚像素搜索。亚像素搜索中先后又进行了1/2像素搜索,找到1/2像素单位的最优MV作为起始点,进行1/4像素搜索,最终得到了1/4像素单位的最优MV。最终得到的有用数据是1/4像素单位的MV和对应的参考帧索引。

在搜索中,由于亚像素位置是没有值的,因此就需要对参考图像进行插值,得到了整像素、1/2、1/4像素位置的图像,存放在了m_filteredBlock[4][4]中。
详见http://blog.csdn.net/lin453701006/article/details/73188458

整个搜索过程是个逐步找最优的过程。

整像素搜索的入口函数是xPatternSearchxPatternSearchFastxPatternSearch进行的是全局搜索,xPatternSearchFast进行的是快速算法,一般情况下使用的是xPatternSearchFast
详见http://blog.csdn.net/lin453701006/article/details/70860150
xPatternSearchFast将会使用TZ search,进行菱形搜素搜索,得到一个最优的整像素MV。
详见http://blog.csdn.net/lin453701006/article/details/77089786

亚像素搜索的入口函数是xPatternSearchFracDIF,可以分为插值和搜索两个部分。插值分为1/2像素插值xExtDIFUpSamplingH和1/4像素插值xExtDIFUpSamplingQ,使用插值滤波器得到亚像素位置的参考块。xPatternRefinement是在以前一步得到的最优MV指向的像素为中心的3x3的像素块中,搜索计算RD cost,找最优匹配块,进一步计算最优MV。
详见http://blog.csdn.net/lin453701006/article/details/70156817。

运动补偿

在运动估计之后,得到的是MV和参考帧索引,运动补偿就是通过这些信息来构造预测图像,实际代码中,运动补偿主要进行亚像素位置插值补偿,生成预测图像。运动补偿的入口函数为motionCompensation,其中分为单向预测xPredInterUni、双向预测xPredInterBi和加权预测xWeightedPredictionUnixWeightedPredictionBi
详见http://blog.csdn.net/lin453701006/article/details/72677630。

你可能感兴趣的:(HEVC,HM,HEVC代码学习)