CAVLC编码学习笔记

  • 参考资料
    • https://blog.csdn.net/a514223963/article/details/7898928
    • https://www.cnblogs.com/TaigaCon/p/5255018.html
  • 定义
    • 英文全名
      • Context-based Adaptive Variable Length Coding
    • 被用于亮度和色度残差数据编码;
    • 编码方式描述为ce(v)
    • 那么尽管在DCT时是以8x8块为单位进行的,在进行CAVLC时也会强制采用4x4块为单位进行编码,在进行熵编码之前,需要把4x4块的矩阵中的元素按照一定顺序重新排列成大小为16的序列。
    • zig-zag顺序扫描
    • 上下文
      • 体现在TotalCoeffs编码所需表格的选取,以及TrailingOnes的后缀长度(suffix_Length)
  • 组成,五个部分

    CAVLC编码学习笔记_第1张图片

    • 编码非零系数的数目(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编码序列。
  • 编码TrailingOnes的符号
    • 规则
      • 每个拖尾系数需要用一个bit表示它的符号。标准规定用0表示“+”,用1表示“-”。
    • 编码顺序
      • 按照扫描逆序进行,也就是从高频数据开始。
  • 编码除了拖尾系数之外的非零系数的幅值(level)
    • 编码顺序
      • 按照扫描逆序进行,也就是从高频数据开始。
    • 编码结果,分两部分
      • 前缀(level_prefix)
        • 码值需要根据level_prefix的值去参照标准中的表9-6
      • 后缀(level_suffix)
        • 码值就是level_suffix的二进制
    • 编码过程
      • 有符号的level转换为无符号的levelCode
      • levelCode的拆分
        • levelSuffixSize
          • 后缀level_suffix的实际长度
        • suffixLength
          • 在某些情况下,levelSuffixSize等于这个变量的值,suffixLength也用于计算前缀的值,它贯穿于整个CAVLC编码过程,会在一个宏块开始编码level时进行初始化(见下述标准中抓取的部分),并且在每个level编码后进行更新。
      • 更新suffixLength
  • 编码TotalZeros
    • TotalZeros
      • 最后一个非零系数前面的0的总数目
  • 编码RunBefore
    • RunBefore
      • 当前非零系数前面连续出现的0的个数
    • ZeroLeft
      • 当前非零系数前的0的总个数
      • 在一开始这个值会被赋值为TotalZeros。当ZeroLeft为0的时候意味着后续非零系数的RunBefore都为0,编码结束。
      • 根据RunBefore与ZeroLeft的值查表9-10得到码值。编码顺序也是逆序进行,编码次数最多为TotalCoeffs - 1。

你可能感兴趣的:(视频编解码)