h.264 CAVLC example explaination

转载自 五岭之南
最终编辑 weiwei22844

对下面的block编码,假设该快上面和左边块的非零系数之和(Na+Nb=0,该块不是亮度直流块。h.264 CAVLC example explaination_第1张图片

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

h.264 CAVLC example explaination_第2张图片

获得码流 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

h.264 CAVLC example explaination_第3张图片

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,最后一个不用编码。

至于解码...(这里省略)

你可能感兴趣的:(h.264 CAVLC example explaination)