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