1. 程式人生 > >H.264---CAVLC---基礎篇

H.264---CAVLC---基礎篇

轉自:https://blog.csdn.net/jubincn/article/details/6948334

CAVLC(Context Adaptive VariableLength Coding)是在H.264/MPEG-4AVC中使用的熵編碼方式。在H.264中,CAVLC以zig-zag順序用於對變換後的殘差塊進行編碼。CAVLC是CABAC的替代品,雖然其壓縮效率不如CABAC,但CAVLC實現簡單,並且在所有的H.264profile中都支援。

CAVLC的編碼過程如下:

1、計算非零係數(TotalCoeffs)和拖尾係數(TrailingOnes)的數目。

拖尾係數指值為+1/-1的係數,最大數目為3。如果超過3個,那麼只有最後三個被視為拖尾係數。拖尾係數的數目被賦值到變數TrailingOnes。
非零係數包括所有的拖尾係數,其數目被賦值到變數TotalCoeffs)。
2、計算nC(numberCurrent,當前塊值)。

nC值由左邊塊的非零係數nA和上面塊非零係數nB來確定,計算公式為:nC=round((nA+nB)/2);若nA存在nB不存在,則nC=nA;若nA不存在而nB存在,則nC=nB;若nA和nB都不存在,則nC=0。
nC值用於選擇VLC編碼表,如下圖所示。這裡體現了上下文相關(contextadaptive)的特性,例如當nC值較小即周圍塊的非零係數較少時,就會選擇比較短的碼,從而實現了資料壓縮。

 

3、查表獲得coff_token的編碼。

 

根據之前編碼和計算過程所得的變數TotalCoeffs、TrailingOnes和nC值可以查H.264標準附錄CAVLC碼錶,即可得出coeff_token編碼序列。
4、編碼每個拖尾係數的符號,按zig-zag的逆序進行編碼。

每個符號用1個bit位來表示,0表示“+”,1表示“—”。
當拖尾係數超過三個時只有最後三個被認定為拖尾係數,引詞編碼順序為從後向前編碼。
5、編碼除拖尾係數之外非零係數的level(Levels)。

每個非零係數的level包括sign和magnitude,掃描順序是逆zig-zag序。
level的編碼由字首(level_prefix)和字尾(level_suffix)組成。字首的長度在0到6之間,字尾的長度則可通過下面的步驟來確定:
將字尾初始化為0。(若非零係數的總數超過10且拖尾係數不到3,則初始化為1)。
編碼頻率最高(即按掃描序最後)的除拖尾係數之外的非零係數。
若這個係數的magnitude超過某個門檻值(threshold),則增加字尾的長度。下表是門檻值的列表:
6、編碼最後一個非零係數之前0的個數(totalZeos)。

TotalZeros指的是在最後一個非零係數前零的數目,此非零係數指的是按照正向掃描的最後一個非零係數
根據TotalCoeffs值,H.264標準共提供了25個變長表格供查詢,其中編碼亮度資料時有15個表格供查詢,編碼色度DC2×2塊(4:2:0格式)有3個表格、編碼色度DC2×4塊(4:2:2格式)有7個表格。
7、編碼每個係數前面0的數目(run_before)。

掃描順序為zig-zag的逆序。
若∑[run_before]== total_zeros,則不需再計算run_before
掃描序中的最後一個元素不需要計算run_before
每個run_before的VLC編碼取決於run_before自身及未編碼的0的個數ZerosLeft。例如若ZerosLeft== 2,那麼run_before只可能是0,1或2,因此使用兩個bit即可表示。