H264運動搜尋和模式選擇主要在函數x264_macroblock_analyse() 中執行。這個函數執行對一個宏塊的分析,确定一個宏塊的編碼模式和運動矢量。這個函數占到了編碼時間的60%以上。
這個函數的主要流程如下:(引用自雷宵骅的部落格)
(1)如果目前是I Slice,調用x264_mb_analyse_intra()進行Intra宏塊的幀内預測模式分析。
(2)如果目前是P Slice,則進行下面流程的分析:
a)調用x264_macroblock_probe_pskip()分析是否為Skip宏塊,如果是的話則不再進行下面分析。
b)調用x264_mb_analyse_inter_p16x16()分析P16x16幀間預測的代價。
c)調用x264_mb_analyse_inter_p8x8()分析P8x8幀間預測的代價。
d)如果P8x8代價值小于P16x16,則依次對4個8x8的子宏塊分割進行判斷:
i.調用x264_mb_analyse_inter_p4x4()分析P4x4幀間預測的代價。
ii.如果P4x4代價值小于P8x8,則調用 x264_mb_analyse_inter_p8x4()和x264_mb_analyse_inter_p4x8()分析P8x4和P4x8幀間預測的代價。
e)如果P8x8代價值小于P16x16,調用x264_mb_analyse_inter_p16x8()和x264_mb_analyse_inter_p8x16()分析P16x8和P8x16幀間預測的代價。
f)此外還要調用x264_mb_analyse_intra(),檢查目前宏塊作為Intra宏塊編碼的代價是否小于作為P宏塊編碼的代價(P Slice中也允許有Intra宏塊)。
(3)如果目前是B Slice,則進行和P Slice類似的處理。
我們提取P幀時的流程,用流程圖歸納它的主要算法:
流程中一些部分是由參數i_mbrd控制開或者關,這裡隐去這些細節。
一些不太重要的流程也被隐去。

圖一 宏塊分析流程