音視頻開發之旅(58) -H.264 幀內預測

目錄

  1. 編碼流程和數據格式回顧
  2. 4 × 4亮度塊的9中預測模式
  3. 16 × 16亮度塊的4種預測模式
  4. 8 × 8 色度塊的4種預測模式
  5. JM代碼
  6. 資料
  7. 收穫

一、編碼流程和數據格式回顧

我們先看下下圖來回顧下編碼流程


一個編碼圖像通常劃分一個或多個片,每個片又可以劃分成若干宏塊組成,一個宏塊由一個 16×16 亮度像素、一個 8×8 Cb以及一個 8×8 Cr 彩色像素塊組成,即常見的420採樣格式,如下圖:


我們通過H264visa碼流分析工具看下H264數據的第一幀數據,可以看到它是I幀,由一個個宏塊組成,在幀內採用幀內預測的方式進行編碼。



也看到上面宏塊的type有16x16也有4x4,這是什麼意思?
再通過Elecard StreamEye 來查看發現更多信息。包括pmode、ipred Intra_4x4、 ipred chroma 都代表什麼意思以及裏面的值有什麼什麼意思吶?


在幀內預測模式中,預測塊 P 是基於已編碼重建塊和當前塊形成的。對亮度像素而言,P 塊用於 4×4 子塊或者 16×16 宏塊的相關操作。
4×4 亮度子塊有 9 種可選預測模式,獨立預測每一個 4×4亮度子塊,適用於帶有大量細節的圖像編碼;
16×16 亮度塊有 4 種預測模式,預測整個 16×16 亮度塊,適用於平坦區域圖像編碼;
色度塊也有 4 種預測模式,類似於 16×16 亮度塊預測模式。編碼器
通常選擇使 P 塊和編碼塊之間差異最小的預測模式。

下面我們來看下其預測模式

二、4 × 4亮度塊的9種預測模式

4x4預測塊的像素使用小寫字母a-p標示,預測塊左側和上方的參考像素使用大寫字母A-M標示:


4x4亮度塊有9中預測模式,分別如下

其中預測模式2 的所有樣本預測值都等於A-D以及I-L的平均值。
其他8中模式的8歌方向的預測示意圖如下所示:


9種預測模式說明如下:
模式 說明
Mode0 (Vertical): 由上方的A、B、C、D進行垂直推算

Mode1 (Horizontal) : 由左側的I、J、K、L進行水平推算

Mode2 (DC) : P中的所有樣本預測值都等於AD及IL的平均值

Mode3 (Diagonal Down-Left): 由45度角方向的左下和右上的樣本內插得出

Mode4 (Diagonal Down-Right): 以45度角往右下的方向進行推算

Mode5 (Vertical-Right) : 以垂直向下方向右偏大約26.6度角(即width/height = 1/2)的方向推行推算。

Mode6 (Horizontal-Down): 以水平向右方向下偏大約26.6度角的方向進行推算。

Mode7 (Vertical-Left): 以垂直向下方向左偏大約26.6度角的方向推行推算。

Mode8 (Horizontal-Up): 以水平向右方向上偏大約26.6度角的方向進行推算。

需要注意的是:

Mode 2的規則可以根據A-M中樣本的可用情況進行修改,因爲它求的是根據參考樣本求的平均值,其他的模式可能在所有需求的參考樣本都可用的時候才能採用。然後需要注意的是如果樣本E、F、G和H是不可用的,樣本D的值可以拷貝到這些位置從而標記這些樣本爲可用的。
對於Mode 3-8,預測樣本的值是參考樣本A-M的加權平均。假設選擇了Mode 4,d的預測值 = round(B/4 + C/2 + D/4)。
引用自:https://www.jianshu.com/p/4d8692d53d8c?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends

圖片來自:《新一代視頻壓縮碼標準-H.264_AVC(第二版).畢厚傑,王健編著》

三、16 × 16亮度塊的4種預測模式

模式 說明
Mode0 (vertical): 由上方的樣本(H)垂直推算
Mode1 (horizontal) 由左側的樣本(V)水平推算
Mode2 (DC): 上方的樣本(H)和左側的樣本(V)的平均值
Mode3 (Plane): 根據上方的樣本(H)和左邊的樣本(V)通過一個plane函數得出,在亮度平滑變化的區域工作得很好。

下面看下《新一代視頻壓縮碼標準-H.264_AVC(第二版).畢厚傑,王健編著》中舉的一個例子:


四、8 × 8 色度塊的4種預測模式

色度的Cr和Cb分量的預測模式選擇是一樣的。
色度預測模式與16x16亮度預測模式的描述類似,除了模式的編號不一樣。
DC (mode 0), horizontal (mode 1), vertical (mode 2), plane (mode 3).

看到這裏我想對於文章開頭我們通過碼流分析工具H264visa以及Elecard StreamEye 查看宏塊的一些問題應該有自己的答案了。

五、JM代碼

這一小節我們結合JM源碼來簡單分析下幀內預測的實現
JM包括JM encoder和JM decoder, JM encoder是H.264標準的一個具體實現, JM decoder是對應的解碼器.
JM encoder和 x264一樣,都是H.264標準的實現, 但它嚴格按照H264的協議來進行實現,而x264 簡化了JM的代價計算方法,去掉了一些代碼,進行了估算等優化,編碼速度上JM會很慢,不適用於生產環境,
查看其源碼對於瞭解H264協議時很有幫助。
JM的源碼下載地址:http://iphome.hhi.de/suehring/tml/download/old_jm/,可以選擇一個版本進行下載查看

這個源碼還沒真正的看,先做個記錄吧,根據需要進行學習。
具體可以參考雷神的文章 : 雷神-H.264官方軟件JM源代碼簡單分析-編碼器lencod

六、資料

  1. 圖書:《新一代視頻壓縮碼標準-H.264_AVC(第二版).畢厚傑,王健編著》- 第 6 章 H.264/AVC 編碼器原理
  2. H.264 幀內預測
  3. 雷神-H.264官方軟件JM源代碼簡單分析-編碼器lencod
  4. JM源碼下載
  5. [JM官方文檔]

七、收穫

通過本篇的學習實踐

  1. 瞭解了幀內編碼的方式以及在整個編碼過程中起的作用
  2. 瞭解4x4亮度塊的9種預測模式、16x16亮度塊以及8x8色度塊的預測方式
  3. 通過碼流分析工具查看宏塊信息,加深理解。

感謝你的閱讀
下一篇我們學習H.264 幀間預測,歡迎關注公衆號“音視頻開發之旅”,一起學習成長。
歡迎交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章