x264程式框架流程分析

2021-06-09 21:12:29 字數 3156 閱讀 3522

1、x264程式框架流程分析

(1) 進入x264.c 的int main( int argc, char **argv ) 函式

main 函式中主要有以下三個主要的步驟,分別呼叫了3個函式。

第一步、對編碼器進行引數設定。函式實現如下:

x264_param_default(x264_param_t *param );此函式在common.c中定義,完成乙個x264_param_t 結構體的初始化。

第二步、分析引數,讀入執行引數完成檔案開啟。函式實現如下:

parse( argc, argv,x264_param_t *param, &opt );此函式在 x264.c 中定義。

vc的執行引數我們可以設定: 「-o out.264 football.yuv 352x288」

則具體到parse函式,其輸入的引數 argc == 5 ,這個數值大小等於要放下下面的 argv所需要的二維陣列的行數。引數argc和argv在進入main 函式之前就已經確定了。

argv 為字串char **的型別的,相當於乙個二維陣列,其具體內容如下:

argv[0] == 「f:\x264-snapshot-20070331-2245\build\win32\bin\x264.exe」

argv[1] == 「-o」

argv[2] == 「out.264」

argv[3] == 「football.yuv」

argv[4] == 「352x288」

第三步、開始編碼。函式實現如下:

encode(x264_param_t *param, &opt ); 此函式在 x264.c 中定義。

(2) static int parse( int argc, char **argv, x264_param_t *param, cli_opt_t *opt )

分析引數,讀入執行引數。

其中比較重要的語句是

int c = getopt_long( argc, argv, "8a:b:b:f:hi:i:m:o:p:q:r:t:vvw",

long_options, &long_options_index);

getopt_long()解析入口位址的向量,最後int c 得到的是 執行引數(「-o out.264 football.yuv 352x288」)中前面「-o」中「o」的ascii值 即 c = 111 。這個getopt_long函式的實現在官方**上下的程式中沒有實現,需要自己來寫。

parse 在解析了入口位址後,用下面的語句開啟檔案

p_open_infile( psz_filename, &opt->hin, param )

yuv_input_t *h = malloc(sizeof(yuv_input_t));

h->width = p_param->i_width;

h->height = p_param->i_height;

h->next_frame = 0;

if( !strcmp(psz_filename, "-") )

h->fh = stdin;

else

h->fh =fopen(psz_filename, "rb");

if( h->fh == null )

return -1;

*p_handle = (hnd_t)h;

return 0;

這樣就在下面encode函式中一開始,得到總的編碼幀數,呼叫這個函式

int get_frame_total_yuv( hnd_t handle )

yuv_input_t *h = handle;

int i_frame_total = 0;

if( !fseek( h->fh, 0, seek_end ) )

uint64_t i_size = ftell( h->fh );//得到檔案的大小。

fseek( h->fh, 0, seek_set );

i_frame_total = (int)(i_size / ( h->width * h->height * 3 / 2 ));

//計算總的幀數

/// 這裡乘以1.5是因為乙個編碼單位是乙個亮度塊加2個色度塊,大小上等於1.5個亮度塊

return i_frame_total;

(3) static int encode( x264_param_t *param, cli_opt_t *opt )

前面都是讀取預設引數,如果設定了引數的話,可以修改 param的。編碼的主要部分還是在這個函式裡面進行呼叫。

encode 函式主要分為以下幾步:

第一步、讀取輸入檔案的總幀數,存放在 param->i_frame_total。

第二步、呼叫 h = x264_encoder_open( param ) 函式對不正確的264_t結構體(h的型別是264_t * )引數進行修改,並對各結構體引數、編碼、**等需要的引數進行初始化。

第三步、構造乙個影象幀的初始化空間。

x264_picture_alloc( &pic, x264_csp_i420, param->i_width, param->i_height );

第四步、利用下面乙個for迴圈,開始一幀一幀進行編碼。

for( i_frame = 0, i_file = 0, i_progress = 0;

b_ctrl_c == 0 && (i_frame < i_frame_total || i_frame_total == 0); )

在這個for迴圈中,

讀取 p_read_frame( &pic, opt->hin, i_frame + opt->i_seek )

編碼並儲存 i_file += encode_frame( h, opt->hout, &pic );

(4) static int encode_frame( x264_t *h, hnd_t hout, x264_picture_t *pic )

這個函式主要是呼叫了 x264_encoder_encode( h, &nal, &i_nal, pic, &pic_out ) 來實現編碼。這個函式也是x264的核心部分了

x264原始碼分析 overscan

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

x264大致編碼流程

只寫了主要函式的功能大概是什麼,詳細 還需要自己細看研究。x264中主要的函式呼叫關係如下 main main internal main internal 呼叫parse 函式解析輸入的引數,呼叫encode 函式編碼 parse 函式呼叫以下函式 encode 函式呼叫以下函式 x264 enc...

x264使用示例

note x264的編碼示例.使用x264的版本為libx264 115 1.示例是個死迴圈,會源源不斷的編碼,然後將資料寫檔案.2.示例的行為是 編碼1000幀後,取空編碼緩衝區,然後迴圈執行這兩步.author 戈 include include include include stdint.h...