H.264(十)上下文自适应的变长编码CAVLC概念

概述:

我们知道,CAVLC的全称叫做“上下文自适应的变长编码Context-based Adaptive Variable Length Coding”。所谓“上下文自适应”,说明了CAVLC算法不是像指数哥伦布编码那样采用固定的码流-码字映射的编码,而是一种动态编码的算法,因而压缩比远远超过固定变长编码UVLC等算法。

在H.264标准中,CAVLC主要用于预测残差的编码。在本系列第二篇博文中我们给出了H.264的编码流图,其中可知,熵编码的输入为帧内/帧间预测残差经过变换-量化后的系数矩阵。以4×4大小的系数矩阵为例,经过变换-量化后,矩阵通常呈现以下特性:

  1. 经过变换量化后的矩阵通常具有稀疏的特性,即矩阵中大多数的数据已0为主。CAVLC可以通过游程编码高效压缩连续的0系数串;
  2. 经过zig-zag扫描的系数矩阵的最高频非0系数通常是值为±1的数据串。CAVLC可以通过传递连续的+1或-1的长度来高效编码高频分量;
  3. 非零系数的幅值通常在靠近DC(即直流分量)部分较大,而在高频部分较小;
  4. 矩阵内非0系数的个数同相邻块相关;

鉴于上述的特性3和4,针对待编码的系数在系数矩阵中不同的位置,以及相邻块的有关信息,在编码时采用不同的码表进行编码。CAVLC的这种特性,体现了命名中的“上下文自适应”的方法。

参考:

https://www.cnblogs.com/TaigaCon/p/5255018.html

https://www.cnblogs.com/TaigaCon/p/7018251.html

一、熵编码回顾

熵编码: 

  • 无损编码:解码后可无失真还原信源信息; 
  • 利用信源符号的概率特性,使编码后的信息尽可能接近信源的熵; 

常见熵编码方法: 

  • 变长编码:哈夫曼编码、香农-费诺编码、指数哥伦布编码; 
  • 算数编码;

二、CAVLC

上下文自适应的变长编码:
   用于亮度和色度预测残差的编码,以量化后的变换系数的形式;
   变换系数矩阵的特征:

  • 稀疏:矩阵元素以0为主;
  • 非零系数集中于低频;
  • 高频部分的非零系数大部分为±1;
  • 非零系数个数同相邻块有关;

CAVLC的上下文模型:

  • 编码非零系数的表格索引;
  • 更新编码非零系数时的后缀长度

三、CALVC的编码过程

编码需要的重要元素:

一般都是以4X4的宏块做编码,所以下面是0~16

  • 非零系数的个数(TotalCoeffs):取值范围为[0, 16],即当前系数矩阵中包括多少个非0值的元素;
  • 拖尾系数的个数(TrailingOnes):取值范围为[0, 3],表示最高频的几个值为±1的系数的个数,如果±1 的个数大于 3 个,
    只有最后 3 个被视为拖尾系数,其余的被视为普通的非零系数。
  • 拖尾系数的符号:以1 bit表示,0表示+,1表示-;
  • 当前块值(numberCurrent):用于选择编码码表,由上方和左侧的相邻块的非零系数个数计算得到。普通非0系数的幅值(level):幅值的编码分为prefix和suffix两个部分进行编码。编码过程按照反序编码,即从最高频率非零系数开始。
  • 最后一个非0系数之前的0的个数(TotalZeros);
  • 每个非0系数之前0的个数(RunBefore):按照反序编码,即从最高频非零系数开始;对于最后一个非零系数(即最低频的非零系数)前的0的个数,以及没有剩余的0系数需要编码时,不需要再继续进行编码。

四、系数矩阵Z形扫描

CAVLC对一个固定大小的系数矩阵进行编码,例如:

{
      3, 2, -1, 0,
      1, 0,  1, 0,
     -1, 0,  0, 0,
      0, 0,  0, 0,
}

扫描:

扫描重排之后得到一维数组:[3, 2, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

五 编码过程

  1. 确定当前块值nC,选择coeff_token的码表;
  2. 根据非零系数个数TotalCoeffs和拖尾系数个数TrailingOnes,编码coeff_token;
  3. 编码拖尾系数的符号;
  4. 编码拖尾系数之外的普通非零系数;
  5. 编码最末非零系数之前0的总个数;
  6. 编码每个非零系数之前的0的个数;

六 CAVLC解析残差过程

在编码残差时对宏块的分割:

  • cbp:表示一个8×8像素块是否进行编码;
  • block:CAVLC编码的基本单元为4×4,在一个cbp表示的块中进一步分割

使用CAVLC解析宏块残差语法元素的顺序:

  1. numCoeff, trailingOnes;
  2. levels;
  3. totalZeros;
  4. runBefore;

七、编码上下文的确定与相邻块的有效性

在解析coeffToken时,码表的选择依赖于上下文信息;
决定上下文的信息由相邻块获取,主要是块中非0系数的个数;
块的有效和无效:

  • Slice上边沿宏块的0、1、2、3号块,其上邻块无效;
  • Slice左边沿宏块的0、4、8、12号块,其左邻块无效;
  • Slice左上宏块的0号块,其左、上邻块均无效;

八、色度块、Intra16x16模式的解析

色度块、Intra16x16模式块的解析思想类似4x4亮度块:

  • 依次解析numCoeff、trailingOnes、trailingSigns、levels、totalZeros、runBefore;

不同之处:

  • 每个单元内系数数量最大值;
  • AC/DC是否分别解析;
  • nC值的计算方法;

九、不同分割模式的比较

                          

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值