Ignore:
Timestamp:
18 May 2012, 09:38:25 (12 years ago)
Author:
lg
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-3.0-LG/source/Lib/TLibEncoder/TEncSearch.cpp

    r56 r62  
    25052505Void TEncSearch::xMergeEstimation( TComDataCU* pcCU, TComYuv* pcYuvOrg, Int iPUIdx, UInt& uiInterDir, TComMvField* pacMvField, UInt& uiMergeIndex, UInt& ruiCost, TComMvField* cMvFieldNeighbours, UChar* uhInterDirNeighbours, Int& numValidMergeCand )
    25062506#else
     2507#if LG_RESTRICTEDRESPRED_M24766
     2508Void TEncSearch::xMergeEstimation( TComDataCU* pcCU, TComYuv* pcYuvOrg, TComYuv* rpcResiPredYuv, Int iPUIdx, UInt& uiInterDir, TComMvField* pacMvField, UInt& uiMergeIndex, UInt& ruiCost )
     2509#else
    25072510Void TEncSearch::xMergeEstimation( TComDataCU* pcCU, TComYuv* pcYuvOrg, Int iPUIdx, UInt& uiInterDir, TComMvField* pacMvField, UInt& uiMergeIndex, UInt& ruiCost )
     2511#endif
    25082512#endif
    25092513{
     
    25532557  const int maxNumMergeCand = MRG_MAX_NUM_CANDS_SIGNALED + ( pcCU->getSlice()->getSPS()->getMultiviewMvPredMode() ? 1 : 0 );
    25542558#endif
    2555 
     2559#if LG_RESTRICTEDRESPRED_M24766
     2560  Int iPUResiPredShift[4];
     2561  Int iLastAddResiShift = -1000;
     2562#endif
    25562563  ruiCost = MAX_UINT;
    25572564  for( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand )
     
    25652572      pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( cMvFieldNeighbours[0 + 2*uiMergeCand], ePartSize, uiAbsPartIdx, 0, iPUIdx );
    25662573      pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( cMvFieldNeighbours[1 + 2*uiMergeCand], ePartSize, uiAbsPartIdx, 0, iPUIdx );
    2567 
     2574#if LG_RESTRICTEDRESPRED_M24766
     2575          Int iAddResiShift;
     2576          UInt uiPartAddr;
     2577          Int iRoiWidth, iRoiHeight;
     2578
     2579          pcCU->getPartIndexAndSize( iPUIdx, uiPartAddr, iRoiWidth, iRoiHeight );
     2580          iAddResiShift = pcCU->getResiPredMode(uiPartAddr);
     2581          iAddResiShift = (pcCU->getSlice()->getPPS()->getUseWP() || pcCU->getInterDir(uiPartAddr) != 3) ? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1 - iAddResiShift : -1);
     2582
     2583          if( pcCU->getResPredFlag( 0 ))
     2584          { // subtract residual prediction from original in motion search
     2585                  if(iLastAddResiShift != iAddResiShift)
     2586                  {
     2587                          //add subtracted residual last time
     2588                          if(iLastAddResiShift >= 0)
     2589                          {
     2590                                  iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iLastAddResiShift;
     2591                                  pcYuvOrg->add(iPUResiPredShift, ePartSize, rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     2592                          }
     2593                          //subtract residual
     2594                          if(iAddResiShift >= 0)
     2595                          {
     2596                                  iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iAddResiShift;
     2597                                  pcYuvOrg->add(iPUResiPredShift, ePartSize, rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ), true );
     2598                          }
     2599                          iLastAddResiShift = iAddResiShift;
     2600                  }
     2601          }
     2602#endif
    25682603      xGetInterPredictionError( pcCU, pcYuvOrg, iPUIdx, uiCostCand, m_pcEncCfg->getUseHADME() );
    25692604      uiBitsCand = uiMergeCand + 1;
     
    25872622    }
    25882623  }
     2624#if LG_RESTRICTEDRESPRED_M24766
     2625  if( pcCU->getResPredFlag( 0 ) && iLastAddResiShift >= 0)
     2626  {
     2627          iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iLastAddResiShift;
     2628          pcYuvOrg->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     2629  }
     2630#endif
    25892631}
    25902632
     
    25992641 */
    26002642#if AMP_MRG
     2643#if LG_RESTRICTEDRESPRED_M24766
     2644Void TEncSearch::predInterSearch( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv* rpcResiPredYuv, TComYuv*& rpcPredYuv, TComYuv*& rpcResiYuv, TComYuv*& rpcRecoYuv, Bool bUseRes, Bool bUseMRG )
     2645#else
    26012646Void TEncSearch::predInterSearch( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv*& rpcPredYuv, TComYuv*& rpcResiYuv, TComYuv*& rpcRecoYuv, Bool bUseRes, Bool bUseMRG )
     2647#endif
    26022648#else
    26032649Void TEncSearch::predInterSearch( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv*& rpcPredYuv, TComYuv*& rpcResiYuv, TComYuv*& rpcRecoYuv, Bool bUseRes )
     
    27022748    for (Int iNumRef=0; iNumRef < MAX_NUM_REF; iNumRef++) uiCostTempL0[iNumRef] = MAX_UINT;
    27032749    UInt          uiBitsTempL0[MAX_NUM_REF];
    2704 
     2750#if LG_RESTRICTEDRESPRED_M24766
     2751        Int iPUResiPredShift[4] = {0, 0, 0, 0};
     2752#endif
    27052753    xGetBlkBits( ePartSize, pcCU->getSlice()->isInterP(), iPartIdx, uiLastMode, uiMbBits);
    27062754   
     
    27182766    {
    27192767#endif
    2720 
     2768#if LG_RESTRICTEDRESPRED_M24766
     2769                Bool bLastResiFlag = false;
     2770#endif
    27212771    //  Uni-directional prediction
    27222772    for ( Int iRefList = 0; iRefList < iNumPredDir; iRefList++ )
     
    27262776      for ( Int iRefIdxTemp = 0; iRefIdxTemp < pcCU->getSlice()->getNumRefIdx(eRefPicList); iRefIdxTemp++ )
    27272777      {
     2778#if LG_RESTRICTEDRESPRED_M24766
     2779                  if( pcCU->getResPredFlag( 0 ))
     2780                  {
     2781                          if(pcCU->getSlice()->getViewId() == pcCU->getSlice()->getRefViewId(eRefPicList, iRefIdxTemp))
     2782                          { // subtract residual prediction from original in motion search
     2783                                  if(!bLastResiFlag)
     2784                                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ), true );
     2785                                  bLastResiFlag = true;
     2786                          }
     2787                          else
     2788                          {
     2789                                  if(bLastResiFlag)
     2790                                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     2791                                  bLastResiFlag = false;
     2792                          }
     2793                  }
     2794#endif
    27282795        uiBitsTemp = uiMbBits[iRefList];
    27292796        if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 )
     
    28892956      }
    28902957    }
     2958#if LG_RESTRICTEDRESPRED_M24766
     2959        if( pcCU->getResPredFlag( 0 ) && bLastResiFlag)
     2960        { // subtract residual prediction from original in motion search
     2961                pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     2962        }
     2963#endif
    28912964    //  Bi-directional prediction
    28922965    if ( pcCU->getSlice()->isInterB() )
    28932966    {
    2894      
     2967#if LG_RESTRICTEDRESPRED_M24766
     2968                Int iLastAddResiShift = -1000;
     2969#endif
    28952970      cMvBi[0] = cMv[0];            cMvBi[1] = cMv[1];
    28962971      iRefIdxBi[0] = iRefIdx[0];    iRefIdxBi[1] = iRefIdx[1];
     
    29943069#else
    29953070          uiBitsTemp += m_auiMVPIdxCost[aaiMvpIdxBi[iRefList][iRefIdxTemp]][AMVP_MAX_NUM_CANDS];
     3071#endif
     3072#if LG_RESTRICTEDRESPRED_M24766
     3073                  Int iAddResiShift = -1, iPredFrom = 0;
     3074                  Int iBestRefIdx = pcCU->getCUMvField(eRefPicList == REF_PIC_LIST_0 ? REF_PIC_LIST_1 : REF_PIC_LIST_0)->getRefIdx(uiPartAddr);
     3075
     3076                  iPredFrom = iBestRefIdx >= 0 ? 3 : 1;
     3077                  if(iBestRefIdx >= 0 && pcCU->getSlice()->getViewId() == pcCU->getSlice()->getRefViewId(eRefPicList == REF_PIC_LIST_0 ? REF_PIC_LIST_1 : REF_PIC_LIST_0, iBestRefIdx))
     3078                          iAddResiShift++;
     3079                  if(pcCU->getSlice()->getViewId() == pcCU->getSlice()->getRefViewId(eRefPicList, iRefIdxTemp))
     3080                          iAddResiShift++;
     3081                  iAddResiShift = (pcCU->getSlice()->getPPS()->getUseWP() || iPredFrom != 3) ? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1-iAddResiShift : -1);
     3082
     3083                  if( pcCU->getResPredFlag( 0 ) )
     3084                  {
     3085                          if(iLastAddResiShift != iAddResiShift)
     3086                          {
     3087                                  //add substracted residual last time
     3088                                  if(iLastAddResiShift >= 0 )
     3089                                  {
     3090                                          iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iLastAddResiShift;
     3091                                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     3092                                  }
     3093                                  //substract residual
     3094                                  if(iAddResiShift >= 0)
     3095                                  {
     3096                                          iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iAddResiShift;
     3097                                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ), true );
     3098                                  }
     3099                                  iLastAddResiShift = iAddResiShift;
     3100                          }
     3101                  }
    29963102#endif
    29973103          // call ME
     
    30493155        }
    30503156      } // for loop-iter
     3157#if LG_RESTRICTEDRESPRED_M24766
     3158          if( pcCU->getResPredFlag( 0 ) && iLastAddResiShift >= 0)
     3159          {
     3160                  iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iLastAddResiShift;
     3161                  pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     3162          }
     3163#endif
    30513164    } // if (B_SLICE)
    30523165#if ZERO_MVD_EST
     
    32553368      if (bTestNormalMC)
    32563369      {
     3370#if LG_RESTRICTEDRESPRED_M24766
     3371                  Int iAddResiShift = pcCU->getResiPredMode(uiPartAddr);
     3372                  iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = \
     3373                          (pcCU->getSlice()->getPPS()->getUseWP() || pcCU->getInterDir(uiPartAddr) != 3)? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1-iAddResiShift : -1);
     3374                  if(pcCU->getResPredFlag(0) && iAddResiShift >= 0)
     3375                  {
     3376                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ), true);
     3377                  }
     3378#endif
    32573379        xGetInterPredictionError( pcCU, pcOrgYuv, iPartIdx, uiMEError, m_pcEncCfg->getUseHADME() );
    32583380        uiMECost = uiMEError + m_pcRdCost->getCost( uiMEBits );
     3381#if LG_RESTRICTEDRESPRED_M24766
     3382                if(pcCU->getResPredFlag(0) && iAddResiShift >= 0)
     3383                {
     3384                        pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     3385                }
     3386#endif
    32593387      }
    32603388#else
     
    32743402      xMergeEstimation( pcCU, pcOrgYuv, iPartIdx, uiMRGInterDir, cMRGMvField, uiMRGIndex, uiMRGCost, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand);
    32753403#else
    3276       xMergeEstimation( pcCU, pcOrgYuv, iPartIdx, uiMRGInterDir, cMRGMvField, uiMRGIndex, uiMRGCost );
     3404#if LG_RESTRICTEDRESPRED_M24766
     3405      xMergeEstimation( pcCU, pcOrgYuv, rpcResiPredYuv, iPartIdx, uiMRGInterDir, cMRGMvField, uiMRGIndex, uiMRGCost );
     3406#else
     3407          xMergeEstimation( pcCU, pcOrgYuv, iPartIdx, uiMRGInterDir, cMRGMvField, uiMRGIndex, uiMRGCost );
     3408#endif
    32773409#endif
    32783410      if ( uiMRGCost < uiMECost )
     
    41164248  UInt      uiWidth      = pcCU->getWidth ( 0 );
    41174249  UInt      uiHeight     = pcCU->getHeight( 0 );
    4118  
     4250#if LG_RESTRICTEDRESPRED_M24766
     4251  Int       iPUResiPredShift[4];
     4252#endif
    41194253  //  No residual coding : SKIP mode
    41204254  if ( ePredMode == MODE_SKIP && bSkipRes )
     
    41284262    if( pcCU->getResPredFlag( 0 ) )
    41294263    {
     4264#if LG_RESTRICTEDRESPRED_M24766
     4265                pcCU->getPUResiPredShift(iPUResiPredShift, 0);
     4266                rpcYuvRec->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcYuvResPrd, uiWidth, uiHeight );
     4267#else
    41304268      rpcYuvRec->add( rpcYuvResPrd, uiWidth, uiHeight );
     4269#endif
    41314270      rpcYuvRec->clip( uiWidth, uiHeight );
    41324271    }
     
    42374376  else
    42384377  {
    4239   rpcYuvResi->subtract( pcYuvOrg, pcYuvPred, 0, uiWidth );
     4378#if LG_RESTRICTEDRESPRED_M24766
     4379          iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = 0;
     4380          rpcYuvResi->subtract(iPUResiPredShift, pcCU->getPartitionSize(0), pcYuvOrg, pcYuvPred, 0, uiWidth );
     4381#else
     4382          rpcYuvResi->subtract( pcYuvOrg, pcYuvPred, 0, uiWidth );
     4383#endif
    42404384#if HHI_INTER_VIEW_RESIDUAL_PRED
    42414385    // subtract residual prediction
    42424386    if( pcCU->getResPredFlag( 0 ) )
    42434387    {
     4388#if LG_RESTRICTEDRESPRED_M24766
     4389                pcCU->getPUResiPredShift(iPUResiPredShift, 0);
     4390                rpcYuvResi->subtract(iPUResiPredShift, pcCU->getPartitionSize(0), rpcYuvResi, rpcYuvResPrd, 0, uiWidth );
     4391#else
    42444392      rpcYuvResi->subtract( rpcYuvResi, rpcYuvResPrd, 0, uiWidth );
     4393#endif
    42454394    }
    42464395#endif
     
    44564605  {
    44574606    pcYuvPred->copyToPartYuv( rpcYuvRec, 0 );
    4458     rpcYuvRec->add( rpcYuvResPrd,   uiWidth, uiHeight );
    4459     rpcYuvRec->add( rpcYuvResiBest, uiWidth, uiHeight );
     4607#if LG_RESTRICTEDRESPRED_M24766
     4608        pcCU->getPUResiPredShift(iPUResiPredShift, 0);
     4609        rpcYuvRec->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcYuvResPrd,   uiWidth, uiHeight );
     4610        iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = 0;
     4611    rpcYuvRec->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcYuvResiBest, uiWidth, uiHeight );
     4612#else
     4613        rpcYuvRec->add( rpcYuvResPrd,   uiWidth, uiHeight );
     4614        rpcYuvRec->add( rpcYuvResiBest, uiWidth, uiHeight );
     4615#endif
    44604616    rpcYuvRec->clip( uiWidth, uiHeight );
    44614617  }
Note: See TracChangeset for help on using the changeset viewer.