在學習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】
【重要數據結構】
【率控分析】
【參數設定】
【多線程分析】