Skip to content
Snippets Groups Projects
QuantRDOQ.cpp 75.5 KiB
Newer Older
  • Learn to ignore specific revisions
  •   {
        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
    
          }
          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