Skip to content
Snippets Groups Projects
QuantRDOQ.cpp 40.8 KiB
Newer Older
  • Learn to ignore specific revisions
  •     int lastCG = -1;
        int absSum = 0 ;
        int n ;
    
        for( int subSet = (uiWidth*uiHeight-1) >> cctx.log2CGSize(); subSet >= 0; subSet-- )
        {
          int  subPos         = subSet << cctx.log2CGSize();
          int  firstNZPosInCG = iCGSizeM1 + 1, lastNZPosInCG = -1;
          absSum = 0 ;
    
          for( n = iCGSizeM1; n >= 0; --n )
          {
            if( piDstCoeff[ cctx.blockPos( n + subPos )] )
            {
              lastNZPosInCG = n;
              break;
            }
          }
    
          for( n = 0; n <= iCGSizeM1; n++ )
          {
            if( piDstCoeff[ cctx.blockPos( n + subPos )] )
            {
              firstNZPosInCG = n;
              break;
            }
          }
    
          for( n = firstNZPosInCG; n <= lastNZPosInCG; n++ )
          {
            absSum += int(piDstCoeff[ cctx.blockPos( n + subPos )]);
          }
    
          if(lastNZPosInCG>=0 && lastCG==-1)
          {
            lastCG = 1;
          }
    
          if( lastNZPosInCG-firstNZPosInCG>=SBH_THRESHOLD )
          {
            uint32_t signbit = (piDstCoeff[cctx.blockPos(subPos+firstNZPosInCG)]>0?0:1);
            if( signbit!=(absSum&0x1) )  // hide but need tune
            {
              // calculate the cost
              int64_t minCostInc = std::numeric_limits<int64_t>::max(), curCost = std::numeric_limits<int64_t>::max();
              int minPos = -1, finalChange = 0, curChange = 0;
    
              for( n = (lastCG == 1 ? lastNZPosInCG : iCGSizeM1); n >= 0; --n )
              {
                uint32_t uiBlkPos   = cctx.blockPos( n + subPos );
                if(piDstCoeff[ uiBlkPos ] != 0 )
                {
                  int64_t costUp   = rdFactor * ( - deltaU[uiBlkPos] ) + rateIncUp[uiBlkPos];
                  int64_t costDown = rdFactor * (   deltaU[uiBlkPos] ) + rateIncDown[uiBlkPos]
                    -   ((abs(piDstCoeff[uiBlkPos]) == 1) ? sigRateDelta[uiBlkPos] : 0);
    
                  if(lastCG==1 && lastNZPosInCG==n && abs(piDstCoeff[uiBlkPos])==1)
                  {
                    costDown -= (4<<SCALE_BITS);
                  }
    
                  if(costUp<costDown)
                  {
                    curCost = costUp;
                    curChange =  1;
                  }
                  else
                  {
                    curChange = -1;
                    if(n==firstNZPosInCG && abs(piDstCoeff[uiBlkPos])==1)
                    {
                      curCost = std::numeric_limits<int64_t>::max();
                    }
                    else
                    {
                      curCost = costDown;
                    }
                  }
                }
                else
                {
                  curCost = rdFactor * ( - (abs(deltaU[uiBlkPos])) ) + (1<<SCALE_BITS) + rateIncUp[uiBlkPos] + sigRateDelta[uiBlkPos] ;
                  curChange = 1 ;
    
                  if(n<firstNZPosInCG)
                  {
                    uint32_t thissignbit = (plSrcCoeff[uiBlkPos]>=0?0:1);
                    if(thissignbit != signbit )
                    {
                      curCost = std::numeric_limits<int64_t>::max();
                    }
                  }
                }
    
                if( curCost<minCostInc)
                {
                  minCostInc = curCost;
                  finalChange = curChange;
                  minPos = uiBlkPos;
                }
              }
    
              if(piDstCoeff[minPos] == entropyCodingMaximum || piDstCoeff[minPos] == entropyCodingMinimum)
              {
                finalChange = -1;
              }
    
              if(plSrcCoeff[minPos]>=0)
              {
                piDstCoeff[minPos] += finalChange ;
              }
              else
              {
                piDstCoeff[minPos] -= finalChange ;
              }
            }
          }
    
          if(lastCG==1)
          {
            lastCG=0 ;
          }
        }
      }
    #endif
    }
    
    //! \}