变换编码(二)

//! 用于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)  
}  


你可能感兴趣的:(HM)