CAVLC的过程

 

2
推荐
Q;CAVLC,Exp-Golomb的区别
A:Exp-Golomb的前缀和后缀根据阶数K的不同,可能是对称,后缀比前缀的长度多1等情况。
负数的情况下,通过公式(–1)k+1 Ceil( k÷2 ),把解析出来的哥伦布码值还原为原始的语法元素值;正数也有相应的对应方法。
CAVLC的前缀和后缀可能对称,也可能不对称,(大多数情况下都是不对称的)而且后缀还可以不存在,后缀的长度也是根据上下文环境来判断的,后缀的取值是根据编码表查询的,
对于正数,编码后的后缀部分的最后1 bit一定是0(若存在后缀);对于负数,其一定是1(若存在后缀)。
CAVLC与Exp-Golomb的前缀的表现形式都是1,01,001,0001......

Q:CAVLC的过程
A:
编码
4×4的残差块通过Zig-Zag扫描,得到一系列字符,如:0,3,0,1,-1,-1,0,1,0......
由此序列推导出以下变量:TotalCoeffs(全部的非零系数,包括拖尾系数),TotalZeros(最后一个非零系数前面的所有0的个数,方向为从左到右,比如上面的序列中,最后一个非零系数为1),TrailingOnes(托尾系数的个数,并规定不能超过3个),然后通过NC值查表,把
TotalCoeffs ,和TrailingOnes的组合进行编码,称为编码元素coeff_token。接下来,对每个拖尾系数的符合编码,0表示+,1表示负。再接下来,对剩下的非零系数编码(此时拖尾系数已经被编码了,不再包括),编码方向为从右到左,比如上面的序列中,先编码1,再编码3。这些系数被编码后,是由level_prefix和level_suffix两部分组成的。level_prefix的值通过查表得出,level_suffix是由若干个0组成,0的个数由suffixLength决定。再接着对TotalZeros的值编码。然后对RunBefore(每个非零系数前零的个数)进行编码,这个方向也是从右到左,并且最后一个(从左边数的第一个)非零系数前零的个数不需要编码,因为后面的编过后,剩下多少个0只有一个存放位置,就是最前面。
解码
由计算出的bit串长度读出相应的bits,通过查表得到TotalCoeffs和TrailingOnes的值,此时无输出,接着读取拖尾系数的符合,由编码的顺序知,先读到的是最后一个拖尾系数。解码完拖尾系数并依次输出,接下来是剩下的非零系数的值,通过查表解码并输出。然后解码TotalZeros,此时输出不变,仍为以前的解码值。接下来解码RunBefore,因为编码时是从右往左编的,故第一个解码出来的RunBefore应该插到第一个解码出的拖尾系数的前面,即插入的方向也是从右到左,最后一步时,剩下的RunBefore都插入到最前面。

你可能感兴趣的:(CAVLC的过程)