細究圖片分節/巨集區塊執行 提高H.264/AVC編碼效率

2007-05-18
【H.264/AVC標準剖析(二)】  

從應用的角度來看,雖然H.264/AVC編碼效能較先前的標準高,但卻也更加複雜。根據JVT(Joint Video Team, JVT)文件,H.264/AVC參考編解碼軟體JM2.1比MPEG-4 MoMuSys FPDAM1-020414編碼器複雜約10倍,解碼器則複雜約3倍,也讓認識H.264/AVC需要更多心力。  

在74期新通訊元件雜誌中,大致上談了關於H.264/AVC架構的編/解碼器架構(圖1),但還沒有機會深入了解圖片的分節、參考畫面的選擇、資料的分割、參數集、冗餘片段及彈性巨集區塊(Macroblock, MB)排序等在H.264/AVC上運作的小細節。因此在本期將繼續來看這些未談的議題。  

片段分節彈性大  

之所以要以片段(Slice)的方式,在H.264/AVC中進行圖片分節(Picture Segmentation),是因為編碼片段後的大小,可以因應不同的最大傳送單元(Maximum Transfer Unit, MTU)需求而有所變化,因此多以片段的形式來作圖片分節。而這個觀念同樣可以用在如交錯式封包化(Interleaved Packetizatio)等執行策略(Implement Scheme)上。  

通常一個片段可以只包含一個巨集區塊,也可以涵蓋整個圖片所有的巨集區塊。而不管哪種方式,圖片中的巨集區塊都必須被精準的編碼到一個片段裡面。通常片段的巨集區塊指定順序是以循序掃描(Raster Scan)方式進行,但同樣可使用彈性巨集區塊排序(Flexibility Macroblock Ordering, FMO)來客製化巨集區塊順序。  

依回饋與否選擇錯誤修復工具  

參考圖選擇(Reference Picture Selection, RPS)在H.263中被當成錯誤修復的使用工具,它的修復標的可以位於圖片、片段或是巨集區塊之中。在回饋式系統(Feedback-based System)裡,編碼器接受到關於遺失或是損壞圖片區域的訊息後,可以選擇採用較舊的修正參考(Correct Reference)巨集區塊來作為預測依據,而不是使用較高成本的內部資訊。  

但如果是不具回饋機制的系統,就可能會採用視訊冗餘編碼(Video Redundancy Coding)等方式,來回復遺失或是損害區域。因此,視訊封包一旦遺失或受損,錯誤回復方式乃是依據訊號是否反饋給編碼器而有不同的修補策略。  

資料分割帶來更多位元字串  

在正常情況下,所有的巨集區塊會被編碼在單一位元串流(Bit Stream)之下,並構成一個片段。但是如果有使用資料分割(Data Partition),則每一個片段會產生更多位元字串(Bit String)。  

在H.264裡面,可使用的分割方式有三種,分別是:標頭資訊(Header Information)、內部分割(Intra Partition)與互相分割(Inter Partition)。  

其中標頭資訊是最重要的,因為如果失去標頭資訊,那其他的資料分割就無用武之地。因此,在H.264裡面,這種標頭資訊的分割型態一般就被稱為A型分割 (Type A Partition)。在標頭資訊裡面,其包含有巨集區塊型態(Macroblock Type)、量化參數(Quantization Parameter)以及移動向量(Motion Vector)等重要資訊。  

至於內部預測(Intra Prediction),主要則是攜帶內部塊編碼模式(Intra CBP)以及內部係數(Intra Coefficient),這種分割必須要在A型分割有效的情況下才可使用。換句話說,這種分割形式就是H.264裡所謂的B型分割(Type B Partition)形式。  

最後一種分割形式是互相分割(Inter Partition),這種分割是片段裡面最大的分割區塊,其只有攜帶塊編碼(CBP)及互相係數,在H.264裡面這種分割便是所謂的C型分割 (Type C Partition)。相對於B型分割,C型分割對編碼器或解碼器重新同步化問題比較沒有貢獻,所以在這三種分割類型裡面這種分割最不重要。但相反的,因為B型分割可以阻止進一步的漂移效應,所以其重要性會比內部分割大。使用C型分割的條件與使用B型分割的條件相似,都需要在A型分割可用的情況下為之,但 C型分割的使用不因B型分割的存在與否而受限制。  

完成型態分割後,來源編碼器(Source Coder)會將不同型態的資訊放入不同的位元緩衝區中,以方便其片段大小可以被調整到符合最大傳送單元的大小限制以內。基於此理由,資料分割的工作是被放在來源編碼器中完成而非放在網路抽象層(NAL)來作。從解碼器(Decoder)的觀點來看,如果在重組資料的過程出現內部或是內部分割資料遺失,其標頭資訊仍可被用來作為錯誤回復改善的依據,並利用巨集區塊型態與移動向量資訊來協助較高品質之重建。  

參數集有助於錯誤回復  

在H.264/AVC裡面包含兩種比較重要的參數集(Parameter Set),一個是序列參數集(Sequence Parameter Set, SPS),它包含所有有關圖片序列的相關資訊;另一個是存有同一圖片內所有片段的資訊圖片參數集(Picture Parameter Set, PPS)。  

對編碼器(Encoder)而言,它會參考儲存在每一個已經編碼後的片段內之標頭資訊,來選擇適當的資訊圖片參數集,但解碼器(Decoder)則可在其已經編碼後的儲存位置,使用不同參數集。關於參數集的另一個特色是,在資訊圖片參數集內含有序列參數所使用的參考資訊。  

對使用者來說,善用參數集機制,對於錯誤回復有很大的助益。尤其在一個容易發生錯誤(Error-prone)的環境裡,使用參數集的關鍵在於這些參數能夠確實且適時到達解碼器端。一個確保此程序的方法,便是使用可信控制協定,利用頻帶外(Out of-band)的方式提早將這些參數送出。如此一來,這些新參數到達編碼器的時間,會比第一個已經使用新參數編碼的片段還早到達解碼器。  

如果有應用層的保護機制,那這些新參數的送達亦可用頻帶內(In-band)的方式為之,例如傳送多個拷貝副本,以確保這些參數可以到達解碼器端;或者將參數寫死在編碼器及解碼器端,並利用應用程式只傳送參數選項來選擇新參數。  

冗餘性片段常見於無線網路環境  

冗餘性片段(Redundancy Slice, RS)可以允許編碼器在相同的位元串流下面,放置一個或多個相同的巨集區塊的冗餘表示。使用冗餘性片段或是封包冗餘複製等傳送式的冗餘方法,這兩者最大的不同在於,冗餘表示的編碼是否可以使用不同的編碼參數(Coding Parameter)。  

至於解碼器與冗餘性片段之間的關係分別是建構主要片段(Primary Slice)與將冗餘性片段丟棄(Discarding RS)。由於可以在主要的片段遺失時重建冗餘性片段,因此冗餘性片段常被使用在如無線網路等易生高度錯誤的環境,但仍具有IP-based環境裡的效率。  

彈性巨集區塊排序增加錯誤修補能力  

在H.264/AVC的BP及XP版本裡,都有提供彈性巨集區塊排序功能,但Main Profile則不提供此功能。彈性巨集區塊排序可讓使用者指定巨集區塊配置圖(MB Allocation Map, MBA Map),使巨集區塊依其配置圖靜態的被指定到片段內的適當位置,而非使用掃描指令(Scan Order);而一般在片段群組裡,巨集區塊是以正常的掃描指令來編碼。  

在圖片內的內部預測或移動向量預測(Motion Vector Prediction)等預測機制裡,只允許空間上鄰近的巨集區塊屬於相同的片段群組。假設有一個圖片只存在兩個片段(圖2),一種是Slice 0以白色表示,另一種Slice 1則以黑色表示,而每一個片段群組都由其他不同片段群組所圍繞,如Slice 0區塊周圍乃由Slice 1區塊所圍繞。如果在傳送過程中,Slice 0群組資訊遺失了,則該遺失區塊的周圍巨集區塊,便可有效提供錯誤回復所需要的資訊,以完成有效的修補。不過彈性巨集區塊排序並非遺失修補的萬靈丹,如果在高度最佳化環境裡,反而會因為彈性巨集區塊排序降低編碼效率,而造成較高的延遲性。  

H.264/AVC進步空間大  

另外在H.264/AVC的編碼器裡面,其有許多重要的關鍵元件用以改善編碼效率、視覺品質以及傳送的網路可信度,分別簡述如下:  

透過轉換/量化與編碼改善壓縮效能  

在壓縮效能的改善方面,主要的關鍵包含轉換與量化步驟,以及熵編碼方式,以下是關鍵元件的運作概要:  

‧轉換及量化  

H.264/AVC在預測殘留畫面上使用的空間轉換編碼(Spatial Transform Coding)與其他之前視訊標準使用的方法很像,不過它們之間有兩個主要差別存在,第一個是H.264/AVC使用的轉換區塊是4×4大小,而之前的視訊標準使用的則是8×8大小。  

新標準採用較小的4×4轉換單元,而不使用原本之前視訊標準使用的8×8區塊,主要的理由包括4×4需要的運算複雜度較小,而其所處理的word長度也會小許多;H.264/AVC不論在內部或是互相預測上,都提供不小改善。因此殘留畫面訊號的空間關聯性(Spatial Correlation)也自然降低許多,這通常意味著,其轉換(Transform)過程中去關聯性(Decorrelation)所需要的努力會少一點;再從客觀的壓縮能力來看,較小的4×4轉換單元會得到較佳的視覺效果,其邊界上的雜訊也會減少許多。  

而第二個差別是在H.264/AVC第一個版本裡,使用類似4×4離散遺餘弦變換(DCT)的整數轉換方式,來取代逆向離散遺餘弦變換(IDCT)的使用,而如果是在H.264 FRExt版本,則支援8×8的整數轉換運作。整數轉換的基本矩陣形式如下:  

(詳細公式請見新通訊元件雜誌75期5月號)  

因此,H.264/AVC的轉換編碼的過程與之前的視訊標準相似,只不過在逆向轉換上面,新標準採用簡單而精確的整數轉換運作來取代IDCT的方法,如此一來可以減少逆向轉換時所可能發生的錯誤配對(Mismatch),以及降低解碼的複雜度。在Intra_16×16模式內的亮度(Luma)元件以及在內部巨集區塊內的色度(Chroma)元件,其4×4轉換區塊的DC係數會再受到哈達瑪轉換(Hadamard Transform)第二次轉換。  

在這種轉換裡面,Intra_16×16模式內亮度元件會被再施以4×4轉換,以及用2×2的轉換來處理所有內部模式內的色度元件。利用這種二次轉換,在平滑區域裡會有很好的壓縮效能。  

H.264/AVC裡面的量化轉換係數主要是由量化參數(Quantization Parameter, QP)所負責偵測,量化參數可以取得52個值,而量化步驟的大小控制,之前的視訊標準採線性方式,今日的量化參數乃以log方式為之,以降低解碼複雜度及強化位元速率(Bit Rate)控制能力。  

一個區塊的量化轉換係數來源是先以Zigzag掃瞄後,再套以熵編碼(Entropy Coding)。但對於色度元件之2×2的DC係數,並不採用Zigzag掃描模式,而是以循序掃描依序進行掃描。在H.264/AVC的反向轉換運作上,可以在16位元整數值上使用的運作,主要限於加法運算、減法運算以及位元移位(Bit-shifting)運算。由於上述運算都是16位元的運算模式,因此在實作上僅以16位元為單位便已足夠,並在前導轉換及量化過程實作中也較重要。  

‧熵編碼  

H.264/AVC支援兩種熵編碼模式,第一種稱為文絡適應可變長度編碼(Context-adaptive Variable-length Coding, CAVLC);另一種稱為文絡適應性二進位算數編碼(Context-adaptive Binary Arithmetic Coding, CABAC)。  

在這兩種熵編碼裡,CABAC的複雜度要比CAVLC高,但是其編碼效能也比CAVLC好。不論是哪一種模式,其語法要素都使用單一無限長度字碼集合 (Single Infinite-extent Codeword Set),單一無限長度字碼集合即是所謂的Exp-Golomb碼。使用這種方法的好處之一,是不須要為每個不同語法要素設計不同的VLC表格(VLC Table)。當使用CAVLC模式時,其量化轉換係數可以使用VLC表格進行編碼,而VLC表格之切換,則依據之前的語法要素值而定。因為多種VLC表格可搭配文絡條件使用,因此它會比只使用單一VLC表格要更有效能。  

除了使用多種VLC表格作為編碼效能改善的方式之外,另一種改善方法便是使用CABAC編碼模式。CABAC不只使用文絡條件的機率評估方式,也會調整其機率評估,以適用非靜態(Nonstationary)的統計行為。在CABAC的核心引擎與相關統計評估,均使用移位或查表方式等低複雜度、無乘法運算的方式完成計算。相較於CAVLC模式,在相同品質之下用CABAC模式可降低約10~15%的位元速率。  

品質改善空間大  

在H.264/AVC的品質改善上面,主要有幾個關鍵元素,在此討論的是預測機制與迴圈去塊狀濾器。H.264/AVC的預測機制可分成內部與互相兩種形式。內部預測機制是在同一片段內為之,但互相預測則用在片段之間,因此互相預測又可分成P Slice預測、B Slice預測以及P&B Slice的加權預測。  

在H.264/AVC內關於內部配置(Intra Placement)應注意的事項有兩項,第一項是由於H.264/AVC允許內部巨集區塊預測,因此對編碼效率(Coding Efficiency)幫助很大,但是對內部編碼(Intra Coding)的重新同步(Re-synchronization)屬性會產生不良後果。因此為避免其影響,可在序列層級(Sequence Level)設定強迫內部預測(Constrained Intra Prediction)旗標,以避免這種類型的預測,以及回復內部資訊的重新同步屬性。  

另外須注意的是,在H.264/AVC中,只有兩種片段含有內部巨集區塊:一種是內部片段(Intra Slice);另一種是瞬間解碼重新更新(Instantaneous Decoding Refresh, IDR)片段。由於IDR片段必須來自完整的IDR圖片,因此所有的IDR圖片片段都是一種IDR片段,而一個IDR片段可能只是IDR圖片片段所組成的一部分。  

‧內部圖片預測(Intra-picture Prediction)  

在所有片段編碼(Slice-coding)型態中,只有三種主要的內部編碼型態被支援,分別是是Intra_4×4、Intra1_6×16以及 I_PCM,其中I_PCM只有在一些不尋常情況下才會被使用,而Intra_4×4是基於預測每一個4×4的亮度區塊,並且是非常適合用來編碼圖片的細節部分的一種模式。  

而Intra_16×16則是對整個16×16的亮度區塊作預測與殘留編碼(Residual Coding),非常適用於圖片的平滑區域,至於色度的預測方式則與前面討論的Intra_4×4或Intra_16×16的亮度預測方式相同。  

在之前的MPEG-4 Visual或H.263v2視訊編碼標準中,內部預測是被放在轉換領域(Transform Domain)來作,但是在H.264/AVC裡,內部預測則被放在空間領域(Spatial Domain)來作。不過當鄰近的巨集區塊有使用互相預測時,內部預測結果就會受到時空錯誤(Spatio-temporal Error)的波及。因此為使其內部預測是來自內部編碼的鄰近巨集區塊,使用受限的內部編碼模式是有必要的。關於Intra_4×4可選擇的預測方向 (Prediction Direction)有8個方向,如圖3。  

其中數字所標示的便是預測模組,例如數字0表示「Mode 0」,是指垂直(Vertical)的預測方向;數字1則表示「Mode 1」,是指水平(Horizontal)的預測方向。在上面的預測方向裡,並沒有出現數字2,是因為「Mode 2」是用樣本的平均值(Average Value)來作為整個區塊的預測依據。  

假設有一個4×4區塊,其內的16個樣本依序標號為a~p,而預測方式則是以先前鄰近標示為A~M的區塊解碼樣本以線性組合,如圖4。  

編碼器可以選擇DC預測,即為Mode 2的預測,以整體平均值方式來預測整個區塊;或是也可採用8種不同預測方向的其中一種,來作為預測依據。  

在Intra_16×16模式裡,整個巨集區塊內之16×16亮度元件是採預測1次便結束的策略,但這種模式內的預測方式沒有太多選擇,只有4種可用選擇,分別為水平、垂直、平面(Plane)與DC方法,其中水平、垂直與DC方法與Intra_4×4模式使用的相同,而它的平面預測方式則也是使用位置特異性的線性組合預測方式為之。在內部巨集區塊內,其色度樣本的預測方式則與Intra_16×16模式內的亮度元件相似。模式列表如表1。  

表1中的每一模式之箭頭都代表了預測方向,對模式3~8而言,預測樣本的計算主要是由A~M樣本的加權平均值計算得來。  

在Intra_4×4模式裡面,每個4×4亮度區塊的預測,都是來自空間上的鄰近亮度樣本而來,但對一個I_PCM內部巨集區塊型態而言,它並不使用預測技術,而只是將取樣值的原始資料(Raw Data)未經壓縮便傳送出去。  

此模式之存在,主要是因為解碼器實作上的理由,這種模式被用於確認任何巨集區塊所需要的位元數目/空間大小,不得大過未經壓縮的巨集區塊所需空間,而並不在乎量化步驟的大小與特殊的巨集區塊樣本值。至於其他圖片間的預測機制,留待下次再與讀者分享。  

(詳細圖表請見新通訊元件雜誌75期5月號)  

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!