VVC量化

Posted Dillon2015

tags:

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

在VTM5中,最大QP变为63(HEVC中最大QP为51),且初始QP传输方式也相应改变。当slice segment layer里slice_qp_delta非零时SliceQpY 初值也要改变。 init_qp_minus26的范围变为( − 26 + QpBdOffsetY ) ~ +37。

在VTM5中,当变换块不是4的幂次时,在处理变换系数的同时修改QP或QP levelScale table而不是乘以√2(181/256或181/128)以补偿变换过程中的隐式缩放。

QP%6 012343
QscaleNormal blocks262142330220560183961638414564
invQScale 404551576472
QscaleCompensating blocks183961638414564131071165110280
invQScale 5764728090102

 

const int g_quantScales[2][SCALING_LIST_REM_NUM] = // can be represented as a 9 element table

     26214,23302,20560,18396,16384,14564 , //!<量化缩放MF
     18396,16384,14564,13107,11651,10280  // Note: last 3 values of second row == half of the first 3 values of the first row
;

const int g_invQuantScales[2][SCALING_LIST_REM_NUM] = // can be represented as a 9 element table

   40,45,51,57,64,72 , //!<反量化缩放MF
   57,64,72,80,90,102  // Note: last 3 values of second row == double of the first 3 values of the first row
;
  // for blocks that where width*height != 4^N, the effective scaling applied during transformation cannot be
    // compensated by a bit-shift (the quantised result will be sqrt(2) * larger than required).
    // The quantScale table and shift is used to compensate for this.
    const bool needSqrtAdjustment= TU::needsBlockSizeTrafoScale( tu, compID );
    const int defaultQuantisationCoefficient    = g_quantScales[needSqrtAdjustment?1:0][cQP.rem];
    int iTransformShift = getTransformShift(channelBitDepth, rect.size(), maxLog2TrDynamicRange) + ( needSqrtAdjustment?-1:0);

此外,和HEVC中标量量化一样VVC提出了一个新概念依赖标量量化(Dependent scalar quantization)。依赖标量量化是指变换系数的一组可容许的重构值依赖于重建顺序在当前变换系数级(transform coefficient level)之前的变换系数级的值。该方法的主要影响是相比于HEVC中非依赖标量量化,它的可允许的重建向量在N维向量空间(N表示变换块中变换系数的数量)中密度更大。这意味着,对于给定的每n维单位体积内可允许的重构向量的平均数目,输入向量与最近的重构向量之间的平均失真减少了。

依赖标量量化实现过程为:(a)定义两个不同重建水平的标量量化器;(b)定义两个标量量化器间的转换方式。

两个标量量化器分别表示为Q0和Q1,如上图所示。重建水平的位置由量化步长delta唯一确定。标量量化器(Q0或Q1)不在码流中显示传输。使用的量化器由编码/重建顺序在当前变换系数之前的变化系数层级的奇偶性决定。

如上图所示,两个标量量化器(Q0和Q1)间的转换由一个有4个状态的状态机实现。状态可以取4个不同的值:0,1,2,3。它由编码/重建顺序在当前变换系数之前的变化系数层级的奇偶性唯一决定。在变换块反量化的初始阶段状态设置为0。变换系数按扫描顺序(例如和熵解码顺序相同)重建。当当前变换系数重建后,它的状态按上图更新,k表示变换系数层级值。

VVC也支持传输默认的或用户定义的缩放矩阵。默认模式的缩放矩阵都是平的对所有尺寸的TB都等于16。目前IBC和帧内编码模式使用相同的缩放矩阵。对于用户定义的矩阵,MatrixType 和MatrixType_DC的数量按下面步骤更新:

  • MatrixType :30 = 2 (2 for intra&IBC/inter) x 3 (Y/Cb/Cr components) x 5(square TB size: from 4×4 to 64×64 for luma, from 2×2 to 32×32 for chroma)

  • MatrixType_DC : 14 = 2(2 for intra&IBC/inter × 1 for Y component) x 3 (TB size: 16×16, 32×32, 64×64) + 4(2 for intra&IBC/inter × 2 for Cb/Cr components) x 2(TB size: 16×16, 32×32)

默认缩放矩阵定义了4x4和8x8两种形式,16x16、32x32、64x64矩阵都是由8x8上采样得到。

//!<4x4
const int g_quantTSDefault4x4[4 * 4] =

  16,16,16,16,
  16,16,16,16,
  16,16,16,16,
  16,16,16,16
;
//!<帧内8x8
const int g_quantIntraDefault8x8[8 * 8] =

  16,16,16,16,17,18,21,24,
  16,16,16,16,17,19,22,25,
  16,16,17,18,20,22,25,29,
  16,16,18,21,24,27,31,36,
  17,17,20,24,30,35,41,47,
  18,19,22,27,35,44,54,65,
  21,22,25,31,41,54,70,88,
  24,25,29,36,47,65,88,115
;
//!<帧间8x8
const int g_quantInterDefault8x8[8 * 8] =

  16,16,16,16,17,18,20,24,
  16,16,16,17,18,20,24,25,
  16,16,17,18,20,24,25,28,
  16,17,18,20,24,25,28,33,
  17,18,20,24,25,28,33,41,
  18,20,24,25,28,33,41,54,
  20,24,25,28,33,41,54,71,
  24,25,28,33,41,54,71,91
;

当变换使用了高频置零操作时,缩放矩阵也要高频置零。

参考

JVET-N0246

JVET-N0847

感兴趣的请关注微信公众号Video Coding

 

以上是关于VVC量化的主要内容,如果未能解决你的问题,请参考以下文章

VVC的部署情况

VVC/VTM帧内编码主要流程图与划分函数

vvenc和vvdec

VVC码率控制中的质量依赖因子QDF

VVC码率控制中的质量依赖因子QDF

VTM10.0量化之一般量化技术