經過了這段時間對幀間預測部分代碼的學習,算是大體上了解了其工作原理。只看理論不看代碼,體會不深刻,在看了代碼後,有了一種恍然大悟的感覺,很多算法實現和看原理時理解的不一樣。下面來整理一下之前寫的博客,總結一下運動估計和運動補償具體的代碼實現思路,主要談一下代碼處理的思路,
運動估計
運動估計實際就是當前塊在參考圖像中搜索找到匹配塊的處理過程。在實際代碼中入口函數是xMotionEstimation
,然後分爲整像素搜索xPatternSearch
,xPatternSearchFast
和亞像素搜索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
整個搜索過程是個逐步找最優的過程。
整像素搜索的入口函數是xPatternSearch
和xPatternSearchFast
。xPatternSearch
進行的是全局搜索,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
和加權預測xWeightedPredictionUni
,xWeightedPredictionBi
。
詳見http://blog.csdn.net/lin453701006/article/details/72677630。