Changeset 1404 in SHVCSoftware for branches/SHM-dev


Ignore:
Timestamp:
4 Aug 2015, 04:07:09 (9 years ago)
Author:
seregin
Message:

port rev 4557

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-dev/source/Lib/TLibEncoder/TEncSearch.cpp

    r1403 r1404  
    346346    Distortion uiBitCost = m_pcRdCost->getCost( iSearchX, iSearchY );
    347347
    348     if ( m_cDistParam.iRows > 32 )
    349     {
    350       m_cDistParam.iSubShift = 4;
    351     }
    352     else if ( m_cDistParam.iRows > 16 )
    353     {
    354       m_cDistParam.iSubShift = 3;
    355     }
    356     else if ( m_cDistParam.iRows > 8 )
    357     {
    358       m_cDistParam.iSubShift = 2;
    359     }
    360     else
    361     {
    362       m_cDistParam.iSubShift = 1;
    363     }
    364 
    365     Distortion uiTempSad = m_cDistParam.DistFunc( &m_cDistParam );
    366     if((uiTempSad + uiBitCost) < rcStruct.uiBestSad)
    367     {
    368       uiSad += uiTempSad >>  m_cDistParam.iSubShift;
    369       while(m_cDistParam.iSubShift > 0)
    370       {
    371         isubShift         = m_cDistParam.iSubShift -1;
    372         m_cDistParam.pOrg = pcPatternKey->getROIY() + (pcPatternKey->getPatternLStride() << isubShift);
    373         m_cDistParam.pCur = piRefSrch + (rcStruct.iYStride << isubShift);
    374         uiTempSad = m_cDistParam.DistFunc( &m_cDistParam );
     348    // Skip search if bit cost is already larger than best SAD
     349    if (uiBitCost < rcStruct.uiBestSad)
     350    {
     351      if ( m_cDistParam.iRows > 32 )
     352      {
     353        m_cDistParam.iSubShift = 4;
     354      }
     355      else if ( m_cDistParam.iRows > 16 )
     356      {
     357        m_cDistParam.iSubShift = 3;
     358      }
     359      else if ( m_cDistParam.iRows > 8 )
     360      {
     361        m_cDistParam.iSubShift = 2;
     362      }
     363      else
     364      {
     365        m_cDistParam.iSubShift = 1;
     366      }
     367
     368      Distortion uiTempSad = m_cDistParam.DistFunc( &m_cDistParam );
     369      if((uiTempSad + uiBitCost) < rcStruct.uiBestSad)
     370      {
    375371        uiSad += uiTempSad >>  m_cDistParam.iSubShift;
    376         if(((uiSad << isubShift) + uiBitCost) > rcStruct.uiBestSad)
    377         {
    378           break;
    379         }
    380 
    381         m_cDistParam.iSubShift--;
    382       }
    383 
    384       if(m_cDistParam.iSubShift == 0)
    385       {
    386         uiSad += uiBitCost;
    387         if( uiSad < rcStruct.uiBestSad )
    388         {
    389           rcStruct.uiBestSad      = uiSad;
    390           rcStruct.iBestX         = iSearchX;
    391           rcStruct.iBestY         = iSearchY;
    392           rcStruct.uiBestDistance = uiDistance;
    393           rcStruct.uiBestRound    = 0;
    394           rcStruct.ucPointNr      = ucPointNr;
    395           m_cDistParam.m_maximumDistortionForEarlyExit = uiSad;
     372        while(m_cDistParam.iSubShift > 0)
     373        {
     374          isubShift         = m_cDistParam.iSubShift -1;
     375          m_cDistParam.pOrg = pcPatternKey->getROIY() + (pcPatternKey->getPatternLStride() << isubShift);
     376          m_cDistParam.pCur = piRefSrch + (rcStruct.iYStride << isubShift);
     377          uiTempSad = m_cDistParam.DistFunc( &m_cDistParam );
     378          uiSad += uiTempSad >>  m_cDistParam.iSubShift;
     379          if(((uiSad << isubShift) + uiBitCost) > rcStruct.uiBestSad)
     380          {
     381            break;
     382          }
     383
     384          m_cDistParam.iSubShift--;
     385        }
     386
     387        if(m_cDistParam.iSubShift == 0)
     388        {
     389          uiSad += uiBitCost;
     390          if( uiSad < rcStruct.uiBestSad )
     391          {
     392            rcStruct.uiBestSad      = uiSad;
     393            rcStruct.iBestX         = iSearchX;
     394            rcStruct.iBestY         = iSearchY;
     395            rcStruct.uiBestDistance = uiDistance;
     396            rcStruct.uiBestRound    = 0;
     397            rcStruct.ucPointNr      = ucPointNr;
     398            m_cDistParam.m_maximumDistortionForEarlyExit = uiSad;
     399          }
    396400        }
    397401      }
     
    411415    uiSad = m_cDistParam.DistFunc( &m_cDistParam );
    412416
    413     // motion cost
    414     uiSad += m_pcRdCost->getCost( iSearchX, iSearchY );
    415 
     417    // only add motion cost if uiSad is smaller than best. Otherwise pointless
     418    // to add motion cost.
    416419    if( uiSad < rcStruct.uiBestSad )
    417420    {
    418       rcStruct.uiBestSad      = uiSad;
    419       rcStruct.iBestX         = iSearchX;
    420       rcStruct.iBestY         = iSearchY;
    421       rcStruct.uiBestDistance = uiDistance;
    422       rcStruct.uiBestRound    = 0;
    423       rcStruct.ucPointNr      = ucPointNr;
    424       m_cDistParam.m_maximumDistortionForEarlyExit = uiSad;
     421
     422      // motion cost
     423      uiSad += m_pcRdCost->getCost( iSearchX, iSearchY );
     424
     425      if( uiSad < rcStruct.uiBestSad )
     426      {
     427        rcStruct.uiBestSad      = uiSad;
     428        rcStruct.iBestX         = iSearchX;
     429        rcStruct.iBestY         = iSearchY;
     430        rcStruct.uiBestDistance = uiDistance;
     431        rcStruct.uiBestRound    = 0;
     432        rcStruct.ucPointNr      = ucPointNr;
     433        m_cDistParam.m_maximumDistortionForEarlyExit = uiSad;
     434      }
    425435    }
    426436  }
     
    31853195#endif
    31863196
    3187     //  Bi-directional prediction
     3197    //  Bi-predictive Motion estimation
    31883198#if REF_IDX_ME_ZEROMV
    31893199    if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) && !(pcCU->getSlice()->getMvdL1ZeroFlag() && bestBiPDist == MAX_INT) )
     
    38253835
    38263836
    3827 
    3828 
    38293837Void TEncSearch::xMotionEstimation( TComDataCU* pcCU, TComYuv* pcYuvOrg, Int iPartIdx, RefPicList eRefPicList, TComMv* pcMvPred, Int iRefIdxPred, TComMv& rcMv, UInt& ruiBits, Distortion& ruiCost, Bool bBi  )
    38303838{
     
    38503858  pcCU->getPartIndexAndSize( iPartIdx, uiPartAddr, iRoiWidth, iRoiHeight );
    38513859
    3852   if ( bBi )
     3860  if ( bBi ) // Bipredictive ME
    38533861  {
    38543862    TComYuv*  pcYuvOther = &m_acYuvPred[1-(Int)eRefPicList];
     
    39523960
    39533961
    3954 
    3955 
    39563962Void TEncSearch::xSetSearchRange ( const TComDataCU* const pcCU, const TComMv& cMvPred, const Int iSrchRng,
    39573963                                   TComMv& rcMvSrchRngLT, TComMv& rcMvSrchRngRB )
     
    39773983#endif
    39783984}
     3985
    39793986
    39803987Void TEncSearch::xPatternSearch( const TComPattern* const pcPatternKey,
     
    40404047  return;
    40414048}
    4042 
    40434049
    40444050
     
    40734079  }
    40744080}
    4075 
    4076 
    40774081
    40784082
     
    41324136      cMv >>= 2;
    41334137#endif
    4134       xTZSearchHelp( pcPatternKey, cStruct, cMv.getHor(), cMv.getVer(), 0, 0 );
     4138      if (cMv != rcMv && (cMv.getHor() != cStruct.iBestX && cMv.getVer() != cStruct.iBestY))
     4139      {
     4140        // only test cMV if not obviously previously tested.
     4141        xTZSearchHelp( pcPatternKey, cStruct, cMv.getHor(), cMv.getVer(), 0, 0 );
     4142      }
    41354143    }
    41364144  }
     
    41394147  if ( bTestZeroVector )
    41404148  {
    4141     xTZSearchHelp( pcPatternKey, cStruct, 0, 0, 0, 0 );
     4149    if ((rcMv.getHor() != 0 || rcMv.getVer() != 0) &&
     4150        (0 != cStruct.iBestX || 0 != cStruct.iBestY))
     4151    {
     4152      // only test 0-vector if not obviously previously tested.
     4153      xTZSearchHelp( pcPatternKey, cStruct, 0, 0, 0, 0 );
     4154    }
    41424155  }
    41434156
     
    41574170    integerMv2Nx2NPred >>= 2;
    41584171#endif
    4159     xTZSearchHelp(pcPatternKey, cStruct, integerMv2Nx2NPred.getHor(), integerMv2Nx2NPred.getVer(), 0, 0);
     4172    if ((rcMv != integerMv2Nx2NPred) &&
     4173        (integerMv2Nx2NPred.getHor() != cStruct.iBestX || integerMv2Nx2NPred.getVer() != cStruct.iBestY))
     4174    {
     4175      // only test integerMv2Nx2NPred if not obviously previously tested.
     4176      xTZSearchHelp(pcPatternKey, cStruct, integerMv2Nx2NPred.getHor(), integerMv2Nx2NPred.getVer(), 0, 0);
     4177    }
    41604178
    41614179    // reset search range
     
    42654283  }
    42664284
    4267   // start refinement
     4285  // star refinement
    42684286  if ( bStarRefinementEnable && cStruct.uiBestDistance > 0 )
    42694287  {
Note: See TracChangeset for help on using the changeset viewer.