Newer
Older
{
rate += fracBitsGt1.intBits[1];
rate += fracBitsPar.intBits[( absLevel - 2 ) & 1];
#if JVET_P0072_SIMPLIFIED_TSRC
numCtxBins += 2;
#endif
int cutoffVal = 2;
const int numGtBins = 4;
for( int i = 0; i < numGtBins; i++ )
{
if( absLevel >= cutoffVal )
{
const uint16_t ctxGtX = cctx.greaterXCtxIdAbsTS( cutoffVal>>1 );
const BinFracBits &fracBitsGtX = fracBitsAccess.getFracBitsArray( ctxGtX );
unsigned gtX = ( absLevel >= ( cutoffVal + 2 ) );
rate += fracBitsGtX.intBits[gtX];
#if JVET_P0072_SIMPLIFIED_TSRC
numCtxBins++;
#endif
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
}
cutoffVal += 2;
}
if( absLevel >= cutoffVal )
{
uint32_t symbol = ( absLevel - cutoffVal ) >> 1;
uint32_t length;
const int threshold = COEF_REMAIN_BIN_REDUCTION;
if( symbol < ( threshold << ricePar ) )
{
length = symbol >> ricePar;
rate += ( length + 1 + ricePar ) << SCALE_BITS;
}
else if( useLimitedPrefixLength )
{
const uint32_t maximumPrefixLength = ( 32 - ( COEF_REMAIN_BIN_REDUCTION + maxLog2TrDynamicRange ) );
uint32_t prefixLength = 0;
uint32_t suffix = ( symbol >> ricePar ) - COEF_REMAIN_BIN_REDUCTION;
while( ( prefixLength < maximumPrefixLength ) && ( suffix > ( ( 2 << prefixLength ) - 2 ) ) )
{
prefixLength++;
}
const uint32_t suffixLength = ( prefixLength == maximumPrefixLength ) ? ( maxLog2TrDynamicRange - ricePar ) : ( prefixLength + 1/*separator*/ );
rate += ( COEF_REMAIN_BIN_REDUCTION + prefixLength + suffixLength + ricePar ) << SCALE_BITS;
}
else
{
length = ricePar;
symbol = symbol - ( threshold << ricePar );
while( symbol >= ( 1 << length ) )
{
symbol -= ( 1 << ( length++ ) );
}
rate += ( threshold + length + 1 - ricePar + length ) << SCALE_BITS;
}
}
}
else if( absLevel == 1 )
{
rate += fracBitsGt1.intBits[0];
#if JVET_P0072_SIMPLIFIED_TSRC
numCtxBins++;
#endif
}
else
{
rate = 0;
}
return rate;
}