源碼分析系列(一)x264_main_dataflow
http://www.cnblogs.com/xkfz007/articles/2616153.html
幀內幀間編碼部分關鍵函數
1.1 x264_encoder_open (x264_param_t *param )
功能
分配編碼器所需結構體。
檢測參數有效性。
初始化sps和pps。
分配編碼器所需memory空間,包括參考幀和緩沖幀。
初始化macroblock cache相應空間。
分配編碼器所需memory空間,包括參考幀和緩沖幀。
根據cpu類型,初始化各指令集加速函數。
輸入項目
x264_param_t *param
輸出項目
x264_t *h
存儲分配
x264_t *h = x264_malloc( sizeof( x264_t ) );
h->out.p_bitstream = x264_malloc( h->out.i_bitstream );
h->frames.unused[i] = x264_frame_new( h );
h->frames.reference[i] = x264_frame_new( h );
x264_ratecontrol_new( h ) ;
1.2 x264_encoder_encode(x264_t *h, x264_nal_t **pp_nal, int *pi_nal, x264_picture_t *pic)
功能
處理編碼幀隊列,並設置編碼幀類型。
初始化參考列表、碼率控制等相關信息。
根據編碼信息,寫sps、pps位流。
調用int x264_slices_write( x264_t *h )函數編碼一幀。
更新碼率控制、噪聲抑制等參數。
輸入項目
x264_t *h
x264_nal_t **pp_nal
int *pi_nal
x264_picture_t *pic
輸出項目
Log文件等。
程序邏輯
如附圖1所示。
附圖1: x264_encoder_encode流程圖
1.3 x264_slice_write(x264_t *h, int i_nal_type, int i_nal_ref_idc)
功能
調用x264_slice_header_write函數向碼流寫入slice header
Load宏塊到cache
宏塊分析
宏塊編碼
宏塊寫cavlc/cabac
保存宏塊到cache
輸入項目
x264_t *h
int i_nal_type
int i_nal_ref_idc
程序邏輯
如附圖2所示:
附圖2: x264_slice_write流程圖
1.4 x264_macroblock_analyse(x264_t *h )
功能
初始化;
對於I Slice,遍歷所有16x16和4x4預測模式,得到最小Cost所對應的分塊方式和預測模式;
對於P Slice,如果宏塊周圍有Skip模式的宏塊,檢測當前塊是否是Skip塊,如果不是Skip塊,遍歷所有可能的塊劃分模式,對每種模式進行運動估計並計算Cost,計算intra對應的16x16和4x4的Cost(包括色度),比較所有的Cost,選最小的Cost對應的模式為最終模式。
輸入項目
x264_t *h
程序邏輯
如附圖3所示:
附圖3: x264_macroblock_analyse流程圖
1.5 x264_macroblock_encode(x264_t *h )
功能
DCT;
量化;
Zigzag;
反量化;
運動補償;
得到殘差的dct域coff。
輸入項目
x264_t *h
程序邏輯
如附圖4所示:
附圖4:x264_macroblock_encode流程圖
運動補償x264_mb_mc( x264_t *h )的大體流程,如附圖5所示:
附圖5: x264_mb_mc流程圖
分類: X264
源碼分析系列(一)x264_main_dataflow