最近跟进了现有VTM5.0中关于色度残差编码的相关细节,在VTM5.0中新加入了CbCr分量残差联合编码的技术。
应该是研究统计发现,以往的版本中Cb和Cr残差彼此呈相反的关系,因此建议利用这种现象并引入一种用于色度残差的联合编码的模式。在这种联合模式中,对于TU的两个色度块只有一个残差。该联合的残差放置到Cb的预测块中,并从Cr的预测块中扣除(即Cr的预测快中没有残差数据,因此也不用进行变换量化编码)。在以前的色度残差编码中,CbCr块各自的残差放置在各自的预测块内,然后分别去变换量化编码。
如果Cb和Cr的编码块标志(CBF)是true,则联合残差模式开启。如果该模式启动,则解码单个残差块(即Cb块)。联合残差块的比特流语法和解码过程遵循VMT4.0中的Cb块残差。Cr块的残差是通过对联合残差取反生成的。
该模式的解码端中的实现如下:
New function:
void CABACReader::joint_cb_cr( TransformUnit& tu )
{
//解码传过来的残差码流
tu.jointCbCr = m_BinDecoder.decodeBin( Ctx::JointCbCrFlag( 0 ) );
}
Added in CABACReader::residual_coding:
// Joint Cb-Cr residual mode is signalled if both Cb and Cr cfbs are true
//如果CbCr的CBF都为ture,那么联合残差模式则开启
if ( compID == COMPONENT_Cr && TU::getCbf( tu, COMPONENT_Cb ) )
{
joint_cb_cr( tu );
// No Cr residual in bitstream in joint Cb-Cr residual mode
if ( tu.jointCbCr )
return;
}
Added in DecCu::xIntraRecBlk and DecCu::xDecodeInterTU:
// Cr uses negative of the signalled Cb residual
if ( tu.jointCbCr && compID == COMPONENT_Cr )
//对Cb预测块处的联合残差取反就能求出Cr预测块的残差
piResi.copyAndNegate( cs.getResiBuf( tu.blocks[COMPONENT_Cb] ) );
else
说了这么多,那么联合色度残差到底 怎么计算的呢?
其实很简单,如下公式所示,实际就是对Cb和Cr的残差求平均,相当于起到了平滑的效果:
resJoint = (resCb – resCr) / 2
式中之所以用减号,是因为Cb和Cr残差近似成相反的关系,且Cb残差为正,Cr残差为负。
下表总结了通用测试条件(CTC)和低QP下测试的结果。在低QP测试中,使用{ 2, 7, 12,17 }的QP集对100帧进行编码。

从以上两个测试结果显示,两种测试条件下的编码时间都有明显上升,每个点的残差平均操作提升了编码端复杂度,而且这种联合残差模式是和原来的单残差编码模式处于竞争的关系,因此会多一轮RDcost计算,所以编码复杂度肯定是有所上升的。
似乎对于更小的Qp,该方案对于色度的增益效果下降比较明显,QP越小,本身残差在变换量化过程中的损失就很小,因此色度单独编码和联合编码对色度PSNR的影响也比较相近,联合平均的操作带来的性能增益并不明显,甚至还有所下降,即使码率降低很多,也无法弥补色度PSNR的损失,但是解码端的解码时间降低比较明显;
对于CTC,由于大QP的色度残差在经过变换量化之后的损失就比较大,因此联合残差编码的平均操作能够在一定程度上弥补单独编码在量化过程中的一些信息损失,并且由于码率的降低,综合性能的色度增益就很明显
之所以要选择小QP估计是考虑到解码复杂度的问题,在性能和复杂度之间做的一个权衡,小的QP所带来的亮度增益还是可观的,色度上的损失也不是很多,同时解码端复杂度明显降低。

本文介绍了VTM5.0中新增的CbCr分量残差联合编码技术,通过将Cb和Cr残差求平均来减少信息损失,提升编码效率。在不同QP设置下,该技术对编码时间和色度PSNR的影响各异。
828

被折叠的 条评论
为什么被折叠?



