- 参考资料
- 定义
- 英文全名
- Context-based Adaptive Variable Length Coding
- 被用于亮度和色度残差数据编码;
- 编码方式描述为ce(v)
- 那么尽管在DCT时是以8x8块为单位进行的,在进行CAVLC时也会强制采用4x4块为单位进行编码,在进行熵编码之前,需要把4x4块的矩阵中的元素按照一定顺序重新排列成大小为16的序列。
- zig-zag顺序扫描
- 上下文
- 体现在TotalCoeffs编码所需表格的选取,以及TrailingOnes的后缀长度(suffix_Length)
- 英文全名
- 组成,五个部分
- 编码非零系数的数目(TotalCoeffs)、拖尾系数(TrailingOnes)的数目;
- 编码拖尾系数的符号;
- 编码除了拖尾系数之外的非零系数的幅值(level);
- 编码最后一个非零系数前面的零的数目(TotalZeros);
- 编码每个非零系数前面连续的零的个数(RunBefore)。
- 编码TotalCoeffs和TrailingOnes
- TotalCoeffs
- 非零系数的数目。变换系数level中所有不为0的level的数目。
- TrailingOnes
- 拖尾系数的数目。指的是矩阵重排列后,序列末尾连续出现的±1的个数(中间可以间隔任意多个0)。如果±1的个数大于3个,则只有最后三个±1会被视为拖尾系数,其余的被视为普通的非零系数。
- 计算nC值
- 作用
- 寻找用于编码TotalCoeffs与TrailingOnes的码表
- 计算方式
- 除了色度的直流系数(Chroma DC)之外,其它系数类型的nC值是根据nA和nB求得
- nC
- number current,当前块值
- nA
- 当前块左边4x4块的非零系数数目
- nB
- 当前块上边4x4块的非零系数数目
- 作用
- 查表获得coeff_token编码
- 根据之前编码和计算过程所得的变量TotalCoeffs、TrailingOnes和nC值可以查H.264标准附录CAVLC码表,即可得出coeff_token编码序列。
- TotalCoeffs
- 编码TrailingOnes的符号
- 规则
- 每个拖尾系数需要用一个bit表示它的符号。标准规定用0表示“+”,用1表示“-”。
- 编码顺序
- 按照扫描逆序进行,也就是从高频数据开始。
- 规则
- 编码除了拖尾系数之外的非零系数的幅值(level)
- 编码顺序
- 按照扫描逆序进行,也就是从高频数据开始。
- 编码结果,分两部分
- 前缀(level_prefix)
- 码值需要根据level_prefix的值去参照标准中的表9-6
- 后缀(level_suffix)
- 码值就是level_suffix的二进制
- 前缀(level_prefix)
- 编码过程
- 有符号的level转换为无符号的levelCode
- levelCode的拆分
- levelSuffixSize
- 后缀level_suffix的实际长度
- suffixLength
- 在某些情况下,levelSuffixSize等于这个变量的值,suffixLength也用于计算前缀的值,它贯穿于整个CAVLC编码过程,会在一个宏块开始编码level时进行初始化(见下述标准中抓取的部分),并且在每个level编码后进行更新。
- levelSuffixSize
- 更新suffixLength
- 编码顺序
- 编码TotalZeros
- TotalZeros
- 最后一个非零系数前面的0的总数目
- TotalZeros
- 编码RunBefore
- RunBefore
- 当前非零系数前面连续出现的0的个数
- ZeroLeft
- 当前非零系数前的0的总个数
- 在一开始这个值会被赋值为TotalZeros。当ZeroLeft为0的时候意味着后续非零系数的RunBefore都为0,编码结束。
- 根据RunBefore与ZeroLeft的值查表9-10得到码值。编码顺序也是逆序进行,编码次数最多为TotalCoeffs - 1。
- RunBefore
CAVLC编码学习笔记
最新推荐文章于 2024-04-11 17:24:32 发布