h.264 CAVLC example explaination

轉載自 五嶺之南
最終編輯 weiwei22844

對下面的block編碼,假設該快上面和左邊塊的非零係數之和(Na+Nb=0,該塊不是亮度直流塊。

Z-Z重排序 0,3,0,1,-1,-1,0,1,0..

獲得碼流 00010001110010111101101

下面詳細分析編碼過程

1.編碼coeff_token。(參考H.264標準9.219-5

(1) nC=round((Na+Nb/2= 0。(對於亮度直流塊nC=-1nC=-2

(2) 非零係數個數TotalCoeffs=5

(3) 拖尾1的個數TrailingOnes =3(本來有4個,但最多隻能要3)

所以 coeff_token = 0000100

2.編碼拖尾1的符號(按逆序編碼)

01,所以得 011

3. 編碼剩餘非零係數(按逆序編碼)(參考h.264標準表9-6

3歸納成公式levelCode = 2*level-2(level>0),  levelCode=-2*level-1 (level<0)

1)對於係數1

由表3levelCode = 2*level-2 = 2*1-2 = 0

參照h.264標準9.2.2

因爲 !(TotalCoeffs>10 && TrailingOnes<3 ),所以sufixLength = 0

leveCode = ( Min( 15, level_prefix ) << suffixLength ) + level_suffix

=>  =  Min(15, level_prefix) << 0 + leve_suffix

所以 level_prefix=0 , level_suffix = 0

所以level(1)=1

2)對於係數3

由表3leveCode = 2*level-2 = 2*3-2 = 4

因爲 sufixLength = 0,所以sufixLength = 1

levelCode =  ( Min( 15, level_prefix ) << suffixLength ) + level_suffix

=>  4 = ( Min( 15, level_prefix ) << 1) + level_suffix

又因爲 level_suffix < (1<< suffixLength) = 1<<1 = 2

所以對level從小到大枚舉,滿足條件的只有 level_suffix = 2 , level_suffix = 0

所以Level(0) = 001(prefix)0(suffix)

4.編碼total_zeros(參考h.264標準表9-7

最後一個非零係數前0的個數 TotalZeros =3, TotalCoeffs=5

所以total_zeros = 111

5.編碼非零係數前的0遊程(按逆序編碼)(參考h.264標準表9-10

1)對於係數1

前面共有30,其中相鄰的0有一個,所以ZeroLeft =3,run_before =1,所以run_before(4) = 10

(2)對於係數-1

ZeroLeft =2,run_before =0,所以run_before(3) = 1

(3)對於係數-1

ZeroLeft =2,run_before =0,所以run_before(2) = 1

(4)對於係數1

ZeroLeft =2,run_before =1,所以run_before(1) = 01

(5)對於係數3

ZeroLeft =1,run_before =1,最後一個不用編碼。

至於解碼...(這裏省略)

發佈了28 篇原創文章 · 獲贊 2 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章