經(jīng)過(guò)一段時(shí)間的學(xué)習我對h264也有了一個(gè)初步的大體的了解,今天在這里說(shuō)一下h264中x264的開(kāi)源code的編碼的解析并附一張我自己畫(huà)的流程圖便于大家理解,又不對的地方清大家指教一二,偶必定三顧茅廬尋得真理。:)
首先我們進(jìn)入x264.c中的main函數.
剛開(kāi)始是讀取默認參數,如果你設置了參數的話(huà)會(huì )修改param的.
i_ret = Encode( ¶m, fin, fout );
這條語(yǔ)句使過(guò)程進(jìn)入x264.c中的Encode函數.(這個(gè)函數就是x264的編碼程序)
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 )
}
這段調用了fseek()函數,對輸入的視頻文件計算其總幀數。
B. 函數h = x264_encoder_open( param)對不正確的參數進(jìn)行修改,并對各結構體參數和cabac編碼,預測等需要的參數進(jìn)行初始化.然后才能進(jìn)行下一步的編碼。
C. 函數 pic = x264_picture_new( h );定義在\CORE\common.c中.
此函數的作用是分給能容納sizeof(x264_picture_t)字節數的空間,然后進(jìn)行初始化.
這里說(shuō)明一下x264_picture_t和x264_frame_t的區別.前者是說(shuō)明一個(gè)視頻序列中每幀的特點(diǎn).后者存放每幀實(shí)際的象素值.
D. 調用fread()函數一次讀入一幀,分亮度和色度分別讀取.這里要看到c語(yǔ)言中的File文件有一個(gè)文件位置指示器,調用fread()函數會(huì )使文件指示器自動(dòng)移位,這就是一幀一幀讀取的實(shí)現過(guò)程.
for( i_frame = 0, i_file = 0; i_ctrl_c == 0 ; i_frame++ )
{
int i_nal;
x264_nal_t *nal;
int i;
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;
}這里文件已經(jīng)指示器發(fā)生了位移
if( x264_encoder_encode( h, &nal,&i_nal, pic ) < 0 )
{
fprintf( stderr, “x264_encoder_encode failed\n” );