1. 程式人生 > >源碼分析系列(一)x264_main_dataflow

源碼分析系列(一)x264_main_dataflow

images 9.png 所有 malloc 控制 相關 .com 圖1 memory

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