天天看点

H.264中CAVLC解码过程详解

实例解析

{0  3  -1  0

  0  -1  1  0

  1  0  0  0

  0  0  0  0}  NC = 1

编码后得到输出码流为: 0000 1000 1110 0101 1110 1101

解码详细过程如下:

1.       根据 Coeff_token 和 NC 查表 ( 见标准表 9-5) ,得到非零系数数目 TotalCoeffs 和拖尾系数数目 TrailingOnes

NC = 1 选择对应的表, Coeff_token 为 0000100 ,查表得到 TotalCoeffs=5 TrailingOnes="3"

输出序列:无

2.       解析拖尾系数

由第一步得到拖尾系数有 3 个,输入拖尾系数符号编码码流 011 ,得到两个拖尾系数由先到后是 1 , -1 , -1

输出序列: 1 , -1 , -1

3.       解析除拖尾系数外的非零系数的幅值( level )

(1)       确定后缀长度 SuffixLength

(2)       根据码流查表 9-6 得到前缀 LevelPrefix

(3)       根据前缀和后缀,得到 LevelCode=(levelprefix<<suffixlength)+levelsuffix

(4)       Levelcode 为偶数 level=(level+2)/2

Levelcode 为奇数 level=(-level-1)/2

(5)       根据设定的阈值确定是否 update Suffixlegth

回到例子中,按照逆序

i=0,Sufixlegth=0, 查表 9-6 , 1 对应的前缀 levelprefix=0 , levelcode=0, 计算得到 level=1,i++

i=1,sufixlegth=1, 查表 0010 对应的前缀 levelprefix=2, 计算 levelcode=4 , level=3,i++

i=2>=TotalCoeffs-TrailingOnes, 除拖尾系数外的非零系数解析完毕

输出序列: 3 , 1 , 1 , -1 , -1

4.       解析每个非零系数前零的个数

根据 TotalCoeffs=5 和输入码流 111 查表 9-7 得到 TotalZeros=3

初始 i=TotalCoeffs-1=4,zeroleft=TotalZeros=3,5 个非零系数前零的数目解析如下:

i=4,zeroleft=3, 根据码流 10 查表 9-10,runbefor=1, 输出序列: 3 , 1 , 1 , -1 , 0 , -1

i=3,zeroleft=3-1=2, 根据码流 1 查表 runbefore=0 ,输出序列: 3 , 1 , 1 , -1 , 0 , -1

i=2,zeroleft=2-0=2, 根据码流 1 查表 runbefore=0 ,输出序列: 3 , 1 , 1 , -1 , 0 , -1

i=1,zeroleft=2-0=2, 根据码流 01 查表 runbefore=1 ,输出序列: 3 , 0 , 1 , 1 , -1 , 0 , -1

i=0,zeroleft=2-1=1 ,输出序列: 0 , 3 , 0 , 1 , 1 , -1 , 0 , -1

5.       解码完毕,将剩下的元素用 0 补齐,反序排列就可以得到 4*4 矩阵。

继续阅读