x264原始碼的小小分析

2021-09-30 10:22:29 字數 1577 閱讀 7833

在學習x264

過程中的一些筆記、參考啦大量書上網上的資料、非常感謝就不一一枚舉啦

:):)

原始碼有的來自最新用git拿到的x264最新原始碼、有的來自有windowsvs工程的老版本(網上有很多中文分析)

【幀級編碼】

main->encode->encode_frame->x264_encoder_encode

【待編碼幀管理】

gop順序:調整b幀-i幀p幀順序(如有b幀)

unused(記憶體塊**池)/next(未處理過將要被處理的幀、處理後放入curerent)/current(已處理過即將被編碼的幀)

從unused拿乙個記憶體塊->fenc

pic_in拷貝到fenc,對fenc進行大小調整(16的整數倍),處理後的fenc放入next

(如果有b幀)調整調整b幀-i幀p幀順序、放進current;(如果沒有b幀)直接從next中取一幀放進current

再從current中拿出一幀到fenc並開始編碼 。

【參考幀管理】

參考幀都是已編碼幀的重構幀;(幾乎)每乙個已編碼幀都會被重構-放進參考幀佇列(除非已知該幀不用作參考)

參考幀佇列:x264_t.reference,x264_t.fref0/fref1

整理上述參考幀佇列:x264_reference_build_list,  x264_reference_update

【片級編碼】

x264_slice_write

【x264_slice_write】

【巨集塊級編碼】

x264_macroblock_analyse    x264_macroblock_encode

【x264_macroblock_analyse】

//處理slice_type_i

if( h->sh.i_type == slice_type_i )

//幀內分析

x264_mb_analyse_intra(h, &analysis, cost_max );

//處理slice_type_p

else

if( h->sh.i_type ==slice_type_p )

//先判別是否p_skip

b_skip =x264_macroblock_probe_pskip( h );

//如果是否p_skip

if( b_skip )

h->mb.i_type = p_skip;

h->mb.i_partition= d_16x16;

//如果不是否p_skip

else

//幀間分析

x264_mb_analyse_inter_p16x16( h, &analysis );

【x264_macroblock_encode】

【重要資料結構】

【率控分析】

【引數設定】

【多執行緒分析】

x264原始碼分析 overscan

引數解析 opt overscan b error parse enum value,x264 overscan names,p vui.i overscan 引數含義 影象在放大的時候邊緣容易變形,overscan,可以將變形的邊界顯示到視窗外面,讓 的人看起來是畫面放大後是正常的。sps vui...

x264原始碼分析 chromaloc引數

引數含義 設定色度取樣位置。引數解析 opt chromaloc 值從0到5。參考 a blob f doc vui.txt 建議 如果正確的從 mpeg1 比如 vcd 的 4 2 0 格式二次取樣轉碼,且不做任何色彩空間轉換,應該設為1。如果正確的從 mpeg2 比如 的 4 2 0 格式二次取...

x264原始碼分析 引數intra refresh

引數含義 intra refresh 是否要把i幀平攤到多個p幀的intra 巨集塊中傳輸。意思就是除了第乙個idr,後面都沒有idr 然後每個p幀中有幾列是幀內參考的,乙個gop內所有的幀內參考組合起來就是乙個完整的幀。引數解析 opt intra refresh p b intra refres...