Changeset 62 in 3DVCSoftware for branches/HTM-3.0-LG/source


Ignore:
Timestamp:
18 May 2012, 09:38:25 (13 years ago)
Author:
lg
Message:
 
Location:
branches/HTM-3.0-LG/source/Lib
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-3.0-LG/source/Lib/TLibCommon/TComDataCU.cpp

    r56 r62  
    28832883}
    28842884
     2885#if LG_RESTRICTEDRESPRED_M24766
     2886Void TComDataCU::getPartIndexAndSize( UInt uiPartIdx, UInt& ruiPartAddr, Int& riWidth, Int& riHeight, UInt uiAbsPartIdx, Bool bLCU)
     2887{
     2888        UInt uiNumPartition  = bLCU ? (getWidth(uiAbsPartIdx)*getHeight(uiAbsPartIdx) >> 4) : m_uiNumPartition;
     2889        UInt uiTmpAbsPartIdx = bLCU ? uiAbsPartIdx : 0;
     2890
     2891        switch ( m_pePartSize[uiTmpAbsPartIdx] )
     2892        {
     2893        case SIZE_2NxN:
     2894                riWidth = getWidth(uiTmpAbsPartIdx);      riHeight = getHeight(uiTmpAbsPartIdx) >> 1; ruiPartAddr = ( uiPartIdx == 0 )? 0 : uiNumPartition >> 1;
     2895                break;
     2896        case SIZE_Nx2N:
     2897                riWidth = getWidth(uiTmpAbsPartIdx) >> 1; riHeight = getHeight(uiTmpAbsPartIdx);      ruiPartAddr = ( uiPartIdx == 0 )? 0 : uiNumPartition >> 2;
     2898                break;
     2899        case SIZE_NxN:
     2900                riWidth = getWidth(uiTmpAbsPartIdx) >> 1; riHeight = getHeight(uiTmpAbsPartIdx) >> 1; ruiPartAddr = ( uiNumPartition >> 2 ) * uiPartIdx;
     2901                break;
     2902        case SIZE_2NxnU:
     2903                riWidth     = getWidth(uiTmpAbsPartIdx);
     2904                riHeight    = ( uiPartIdx == 0 ) ?  getHeight(uiTmpAbsPartIdx) >> 2 : ( getHeight(uiTmpAbsPartIdx) >> 2 ) + ( getHeight(uiTmpAbsPartIdx) >> 1 );
     2905                ruiPartAddr = ( uiPartIdx == 0 ) ? 0 : uiNumPartition >> 3;
     2906                break;
     2907        case SIZE_2NxnD:
     2908                riWidth     = getWidth(uiTmpAbsPartIdx);
     2909                riHeight    = ( uiPartIdx == 0 ) ?  ( getHeight(uiTmpAbsPartIdx) >> 2 ) + ( getHeight(uiTmpAbsPartIdx) >> 1 ) : getHeight(uiTmpAbsPartIdx) >> 2;
     2910                ruiPartAddr = ( uiPartIdx == 0 ) ? 0 : (uiNumPartition >> 1) + (uiNumPartition >> 3);
     2911                break;
     2912        case SIZE_nLx2N:
     2913                riWidth     = ( uiPartIdx == 0 ) ? getWidth(uiTmpAbsPartIdx) >> 2 : ( getWidth(uiTmpAbsPartIdx) >> 2 ) + ( getWidth(uiTmpAbsPartIdx) >> 1 );
     2914                riHeight    = getHeight(uiTmpAbsPartIdx);
     2915                ruiPartAddr = ( uiPartIdx == 0 ) ? 0 : uiNumPartition >> 4;
     2916                break;
     2917        case SIZE_nRx2N:
     2918                riWidth     = ( uiPartIdx == 0 ) ? ( getWidth(uiTmpAbsPartIdx) >> 2 ) + ( getWidth(uiTmpAbsPartIdx) >> 1 ) : getWidth(uiTmpAbsPartIdx) >> 2;
     2919                riHeight    = getHeight(uiTmpAbsPartIdx);
     2920                ruiPartAddr = ( uiPartIdx == 0 ) ? 0 : (uiNumPartition >> 2) + (uiNumPartition >> 4);
     2921                break;
     2922        default:
     2923                assert ( m_pePartSize[0] == SIZE_2Nx2N );
     2924                riWidth = getWidth(uiTmpAbsPartIdx);      riHeight = getHeight(uiTmpAbsPartIdx);      ruiPartAddr = 0;
     2925                break;
     2926        }
     2927}
     2928#else
    28852929Void TComDataCU::getPartIndexAndSize( UInt uiPartIdx, UInt& ruiPartAddr, Int& riWidth, Int& riHeight )
    28862930{
     
    29222966  }
    29232967}
    2924 
     2968#endif
     2969
     2970#if LG_RESTRICTEDRESPRED_M24766
     2971Int TComDataCU::getResiPredMode(UInt uiPartAddr)
     2972{
     2973        Int iAddResiShift = -1;
     2974
     2975        for(UInt uiRefIdx = 0; uiRefIdx < 2; uiRefIdx++)
     2976        {
     2977                RefPicList eRefList = uiRefIdx ? REF_PIC_LIST_1 : REF_PIC_LIST_0;
     2978                Int iBestRefIdx = getCUMvField(eRefList)->getRefIdx(uiPartAddr);
     2979                if(iBestRefIdx >= 0 && getSlice()->getViewId() == getSlice()->getRefViewId(eRefList, iBestRefIdx))
     2980                        iAddResiShift++;
     2981        }
     2982
     2983        return iAddResiShift;
     2984}
     2985
     2986Void TComDataCU::getPUResiPredShift(Int *iPUResiPredShift, UInt uiAbsPartIndex)
     2987{
     2988        UInt uiPartSize = getPartitionSize(uiAbsPartIndex);
     2989        UInt uiPartAddr;
     2990        Int iWidth, iHeight;
     2991        Int iAddResiShift;
     2992
     2993        if(uiPartSize == SIZE_2Nx2N)
     2994        {
     2995                iAddResiShift = getResiPredMode(uiAbsPartIndex);
     2996                for(UInt i = 0; i < 4; i++)
     2997                        iPUResiPredShift[i] = (getSlice()->getPPS()->getUseWP() || getInterDir(uiAbsPartIndex) != 3) ? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1-iAddResiShift : -1);
     2998                return;
     2999        }
     3000
     3001        if(uiPartSize == SIZE_2NxN || uiPartSize == SIZE_2NxnU || uiPartSize == SIZE_2NxnD)
     3002        {
     3003                for(UInt i = 0; i < 2; i++)
     3004                {
     3005                        getPartIndexAndSize(i, uiPartAddr, iWidth, iHeight, uiAbsPartIndex, true);
     3006                        uiPartAddr += uiAbsPartIndex;
     3007                        iAddResiShift = getResiPredMode(uiPartAddr);
     3008                        iPUResiPredShift[2*i] = iPUResiPredShift[2*i+1] = (getSlice()->getPPS()->getUseWP() || getInterDir(uiPartAddr) != 3) ? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1-iAddResiShift : -1);
     3009                }
     3010                return;
     3011        }
     3012
     3013        if(uiPartSize == SIZE_Nx2N || uiPartSize == SIZE_nLx2N || uiPartSize == SIZE_nRx2N)
     3014        {
     3015                for(UInt i = 0; i < 2; i++)
     3016                {
     3017                        getPartIndexAndSize(i, uiPartAddr, iWidth, iHeight, uiAbsPartIndex, true);
     3018                        uiPartAddr += uiAbsPartIndex;
     3019                        iAddResiShift = getResiPredMode(uiPartAddr);
     3020                        iPUResiPredShift[i] = iPUResiPredShift[2+i] = (getSlice()->getPPS()->getUseWP() || getInterDir(uiPartAddr) != 3) ? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1-iAddResiShift : -1);
     3021                }
     3022                return;
     3023        }
     3024
     3025        if(uiPartSize == SIZE_NxN)
     3026        {
     3027                for(UInt i = 0; i < 4; i++)
     3028                {
     3029                        getPartIndexAndSize(i, uiPartAddr, iWidth, iHeight, uiAbsPartIndex, true);
     3030                        uiPartAddr += uiAbsPartIndex;
     3031                        iAddResiShift = getResiPredMode(uiPartAddr);
     3032                        iPUResiPredShift[i] = (getSlice()->getPPS()->getUseWP() || getInterDir(uiPartAddr) != 3) ? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1-iAddResiShift : -1);
     3033                }
     3034        }
     3035
     3036}
     3037#endif
    29253038
    29263039Void TComDataCU::getMvField ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefPicList, TComMvField& rcMvField )
  • branches/HTM-3.0-LG/source/Lib/TLibCommon/TComDataCU.h

    r56 r62  
    526526  // member functions for accessing partition information
    527527  // -------------------------------------------------------------------------------------------------------------------
    528  
     528#if LG_RESTRICTEDRESPRED_M24766
     529  Void          getPartIndexAndSize( UInt uiPartIdx, UInt& ruiPartAddr, Int& riWidth, Int& riHeight, UInt uiAbsPartIdx = 0, Bool bLCU = false);
     530#else
    529531  Void          getPartIndexAndSize   ( UInt uiPartIdx, UInt& ruiPartAddr, Int& riWidth, Int& riHeight );
     532#endif
     533#if LG_RESTRICTEDRESPRED_M24766
     534  Int           getResiPredMode(UInt uiPartAddr);
     535  Void          getPUResiPredShift (Int *iPUPredResiShift, UInt uiAbsPartIndex);
     536#endif
    530537  UChar         getNumPartInter       ();
    531538  Bool          isFirstAbsZorderIdxInDepth (UInt uiAbsPartIdx, UInt uiDepth);
  • branches/HTM-3.0-LG/source/Lib/TLibCommon/TComResidualGenerator.cpp

    r56 r62  
    335335  Pel*    pRes      = pcCUResidual->getLumaAddr();
    336336  UInt    uiLumaTrMode, uiChromaTrMode;
     337#if LG_RESTRICTEDRESPRED_M24766
     338  Int     iPUPredResiShift[4];
     339#endif
    337340  pcCU->convertTransIdx             ( 0, pcCU->getTransformIdx( 0 ), uiLumaTrMode, uiChromaTrMode );
    338341#if H0736_AVC_STYLE_QP_RANGE
     
    363366    Bool bOK = pcCU->getResidualSamples( 0, m_ppcYuvTmp[0] );
    364367    AOF( bOK );
     368#if LG_RESTRICTEDRESPRED_M24766
     369        pcCU->getPUResiPredShift(iPUPredResiShift, 0);
     370        pcCUResidual->add(iPUPredResiShift, pcCU->getPartitionSize(0), m_ppcYuvTmp[0], pcCU->getWidth( 0 ), pcCU->getHeight( 0 ) );
     371#else
    365372    pcCUResidual->add( m_ppcYuvTmp[0], pcCU->getWidth( 0 ), pcCU->getHeight( 0 ) );
     373#endif
    366374  }
    367375
  • branches/HTM-3.0-LG/source/Lib/TLibCommon/TComYuv.cpp

    r56 r62  
    392392}
    393393
    394 
     394#if LG_RESTRICTEDRESPRED_M24766
     395Void
     396TComYuv::add(Int *iPUResiPredShift, PartSize uhPartitionSize,  TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract )
     397{
     398        addLuma   (iPUResiPredShift, uhPartitionSize, pcYuvAdd, iWidth,    iHeight,    bSubtract );
     399        addChroma (iPUResiPredShift, uhPartitionSize, pcYuvAdd, iWidth>>1, iHeight>>1, bSubtract );
     400}
     401#else
    395402Void
    396403TComYuv::add( TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract )
     
    399406  addChroma ( pcYuvAdd, iWidth>>1, iHeight>>1, bSubtract );
    400407}
    401 
     408#endif
     409
     410#if LG_RESTRICTEDRESPRED_M24766
     411void
     412TComYuv::getPUXYOffset(PartSize uhPartitionSize, Int iWidth, Int iHeight, Int &iXOffset, Int &iYOffset)
     413{
     414        switch(uhPartitionSize)
     415        {         
     416        case SIZE_2NxN:
     417                iXOffset = iWidth;      iYOffset = iHeight >> 1;   break;
     418        case SIZE_2NxnU:
     419                iXOffset = iWidth;      iYOffset = iHeight >> 2;   break;
     420        case SIZE_2NxnD:
     421                iXOffset = iWidth;      iYOffset = (iHeight >> 1) + (iHeight >> 2);   break;
     422        case SIZE_Nx2N:
     423                iXOffset = iWidth >> 1; iYOffset = iHeight; break;
     424        case SIZE_nLx2N:
     425                iXOffset = iWidth >> 2; iYOffset = iHeight; break;
     426        case SIZE_nRx2N:
     427                iXOffset = (iWidth >> 1) + (iWidth >> 2); iYOffset = iHeight; break;
     428        case SIZE_NxN:
     429                iXOffset = iWidth >> 1; iYOffset = iHeight >> 1;  break;
     430        default:
     431                assert(uhPartitionSize == SIZE_2Nx2N);
     432                iXOffset = iWidth;        iYOffset = iHeight;     break;
     433        }
     434}
     435#endif
     436
     437#if LG_RESTRICTEDRESPRED_M24766
     438Void
     439TComYuv::addLuma(Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract )
     440#else
    402441Void
    403442TComYuv::addLuma( TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract )
     443#endif
    404444{
    405445  Int   iScale      = ( bSubtract ? -1 : 1 );
     
    408448  Pel*  pAddSamples = pcYuvAdd->getLumaAddr();
    409449  Pel*  pDstSamples = getLumaAddr();
     450
     451#if LG_RESTRICTEDRESPRED_M24766
     452  Int iXOffset, iYOffset;
     453
     454  getPUXYOffset(uhPartitionSize, iWidth, iHeight, iXOffset, iYOffset);
     455
     456  for( Int iY = 0; iY < iYOffset; iY++, pDstSamples += iDstStride, pAddSamples += iAddStride )
     457  {
     458          if(iPUResiPredShift[0] >= 0)
     459          {
     460                  for( Int iX = 0; iX < iXOffset; iX++ )
     461                  {
     462                          pDstSamples[iX] += iScale * (pAddSamples[iX] >> iPUResiPredShift[0]);
     463                  }
     464          }
     465
     466          if(iPUResiPredShift[1] >= 0)
     467          {
     468                  for( Int iX = iXOffset; iX < iWidth; iX++ )
     469                  {
     470                          pDstSamples[iX] += iScale * (pAddSamples[iX] >> iPUResiPredShift[1]);
     471                  }
     472          }
     473  }
     474
     475  for( Int iY = iYOffset; iY < iHeight; iY++, pDstSamples += iDstStride, pAddSamples += iAddStride )
     476  {
     477          if(iPUResiPredShift[2] >= 0)
     478          {
     479                  for( Int iX = 0; iX < iXOffset; iX++ )
     480                  {
     481                          pDstSamples[iX] += iScale * (pAddSamples[iX] >> iPUResiPredShift[2]);
     482                  }
     483          }
     484
     485          if(iPUResiPredShift[3] >= 0)
     486          {
     487                  for( Int iX = iXOffset; iX < iWidth; iX++ )
     488                  {
     489                          pDstSamples[iX] += iScale * (pAddSamples[iX] >> iPUResiPredShift[3]);
     490                  }
     491          }
     492  }
     493#else
    410494  for( Int iY = 0; iY < iHeight; iY++, pDstSamples += iDstStride, pAddSamples += iAddStride )
    411495  {
     
    415499    }
    416500  }
    417 }
    418 
     501#endif
     502}
     503
     504#if LG_RESTRICTEDRESPRED_M24766
     505Void
     506TComYuv::addChroma(Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract )
     507#else
    419508Void
    420509TComYuv::addChroma( TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract )
     510#endif
    421511{
    422512  Int   iScale        = ( bSubtract ? -1 : 1 );
     
    427517  Pel*  pDstSamplesCb = getCbAddr();
    428518  Pel*  pDstSamplesCr = getCrAddr();
     519
     520#if LG_RESTRICTEDRESPRED_M24766
     521  Int iXOffset, iYOffset;
     522 
     523  getPUXYOffset(uhPartitionSize, iWidth, iHeight, iXOffset, iYOffset);
     524
     525  for( Int iY = 0; iY < iYOffset; iY++, pDstSamplesCb += iDstStride, pAddSamplesCb += iAddStride,
     526          pDstSamplesCr += iDstStride, pAddSamplesCr += iAddStride  )
     527  {
     528          if(iPUResiPredShift[0] >= 0)
     529          {
     530                  for( Int iX = 0; iX < iXOffset; iX++ )
     531                  {
     532                          pDstSamplesCb[iX] += iScale * (pAddSamplesCb[iX] >> iPUResiPredShift[0]);
     533                          pDstSamplesCr[iX] += iScale * (pAddSamplesCr[iX] >> iPUResiPredShift[0]);
     534                  }
     535          }
     536
     537          if(iPUResiPredShift[1] >= 0)
     538          {
     539                  for( Int iX = iXOffset; iX < iWidth; iX++ )
     540                  {
     541                          pDstSamplesCb[iX] += iScale * (pAddSamplesCb[iX] >> iPUResiPredShift[1]);
     542                          pDstSamplesCr[iX] += iScale * (pAddSamplesCr[iX] >> iPUResiPredShift[1]);
     543                  }
     544          }
     545  }
     546
     547  for( Int iY = iYOffset; iY < iHeight; iY++, pDstSamplesCb += iDstStride, pAddSamplesCb += iAddStride,
     548          pDstSamplesCr += iDstStride, pAddSamplesCr += iAddStride  )
     549  {
     550          if(iPUResiPredShift[2] >= 0)
     551          {
     552                  for( Int iX = 0; iX < iXOffset; iX++ )
     553                  {
     554                          pDstSamplesCb[iX] += iScale * (pAddSamplesCb[iX] >> iPUResiPredShift[2]);
     555                          pDstSamplesCr[iX] += iScale * (pAddSamplesCr[iX] >> iPUResiPredShift[2]);
     556                  }
     557          }
     558
     559          if(iPUResiPredShift[3] >= 0)
     560          {
     561                  for( Int iX = iXOffset; iX < iWidth; iX++ )
     562                  {
     563                          pDstSamplesCb[iX] += iScale * (pAddSamplesCb[iX] >> iPUResiPredShift[3]);
     564                          pDstSamplesCr[iX] += iScale * (pAddSamplesCr[iX] >> iPUResiPredShift[3]);
     565                  }
     566          }
     567  }
     568#else
    429569  for( Int iY = 0; iY < iHeight; iY++, pDstSamplesCb += iDstStride, pAddSamplesCb += iAddStride,
    430570                                       pDstSamplesCr += iDstStride, pAddSamplesCr += iAddStride  )
     
    436576    }
    437577  }
     578#endif
    438579}
    439580
     
    535676}
    536677
     678#if LG_RESTRICTEDRESPRED_M24766
     679Void TComYuv::subtract(Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
     680{
     681        subtractLuma  (iPUResiPredShift, uhPartitionSize, pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize    );
     682        subtractChroma(iPUResiPredShift, uhPartitionSize, pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize>>1 );
     683}
     684#else
    537685Void TComYuv::subtract( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
    538686{
    539   subtractLuma  ( pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize    );
    540   subtractChroma( pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize>>1 );
    541 }
    542 
     687        subtractLuma  ( pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize    );
     688        subtractChroma( pcYuvSrc0, pcYuvSrc1,  uiTrUnitIdx, uiPartSize>>1 );
     689}
     690#endif
     691
     692#if LG_RESTRICTEDRESPRED_M24766
     693Void TComYuv::subtractLuma(Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
     694#else
    543695Void TComYuv::subtractLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
     696#endif
    544697{
    545698  Int x, y;
     
    552705  Int  iSrc1Stride = pcYuvSrc1->getStride();
    553706  Int  iDstStride  = getStride();
     707
     708#if LG_RESTRICTEDRESPRED_M24766
     709  Int iXOffset, iYOffset;
     710
     711  getPUXYOffset(uhPartitionSize, uiPartSize, uiPartSize, iXOffset, iYOffset);
     712
     713  for ( y = uiPartSize-1; y >= iYOffset; y-- )
     714  {
     715          if(iPUResiPredShift[3] >= 0)
     716          {
     717                  for ( x = uiPartSize-1; x >= iXOffset; x-- )
     718                  {
     719                          pDst[x] = pSrc0[x] - (pSrc1[x] >> iPUResiPredShift[3]);
     720                  }
     721          }
     722
     723          if(iPUResiPredShift[2] >= 0)
     724          {
     725                  for ( x = iXOffset-1; x >= 0; x-- )
     726                  {
     727                          pDst[x] = pSrc0[x] - (pSrc1[x] >> iPUResiPredShift[2]);
     728                  }
     729          }
     730          pSrc0 += iSrc0Stride;
     731          pSrc1 += iSrc1Stride;
     732          pDst  += iDstStride;
     733  }
     734
     735  for ( y = iYOffset-1; y >= 0; y-- )
     736  {
     737          if(iPUResiPredShift[1] >= 0)
     738          {
     739                  for ( x = uiPartSize-1; x >= iXOffset; x-- )
     740                  {
     741                          pDst[x] = pSrc0[x] - (pSrc1[x] >> iPUResiPredShift[3]);
     742                  }
     743          }
     744
     745          if(iPUResiPredShift[0] >= 0)
     746          {
     747                  for ( x = iXOffset-1; x >= 0; x-- )
     748                  {
     749                          pDst[x] = pSrc0[x] - (pSrc1[x] >> iPUResiPredShift[2]);
     750                  }
     751          }
     752          pSrc0 += iSrc0Stride;
     753          pSrc1 += iSrc1Stride;
     754          pDst  += iDstStride;
     755  }
     756
     757#else
    554758  for ( y = uiPartSize-1; y >= 0; y-- )
    555759  {
     
    562766    pDst  += iDstStride;
    563767  }
    564 }
    565 
     768#endif
     769}
     770
     771#if LG_RESTRICTEDRESPRED_M24766
     772Void TComYuv::subtractChroma(Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
     773#else
    566774Void TComYuv::subtractChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
     775#endif
    567776{
    568777  Int x, y;
     
    578787  Int  iSrc1Stride = pcYuvSrc1->getCStride();
    579788  Int  iDstStride  = getCStride();
     789#if LG_RESTRICTEDRESPRED_M24766
     790  Int iXOffset, iYOffset;
     791 
     792  getPUXYOffset(uhPartitionSize, uiPartSize, uiPartSize, iXOffset, iYOffset);
     793
     794  for ( y = uiPartSize-1; y >= iYOffset; y-- )
     795  {
     796          if(iPUResiPredShift[3] >= 0)
     797          {
     798                  for ( x = uiPartSize-1; x >= iXOffset; x-- )
     799                  {
     800                          pDstU[x] = pSrcU0[x] - (pSrcU1[x]>>iPUResiPredShift[3]);
     801                          pDstV[x] = pSrcV0[x] - (pSrcV1[x]>>iPUResiPredShift[3]);
     802                  }
     803          }
     804
     805          if(iPUResiPredShift[2] >= 0)
     806          {
     807                  for ( x = iXOffset-1; x >= 0; x-- )
     808                  {
     809                          pDstU[x] = pSrcU0[x] - (pSrcU1[x]>>iPUResiPredShift[2]);
     810                          pDstV[x] = pSrcV0[x] - (pSrcV1[x]>>iPUResiPredShift[2]);
     811                  }
     812          }
     813          pSrcU0 += iSrc0Stride;
     814          pSrcU1 += iSrc1Stride;
     815          pSrcV0 += iSrc0Stride;
     816          pSrcV1 += iSrc1Stride;
     817          pDstU  += iDstStride;
     818          pDstV  += iDstStride;
     819  }
     820
     821  for ( y = iYOffset-1; y >= 0; y-- )
     822  {
     823          if(iPUResiPredShift[1] >= 0)
     824          {
     825                  for ( x = uiPartSize-1; x >= iXOffset; x-- )
     826                  {
     827                          pDstU[x] = pSrcU0[x] - (pSrcU1[x]>>iPUResiPredShift[1]);
     828                          pDstV[x] = pSrcV0[x] - (pSrcV1[x]>>iPUResiPredShift[1]);
     829                  }
     830          }
     831
     832          if(iPUResiPredShift[0] >= 0)
     833          {
     834                  for ( x = iXOffset-1; x >= 0; x-- )
     835                  {
     836                          pDstU[x] = pSrcU0[x] - (pSrcU1[x]>>iPUResiPredShift[0]);
     837                          pDstV[x] = pSrcV0[x] - (pSrcV1[x]>>iPUResiPredShift[0]);
     838                  }
     839          }
     840          pSrcU0 += iSrc0Stride;
     841          pSrcU1 += iSrc1Stride;
     842          pSrcV0 += iSrc0Stride;
     843          pSrcV1 += iSrc1Stride;
     844          pDstU  += iDstStride;
     845          pDstV  += iDstStride;
     846  }
     847#else
    580848  for ( y = uiPartSize-1; y >= 0; y-- )
    581849  {
     
    592860    pDstV  += iDstStride;
    593861  }
     862#endif
    594863}
    595864
  • branches/HTM-3.0-LG/source/Lib/TLibCommon/TComYuv.h

    r56 r62  
    146146  Void    addClipPartLuma   ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize ); //GT
    147147
    148  
     148#if LG_RESTRICTEDRESPRED_M24766
    149149  //  pcYuvSrc0 - pcYuvSrc1 -> m_apiBuf
     150  Void    subtract          (Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize );
     151  Void    subtractLuma      (Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize );
     152  Void    subtractChroma    (Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize );
     153#else
    150154  Void    subtract          ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize );
    151155  Void    subtractLuma      ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize );
    152156  Void    subtractChroma    ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize );
     157#endif
    153158 
    154159  //  (pcYuvSrc0 + pcYuvSrc1)/2 for YUV partition
     
    161166  //   Remove High frequency
    162167  Void    removeHighFreq    ( TComYuv* pcYuvSrc, UInt uiPartIdx, UInt uiWidht, UInt uiHeight );
    163  
     168#if LG_RESTRICTEDRESPRED_M24766
     169  void    getPUXYOffset     (PartSize uhPartitionSize, Int iWidth, Int iHeight, Int &iXOffset, Int &iYOffset);
     170  Void    add               (Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract = false );
     171  Void    addLuma           (Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract );
     172  Void    addChroma         (Int *iPUResiPredShift, PartSize uhPartitionSize, TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract );
     173#else
    164174  Void    add               ( TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract = false );
    165175  Void    addLuma           ( TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract );
    166176  Void    addChroma         ( TComYuv* pcYuvAdd, Int iWidth, Int iHeight, Bool bSubtract );
     177#endif
    167178
    168179  Void    clip              ( Int iWidth, Int iHeight );
  • branches/HTM-3.0-LG/source/Lib/TLibCommon/TypeDef.h

    r56 r62  
    6868
    6969
    70 
     70#if HHI_INTER_VIEW_RESIDUAL_PRED
     71#define LG_RESTRICTEDRESPRED_M24766     1   // restricted inter-view residual prediction
     72#else
     73#define LG_RESTRICTEDRESPRED_M24766     0
     74#endif
    7175
    7276
  • branches/HTM-3.0-LG/source/Lib/TLibDecoder/TDecCu.cpp

    r56 r62  
    638638    Bool bOK = pcCU->getResidualSamples( 0, m_ppcYuvResPred[uiDepth] );
    639639    AOF( bOK );
     640#if LG_RESTRICTEDRESPRED_M24766
     641        Int iPUResiPredShift[4];
     642        pcCU->getPUResiPredShift(iPUResiPredShift, 0);
     643        m_ppcYuvReco[uiDepth]->add(iPUResiPredShift, pcCU->getPartitionSize(0), m_ppcYuvResPred[uiDepth], pcCU->getWidth( 0 ), pcCU->getHeight( 0 ) );
     644#else
    640645    m_ppcYuvReco[uiDepth]->add( m_ppcYuvResPred[uiDepth], pcCU->getWidth( 0 ), pcCU->getHeight( 0 ) );
     646#endif
    641647  }
    642648#endif
  • branches/HTM-3.0-LG/source/Lib/TLibDecoder/TDecEntropy.cpp

    r56 r62  
    104104  if( bResPredAvailable )
    105105  {
     106#if LG_RESTRICTEDRESPRED_M24766
     107          Int iPUResiPredShift[4];
     108          pcCU->getPUResiPredShift(iPUResiPredShift, uiAbsPartIdx);
     109          if(iPUResiPredShift[0] >= 0 || iPUResiPredShift[1] >= 0  || iPUResiPredShift[2] >= 0  || iPUResiPredShift[3] >= 0 )
     110#endif
    106111    m_pcEntropyDecoderIf->parseResPredFlag( pcCU, bResPredFlag, uiAbsPartIdx, uiDepth );
    107112  }
  • branches/HTM-3.0-LG/source/Lib/TLibEncoder/TEncCu.cpp

    r56 r62  
    19031903 
    19041904#if HHI_INTER_VIEW_RESIDUAL_PRED
     1905#if !LG_RESTRICTEDRESPRED_M24766
    19051906  if( rpcTempCU->getResPredFlag( 0 ) )
    19061907  { // subtract residual prediction from original in motion search
     
    19081909  }
    19091910#endif
     1911#endif
    19101912
    19111913#if AMP_MRG
    19121914  rpcTempCU->setMergeAMP (true);
    19131915  #if HHI_INTERVIEW_SKIP
     1916#if LG_RESTRICTEDRESPRED_M24766
     1917  m_pcPredSearch->predInterSearch ( rpcTempCU, m_ppcOrigYuv[uhDepth], m_ppcResPredTmp[uhDepth], m_ppcPredYuvTemp[uhDepth], m_ppcResiYuvTemp[uhDepth], m_ppcRecoYuvTemp[uhDepth], bSkipRes, bUseMRG  );
     1918#else
    19141919  m_pcPredSearch->predInterSearch ( rpcTempCU, m_ppcOrigYuv[uhDepth], m_ppcPredYuvTemp[uhDepth], m_ppcResiYuvTemp[uhDepth], m_ppcRecoYuvTemp[uhDepth], bSkipRes, bUseMRG  );
     1920#endif
    19151921#else
    19161922  m_pcPredSearch->predInterSearch ( rpcTempCU, m_ppcOrigYuv[uhDepth], m_ppcPredYuvTemp[uhDepth], m_ppcResiYuvTemp[uhDepth], m_ppcRecoYuvTemp[uhDepth], false, bUseMRG );
     
    19251931
    19261932#if HHI_INTER_VIEW_RESIDUAL_PRED
     1933#if !LG_RESTRICTEDRESPRED_M24766
    19271934  if( rpcTempCU->getResPredFlag( 0 ) )
    19281935  { // add residual prediction to original again
    19291936    m_ppcOrigYuv[uhDepth]->add( m_ppcResPredTmp [uhDepth], rpcTempCU->getWidth( 0 ), rpcTempCU->getHeight( 0 ) );
    19301937  }
     1938#endif
    19311939#endif
    19321940
  • branches/HTM-3.0-LG/source/Lib/TLibEncoder/TEncEntropy.cpp

    r56 r62  
    471471  ROTVS( pcCU->isIntra           ( uiAbsPartIdx )              );
    472472  ROFVS( pcCU->getResPredAvail   ( uiAbsPartIdx )              );
    473 
     473#if LG_RESTRICTEDRESPRED_M24766
     474  Int iPUResiPredShift[4];
     475  pcCU->getPUResiPredShift(iPUResiPredShift, uiAbsPartIdx);
     476  if(iPUResiPredShift[0] >= 0 || iPUResiPredShift[1] >= 0  || iPUResiPredShift[2] >= 0  || iPUResiPredShift[3] >= 0 )
     477#endif
    474478  // encode flag
    475479  m_pcEntropyCoderIf->codeResPredFlag( pcCU, uiAbsPartIdx );
  • 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  }
  • branches/HTM-3.0-LG/source/Lib/TLibEncoder/TEncSearch.h

    r56 r62  
    188188  Void predInterSearch          ( TComDataCU* pcCU,
    189189                                  TComYuv*    pcOrgYuv,
     190#if LG_RESTRICTEDRESPRED_M24766
     191                                                                  TComYuv*     rpcResiPredYuv,
     192#endif
    190193                                  TComYuv*&   rpcPredYuv,
    191194                                  TComYuv*&   rpcResiYuv,
     
    440443  Void xMergeEstimation           ( TComDataCU*     pcCU,
    441444                                    TComYuv*        pcYuvOrg,
     445#if LG_RESTRICTEDRESPRED_M24766
     446                                                                        TComYuv*        rpcResiPredYuv,
     447#endif
    442448                                    Int             iPartIdx,
    443449                                    UInt&           uiInterDir,
Note: See TracChangeset for help on using the changeset viewer.