H.264/AVC中CAVLC编码方法简介
一 名词
TotalCoeffs:全部非零系数个数。(0~16)
TotalZeros:最后一个非零系数前的零的个数。
TrailingOnes:拖尾系数(即+1)的个数。(0~3)
NC:当前块值。除色度的直流系数外(常数-1),其它系数类型NC值是根据当前左边4x4块的非零系数数目(NA)和当前块上面4x4的非零系数的数目(NB求得的。
计算NC的值
上面的块(NB) |
左达的块(NA) |
NC |
X |
X |
(NA+NB)/2 |
X |
|
NA |
|
X |
NB |
|
|
0 |
选择非零系数个数和拖尾系数个数的编码表格(表格见毕书附录):
NC |
表格 |
0<=NC<2 |
变长表格1 |
2<=NC<4 |
变长表格2 |
5<=NC<8 |
变长表格3 |
NC=-1 |
变长表格4 |
NC>=8 |
定长表格 |
二 编码过程
1. 对TotalCoeffs和TrailingOnes进行组合编码,称为Coeff_token。
2. 对拖尾系数的符号进行编码,+为1,-为0,从右向左。
3. 对非零系数(不包括拖尾系数,拖尾系数已经编码)进行编码,从右向左。
4. 对TotalZeros进行编码。
5. 对非零系数前的零的个数进行编码,从右向左,最后一个(从左边数第一个)非零系数前的零的个数不需要编码(剩下的零都是这个位置的)。
以下4x4块为例(毕书P123,原例有误):
0 0 -1 0
5 2 0 0
3 0 0 0
1 0 0 0
Z扫描完成后: 0,0,5,3,2,-1,0,0,0,1…
No |
元素 |
数值 |
编码 |
说明 |
1 |
Coeff_token |
TotalCoeffs=5,TrailingOnes=2 |
0000101 |
TotalCoeffs ,和TrailingOnes的组合进行编码 |
2-1 |
TrailingOnes_sign_flag |
+ |
1 |
拖尾系数的符号,从右向左 |
2-2 |
TrailingOnes_sign_flag |
- |
0 |
|
3-1 |
Level(2) |
1(suffixLength=0) |
1 |
|
3-2 |
Level(1) |
3(suffixLength=1) |
0010 |
|
3-3 |
Level(0) |
5(suffixLength=1) |
000010 |
|
4 |
Total_zeros |
5 |
101 |
|
5-1 |
Run_before(4) |
ZeroLeft=5, run_before=3 |
010 |
|
5-2 |
Run_before(3) |
ZeroLeft=2, run_before=0 |
1 |
|
5-3 |
Run_before(2) |
ZeroLeft=2, run_before=0 |
1 |
|
5-4 |
Run_before(1) |
ZeroLeft=2, run_before=0 |
1 |
|
5-5 |
Run_before(0) |
ZeroLeft=2, run_before=2 |
|
最后一个不需要编码 |
编码输出:00001011010010000010101010111