【H.264/AVC視頻編解碼技術詳解】十九、熵編碼(5):CABAC語法元素的二值化

《H.264/AVC視頻編解碼技術詳解》視頻教程已經在“CSDN學院”上線,視頻中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看!

“紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文檔以代碼的形式操作一遍,才能對視頻壓縮編碼標準的思想和方法有足夠深刻的理解和體會!

鏈接地址:H.264/AVC視頻編解碼技術詳解

GitHub代碼地址:點擊這裏

一、上下文自適應的二進制算術編碼

在上篇博文【H.264/AVC視頻編解碼技術詳解】十八:算術編碼的基本原理與實現中研究了算術編碼的基本概念,然而在實際的H.264編解碼的方法中,顯然是不可能採用上文中簡單的算法來實現。在實際應用中,H.264採用的爲稱作上下文自適應的二進制算術編碼(Context-based Adaptive Binary Arithmetic Coding, CABAC)。CABAC算法是H.264中新引入的一種非常複雜的熵編碼算法,專門用於視頻的壓縮編碼。事實證明,在視頻壓縮編碼領域,CABAC保持了強大的生命力,在H.264更新的標準H.265中繼續保留了CABAC算法,並且廢棄了CAVLC而將CABAC作爲主要的熵編碼方法。

在CABAC中,主要步驟或算法可以分爲3個步驟/類別:

  1. 語法元素的二值化;
  2. 上下文模型;
  3. 算術編碼;

在本章節中主要討論語法元素二值化過程,上下文模型和算術編碼在後續章節詳述。

二、二值化方法

我們知道,預測編碼、變換編碼等步驟輸出的信息多種多樣,不會僅僅出現二進制數據,例如宏塊類型mb_type或預測模式pred_mode等信息具有比較廣泛的取值範圍。在輸入算術編碼器之前,需要對這些語法元素進行二值化操作。在H.264的標準文檔中,二值化的方法定義在9.3.2節。

語法元素二值化的輸入數據爲一個語法元素的值,例如型mb_type等。而輸出的信息爲語法元素的二值化數據流,以及maxBinIdxCtx、ctxIdxOffset和bypassFlag等信息。在協議文檔中定義的二值化方法有:

  • 一元二值化(Unary Binarization);
  • 截斷一元二值化(Truncated Unary Binarization);
  • k階指數哥倫布編碼;
  • 定長編碼;
  • 其他方法;

2.1 一元二值化(Unary Binarization)

一元二值化方法是一種非常簡單的方法。二值化之後的碼流長度等於語法元素的值val,且除了最後一位爲0外,前面的val-1位均爲1。對應關係爲:

2.2 截斷一元二值化(Truncated Unary Binarization)

採用截斷一元二值化方法時,輸入數據除了語法元素的值之外,還需要傳入一個值cMax,表示語法元素的上限值。使用截斷一元二值化時,如果語法元素的值小於cMax,則採用2.1所述的一元二值化方法;如果語法元素的值等於cMax,則二值化的輸出碼流爲cMax個bit-1。

2.3 k階指數哥倫布編碼

指數哥倫布編碼在前面的博文中已有詳述,詳情可見:

2.4 定長編碼

定長編碼的輸入數據包括語法元素的值和cMax,,表示語法元素的上限值。定長編碼的碼字長度以cMax的長度爲準,並按二進制排列每一個語法元素值作爲編碼的對應。

三、語法元素的二值化

3.1 語法元素相關的特定二值化方法

在標準協議文檔的9.2.3.5描述了宏塊類型mb_type和子宏塊類型sub_mb_type的二值化。這兩種類型的二值化方法不是由某個算法推導,而是由表格指定。表9-36到9-38描述了此類語法元素的值與二進制數據的關係。

3.2 Coded Block Pattern的二值化

對於CBP數據,其二值化碼流由前綴和後綴組成。前綴表示亮度cbp,即CodedBlockPatternLuma,由cMax爲15的定長編碼實現;若ChromaArrayType不等於0或3,則後綴表示色度cbp即CodedBlockPatternChroma,由cMax爲2的截斷一元編碼表示。

3.3 mb_qp_delta的二值化

mb_qp_delta的二值化過程需要首先解決一個其取值有正有負的過程,因此首先採用了標準文檔中表9-3中的正負值映射方法將mb_qp_delta全部轉換爲非負值,而後採用一元編碼方法進行二值化。

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