H.266/VVC相關技術學習筆記14:色度殘差聯合編碼技術

最近跟進了現有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所帶來的亮度增益還是可觀的,色度上的損失也不是很多,同時解碼端複雜度明顯降低。

發佈了89 篇原創文章 · 獲贊 68 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章