?
?
?
相關說明:
1. 使用版本: x264-cvs-2004-05-11
2. 這次的分析基本上已經將代碼中最難理解的部分做了闡釋,對代碼的主線也做了剖析,如果這個主線理解了,就容易設置幾個區間,進行分工閱讀,將各個區間擊破了.
3. 需要學習的知識:
a) 編碼器的工作流程.
b) H.264的碼流結構,像x264_sps_t,x264_pps_t等參數的定義基本上都完全符合標準文檔中參數集的定義,抓住主要參數,次要參數也應該有所了解.
c) 數學知識,對dct變換等與數學相關的知識的編程實現要有較好理解.
d) C語言的知識.涉及到c語言的較多不經常用的特性,如函數指針數組,移位運算,結構體的嵌套定義等.
e) 耐心,對h.264的復雜性要有清醒的認識.
1. 進入x264.c中的main函數.
剛開始是讀取默認參數,如果你設置了參數的話會修改param的.
i_ret = Encode( ¶m, fin, fout );
這條語句使過程進入x264.c中的Encode函數.
2. X.264的encode函數.
A. i_frame_total = 0;
if( !fseek( fyuv, 0, SEEK_END ) )
???? {
??????? int64_t i_size = ftell( fyuv );
??????? fseek( fyuv, 0, SEEK_SET );
??????? i_frame_total = i_size / ( param->i_width * param->i_height * 3 / 2 )
}上面這段計算出輸入文件的總幀數.
B.????? h = x264_encoder_open( param )這個函數是對不正確的參數進行修改,并對各結構體參數和cabac編碼,預測等需要的參數進行初始化.
C.???? pic = x264_picture_new( h );
該函數定義在/CORE/common.c中.首先分給能容納sizeof(x264_picture_t)字節數的空間,然后進行初始化.
????? 這里看一下x264_picture_t和x264_frame_t的區別.前者是說明一個視頻序列中每幀的特點.后者存放每幀實際的象素值.注意區分.
D.???? for( i_frame = 0, i_file = 0; i_ctrl_c == 0 ; i_frame++ )
??? {
??????? int???????? i_nal;
??????? x264_nal_t *nal;
int ????????i;
/* read a frame */
??????? if( fread( pic->plane[0], 1, param->i_width * param->i_height, fyuv ) <= 0 ||
??????????? fread( pic->plane[1], 1, param->i_width * param->i_height / 4, fyuv ) <= 0 ||
??????????? fread( pic->plane[2], 1, param->i_width * param->i_height / 4, fyuv ) <= 0 )
??????? {
??????????? break;
??????? }
??? //文件位置指示器自己變化了.
??????? if( x264_encoder_encode( h, &nal, &i_nal, pic ) < 0 )
??????? {
??????????? fprintf( stderr, "x264_encoder_encode failed/n" );
??????? }
??????? ……
}
凡是出現for循環的地方都應該認真對待,這是我的一個體會,也是進入分層結構認真分析的好方法.
fread()函數一次讀入一幀,分亮度和色度分別讀取.這里要看到c語言中的File文件有一個文件位置指示器,調用fread()函數會使文件指示器自動移位,這就是一幀一幀讀取的實現過程.