CAVLC

CAVLC即基於上下文的自適應變長編碼。H.264標準中使用CAVLC對4*4模組的亮度和色度殘差數據進行編碼。

CAVLC概念

CAVLC的全稱是Context-Adaptive Varialbe-Length Coding,即基於上下文的自適應變長編碼。CAVLC的本質是變長編碼,它的特性主要體現在自適應能力上,CAVLC可以根據已編碼句法元素的情況動態的選擇編碼中使用的碼錶,並且隨時更新拖尾係數後綴的長度,從而獲得極高的壓縮比。H.264標準中使用CAVLC對4×4模組的亮度和色度殘差數據進行編碼。

CAVLC原理

在H.264標準編碼體系中,視頻圖像在經過了預測、變換及量化編碼後表現出如下的特性:4×4塊殘差數據塊比較稀疏,其中非零係數主要集中在低頻部分,而高頻係數大部分是零;量化後的數據經過zig-zag掃描,DC係數附近的非零係數值較大,而高頻位置上的非零係數值大部分是+1和-1;相鄰的4×4塊的非零係數的數目是相關的。CAVLC就是利用編碼後殘差數據的這些特性,通過自適應對不同碼錶的選擇,利用較少的編碼數據對殘差數據進行無損的熵編碼,進一步減少了編碼數據的冗餘和相關性,提高了H.264的壓縮效率。

CAVLC編碼流程

視頻圖像在經過預測、變換和量化編碼後,需要經過Zig-zag掃描和重新的排序過程,為後序的CAVLC編碼進行準備。一個殘差數據塊的CAVLC熵編碼的流程如圖所示:

CAVLC熵編碼處理流程CAVLC熵編碼處理流程
1、TotalCoeffs和TrailingOnes的編碼

從碼流的起始位置開始計算整個編碼塊中非零係數的數目(TotalCoeffs),非零係數的數目為從0-16,非零係數的數目被賦值給變數TotalCoeffs。
拖尾係數是指碼流中正或者負1的個數(+/-1)。拖尾係數的數目(TrailingOnes)被限定在3個以內,如果+/-1的數目超過3個,則只有最後3個被視為拖尾係數,其餘的被視為普通的非零係數,拖尾係數的數目被賦值為變數TrailingOnes。

2、判斷計算nC值

nC(Number Current 當前塊值)值的計算集中體現了CAVLC的基於上下文的思想,通過nC值選擇不同H.264標準附錄CAVLC碼錶。

3、查表獲得coeff_token編碼

根據之前編碼和計算過程所得的變數TotalCoeffs、TrailingOnes和nC值可以查H.264標準附錄CAVLC碼錶,即可得出coeff_token編碼序列。

4、編碼每個拖尾係數的符號:前面的coeff_token編碼中已經包含了拖尾係數的總數,還需進一步對拖尾係數的符號進行編碼。由於拖尾係數符合為正(+)或負(-),因此,在H.264標準中規定用0表示正1(+1)、1表示負1(-1)。當拖尾係數的數目超過3個只有最後3個被認定為拖尾係數,因此對符號的編碼順序應按照反向掃描的順序進行。

5、編碼除拖尾係數之外的非零係數的幅值(Levels)

非零係數的幅值(Levels)由兩個部分組成:前綴(level_prefix)和後綴(level_suffix)。levelCode、levelSuffixsSize和suffixLength是編碼過程中需要使用的三個變數,其中levelCode是中間過程中用到的無符號數,levelSuffixsSize表示後綴長度位數,suffixLength代表Level的碼錶序號。

6、編碼最後一個非零係數前零的數目(TotalZeros)

TotalZeros指的是在最後一個非零係數前零的數目,此非零係數指的是按照正向掃描的最後一個非零係數。因為非零係數數目(TotalCoeffs)是已知,這就決定了TotalZeros可能的最大值。根據TotalCoeffs值,H.264標準共提供了25個變長表格供查找,其中編碼亮度數據時有15個表格供查找,編碼色度DC 2×2塊(4:2:0格式)有3個表格、編碼色度DC 2×4塊(4:2:2格式)有7個表格。

7、編碼每個非零係數前零的個數(RunBefore)

在CAVLC中,變數 ZerosLeft表示當前非零係數左邊的所有零的個數,ZerosLeft的初始值等於TotalZeros。每個非零係數前零的個數(RunBefore)是按照反序來進行編碼的,從最高頻的非零係數開始。H.264標準中根據不同ZerosLeft和RunBefore,構建了RunBefore編碼表格供編碼查找使用。根據表格每編碼完一個RunBefore,對ZerosLeft的值進行更新,繼續編碼下一個RunBefore,直至全部完成所有非零係數前零的個數的編碼。當ZerosLeft=0即沒有剩餘0需要編碼時或者只有一個非零係數時,均不需要再進行RunBefore編碼。

CAVLC解碼流程

CAVLC熵解碼是上述CAVLC熵編碼的逆過程,CAVLC熵解碼的輸入數據是來自片層數據的比特流,解碼的基本單位是一個4×4的像素塊,輸出為包含4×4塊每個像素點所有幅值的序列。CAVLC解碼步驟如下:
1. 初始化所有的係數幅值
2. 解碼非零係數個數(TotalCoeff)和拖尾係數個數(TrailingOnes)。
3. 解碼拖尾係數符號(trailing_ones_sign_flag)
4. 解碼非零係數幅值
5. 解碼total_zeros和run_before
6. 組合非零係數幅值和遊程信息,得到整個殘差數據塊

相關詞條

相關搜尋

熱門詞條

聯絡我們