CAVLC
基于上下文自适应的可变长编码
 
主要用于4×4子块残差数据(经过变换,量化后)的编码。
 
残差数据经过变换,量化后的数据表现出如下特性:
  1. 非零系数主要集中在低频部分,高频部分大部分是0
  2. 量化后的数据经过 zig-zag扫描,DC系数附近的非零系数值较大,高频位置上的非零系数大部分是+1和-1
  3. 相邻的4×4块的非零系数的数目是相关的
在CAVLC中,上下文模型的选择主要体现在两个方面:
  1. 非零系数编码所需表格的选择
  2. 拖尾系数后缀长度的更新

 
具体的编码过程:
  1. 对非零系数数目 TotalCoeffs 以及拖尾系数的数目 TrailingOnes进行编码
步骤1约定如下:
  • 非零系数范围0~16,
  • 拖尾系数数目范围0~3.
  • 如果+1,-1的总个数大于3,那么只有最后三个被视为拖尾系数
对这两个元素的编码是通过查表法。共有四个变长表格和1个定长表格可供选择。
其中,定长表格的码字长6比特,高4位表示非零系数个数,低两位表示拖尾系数个数。
 
为了选择合适的表格,现在定义一个变量NC。
  • 待编码数据为 色度分量的直流系数时 NC= -1
  • 其他情况 NC由下表决定
 
 NB
 NA
NC 
 X
 X
 (NA+NB)/2
 X
 
 NA
 
 X
 NB
 
 
 0
表中变量定义如下:
  • NA 为待编码块左边的4×4块的非零系数数目
  • NB为待编码块上边的4×4块的非零系数数目
  • X 表示与当前待编码块 属于同一个片而且可用
OK,现在NC值已经获得了,下面就可以选择表格了。
 NC
 表格
 0<=NC<2
 变长表格1
 2<=NC<4
 变长表格2
 4<=NC<8
 变长表格3
 NC=-1
 变长表格4
 NC>=8
 定长表格
 
表格在此就不列出了。
 
 
     2.对每个拖尾系数的符号进行编码
         其中0表示正,1表示负。编码顺序是按照反向扫描顺序,从高频区开始
 
     3.对除拖尾系数外,非零系数的幅值进行编码
     4.对最后一个非零系数前零的数目TotalZeros进行编码
          例如:一串数 0 0 5 0 3 0 0 0 1 0 0 -1 0 0 0 0
          最后一个非零系数是-1,故TotolZeros=2+1+3+2=8
   
     5.对每个非零系数前零的个数RunBefore进行编码
        RunBefore在以下两种情况下是不需要编码的:
  • 最后一个非零系数(低频位置上)前零的个数
  • 如果没有剩余的零需要编码,就没有必要再进行RunBefore的编码