X264的參考列表

2021-06-19 23:52:07 字數 2223 閱讀 5360

學習之用,多謝博主!

h.264標準寫得比較繁複,所以考慮在瀏覽完white*****之後就開始研讀x264**。x264**風格還是比較清晰簡潔的。

根據對標準得理解,picture order count在slice解碼的一開始就被提及:

i0 b1 b2 p3 b4 b5 p6

i0 p3 b1 b2 p6 b4 b5

於是i0的poc是0,p3的poc是3,b1是1……

為了支援h264複雜的幀存機制,x264以專門的乙個模組frame.c進行處理。

common/frame.c中包括一組幀緩衝操作函式。包括對幀進行filo和fifo訪問,空閒幀佇列的相應操作等。

以下逐個函式分析encoder.c中編碼一幀的函式x264_encoder_encode中有關frame的呼叫:

x264_reference_update

這個函式裡最主要的工作的是將上乙個參考幀放入參考幀佇列,並從空閒幀佇列中取出一幀作為當前的參考工作幀(即解碼操作的目的幀),即h->fdec。

當當前佇列(current佇列)可用幀為0時,需要對next佇列中的幀進行判決,需要進行如下過程:

1. 呼叫x264_slicetype_decide

這個函式確定當前條帶(幀)的型別

其中首先呼叫x264_ratecontrol_slice_type,依據位元速率控制逐個求出next列表中所有幀的型別(雖然在當前並不全部用到,見後)。

隨 後統計審查並調整next列表,保證idr幀滿足有關最大關鍵幀間隔的要求的正常出現:即針對frm->i_frame - h->frames.i_last_idr >= h->param.i_keyint_max作判斷。審查按順序針對所有被判定為b系或auto型別的幀進行(這些幀在審核過程中被確認為b幀), 直到遇到第乙個不是這樣的幀。

如果某個幀被指定為idr,則乙個gop在它之前結束。

此時,就可以從current佇列中取出一幀,進行編碼,現在記這幀叫h->fenc。

首先做幾項和幀有關的設定工作:

1. 如果f_enc是idr,則將最近idr序號標記h->frames.i_last_idr設定為i_frame。

2. 根據f_enc的型別確定nal和slice型別相關引數。 

3. 設定poc為2 * (h->fenc->i_frame - h->frames.i_last_idr)。並使得h->fdec和h->fenc的主要幀引數一致。

隨後進行以下一些過程:

x264_reference_build_list

在這個函式中,我們將遇到參考幀列表h->frames.reference和h.264很有特色的雙列表(h->fref0、h->fref1)。前者中放置了所有可用於參考的參考幀。

首 先將所有reference列表中的幀按照poc和h->fenc的poc的大小關係不同複製到雙列表中,其中h->fref0放置poc較 小的那些。然後對雙列表進行排序,使得h->fref0中的幀poc按從大到小排列,h->fref1按從小到大排列,於是這兩個列表中靠前 的幀的poc比較接近當前幀h->fenc。在這裡,乙個特殊的情況是,對於p幀(只需要用到列表h->fref0做參考),其排序依據是 i_frame_num而不是poc,因此需要對這種情況的列表h->fref0置位需重排序標記。最後對雙列表的長度做限制。

x264_ratecontrol_start

位元速率控制初始化,在以後專門的話題中論述。

在初始化後,從位元速率控制體中獲得全域性qp值:i_global_qp = x264_ratecontrol_qp( h )。

如果當前是b條帶(幀),則呼叫x264_macroblock_bipred_init

該函式設定一些參考幀關係矩陣,關係矩陣以fref0的索引為行座標,以fref1的索引為列座標。主要包括:dist_scale_factor,bipred_weight,矩陣值主要由相應幀的poc決定。後續討論。

x264_slice_init

內部呼叫x264_slice_header_init,它對header進行配置,含義以後討論。

bs_init

初始化碼流工作上下文。

隨後將幀型別表現到碼流中。接著寫sei,sps和pps。

然後就是最關鍵的寫條帶(即主要的編碼工作)開始的地方:

x264_slices_write

這裡通過x264_stack_align呼叫x264_slice_write,為了將棧做4位元組對齊,以提高執行效率。

x264_slice_write函式是編碼一幀的關鍵函式,將在下一章中論述。

X264的參考幀設定

1 以r1884為例 r,ref 整數 reference frame,即參考幀,決定最多可能的參考幀數。有效範圍值1 16。該值越大,壓縮率越高 但大於6後對壓縮率的貢獻很低 可以看壓制完後x264 info ref 項,例如上圖p l0那行,71.0 表示p幀參考自己,4.2 表示參考隔壁1個幀...

x264使用示例

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

編譯安裝x264

網上也有相應的教程,之所以在這裡重申一遍,是因為我試了網上很多的編譯方法,都出現了問題,為此將此編譯安裝方法記錄下來。首先是 獲取x264 的 git clone git linux 下最簡單編譯步驟 1.切換至源 目錄 2.輸入 configure enable shared enable sta...