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