欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
x264開(kāi)源編碼-供初學(xué)參考???(轉)
經(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( &param, 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” );
       }
       ……
       }

E    進(jìn)入x264_encoder_encode( h, &nal,&i_nal, pic )函數,該函數定義在/Enc/encoder.c中.

         函數中先定義了如下三個(gè)參數:
               int    i_nal_type;   nal存放的數據類(lèi)型,可以是sps,pps等多種.                  
               int    i_nal_ref_idc;  nal的優(yōu)先級,nal重要性的標志位.
               int    i_slice_type;  slice的類(lèi)型的 

        這里先說(shuō)明一下:我們假設一個(gè)視頻序列如下:
                  I  B   P
         我們編碼是按I  B的順序,這就是frame的編號
        但是編碼器如何來(lái)區分他們并把他們重新排序呢?

        我們來(lái)看看編碼器是如何區分讀入的一幀是I幀,P幀,或者B幀?

        以I   B   P  B   P為例.
 
       if( h->i_frame % (h->param.i_iframe *h->param.i_idrframe) == 0 ){
                確定這是立即刷新片.
         }
          if( h->param.i_bframe > 0)//判斷h是否為B幀然后對其進(jìn)行下一步操作.
         我們編完I幀后碰到了一個(gè)B幀,這時(shí)我們先不對它進(jìn)編碼.而是采用frame=        x264_encoder_frame_put_from_picture( h,h->frame_next, pic)函數將這個(gè)B幀放進(jìn)h->frame_next中.
          在h中同時(shí)定義了下面幾個(gè)幀數組用以實(shí)現幀的管理.
             x264_frame_t  *bframe_current[X264_BFRAME_MAX];
              x264_frame_t   *frame_next[X264_BFRAME_MAX+1];  //這個(gè)是定義下一個(gè)幀,但不一定是B幀.
            x264_frame_t   *frame_unused[X264_BFRAME_MAX+1];

        同時(shí)還有下面4個(gè)函數(定義在\ENCODER\encoder.c中).
             x264_encoder_frame_put_from_picture();
             x264_encoder_frame_put() ();
             x264_encoder_frame_get();
             x264_frame_copy_picture();
        這3個(gè)數組和4個(gè)函數可以說(shuō)完成了整個(gè)幀的類(lèi)型的判定問(wèn)題.在不對P幀進(jìn)行編碼之前,我們不對B幀進(jìn)行編碼,只是把B幀放進(jìn)緩沖區(就是前面提到的數組).
        例如視頻序列:I  P
先確立第一個(gè)幀的類(lèi)型,然后進(jìn)行編碼.然后是2個(gè)B幀,我們把它放進(jìn)緩沖區數組.然后是P幀,我們可以判定它的類(lèi)型并進(jìn)行編碼.同時(shí),我們將緩沖區的B幀放進(jìn)h->bframe_current[i],不過(guò)這時(shí)P幀前的兩個(gè)B幀并沒(méi)有編碼.當讀到P幀后面的第一個(gè)B幀時(shí),我們實(shí)際上才將h->bframe_current數組中的第一個(gè)B幀編碼,也就是將在I幀后面的第一個(gè)B幀編碼.依此類(lèi)推.(幀的有關(guān)理解學(xué)習筆記(二)

F   建立參考幀列表的操作,這里調用了函數x264_reference_build_list( h,h->fdec->i_poc );(定義在\ENCODER\encoder.c中).
       光調用這個(gè)函數是不行的,它是和后面的這個(gè)函數(如下)一起配合工作的.
                      if( i_nal_ref_idc != NAL_PRIORITY_DISPOSABLE )//判斷為B幀.
                      {
                       x264_reference_update( h );
                       }
       If條件是判斷當前幀是否是B幀,如果是的話(huà)就不更新參考列表,因為B幀本來(lái)就不能作為參考幀嘛!如果是I幀或P幀的話(huà),就更新參考幀列表.

G   下面是寫(xiě)slice的操作.

                    
                    h->out.i_nal = 0;//out的聲明在bs.h中.
                    bs_init( &h->out.bs,h->out.p_bitstream,h->out.i_bitstream );//空出8位.
 
                     
                    if( i_nal_type == NAL_SLICE_IDR )
                        {
                          
                           x264_nal_start( h, NAL_SPS,NAL_PRIORITY_HIGHEST );
                           x264_sps_write( &h->out.bs,h->sps );
                           x264_nal_end( h );
 
                            
                           x264_nal_start( h, NAL_PPS,NAL_PRIORITY_HIGHEST );
                           x264_pps_write( &h->out.bs,h->pps );
                           x264_nal_end( h );
                          
         x264_slice_write()(定義在\ENCODER\encoder.c中),這里面是編碼的最主要部分..
         下面這個(gè)循環(huán),它是采用for循環(huán)對一幀圖像的所有塊依次進(jìn)行編碼.
               for( mb_xy = 0, i_skip = 0; mb_xy <h->sps->i_mb_width *h->sps->i_mb_height; mb_xy++)//h->sps->i_mb_width指的是從寬度上說(shuō)有多少個(gè)宏快.   {
               const int i_mb_y = mb_xy /h->sps->i_mb_width;
                constinti_mb_x = mb_xy %h->sps->i_mb_width;//這兩個(gè)變量是定義宏塊的位置..
 
                
               x264_macroblock_cache_load( h, i_mb_x, i_mb_y);//是把當前宏塊的up宏塊和left宏塊的intra4×4_pred_mode,non_zero_count加載進(jìn)來(lái),放到一個(gè)數組里面,這個(gè)數組用來(lái)直接得到當前宏塊的左側和上面宏塊的相關(guān)值.要想得到當前塊的預測值,要先知道上面,左面的預測值,它的目的是替代getneighbour函數.
               
                 TIMER_START(i_mtime_analyse);
                x264_macroblock_analyse( h);//定義在analyse.h中.
                 TIMER_STOP(i_mtime_analyse);
 
                 
                 TIMER_START( i_mtime_encode );
                 x264_macroblock_encode( h );//定義在Enc/encoder.c中.
                 TIMER_STOP( i_mtime_encode );
       到這就已經(jīng)完成編碼的主要過(guò)程了,后面就是熵編碼的過(guò)程了.

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
x264編碼詳細文字全過(guò)程
X264編碼流程詳解
X264-應用工程
x264代碼剖析(九):x264_encoder_encode()函數之x264_slice''s''_write()函數
X264閱讀筆記1
x264框架分析
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久