JM8.6中encode_one_macroblock函數的運作流程[宏塊代價函數的使用或幀間幀內模式選擇流程]
在JM中最重要, 最核心的一個函數就是encode_one_macroblock, 這個函數是整個編碼器的核心, 其實, 通過讀源碼,可以發現, encode_one_macroblock中的大部分工作是在進行模式的選擇, 下面我們跟著代碼走一下, 看看具體的流程: (我們假設幀間幀內同時都允許)
1. 幀間三種幀間宏塊級模式( 16×16, 16×8,8×16) 迴圈, 進行擇優
同時將min_cost初始化為最大值, 將best_mode初始化為1(16x16)
1.1. 對三種模式下的每一個塊進行計算最佳代價
16*16 分割方式只需要計算一次,16*8 和8*16 分割方式需要計算兩次
1.1.1 運動搜尋
在函數PartitionMotionSearch中對模式mode進行運動搜尋, 在搜尋中利用MV_COST計算搜尋代價, 得到該模式下的最優代價儲存在motion_cost中及最佳MV儲存在 img->all_mv中.
其中也包含對非RDO 方式下P 幀SKIP 模式的擇優
1.1.2 參考幀擇優
在計算時利用代價函數REF _COST得到參考幀代價, 並且加上對應模式下對應參考幀的搜尋代價, 總起來作為代價進行參考幀的選擇(在利用REF_COST時根據是否是RDO進行區分,如果使用的是RDO方式, 則選擇該方式下的最優參考幀.
另外對於B幀的情況要考慮後向參考和雙向參考的情況.
對於P幀的情況,也就是前向參考的情況
只將前向參考代價加入到cost中, cost是以整個宏塊的所有代價和
1.2 根據一整個宏塊的代價選擇出最優的代價
2. 幀間亞宏塊模式( P8x8 模式:8x8,8x4,4x8,4x4)迴圈,進行擇優
對於一個整宏塊是分為4個8x8塊, 然後每個8x8塊進行P8x8模式的選擇
進行P8x8選擇時, 先初始化min_cost8x8(非RDO)為最大, min_rdcost(RDO)為最大
2. 1 運動搜尋,
與宏塊級類似
代價函數用MV _ COST (包含對非RDO 方式下P 幀SKIP 模式的擇優) ;
step2. 2 參考幀擇優, 代價函數用 REF _COST ;
step2. 3 塊模式擇優, 代價函數用 MODE _COST ;
step2. 4 對於非RDO 方式,將step2. 3 的擇優結果與step1 中的最佳大模式進行比較決策,選出最優
模式。
step3 所有模式擇優
step3. 1 RDO 方式下,對三種幀間大塊模式、 最佳P8 模式、 兩種幀內預測模式以及SKIP、 DIRECT
模式進行RDO 模式代價MODE _ COST 的比較擇優:
step3. 1. 1 四種色度塊幀內預測模式迴圈;
step3. 1. 2 設定運動預測和參考幀模式;
step3. 1. 3 計算七種模式的 RDO 模式代價MODE_ COST ,進行比較決策。
step3. 2 非RDO 方式下,將step2 的擇優結果與DIRECT 模式、 幀內預測模式進行比較擇優:
step3. 2. 1 獲得DIRECT 模式下的代價MODE_ COST ,進行比較擇優;
step3. 2. 2 進行4×4 和16×16 的幀內預測, 用MODE_ COST 對預測模式擇優。