H.266/VVC技术学习:熵编码

在VVC中,与HEVC中的设计相比,CABAC包含以下主要变化:

  • Core CABAC engine
  • 分离变换块和变换跳过块的残差编码结构。
  • 变换系数的上下文建模

一、Core CABAC engine

HEVC中的CABAC engine 在64个不同的代表性概率状态之间使用基于表的概率转换过程。

在HEVC中,表示编码engine状态的范围ivlCurrRange在计算新的间隔范围之前被量化为一组4个值,将表示小概率符号(LPS)的概率pLPS量化为64个值,可以使用包含所有64x4的8位预计算值的表来实现HEVC状态转换,以近似ivlCurrRange*pLPS(pStateIdx)的值,其中pLPS是最小可能符号(LPS)的概率,pStateIdx是当前状态的索引。此外,可以使用预先计算的LUT(Look-Up-Table)来实现解码决策。使用LUT(查表)获得第一个ivlLpsRange,如下所示。然后,使用ivlLpsRange更新ivlCurrRange并计算输出binVal。

                                ivlLpsRange = rangeTabLps[ pStateIdx ][ qRangeIdx ]                        

在VVC中,概率用概率索引pStateIdx线性表示。所有的计算都可以用方程来完成,而不需要LUT运算。为了提高概率估计的精度,采用了多假设概率更新模型。二进制算术编码器中用于间隔细分的pStateIdx是pStateIdx0和pStateIdx1两种概率的组合。这两个概率与每个上下文模型相关联,并以不同的adaptation rates独立地更新。每个上下文模型的pStateIdx0和pStateIdx1的adaptation rates是基于相关bin的统计信息预先训练的。概率估计pStateIdx是两个假设估计的平均值。

下图展示了在VVC中解码单个二进制判决的流程图。

 和HEVC类似,VVC-CABAC需要在在每个slice的开始处调用的QP依赖的初始化过程。给定slice的luma Qp 的初始值,上下文模型的初始概率状态表示为preCtxState,如下所示

m = slopeIdx × 5 – 45                                                      

n = (offsetIdx << 3) +7                                                      

preCtxState = Clip3(1, 127, ((m × (QP − 32)) >> 4) + n)                      

 其中slopeIdx和offsetIdx限制为3位,总初始化值由6位精度表示。概率状态preCtxState表示线性域中的概率。因此,在输入算术编码引擎之前,preCtxState只需进行适当的移位操作,就可以保存对数到线性域的映射以及256字节的表。

pStateIdx0 = preCtxState << 3                                                

pStateIdx1 = preCtxState << 7                                                

二、变换系数熵编码 

在HEVC中,编码块的变换系数的是以4x4大小的非重叠系数组(CGs或subblocks)为单位进行编码,需要将较大的变换块(Transform Block,TB)分割为多个互不重叠的CG。

在VVC中,CG的大小的选择仅依赖于TB大小,即移除对通道类型channel type的依赖。因此,可以使用各种CG(1x16、2x8、8x2、2x4、4x2和16x1)。编码块内的CG和CG内的变换系数根据预定义的扫描顺序进行编码。

为了限制每个像素的上下文编码的bins的最大数量,使用TB的面积和颜色分量来导出TB的上下文编码bin的最大数量(Maximum number of context-coded bins,Mccb)。

  • 对于亮度TB,上下文编码bin(context-coded bins,CCB)的最大数量等于TB_zosize *1.75。
  • 对于色度TB,上下文编码bin(CCB)的最大数量等于TB_zosize *1.25。

这里,TB_zosize表示系数归零后TB内的像素数。注意,对于CCB计数,不考虑transform skip residual mode中的coded_sub_block_flag。

在HEVC中,残差编码是针对变换系数级的统计特性和信号特性而设计的,而在VVC中,变换系数和变换跳过(Transform Skip)系数分别采用了两种不同的残差编码结构。

2.1 变换系数的残差编码(Residual coding for transform coefficients)

在变换系数编码中,变量remBinsPass1首先被设置为上下文编码bins(CCB)的最大数目,并且每当使用上下文编码时remBinsPass1的值减少1。

Pass 1:编码的语法元素包括sig_coeff_flag、abs_level_gt1_flag、par_level_flag和abs_level_gt3_flag。(sig_coeff_flag表示当前位置是否存在非零系数;abs_level_gt1_flag表示当前非零系数的绝对值是否大于1;par_level_flag表示当前非零系数绝对值的奇偶性,par_level_flag=0代表偶数;abs_level_gt3_flag表示当前非零系数的绝对值是否大于3)。

当remBinsPass1大于或等于4时,上述语法元素使用上下文编码。

Pass 2:若Pass 1中编码完CG内的所有非零系数后,使用上下文编码的bin的数目不大于Mccb,则Pass 1中剩余的系数幅值信息语法元素abs_remainder=absLevel(非零系数幅值绝对值)-absLevel1进行Golomb-rice二进制化和旁路编码。

当在Pass 1中进行编码时remBinsPass1变得小于4时,在Pass 1编码的系数的剩余部分用abs_remainder的语法元素进行编码,在Pass 1中没有编码的系数在Pass 2中使用Golomb-Rice二进制化和旁路编码,语法元素为dec_abs_level,如下图所示。

Pass 3: 编码非零系数的符号。如果非零系数的符号为负,则使用旁路模式编码coeff_sign_flag=1,否则编码coeff_sign_flag=0。

remBinsPass1每个TB重置一次。对于sig_coeff_flag, abs_level_gt1_flag, par_level_flag, 和abs_level_gt3_flag,对剩余系数使用上下文编码的bins到使用旁路编码的bins的转换最多每TB发生一次。对于系数子块,如果remBinsPass1小于4,则通过使用旁路编码的bin对整个系数子块进行编码。

Pass 2和Pass 3使用统一(相同)rice参数(ricePar)派生。唯一的区别是,Pass 2和Pass 3的baseLevel分别设置为4和0。Rice参数的确定不仅基于局部模板中相邻五个变换系数的绝对水平之和,还考虑了相应的baseLevel,如下所示:

RicePara = RiceParTable[ max(min( 31, sumAbs − 5 * baseLevel), 0) ]                      

在第一个子块编码pass结束之后,剩余的每个待编码系数的绝对值由语法元素dec_abs_level编码,其对应于修改后的绝对电平值(absolute level value),其中零电平值被有条件地映射到非零值。在编码器端,语法元素dec_abs_level的值由绝对电平(absLevel)、相关量化器状态(QState)和rice参数值(RicePara)导出,如下所示:

ZeroPos = ( QState < 2? 1 : 2 ) << RicePara
if (absLevel == 0)
                dec_abs_level = ZeroPos
else
                dec_abs_level = (absLevel <= ZeroPos) ? (absLevel – 1) : absLevel

2.1 变换跳过系数的残差编码(Residual coding for transform skip)

与HEVC类似,VVC支持transform skip模式。亮度和色度块允许变换跳过模式。在变换跳过模式中,信号的统计特性不同于变换系数的统计特性,并且将变换应用于这种残差以实现低频分量周围的能量压缩通常不太有效。具有这种特征的残差通常出现在屏幕内容中,而不是自然的相机捕捉内容。

三、系数编码的上下文建模

与变换系数水平绝对值(absolute values of transform coefficient levels)有关的语法元素的概率模型的选择取决于局部邻域中绝对水平(absolute levels)或部分重构绝对水平(partially reconstructed absolute levels)的值,使用的模板如下图所示。

用于选择概率模型的模板的图。黑色方块指定当前扫描位置,蓝色方块表示使用的局部邻域。

 所选的概率模型取决于局部邻域中的绝对水平(或部分重构的绝对水平)和局部邻域中大于0的绝对水平的数目(由sig_coeff_flags等于1的数目给出)之和。上下文建模和二值化取决于local neighbourhood的以下:

  • numSig: the number of non-zero levels in the local neighbourhood 局部邻域的非零水平
  • sumAbs1: the sum of partially reconstructed absolute levels (absLevel1) after the first pass in the local neighbourhood Pass 1后局部邻域的部分重建的绝对水平(absLevel1)之和
  • sumAbs: the sum of reconstructed absolute levels in the local neighbourhood 局部邻域中重建的绝对水平之和
  • diagonal position (d): the sum of the horizontal and vertical coordinates of a current scan position inside the transform block 变换块内当前扫描位置的水平和垂直坐标之和
  • 基于numSig、sumAbs1和d的值,选择了编码sig_flag、par_flag, gt1_flag, and gt2_flag的概率模型。基于sumAbs和numSig的值选择用于二值化abs_remainder的Rice参数。

在VVC中,基于跳过高频系数的简化32点MTS(RMTS32)用于降低32点DST-7/DCT-8的计算复杂度,并且考虑到所有类型的零输出(即RMTS32和DCT2中高频分量的现有零输出),它伴随着系数编码的变化。具体地说,最后一个非零系数位置编码的二值化基于缩减的TU大小进行编码,最后一个非零系数位置编码的上下文模型选择由原始TU大小决定。

此外,还使用了60个上下文模型对变换系数的sig_coeff_flag进行编码。上下文模型索引的选择是基于一个最大的五个先前部分重建的绝对水平的总和,称为locSumAbsPass1,如下所示

If cIdx is equal to 0, ctxInc is derived as follows:

ctxInc = 12 * Max( 0, QState − 1 ) +                                          

Min( ( locSumAbsPass1 + 1 ) >> 1, 3 ) + ( d < 2  ?  8  :  ( d < 5  ?  4  :  0 ) )          

Otherwise (cIdx is greater than 0), ctxInc is derived as follows:

                          ctxInc = 36 + 8 * Max( 0, QState − 1) +

                                      Min( ( locSumAbsPass1 + 1 ) >> 1, 3 )  + ( d < 2  ?  4  :  0 )                       

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值