引言
我們都知道HEVC裏有很多語法結構,爲什麼要設計那麼多的語法結構呢?答案是爲了增強操作的靈活性和數據損失的魯棒性。這些語法架構使得HEVC在壓縮效率和網絡適應性都有顯著提升。
編碼時的分層處理架構
GOP
視頻序列由時間連續的圖像構成,這些圖像首先會被分成若干組,每一組圖像集合就是一個GOP(Group of Pictures)。
GOP分爲封閉式GOP和開放式GOP,封閉式的即每個GOP之間獨立編解碼,開放式的GOP則後面的GOP中的圖像可以使用前面的GOP中圖像作參考。
封閉式GOP第一幀爲IDR圖像,開放式GOP第一個GOP第一幀爲IDR圖像,後續GOP第一個幀內圖像爲non-IDR圖像。所謂IDR圖像就是一種特殊的幀內編碼圖像,其後面的圖像不能參考IDR之前的圖像。
Slice
一個GOP中有多幀圖像,每一幀圖像會被劃分爲一個或多個Slice。每個Slice之間獨立編解碼,即不需要依靠其他Slice的信息,因此每個Slice都需要進行熵編碼的初始化。
劃分爲Slice的主要目的是爲了在數據丟失後能再次保證解碼同步,且有利於並行運算。
Slice根據類型可以分爲I Slice,P Slice,B Slice。
- I Slice裏所有CU使用幀內預測,其餘兩種Slice裏的CU可以使用幀內或幀間預測。
- P Slice裏所有幀間預測的預測塊只能有一個運動補償預測信息。P Slice只能有一個參考圖像列表。
- B Slice裏所有幀間預測的預測塊最多可以有兩個運動補償預測信息,B Slice可以使用兩個參考圖像列表。
SS(Slice Segment)
每個Slice會被劃分爲一個或多個SS,且有一個獨立的SS和若干個依賴SS組成,且以獨立SS爲Slice的開始部分。每個SS由多個CTU組成(至少一個)。一個SS的編碼數據組成一個NAL單元傳輸。
- 獨立SS,其相關信息可以由自己確定
- 依賴SS,其某些相關信息需要用到獨立SS的信息推導
CTU(Coding Tree Unit)
由一個亮度CTB(Coding Tree Block)和兩個色度CTB及相應的語法元素組成,尺寸默認爲64x64,可以通過編碼器配置。一個SS會被分割成若干個相同大小的CTU進行編碼。
CU(Coding Unit)
由一個亮度CB(Coding Block)和兩個色度CB及相應的語法元素組成。CU由CTU通過四叉樹的形式劃分而來。一個CTU可以作爲一個CU,也可能進一步劃分爲多個小的CU。CU尺寸默認最小爲8x8,最大爲64x64,也是可以配置的。
大尺寸CU使得平緩區域編碼效率大大提高,小尺寸CU可以更好地處理圖像局部細節。
Tile
圖像出了劃分成Slice還能劃分成Tile,Tile是一個矩形區域,包含整數個CTU,可以獨立解碼。其主要目的是爲了增強並行處理能力,同時不引入新的錯誤擴散。
Slice和Tile需要至少滿足以下兩個條件之一:
- 一個Slice中的CTU屬於同一個Tile
- 一個Tile中的CTU屬於同一個Slice