标签:git 数据 gone gns 前缀 变换 简单 视频教程 number
在H.264的解码器在解析宏块的残差数据时,其流程类似于上文提到的CAVLC编码的逆过程。在解析一个宏块残差的时候,首先解析的是残差矩阵的非零系数以及拖尾系数的个数numCoeff和trailingOnes。随后是每一个拖尾系数的符号trailingSigns。而后是每一个非拖尾非零系数level的值。然后解析的是最高频非零系数前面的零的总个数totalZeros。最后是每一个非零系数前连续零的个数runBefore。
CAVLC编解码过程中的上下文即为当前块值numberCurrent。该值与当前像素块的左侧邻块和上方邻块中非零系数的个数有关。
以尺寸为4×4宏块分割方式为例。当前像素块同左侧和上方邻块的相对位置关系如下图:
对于当前像素块,若其上方和左侧相邻块都不可见(unavailable),那么当前像素块的numberCurrent值为0;若上方或左侧,有且仅有一个相邻块是可见的,那么当前像素块的numberCurrent值即为这个邻块中非零系数的个数numCoeff;若两个邻块都是可见的,那么当前像素块的numberCurrent值为两个邻块numCoeff的四舍五入平均值。
在CAVLC的解析过程中,非零系数总个数numCoeff和拖尾系数个数trailingOnes两个值是一起解析出来的。解析这两个值依据的是标准文档中的表9-5,如下表即是表9-5的部分:
根据之前解析出来的numberCurrent值,在这个表格中选择一列作为解码数据的参考。此后,从码流中读取相应长度的二进制码流,与表格中的值相比较。当码流与表格中的值匹配时,表格的前两列作为数组的下标,其值即等于希望解析出来的numCoeff和trailingOnes的值。
我们知道变换系数矩阵中最高频的几个绝对值为1的非零系数称之为拖尾系数,其个数范围为0~3个。表示每一个拖尾系数的符号可以一个bit的trailing_ones_sign_flag表示:
非拖尾的非零系数的幅值通常表示为levels。Levels的解析相对较为复杂。该部分是从最高频开始解析到最低频的非零系数为止。也就是说,levels部分是按频率倒序解析的。
在解析每一个level的时候,每一个值都会按照前缀(prefix)和后缀(suffix)两部分进行解析。
Level_prefix部分即level的前缀部分,该部分的解析较为简单,以伪代码表示如:
leadingZeroBits = ?1
for( b = 0; !b; leadingZeroBits++ )
b = read_bits( 1 )
level_prefix = leadingZeroBits
结合标准文档中的表9-6的表述可知,level的前缀值即为当前码流的下一个比特1之前连续的比特0的个数。
Level_suffix部分的解析比prefix部分复杂,总体上可以分为以下几个步骤:
在解析完成level_prefix和level_suffix之后,将二者组合生成levelCode。计算方法为:levelCode=(Min(15,level_prefix)<
根据计算得到的levelCode的奇偶性,判断level的符号:
在解析过程中更新suffixLength体现了上下文自适应的思想。
变换系数矩阵中的零系数也是重要的信息。CAVLC解析的零系数信息主要分两类:
解析totalZeros的过程与解析numCoeff和trailingOnes类似,都是从一个二维表格中查找某列表格,在从码流中查找与表格中匹配的值,然后索引便是所求的totalZeros值。解析totalZeros的表格为标准文档中的表9-7。下图是表9-7的局部:
在解析totalZeros的过程中,选择表格的索引值等于当前矩阵块的非零系数个数numCoeff。
解析每个非零系数的runBefore时,也是按照从高频到低频逆序处理的。每次解析的runBefore也是按照类似上述的解析方法,从码流中读取相应长度的码流并与表格中的值比对,匹配后返回索引值作为解析的值。解析runBefore参考标准文档的表9-10:
每次解析出一个runBefore后,totalZeros都要减去该值,然后进行下一次处理。若有n个非零系数,则总共需要解析n-1个runBefore。最低频率的非零系数前的runBefore不需要写在码流中,因为可以通过上述信息推算出。
以上就是解析一个宏块的4×4残差系数矩阵相应语法元素的主要思想和过程。当然实际的解析过程比此要复杂得多,更详细的情况可到CSDN学院的课程:H.264/AVC视频编解码技术详解中观看。
【H.264/AVC视频编解码技术详解】十三、熵编码算法(4):H.264使用CAVLC解析宏块的残差数据
标签:git 数据 gone gns 前缀 变换 简单 视频教程 number
原文地址:http://blog.csdn.net/shaqoneal/article/details/67681663