H.264---CAVLC---基础篇

Posted qing1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H.264---CAVLC---基础篇相关的知识,希望对你有一定的参考价值。

转自:https://blog.csdn.net/jubincn/article/details/6948334

CAVLC(Context Adaptive VariableLength Coding)是在H.264/MPEG-4AVC中使用的熵编码方式。在H.264中,CAVLC以zig-zag顺序用于对变换后的残差块进行编码。CAVLC是CABAC的替代品,虽然其压缩效率不如CABAC,但CAVLC实现简单,并且在所有的H.264profile中都支持。

CAVLC的编码过程如下:

1、计算非零系数(TotalCoeffs)和拖尾系数(TrailingOnes)的数目。

拖尾系数指值为+1/-1的系数,最大数目为3。如果超过3个,那么只有最后三个被视为拖尾系数。拖尾系数的数目被赋值到变量TrailingOnes。
非零系数包括所有的拖尾系数,其数目被赋值到变量TotalCoeffs)。
2、计算nC(numberCurrent,当前块值)。

nC值由左边块的非零系数nA和上面块非零系数nB来确定,计算公式为:nC=round((nA+nB)/2);若nA存在nB不存在,则nC=nA;若nA不存在而nB存在,则nC=nB;若nA和nB都不存在,则nC=0。
nC值用于选择VLC编码表,如下图所示。这里体现了上下文相关(contextadaptive)的特性,例如当nC值较小即周围块的非零系数较少时,就会选择比较短的码,从而实现了数据压缩。

技术分享图片

 

3、查表获得coff_token的编码。

 

根据之前编码和计算过程所得的变量TotalCoeffs、TrailingOnes和nC值可以查H.264标准附录CAVLC码表,即可得出coeff_token编码序列。
4、编码每个拖尾系数的符号,按zig-zag的逆序进行编码。

每个符号用1个bit位来表示,0表示“+”,1表示“—”。
当拖尾系数超过三个时只有最后三个被认定为拖尾系数,引词编码顺序为从后向前编码。
5、编码除拖尾系数之外非零系数的level(Levels)。

每个非零系数的level包括sign和magnitude,扫描顺序是逆zig-zag序。
level的编码由前缀(level_prefix)和后缀(level_suffix)组成。前缀的长度在0到6之间,后缀的长度则可通过下面的步骤来确定:
将后缀初始化为0。(若非零系数的总数超过10且拖尾系数不到3,则初始化为1)。
编码频率最高(即按扫描序最后)的除拖尾系数之外的非零系数。
若这个系数的magnitude超过某个门槛值(threshold),则增加后缀的长度。下表是门槛值的列表:
6、编码最后一个非零系数之前0的个数(totalZeos)。

TotalZeros指的是在最后一个非零系数前零的数目,此非零系数指的是按照正向扫描的最后一个非零系数
根据TotalCoeffs值,H.264标准共提供了25个变长表格供查找,其中编码亮度数据时有15个表格供查找,编码色度DC2×2块(4:2:0格式)有3个表格、编码色度DC2×4块(4:2:2格式)有7个表格。
7、编码每个系数前面0的数目(run_before)。

扫描顺序为zig-zag的逆序。
若∑[run_before]== total_zeros,则不需再计算run_before
扫描序中的最后一个元素不需要计算run_before
每个run_before的VLC编码取决于run_before自身及未编码的0的个数ZerosLeft。例如若ZerosLeft== 2,那么run_before只可能是0,1或2,因此使用两个bit即可表示。



















以上是关于H.264---CAVLC---基础篇的主要内容,如果未能解决你的问题,请参考以下文章

Vue基础篇

Flutter基础篇——常用Widget

ELFK-基础篇

Android之WIFI-基础篇NativeDaemonConnector分析

详解CALCULATE系列-基础篇

快速入门Linux基础+环境配置+shell脚本