HEVC學習(二十七) —— 變換編碼之二

//! 用於significant_coeff_flag的上下文推導過程的模式選擇 draft 9.3.3.1.4
Int  TComTrQuant::calcPatternSigCtx( const UInt* sigCoeffGroupFlag, UInt posXCG, UInt posYCG, Int width, Int height )
{
  if( width == 4 && height == 4 ) return -1; //!< 不滿足計算pattern的條件

  UInt sigRight = 0;
  UInt sigLower = 0;

  /*
  **		x    a
  **		
  **		b
  */
  width >>= 2;
  height >>= 2;
  if( posXCG < width - 1 ) //!< draft (9-17)
  {
    sigRight = (sigCoeffGroupFlag[ posYCG * width + posXCG + 1 ] != 0); //!< coded_sub_block_flag[xS+1][yS]
  }
  if (posYCG < height - 1 )  //!< draft (9-18)
  {
    sigLower = (sigCoeffGroupFlag[ (posYCG  + 1 ) * width + posXCG ] != 0); //!< (coded_sub_block_flag[xS][yS+1] << 1)
  }
  return sigRight + (sigLower<<1); //!< draft (9-17) (9-18)
}

//! Derivation process of ctxIdxInc for the syntax element significant_coeff_flag (draft 9.3.3.1.4)
Int TComTrQuant::getSigCtxInc    (
                                   Int                             patternSigCtx,
                                   UInt                            scanIdx,
                                   Int                             posX,
                                   Int                             posY,
                                   Int                             log2BlockSize,
                                   Int                             width
                                  ,Int                             height
                                  ,TextType                        textureType
                                  )
{
  const Int ctxIndMap[16] =
  {
    0, 1, 4, 5,
    2, 3, 4, 5,
    6, 6, 8, 8,
    7, 7, 8, 8
  }; //!< Table 9-39 Specification of ctxIdxMap[i]

  if( posX + posY == 0 ) //!< draft (9-16)
  {
    return 0;
  }

  if ( log2BlockSize == 2 ) //!< draft (9-15)
  {
    return ctxIndMap[ 4 * posY + posX ];
  }
  //! draft (9-24)、(9-25)、(9-26)、(9-27)
  Int offset = log2BlockSize == 3 ? (scanIdx==SCAN_DIAG ? 9 : 15) : (textureType == TEXT_LUMA ? 21 : 12);

  Int posXinSubset = posX-((posX>>2)<<2); //!< xP = xC & 3
  Int posYinSubset = posY-((posY>>2)<<2); //!< yP = yC & 3
  Int cnt = 0;
  if(patternSigCtx==0) //!< prevCsbf == 0
  {
    cnt = posXinSubset+posYinSubset<=2 ? (posXinSubset+posYinSubset==0 ? 2 : 1) : 0; //!< draft (9-19)
  }
  else if(patternSigCtx==1) //!< prevCsbf == 1
  {
    cnt = posYinSubset<=1 ? (posYinSubset==0 ? 2 : 1) : 0; //!< draft (9-20)
  }
  else if(patternSigCtx==2) //!< prevCsbf == 2
  {
    cnt = posXinSubset<=1 ? (posXinSubset==0 ? 2 : 1) : 0; //!< draft (9-21)
  }
  else
  {
    cnt = 2; //!< draft (9-22)
  }

  return (( textureType == TEXT_LUMA && ((posX>>2) + (posY>>2)) > 0 ) ? 3 : 0) + offset + cnt; //!< draft (9-23)
}

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