目錄
- 編碼流程和資料格式回顧
- 4 × 4亮度塊的9中預測模式
- 16 × 16亮度塊的4種預測模式
- 8 × 8 色度塊的4種預測模式
- JM代碼
- 資料
- 收獲
一、編碼流程和資料格式回顧
我們先看下下圖來回顧下編碼流程
一個編碼圖像通常劃分一個或多個片,每個片又可以劃分成若幹宏塊組成,一個宏塊由一個 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)。
引用自:H.264 幀内預測 - 簡書
圖檔來自:《新一代視訊壓縮碼标準-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
六、資料
- 圖書:《新一代視訊壓縮碼标準-H.264_AVC(第二版).畢厚傑,王健編著》- 第 6 章 H.264/AVC 編碼器原理
- H.264 幀内預測
- 雷神-H.264官方軟體JM源代碼簡單分析-編碼器lencod
- JM源碼下載下傳
- [JM官方文檔]
七、收獲
通過本篇的學習實踐
- 了解了幀内編碼的方式以及在整個編碼過程中起的作用
- 了解4x4亮度塊的9種預測模式、16x16亮度塊以及8x8色度塊的預測方式
- 通過碼流分析工具檢視宏塊資訊,加深了解。
感謝你的閱讀
下一篇我們學習H.264 幀間預測,歡迎關注公衆号“音視訊開發之旅”,一起學習成長。
歡迎交流