对下面的block编码,假设该快上面和左边块的非零系数之和(Na+Nb)=0,该块不是亮度直流块。![h.264 CAVLC example explaination_第1张图片](http://img.e-com-net.com/image/info5/01723c0c29434430a6c6a50f944d73a0.jpg)
Z-Z重排序 0,3,0,1,-1,-1,0,1,0…..
![h.264 CAVLC example explaination_第2张图片](http://img.e-com-net.com/image/info5/50a04243ecfb48aaab8b1bd81c5c6b34.jpg)
获得码流 00010001110010111101101。
下面详细分析编码过程
1.编码coeff_token。(参考H.264标准9.21表9-5)
(1) nC=round((Na+Nb)/2)= 0。(对于亮度直流块nC=-1或nC=-2)
(2) 非零系数个数TotalCoeffs=5
(3) 拖尾1的个数TrailingOnes =3。(本来有4个,但最多只能要3个)
所以 coeff_token = “0000100”。
2.编码拖尾1的符号(按逆序编码)
正0负1,所以得 “011”
3. 编码剩余非零系数(按逆序编码)(参考h.264标准表9-6)
![h.264 CAVLC example explaination_第3张图片](http://img.e-com-net.com/image/info5/cc06eb6273774677b4a85ccdbaedcd9b.jpg)
表3归纳成公式levelCode = 2*level-2(level>0), levelCode=-2*level-1 (level<0)
(1)对于系数1。
由表3,levelCode = 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。
由表3,leveCode = 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
前面共有3个0,其中相邻的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,最后一个不用编码。
至于解码…...(这里省略)