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...