H 264筆記之一

2021-05-23 23:05:55 字數 2277 閱讀 2677

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函式是編碼一幀的關鍵函式,將在下一章中論述。

h 264優化筆記

目前 h.264編解碼器的實現可以採用以下幾種方式 採用奔騰 pentium 四代機實現 h.264 編譯碼最早就是在 pc 平台上實現 的 由於簡單易開發 基於該平台的研究得到最多 jvt 的 jm 參考 是就是基於 pc 平台的 此方案的優點是利用當前最新的 pc 資源 以及較強的軟體工具 in...

h264編碼演算法由淺入深(一)

h264壓縮的主要過程。巨集塊劃分 幀內 幀間運動檢測 dct變換,量化 環路濾波 熵編碼 封裝資料寫slice h264資料幀 編碼器每次輸出乙個slice,一幀資料可能分為多個slice,也可能乙個。大多數情況是乙個slice。slice型別即nalu型別的定義如下 0 未規定 1 非idr影象...

H 264學習筆記4 變換量化

a 變換量化過程總體介紹 經過幀內 16x16和4x4亮度 8x8色度 和幀間 4x4 16x16亮度 4x4 8x8色度 畫素塊 之後,得到 塊的殘差,為了壓縮殘差資訊的統計冗餘,需要對殘差資料進行變換和量化操作。變換和量化的總體操作過程如下圖 對於intra 16x16的亮度塊,通過16 4x4...