Ignore:
Timestamp:
13 Nov 2015, 17:00:20 (9 years ago)
Author:
tech
Message:

Removed 3D.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-16.0-MV-draft-5/source/Lib/TLibCommon/TComRdCost.cpp

    r1386 r1390  
    4141#include "TComRom.h"
    4242#include "TComRdCost.h"
    43 #if NH_3D_VSO
    44 #include "TComDataCU.h"
    45 #include "TComRectangle.h"
    46 #endif
    4743
    4844//! \ingroup TLibCommon
    4945//! \{
    5046
    51 #if NH_3D_VSO
    52 // SAIT_VSO_EST_A0033
    53 Double TComRdCost::m_dDisparityCoeff = 1.0;
    54 #endif
    5547TComRdCost::TComRdCost()
    5648{
     
    6355
    6456// Calculate RD functions
    65 #if NH_3D_VSO
    66 Double TComRdCost::calcRdCost( Double numBits, Dist intDistortion, DFunc eDFunc )
    67 {
    68   Double distortion = (Double) intDistortion;
    69 #else
    7057Double TComRdCost::calcRdCost( Double numBits, Double distortion, DFunc eDFunc )
    7158{
    72 #endif
    7359 
    7460  Double lambda = 1.0;
     
    183169  m_afpDistortFunc[DF_HADS16N] = TComRdCost::xGetHADs;
    184170
    185 #if NH_3D_VSO
    186   // SAIT_VSO_EST_A0033
    187   m_afpDistortFunc[29]  = TComRdCost::xGetVSD;
    188   m_afpDistortFunc[30]  = TComRdCost::xGetVSD4;
    189   m_afpDistortFunc[31]  = TComRdCost::xGetVSD8;
    190   m_afpDistortFunc[32]  = TComRdCost::xGetVSD16;
    191   m_afpDistortFunc[33]  = TComRdCost::xGetVSD32;
    192   m_afpDistortFunc[34]  = TComRdCost::xGetVSD64;
    193   m_afpDistortFunc[35]  = TComRdCost::xGetVSD16N;
    194 #endif
    195171
    196172  m_costMode                   = COST_STANDARD_LOSSY;
     
    199175  m_iCostScale                 = 0;
    200176
    201 #if NH_3D_VSO
    202   m_bUseVSO                 = false;
    203   m_uiVSOMode               = 0;
    204   m_fpDistortFuncVSO        = NULL;
    205   m_pcRenModel              = NULL;
    206 
    207   // SAIT_VSO_EST_A0033
    208   m_bUseEstimatedVSD        = false;
    209 #endif
    210 #if NH_3D_DBBP
    211   m_bUseMask                = false;
    212 #endif
    213177
    214178}
     
    237201  rcDistParam.DistFunc = m_afpDistortFunc[eDFunc + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ];
    238202
    239 #if NH_3D_DBBP
    240   if( m_bUseMask )
    241   {
    242     if( eDFunc >= DF_SSE && eDFunc <= DF_SSE16N )
    243     {
    244       rcDistParam.DistFunc = TComRdCost::xGetMaskedSSE;
    245     }
    246     else if( eDFunc >= DF_SAD && eDFunc <= DF_SADS16N )
    247     {
    248       rcDistParam.DistFunc = TComRdCost::xGetMaskedSAD;
    249     }
    250     else if( eDFunc >= DF_HADS && eDFunc <= DF_HADS16N )
    251     {
    252       rcDistParam.DistFunc = TComRdCost::xGetMaskedSAD;
    253     }
    254     else if( eDFunc >= DF_VSD && eDFunc <= DF_VSD16N )
    255     {
    256       rcDistParam.DistFunc = TComRdCost::xGetMaskedVSD;
    257     }
    258     else if( eDFunc >= DF_SAD12 && eDFunc <= DF_SADS48 )
    259     {
    260       rcDistParam.DistFunc = TComRdCost::xGetMaskedSAD;
    261     }
    262   }
    263 #endif
    264203  // initialize
    265204  rcDistParam.iSubShift  = 0;
     
    296235  }
    297236
    298 #if NH_3D_DBBP
    299   if( m_bUseMask )
    300   {
    301     rcDistParam.DistFunc = TComRdCost::xGetMaskedSAD;
    302   }
    303 #endif
    304237  // initialize
    305238  rcDistParam.iSubShift  = 0;
     
    347280  }
    348281
    349 #if NH_3D_DBBP
    350   if( m_bUseMask )
    351   {
    352     rcDistParam.DistFunc = TComRdCost::xGetMaskedSAD;
    353   }
    354 #endif
    355282  // initialize
    356283  rcDistParam.iSubShift  = 0;
     
    370297  rcDP.DistFunc   = m_afpDistortFunc[ ( bHadamard ? DF_HADS : DF_SADS ) + g_aucConvertToBit[ iWidth ] + 1 ];
    371298  rcDP.m_maximumDistortionForEarlyExit = std::numeric_limits<Distortion>::max();
    372 #if NH_3D_DBBP
    373   if( m_bUseMask )
    374   {
    375     rcDP.DistFunc = TComRdCost::xGetMaskedSAD;
    376   }
    377 #endif
    378299}
    379300
     
    413334}
    414335
    415 #if NH_3D_ENC_DEPTH
    416 UInt TComRdCost::calcVAR (Pel* pi0, Int stride, Int width, Int height, Int cuDepth, UInt maxCuWidth)
    417 {
    418   Int temp = 0;
    419 
    420   for (Int y = 0; y < height; y++)
    421   {
    422     for (Int x = 0; x < width; x++)
    423     {
    424       temp += pi0[ y * stride + x ];
    425     }
    426   }
    427 
    428   Int cuMaxLog2Size = g_aucConvertToBit[maxCuWidth]+2;
    429  
    430   if ( width == 4 )
    431   {
    432     cuDepth = cuMaxLog2Size - 2;
    433   }
    434 
    435   temp = temp >> (cuMaxLog2Size-cuDepth) * 2;
    436 
    437   UInt sum = 0;
    438   for (Int y = 0; y < height; y++)
    439   {
    440     for (Int x = 0; x <  width; x++)
    441     {
    442       sum += (pi0[ y * stride + x ] - temp ) * (pi0[ y * stride + x ] - temp );
    443     }
    444   }
    445   return (sum >> (cuMaxLog2Size-cuDepth)*2);
    446 
    447 }
    448 #endif
    449336
    450337
     
    463350  cDtParam.bitDepth     = bitDepth;
    464351
    465 #if NH_3D_IC
    466   cDtParam.bUseIC       = false;
    467 #endif
    468 #if NH_3D_SDC_INTER
    469   cDtParam.bUseSDCMRSAD = false;
    470 #endif
    471352
    472353  if (isChroma(compID))
     
    479360  }
    480361}
    481 #if NH_3D_VSO
    482 // SAIT_VSO_EST_A0033
    483 UInt TComRdCost::getDistPartVSD( TComDataCU* pcCU, UInt uiPartOffset, Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight,  Bool bHAD, DFunc eDFunc )
    484 {
    485   AOT( ( m_dDisparityCoeff <= 0 ) || ( m_dDisparityCoeff > 10 ) );
    486 
    487   Pel* piVirRec  = m_pcVideoRecPicYuv->getAddr( COMPONENT_Y, pcCU->getCtuRsAddr( ), pcCU->getZorderIdxInCtu()+uiPartOffset );
    488   Pel* piVirOrg  = m_pcDepthPicYuv   ->getAddr( COMPONENT_Y, pcCU->getCtuRsAddr( ), pcCU->getZorderIdxInCtu()+uiPartOffset );
    489   Int iVirStride = m_pcVideoRecPicYuv->getStride( COMPONENT_Y );   
    490 
    491   DistParam cDtParam;
    492   setDistParam( uiBlkWidth, uiBlkHeight, eDFunc, cDtParam );
    493   cDtParam.pOrg       = piOrg;
    494   cDtParam.pCur       = piCur;
    495   cDtParam.pVirRec    = piVirRec;
    496   cDtParam.pVirOrg    = piVirOrg;
    497   cDtParam.iStrideVir = iVirStride;
    498   cDtParam.iStrideOrg = iOrgStride;
    499   cDtParam.iStrideCur = iCurStride;
    500   cDtParam.iStep      = 1;
    501 
    502   cDtParam.bApplyWeight = false; 
    503 
    504   cDtParam.bitDepth   = bitDepth;
    505 #if NH_3D
    506   cDtParam.bUseIC       = false;
    507 #endif
    508 #if NH_3D_SDC_INTER
    509   cDtParam.bUseSDCMRSAD = false;
    510 #endif
    511 
    512   Dist dist = cDtParam.DistFunc( &cDtParam );
    513 
    514   if ( m_bUseWVSO )   
    515   {
    516     Int iDWeight   = m_iDWeight   * m_iDWeight;
    517     Int iVSOWeight = m_iVSDWeight * m_iVSDWeight;
    518     Dist distDepth;
    519 
    520     if ( !bHAD )
    521     {
    522       distDepth = (Dist) getDistPart( bitDepth, piCur, iCurStride, piOrg, iOrgStride, uiBlkWidth, uiBlkHeight, COMPONENT_Y);
    523     }
    524     else
    525     {
    526       distDepth = (Dist) calcHAD( bitDepth, piCur, iCurStride, piOrg, iOrgStride, uiBlkWidth, uiBlkHeight);
    527     }
    528 
    529     dist = (Dist) (iDWeight * distDepth + iVSOWeight * dist ) / ( iDWeight + iVSOWeight);
    530   }
    531 
    532   return (UInt) dist;
    533 }
    534 #endif
    535 
    536 #if KWU_RC_MADPRED_E0227
    537 UInt TComRdCost::getSADPart ( Int bitDepth, Pel* pelCur, Int curStride,  Pel* pelOrg, Int orgStride, UInt width, UInt height )
    538 {
    539   UInt SAD = 0;
    540   Int shift = DISTORTION_PRECISION_ADJUSTMENT(bitDepth-8);
    541   for ( Int i=0; i<height; i++ )
    542   {
    543     for( Int j=0; j<width; j++ )
    544     {
    545       SAD += abs((pelCur[j] - pelOrg[j])) >> shift;
    546     }
    547     pelCur = pelCur + curStride;
    548     pelOrg = pelOrg + orgStride;
    549   }
    550   return SAD;
    551 }
    552 #endif
     362
    553363
    554364// ====================================================================================================================
     
    556366// ====================================================================================================================
    557367
    558 #if NH_3D_DBBP
    559 // --------------------------------------------------------------------------------------------------------------------
    560 // Masked distortion functions
    561 // --------------------------------------------------------------------------------------------------------------------
    562 
    563 UInt TComRdCost::xGetMaskedSSE( DistParam* pcDtParam )
    564 {
    565   const Pel* piOrg   = pcDtParam->pOrg;
    566   const Pel* piCur   = pcDtParam->pCur;
    567   Int  iRows   = pcDtParam->iRows;
    568   Int  iCols   = pcDtParam->iCols;
    569   Int  iStrideOrg = pcDtParam->iStrideOrg;
    570   Int  iStrideCur = pcDtParam->iStrideCur;
    571  
    572   UInt uiSum = 0;
    573  
    574   UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT((pcDtParam->bitDepth-8) << 1);
    575  
    576   Int iTemp;
    577  
    578   for( ; iRows != 0; iRows-- )
    579   {
    580     for (Int n = 0; n < iCols; n++ )
    581     {
    582       if( piOrg[n] != DBBP_INVALID_SHORT )
    583       {
    584         iTemp = piOrg[n  ] - piCur[n  ];
    585         uiSum += ( iTemp * iTemp ) >> uiShift;
    586       }
    587     }
    588     piOrg += iStrideOrg;
    589     piCur += iStrideCur;
    590   }
    591  
    592   return ( uiSum );
    593 }
    594 
    595 UInt TComRdCost::xGetMaskedSAD( DistParam* pcDtParam )
    596 {
    597  
    598   AOF(!pcDtParam->bApplyWeight);
    599 #if NH_3D_IC
    600   AOF(!pcDtParam->bUseIC);
    601 #endif
    602  
    603   const Pel* piOrg   = pcDtParam->pOrg;
    604   const Pel* piCur   = pcDtParam->pCur;
    605   Int  iRows   = pcDtParam->iRows;
    606   Int  iCols   = pcDtParam->iCols;
    607   Int  iStrideCur = pcDtParam->iStrideCur;
    608   Int  iStrideOrg = pcDtParam->iStrideOrg;
    609  
    610   UInt uiSum = 0;
    611  
    612   for( ; iRows != 0; iRows-- )
    613   {
    614     for (Int n = 0; n < iCols; n++ )
    615     {
    616       if( piOrg[n] != DBBP_INVALID_SHORT )
    617       {
    618         uiSum += abs( piOrg[n] - piCur[n] );
    619       }
    620     }
    621     piOrg += iStrideOrg;
    622     piCur += iStrideCur;
    623   }
    624  
    625   return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8);
    626 }
    627 
    628 
    629 UInt TComRdCost::xGetMaskedVSD( DistParam* pcDtParam )
    630 {
    631   const Pel* piOrg    = pcDtParam->pOrg;
    632   const Pel* piCur    = pcDtParam->pCur;
    633   const Pel* piVirRec = pcDtParam->pVirRec;
    634   const Pel* piVirOrg = pcDtParam->pVirOrg;
    635   Int  iRows    = pcDtParam->iRows;
    636   Int  iCols    = pcDtParam->iCols;
    637   Int  iStrideOrg = pcDtParam->iStrideOrg;
    638   Int  iStrideCur = pcDtParam->iStrideCur;
    639   Int  iStrideVir = pcDtParam->iStrideVir;
    640  
    641   UInt uiSum = 0;
    642   UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8)<<1;
    643  
    644   Int dDM;
    645  
    646   for ( Int y = 0 ; y < iRows ; y++ )
    647   {
    648     for (Int x = 0; x < iCols; x++ )
    649     {
    650       if( piOrg[x] != DBBP_INVALID_SHORT )
    651       {
    652         dDM = (Int) ( piOrg[x  ] - piCur[x  ] );
    653         uiSum += getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, x, y ) >> uiShift;
    654       }
    655     }
    656     piOrg += iStrideOrg;
    657     piCur += iStrideCur;
    658   }
    659  
    660   return ( uiSum );
    661 }
    662 #endif
    663368// --------------------------------------------------------------------------------------------------------------------
    664369// SAD
     
    671376    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    672377  }
    673 #if NH_3D_IC
    674   if( pcDtParam->bUseIC )
    675   {
    676     return xGetSADic( pcDtParam );
    677   }
    678 #endif
    679 #if NH_3D_SDC_INTER
    680   if( pcDtParam->bUseSDCMRSAD )
    681   {
    682     return xGetSADic( pcDtParam );
    683   }
    684 #endif
    685378
    686379  const Pel* piOrg   = pcDtParam->pOrg;
     
    717410  }
    718411
    719 #if NH_3D_IC
    720   if( pcDtParam->bUseIC )
    721   {
    722     return xGetSAD4ic( pcDtParam );
    723   }
    724 #endif
    725 #if NH_3D_SDC_INTER
    726   if( pcDtParam->bUseSDCMRSAD )
    727   {
    728     return xGetSAD4ic( pcDtParam );
    729   }
    730 #endif
    731412
    732413  const Pel* piOrg   = pcDtParam->pOrg;
     
    762443  }
    763444
    764 #if NH_3D_IC
    765   if( pcDtParam->bUseIC )
    766   {
    767     return xGetSAD8ic( pcDtParam );
    768   }
    769 #endif
    770 #if NH_3D_SDC_INTER
    771   if( pcDtParam->bUseSDCMRSAD )
    772   {
    773     return xGetSAD8ic( pcDtParam );
    774   }
    775 #endif
    776445
    777446  const Pel* piOrg      = pcDtParam->pOrg;
     
    811480  }
    812481
    813 #if NH_3D_IC
    814   if( pcDtParam->bUseIC )
    815   {
    816     return xGetSAD16ic( pcDtParam );
    817   }
    818 #endif
    819 #if NH_3D_SDC_INTER
    820   if( pcDtParam->bUseSDCMRSAD )
    821   {
    822     return xGetSAD16ic( pcDtParam );
    823   }
    824 #endif
    825482
    826483  const Pel* piOrg   = pcDtParam->pOrg;
     
    867524    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    868525  }
    869 #if NH_3D_IC
    870   if( pcDtParam->bUseIC )
    871   {
    872     return xGetSAD12ic( pcDtParam );
    873   }
    874 #endif
    875 #if NH_3D_SDC_INTER
    876   if( pcDtParam->bUseSDCMRSAD )
    877   {
    878     return xGetSAD12ic( pcDtParam );
    879   }
    880 #endif
    881526
    882527  const Pel* piOrg   = pcDtParam->pOrg;
     
    915560Distortion TComRdCost::xGetSAD16N( DistParam* pcDtParam )
    916561{
    917 #if NH_3D_IC
    918   if( pcDtParam->bUseIC )
    919   {
    920     return xGetSAD16Nic( pcDtParam );
    921   }
    922 #endif
    923 #if NH_3D_SDC_INTER
    924   if( pcDtParam->bUseSDCMRSAD )
    925   {
    926     return xGetSAD16Nic( pcDtParam );
    927   }
    928 #endif
    929562
    930563  const Pel* piOrg   = pcDtParam->pOrg;
     
    975608  }
    976609
    977 #if NH_3D_IC
    978   if( pcDtParam->bUseIC )
    979   {
    980     return xGetSAD32ic( pcDtParam );
    981   }
    982 #endif
    983 #if NH_3D_SDC_INTER
    984   if( pcDtParam->bUseSDCMRSAD )
    985   {
    986     return xGetSAD32ic( pcDtParam );
    987   }
    988 #endif
    989610
    990611  const Pel* piOrg   = pcDtParam->pOrg;
     
    1048669  }
    1049670
    1050 #if NH_3D_IC
    1051   if( pcDtParam->bUseIC )
    1052   {
    1053     return xGetSAD24ic( pcDtParam );
    1054   }
    1055 #endif
    1056 #if NH_3D_SDC_INTER
    1057   if( pcDtParam->bUseSDCMRSAD )
    1058   {
    1059     return xGetSAD24ic( pcDtParam );
    1060   }
    1061 #endif
    1062671
    1063672  const Pel* piOrg   = pcDtParam->pOrg;
     
    1113722  }
    1114723
    1115 #if NH_3D_IC
    1116   if( pcDtParam->bUseIC )
    1117   {
    1118     return xGetSAD64ic( pcDtParam );
    1119   }
    1120 #endif
    1121 #if NH_3D_SDC_INTER
    1122   if( pcDtParam->bUseSDCMRSAD )
    1123   {
    1124     return xGetSAD64ic( pcDtParam );
    1125   }
    1126 #endif
    1127724
    1128725  const Pel* piOrg   = pcDtParam->pOrg;
     
    1217814    return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    1218815  }
    1219 #if NH_3D_IC
    1220   if( pcDtParam->bUseIC )
    1221   {
    1222     return xGetSAD48ic( pcDtParam );
    1223   }
    1224 #endif
    1225 #if NH_3D_SDC_INTER
    1226   if( pcDtParam->bUseSDCMRSAD )
    1227   {
    1228     return xGetSAD48ic( pcDtParam );
    1229   }
    1230 #endif
    1231816
    1232817  const Pel* piOrg   = pcDtParam->pOrg;
     
    1300885
    1301886
    1302 #if NH_3D_IC || NH_3D_SDC_INTER
    1303 UInt TComRdCost::xGetSADic( DistParam* pcDtParam )
    1304 {
    1305   if ( pcDtParam->bApplyWeight )
    1306   {
    1307     return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    1308   }
    1309   const Pel* piOrg   = pcDtParam->pOrg;
    1310   const Pel* piCur   = pcDtParam->pCur;
    1311   Int  iRows   = pcDtParam->iRows;
    1312   Int  iCols   = pcDtParam->iCols;
    1313   Int  iStrideCur = pcDtParam->iStrideCur;
    1314   Int  iStrideOrg = pcDtParam->iStrideOrg;
    1315 
    1316   UInt uiSum = 0;
    1317 
    1318   Int  iOrigAvg = 0, iCurAvg = 0;
    1319   Int  iDeltaC;
    1320 
    1321   for( ; iRows != 0; iRows-- )
    1322   {
    1323     for (Int n = 0; n < iCols; n++ )
    1324     {
    1325       iOrigAvg += piOrg[n];
    1326       iCurAvg  += piCur[n];
    1327     }
    1328     piOrg += iStrideOrg;
    1329     piCur += iStrideCur;
    1330   }
    1331 
    1332   piOrg   = pcDtParam->pOrg;
    1333   piCur   = pcDtParam->pCur;
    1334   iRows   = pcDtParam->iRows;
    1335 
    1336   iDeltaC = (iOrigAvg - iCurAvg)/iCols/iRows;
    1337 
    1338   for( ; iRows != 0; iRows-- )
    1339   {
    1340     for (Int n = 0; n < iCols; n++ )
    1341     {
    1342       uiSum += abs( piOrg[n] - piCur[n] - iDeltaC );
    1343     }
    1344     piOrg += iStrideOrg;
    1345     piCur += iStrideCur;
    1346   }
    1347 
    1348   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    1349 }
    1350 
    1351 UInt TComRdCost::xGetSAD4ic( DistParam* pcDtParam )
    1352 {
    1353   if ( pcDtParam->bApplyWeight )
    1354   {
    1355     return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    1356   }
    1357   const Pel* piOrg   = pcDtParam->pOrg;
    1358   const Pel* piCur   = pcDtParam->pCur;
    1359   Int  iRows   = pcDtParam->iRows;
    1360   Int  iSubShift  = pcDtParam->iSubShift;
    1361   Int  iSubStep   = ( 1 << iSubShift );
    1362   Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
    1363   Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
    1364 
    1365   UInt uiSum = 0;
    1366 
    1367   Int  iOrigAvg = 0, iCurAvg = 0, uiRowCnt = 0;
    1368   Int  iDeltaC;
    1369 
    1370   for( ; iRows != 0; iRows-=iSubStep )
    1371   {
    1372     iOrigAvg += piOrg[0];
    1373     iOrigAvg += piOrg[1];
    1374     iOrigAvg += piOrg[2];
    1375     iOrigAvg += piOrg[3];
    1376 
    1377     iCurAvg  += piCur[0];
    1378     iCurAvg  += piCur[1];
    1379     iCurAvg  += piCur[2];
    1380     iCurAvg  += piCur[3];
    1381 
    1382     piOrg += iStrideOrg;
    1383     piCur += iStrideCur;
    1384     uiRowCnt++;
    1385   }
    1386 
    1387   piOrg   = pcDtParam->pOrg;
    1388   piCur   = pcDtParam->pCur;
    1389   iRows   = pcDtParam->iRows;
    1390 
    1391   iDeltaC = uiRowCnt ? ((iOrigAvg - iCurAvg)/uiRowCnt/4) : 0;
    1392 
    1393   for( ; iRows != 0; iRows-=iSubStep )
    1394   {
    1395     uiSum += abs( piOrg[0] - piCur[0] - iDeltaC );
    1396     uiSum += abs( piOrg[1] - piCur[1] - iDeltaC );
    1397     uiSum += abs( piOrg[2] - piCur[2] - iDeltaC );
    1398     uiSum += abs( piOrg[3] - piCur[3] - iDeltaC );
    1399 
    1400     piOrg += iStrideOrg;
    1401     piCur += iStrideCur;
    1402   }
    1403 
    1404   uiSum <<= iSubShift;
    1405   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    1406 }
    1407 
    1408 UInt TComRdCost::xGetSAD8ic( DistParam* pcDtParam )
    1409 {
    1410   if ( pcDtParam->bApplyWeight )
    1411   {
    1412     return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    1413   }
    1414   const Pel* piOrg      = pcDtParam->pOrg;
    1415   const Pel* piCur      = pcDtParam->pCur;
    1416   Int  iRows      = pcDtParam->iRows;
    1417   Int  iSubShift  = pcDtParam->iSubShift;
    1418   Int  iSubStep   = ( 1 << iSubShift );
    1419   Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
    1420   Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
    1421 
    1422   UInt uiSum = 0;
    1423 
    1424   Int  iOrigAvg = 0, iCurAvg = 0, uiRowCnt = 0;
    1425   Int  iDeltaC;
    1426 
    1427   for( ; iRows != 0; iRows-=iSubStep )
    1428   {
    1429     iOrigAvg += piOrg[0];
    1430     iOrigAvg += piOrg[1];
    1431     iOrigAvg += piOrg[2];
    1432     iOrigAvg += piOrg[3];
    1433     iOrigAvg += piOrg[4];
    1434     iOrigAvg += piOrg[5];
    1435     iOrigAvg += piOrg[6];
    1436     iOrigAvg += piOrg[7];
    1437 
    1438     iCurAvg  += piCur[0];
    1439     iCurAvg  += piCur[1];
    1440     iCurAvg  += piCur[2];
    1441     iCurAvg  += piCur[3];
    1442     iCurAvg  += piCur[4];
    1443     iCurAvg  += piCur[5];
    1444     iCurAvg  += piCur[6];
    1445     iCurAvg  += piCur[7];
    1446 
    1447     piOrg += iStrideOrg;
    1448     piCur += iStrideCur;
    1449     uiRowCnt++;
    1450   }
    1451 
    1452   piOrg   = pcDtParam->pOrg;
    1453   piCur   = pcDtParam->pCur;
    1454   iRows   = pcDtParam->iRows;
    1455 
    1456   iDeltaC = uiRowCnt ? ((iOrigAvg - iCurAvg)/uiRowCnt/8) : 0;
    1457 
    1458   for( ; iRows != 0; iRows-=iSubStep )
    1459   {
    1460     uiSum += abs( piOrg[0] - piCur[0] - iDeltaC );
    1461     uiSum += abs( piOrg[1] - piCur[1] - iDeltaC );
    1462     uiSum += abs( piOrg[2] - piCur[2] - iDeltaC );
    1463     uiSum += abs( piOrg[3] - piCur[3] - iDeltaC );
    1464     uiSum += abs( piOrg[4] - piCur[4] - iDeltaC );
    1465     uiSum += abs( piOrg[5] - piCur[5] - iDeltaC );
    1466     uiSum += abs( piOrg[6] - piCur[6] - iDeltaC );
    1467     uiSum += abs( piOrg[7] - piCur[7] - iDeltaC );
    1468 
    1469     piOrg += iStrideOrg;
    1470     piCur += iStrideCur;
    1471   }
    1472 
    1473   uiSum <<= iSubShift;
    1474   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    1475 }
    1476 
    1477 UInt TComRdCost::xGetSAD16ic( DistParam* pcDtParam )
    1478 {
    1479   if ( pcDtParam->bApplyWeight )
    1480   {
    1481     return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    1482   }
    1483   const Pel* piOrg   = pcDtParam->pOrg;
    1484   const Pel* piCur   = pcDtParam->pCur;
    1485   Int  iRows   = pcDtParam->iRows;
    1486   Int  iSubShift  = pcDtParam->iSubShift;
    1487   Int  iSubStep   = ( 1 << iSubShift );
    1488   Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
    1489   Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
    1490 
    1491   UInt uiSum = 0;
    1492 
    1493   Int iOrigAvg = 0, iCurAvg = 0, uiRowCnt = 0;
    1494   Int iDeltaC;
    1495 
    1496   for( ; iRows != 0; iRows-=iSubStep )
    1497   {
    1498     iOrigAvg += piOrg[0];
    1499     iOrigAvg += piOrg[1];
    1500     iOrigAvg += piOrg[2];
    1501     iOrigAvg += piOrg[3];
    1502     iOrigAvg += piOrg[4];
    1503     iOrigAvg += piOrg[5];
    1504     iOrigAvg += piOrg[6];
    1505     iOrigAvg += piOrg[7];
    1506     iOrigAvg += piOrg[8];
    1507     iOrigAvg += piOrg[9];
    1508     iOrigAvg += piOrg[10];
    1509     iOrigAvg += piOrg[11];
    1510     iOrigAvg += piOrg[12];
    1511     iOrigAvg += piOrg[13];
    1512     iOrigAvg += piOrg[14];
    1513     iOrigAvg += piOrg[15];
    1514 
    1515     iCurAvg  += piCur[0];
    1516     iCurAvg  += piCur[1];
    1517     iCurAvg  += piCur[2];
    1518     iCurAvg  += piCur[3];
    1519     iCurAvg  += piCur[4];
    1520     iCurAvg  += piCur[5];
    1521     iCurAvg  += piCur[6];
    1522     iCurAvg  += piCur[7];
    1523     iCurAvg  += piCur[8];
    1524     iCurAvg  += piCur[9];
    1525     iCurAvg  += piCur[10];
    1526     iCurAvg  += piCur[11];
    1527     iCurAvg  += piCur[12];
    1528     iCurAvg  += piCur[13];
    1529     iCurAvg  += piCur[14];
    1530     iCurAvg  += piCur[15];
    1531 
    1532     piOrg += iStrideOrg;
    1533     piCur += iStrideCur;
    1534     uiRowCnt++;
    1535   }
    1536 
    1537   piOrg   = pcDtParam->pOrg;
    1538   piCur   = pcDtParam->pCur;
    1539   iRows   = pcDtParam->iRows;
    1540 
    1541   iDeltaC = uiRowCnt ? ((iOrigAvg - iCurAvg)/uiRowCnt/16) : 0;
    1542 
    1543   for( ; iRows != 0; iRows-=iSubStep )
    1544   {
    1545     uiSum += abs( piOrg[0] - piCur[0] - iDeltaC );
    1546     uiSum += abs( piOrg[1] - piCur[1] - iDeltaC );
    1547     uiSum += abs( piOrg[2] - piCur[2] - iDeltaC );
    1548     uiSum += abs( piOrg[3] - piCur[3] - iDeltaC );
    1549     uiSum += abs( piOrg[4] - piCur[4] - iDeltaC );
    1550     uiSum += abs( piOrg[5] - piCur[5] - iDeltaC );
    1551     uiSum += abs( piOrg[6] - piCur[6] - iDeltaC );
    1552     uiSum += abs( piOrg[7] - piCur[7] - iDeltaC );
    1553     uiSum += abs( piOrg[8] - piCur[8] - iDeltaC );
    1554     uiSum += abs( piOrg[9] - piCur[9] - iDeltaC );
    1555     uiSum += abs( piOrg[10] - piCur[10] - iDeltaC );
    1556     uiSum += abs( piOrg[11] - piCur[11] - iDeltaC );
    1557     uiSum += abs( piOrg[12] - piCur[12] - iDeltaC );
    1558     uiSum += abs( piOrg[13] - piCur[13] - iDeltaC );
    1559     uiSum += abs( piOrg[14] - piCur[14] - iDeltaC );
    1560     uiSum += abs( piOrg[15] - piCur[15] - iDeltaC );
    1561 
    1562     piOrg += iStrideOrg;
    1563     piCur += iStrideCur;
    1564   }
    1565 
    1566   uiSum <<= iSubShift;
    1567   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    1568 }
    1569 
    1570 UInt TComRdCost::xGetSAD12ic( DistParam* pcDtParam )
    1571 {
    1572   if ( pcDtParam->bApplyWeight )
    1573   {
    1574     return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    1575   }
    1576   const Pel* piOrg   = pcDtParam->pOrg;
    1577   const Pel* piCur   = pcDtParam->pCur;
    1578   Int  iRows   = pcDtParam->iRows;
    1579   Int  iSubShift  = pcDtParam->iSubShift;
    1580   Int  iSubStep   = ( 1 << iSubShift );
    1581   Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
    1582   Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
    1583 
    1584   UInt uiSum = 0;
    1585 
    1586   Int  iOrigAvg = 0, iCurAvg = 0, uiRowCnt = 0;
    1587   Int  iDeltaC;
    1588 
    1589   for( ; iRows != 0; iRows-=iSubStep )
    1590   {
    1591     iOrigAvg += piOrg[0];
    1592     iOrigAvg += piOrg[1];
    1593     iOrigAvg += piOrg[2];
    1594     iOrigAvg += piOrg[3];
    1595     iOrigAvg += piOrg[4];
    1596     iOrigAvg += piOrg[5];
    1597     iOrigAvg += piOrg[6];
    1598     iOrigAvg += piOrg[7];
    1599     iOrigAvg += piOrg[8];
    1600     iOrigAvg += piOrg[9];
    1601     iOrigAvg += piOrg[10];
    1602     iOrigAvg += piOrg[11];
    1603 
    1604     iCurAvg  += piCur[0];
    1605     iCurAvg  += piCur[1];
    1606     iCurAvg  += piCur[2];
    1607     iCurAvg  += piCur[3];
    1608     iCurAvg  += piCur[4];
    1609     iCurAvg  += piCur[5];
    1610     iCurAvg  += piCur[6];
    1611     iCurAvg  += piCur[7];
    1612     iCurAvg  += piCur[8];
    1613     iCurAvg  += piCur[9];
    1614     iCurAvg  += piCur[10];
    1615     iCurAvg  += piCur[11];
    1616 
    1617     piOrg += iStrideOrg;
    1618     piCur += iStrideCur;
    1619     uiRowCnt++;
    1620   }
    1621 
    1622   piOrg   = pcDtParam->pOrg;
    1623   piCur   = pcDtParam->pCur;
    1624   iRows   = pcDtParam->iRows;
    1625 
    1626   iDeltaC = uiRowCnt ? ((iOrigAvg - iCurAvg)/uiRowCnt/12) : 0;
    1627 
    1628   for( ; iRows != 0; iRows-=iSubStep )
    1629   {
    1630     uiSum += abs( piOrg[0] - piCur[0] - iDeltaC );
    1631     uiSum += abs( piOrg[1] - piCur[1] - iDeltaC );
    1632     uiSum += abs( piOrg[2] - piCur[2] - iDeltaC );
    1633     uiSum += abs( piOrg[3] - piCur[3] - iDeltaC );
    1634     uiSum += abs( piOrg[4] - piCur[4] - iDeltaC );
    1635     uiSum += abs( piOrg[5] - piCur[5] - iDeltaC );
    1636     uiSum += abs( piOrg[6] - piCur[6] - iDeltaC );
    1637     uiSum += abs( piOrg[7] - piCur[7] - iDeltaC );
    1638     uiSum += abs( piOrg[8] - piCur[8] - iDeltaC );
    1639     uiSum += abs( piOrg[9] - piCur[9] - iDeltaC );
    1640     uiSum += abs( piOrg[10] - piCur[10] - iDeltaC );
    1641     uiSum += abs( piOrg[11] - piCur[11] - iDeltaC );
    1642 
    1643     piOrg += iStrideOrg;
    1644     piCur += iStrideCur;
    1645   }
    1646 
    1647   uiSum <<= iSubShift;
    1648   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    1649 }
    1650 
    1651 
    1652 UInt TComRdCost::xGetSAD16Nic( DistParam* pcDtParam )
    1653 {
    1654   const Pel* piOrg   = pcDtParam->pOrg;
    1655   const Pel* piCur   = pcDtParam->pCur;
    1656   Int  iRows   = pcDtParam->iRows;
    1657   Int  iCols   = pcDtParam->iCols;
    1658   Int  iSubShift  = pcDtParam->iSubShift;
    1659   Int  iSubStep   = ( 1 << iSubShift );
    1660   Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
    1661   Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
    1662 
    1663   UInt uiSum = 0;
    1664 
    1665   Int iOrigAvg = 0, iCurAvg = 0, uiRowCnt = 0, uiColCnt = (iCols-1)/16 + 1;
    1666   Int  iDeltaC;
    1667 
    1668   for( ; iRows != 0; iRows-=iSubStep )
    1669   {
    1670     for (Int n = 0; n < iCols; n+=16 )
    1671     {
    1672       iOrigAvg += piOrg[n + 0];
    1673       iOrigAvg += piOrg[n + 1];
    1674       iOrigAvg += piOrg[n + 2];
    1675       iOrigAvg += piOrg[n + 3];
    1676       iOrigAvg += piOrg[n + 4];
    1677       iOrigAvg += piOrg[n + 5];
    1678       iOrigAvg += piOrg[n + 6];
    1679       iOrigAvg += piOrg[n + 7];
    1680       iOrigAvg += piOrg[n + 8];
    1681       iOrigAvg += piOrg[n + 9];
    1682       iOrigAvg += piOrg[n + 10];
    1683       iOrigAvg += piOrg[n + 11];
    1684       iOrigAvg += piOrg[n + 12];
    1685       iOrigAvg += piOrg[n + 13];
    1686       iOrigAvg += piOrg[n + 14];
    1687       iOrigAvg += piOrg[n + 15];
    1688 
    1689       iCurAvg  += piCur[n + 0];
    1690       iCurAvg  += piCur[n + 1];
    1691       iCurAvg  += piCur[n + 2];
    1692       iCurAvg  += piCur[n + 3];
    1693       iCurAvg  += piCur[n + 4];
    1694       iCurAvg  += piCur[n + 5];
    1695       iCurAvg  += piCur[n + 6];
    1696       iCurAvg  += piCur[n + 7];
    1697       iCurAvg  += piCur[n + 8];
    1698       iCurAvg  += piCur[n + 9];
    1699       iCurAvg  += piCur[n + 10];
    1700       iCurAvg  += piCur[n + 11];
    1701       iCurAvg  += piCur[n + 12];
    1702       iCurAvg  += piCur[n + 13];
    1703       iCurAvg  += piCur[n + 14];
    1704       iCurAvg  += piCur[n + 15];
    1705     }
    1706     piOrg += iStrideOrg;
    1707     piCur += iStrideCur;
    1708     uiRowCnt++;
    1709   }
    1710   piOrg   = pcDtParam->pOrg;
    1711   piCur   = pcDtParam->pCur;
    1712   iRows   = pcDtParam->iRows;
    1713 
    1714   iDeltaC = (uiRowCnt && uiColCnt) ? ((iOrigAvg - iCurAvg)/uiRowCnt/uiColCnt/16) : 0;
    1715 
    1716   for( ; iRows != 0; iRows-=iSubStep )
    1717   {
    1718     for (Int n = 0; n < iCols; n+=16 )
    1719     {
    1720       uiSum += abs( piOrg[n+ 0] - piCur[n+ 0] - iDeltaC );
    1721       uiSum += abs( piOrg[n+ 1] - piCur[n+ 1] - iDeltaC );
    1722       uiSum += abs( piOrg[n+ 2] - piCur[n+ 2] - iDeltaC );
    1723       uiSum += abs( piOrg[n+ 3] - piCur[n+ 3] - iDeltaC );
    1724       uiSum += abs( piOrg[n+ 4] - piCur[n+ 4] - iDeltaC );
    1725       uiSum += abs( piOrg[n+ 5] - piCur[n+ 5] - iDeltaC );
    1726       uiSum += abs( piOrg[n+ 6] - piCur[n+ 6] - iDeltaC );
    1727       uiSum += abs( piOrg[n+ 7] - piCur[n+ 7] - iDeltaC );
    1728       uiSum += abs( piOrg[n+ 8] - piCur[n+ 8] - iDeltaC );
    1729       uiSum += abs( piOrg[n+ 9] - piCur[n+ 9] - iDeltaC );
    1730       uiSum += abs( piOrg[n+10] - piCur[n+10] - iDeltaC );
    1731       uiSum += abs( piOrg[n+11] - piCur[n+11] - iDeltaC );
    1732       uiSum += abs( piOrg[n+12] - piCur[n+12] - iDeltaC );
    1733       uiSum += abs( piOrg[n+13] - piCur[n+13] - iDeltaC );
    1734       uiSum += abs( piOrg[n+14] - piCur[n+14] - iDeltaC );
    1735       uiSum += abs( piOrg[n+15] - piCur[n+15] - iDeltaC );
    1736     }
    1737     piOrg += iStrideOrg;
    1738     piCur += iStrideCur;
    1739   }
    1740 
    1741   uiSum <<= iSubShift;
    1742   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    1743 }
    1744 
    1745 UInt TComRdCost::xGetSAD32ic( DistParam* pcDtParam )
    1746 {
    1747   if ( pcDtParam->bApplyWeight )
    1748   {
    1749     return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    1750   }
    1751   const Pel* piOrg   = pcDtParam->pOrg;
    1752   const Pel* piCur   = pcDtParam->pCur;
    1753   Int  iRows   = pcDtParam->iRows;
    1754   Int  iSubShift  = pcDtParam->iSubShift;
    1755   Int  iSubStep   = ( 1 << iSubShift );
    1756   Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
    1757   Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
    1758 
    1759   UInt uiSum = 0;
    1760 
    1761   Int  iOrigAvg = 0, iCurAvg = 0, uiRowCnt = 0;
    1762   Int  iDeltaC;
    1763 
    1764   for( ; iRows != 0; iRows-=iSubStep )
    1765   {
    1766     iOrigAvg += piOrg[0];
    1767     iOrigAvg += piOrg[1];
    1768     iOrigAvg += piOrg[2];
    1769     iOrigAvg += piOrg[3];
    1770     iOrigAvg += piOrg[4];
    1771     iOrigAvg += piOrg[5];
    1772     iOrigAvg += piOrg[6];
    1773     iOrigAvg += piOrg[7];
    1774     iOrigAvg += piOrg[8];
    1775     iOrigAvg += piOrg[9];
    1776     iOrigAvg += piOrg[10];
    1777     iOrigAvg += piOrg[11];
    1778     iOrigAvg += piOrg[12];
    1779     iOrigAvg += piOrg[13];
    1780     iOrigAvg += piOrg[14];
    1781     iOrigAvg += piOrg[15];
    1782     iOrigAvg += piOrg[16];
    1783     iOrigAvg += piOrg[17];
    1784     iOrigAvg += piOrg[18];
    1785     iOrigAvg += piOrg[19];
    1786     iOrigAvg += piOrg[20];
    1787     iOrigAvg += piOrg[21];
    1788     iOrigAvg += piOrg[22];
    1789     iOrigAvg += piOrg[23];
    1790     iOrigAvg += piOrg[24];
    1791     iOrigAvg += piOrg[25];
    1792     iOrigAvg += piOrg[26];
    1793     iOrigAvg += piOrg[27];
    1794     iOrigAvg += piOrg[28];
    1795     iOrigAvg += piOrg[29];
    1796     iOrigAvg += piOrg[30];
    1797     iOrigAvg += piOrg[31];
    1798 
    1799     iCurAvg  += piCur[0];
    1800     iCurAvg  += piCur[1];
    1801     iCurAvg  += piCur[2];
    1802     iCurAvg  += piCur[3];
    1803     iCurAvg  += piCur[4];
    1804     iCurAvg  += piCur[5];
    1805     iCurAvg  += piCur[6];
    1806     iCurAvg  += piCur[7];
    1807     iCurAvg  += piCur[8];
    1808     iCurAvg  += piCur[9];
    1809     iCurAvg  += piCur[10];
    1810     iCurAvg  += piCur[11];
    1811     iCurAvg  += piCur[12];
    1812     iCurAvg  += piCur[13];
    1813     iCurAvg  += piCur[14];
    1814     iCurAvg  += piCur[15];
    1815     iCurAvg  += piCur[16];
    1816     iCurAvg  += piCur[17];
    1817     iCurAvg  += piCur[18];
    1818     iCurAvg  += piCur[19];
    1819     iCurAvg  += piCur[20];
    1820     iCurAvg  += piCur[21];
    1821     iCurAvg  += piCur[22];
    1822     iCurAvg  += piCur[23];
    1823     iCurAvg  += piCur[24];
    1824     iCurAvg  += piCur[25];
    1825     iCurAvg  += piCur[26];
    1826     iCurAvg  += piCur[27];
    1827     iCurAvg  += piCur[28];
    1828     iCurAvg  += piCur[29];
    1829     iCurAvg  += piCur[30];
    1830     iCurAvg  += piCur[31];
    1831 
    1832     piOrg += iStrideOrg;
    1833     piCur += iStrideCur;
    1834     uiRowCnt++;
    1835   }
    1836 
    1837   piOrg   = pcDtParam->pOrg;
    1838   piCur   = pcDtParam->pCur;
    1839   iRows   = pcDtParam->iRows;
    1840 
    1841   iDeltaC = uiRowCnt ? ((iOrigAvg - iCurAvg)/uiRowCnt/32) : 0;
    1842 
    1843   for( ; iRows != 0; iRows-=iSubStep )
    1844   {
    1845     uiSum += abs( piOrg[0] - piCur[0] - iDeltaC );
    1846     uiSum += abs( piOrg[1] - piCur[1] - iDeltaC );
    1847     uiSum += abs( piOrg[2] - piCur[2] - iDeltaC );
    1848     uiSum += abs( piOrg[3] - piCur[3] - iDeltaC );
    1849     uiSum += abs( piOrg[4] - piCur[4] - iDeltaC );
    1850     uiSum += abs( piOrg[5] - piCur[5] - iDeltaC );
    1851     uiSum += abs( piOrg[6] - piCur[6] - iDeltaC );
    1852     uiSum += abs( piOrg[7] - piCur[7] - iDeltaC );
    1853     uiSum += abs( piOrg[8] - piCur[8] - iDeltaC );
    1854     uiSum += abs( piOrg[9] - piCur[9] - iDeltaC );
    1855     uiSum += abs( piOrg[10] - piCur[10] - iDeltaC );
    1856     uiSum += abs( piOrg[11] - piCur[11] - iDeltaC );
    1857     uiSum += abs( piOrg[12] - piCur[12] - iDeltaC );
    1858     uiSum += abs( piOrg[13] - piCur[13] - iDeltaC );
    1859     uiSum += abs( piOrg[14] - piCur[14] - iDeltaC );
    1860     uiSum += abs( piOrg[15] - piCur[15] - iDeltaC );
    1861     uiSum += abs( piOrg[16] - piCur[16] - iDeltaC );
    1862     uiSum += abs( piOrg[17] - piCur[17] - iDeltaC );
    1863     uiSum += abs( piOrg[18] - piCur[18] - iDeltaC );
    1864     uiSum += abs( piOrg[19] - piCur[19] - iDeltaC );
    1865     uiSum += abs( piOrg[20] - piCur[20] - iDeltaC );
    1866     uiSum += abs( piOrg[21] - piCur[21] - iDeltaC );
    1867     uiSum += abs( piOrg[22] - piCur[22] - iDeltaC );
    1868     uiSum += abs( piOrg[23] - piCur[23] - iDeltaC );
    1869     uiSum += abs( piOrg[24] - piCur[24] - iDeltaC );
    1870     uiSum += abs( piOrg[25] - piCur[25] - iDeltaC );
    1871     uiSum += abs( piOrg[26] - piCur[26] - iDeltaC );
    1872     uiSum += abs( piOrg[27] - piCur[27] - iDeltaC );
    1873     uiSum += abs( piOrg[28] - piCur[28] - iDeltaC );
    1874     uiSum += abs( piOrg[29] - piCur[29] - iDeltaC );
    1875     uiSum += abs( piOrg[30] - piCur[30] - iDeltaC );
    1876     uiSum += abs( piOrg[31] - piCur[31] - iDeltaC );
    1877 
    1878     piOrg += iStrideOrg;
    1879     piCur += iStrideCur;
    1880   }
    1881 
    1882   uiSum <<= iSubShift;
    1883   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    1884 }
    1885 
    1886 
    1887 UInt TComRdCost::xGetSAD24ic( DistParam* pcDtParam )
    1888 {
    1889   if ( pcDtParam->bApplyWeight )
    1890   {
    1891     return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    1892   }
    1893   const Pel* piOrg   = pcDtParam->pOrg;
    1894   const Pel* piCur   = pcDtParam->pCur;
    1895   Int  iRows   = pcDtParam->iRows;
    1896   Int  iSubShift  = pcDtParam->iSubShift;
    1897   Int  iSubStep   = ( 1 << iSubShift );
    1898   Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
    1899   Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
    1900 
    1901   UInt uiSum = 0;
    1902 
    1903   Int  iOrigAvg = 0, iCurAvg = 0, uiRowCnt = 0;
    1904   Int  iDeltaC;
    1905 
    1906   for( ; iRows != 0; iRows-=iSubStep )
    1907   {
    1908     iOrigAvg += piOrg[0];
    1909     iOrigAvg += piOrg[1];
    1910     iOrigAvg += piOrg[2];
    1911     iOrigAvg += piOrg[3];
    1912     iOrigAvg += piOrg[4];
    1913     iOrigAvg += piOrg[5];
    1914     iOrigAvg += piOrg[6];
    1915     iOrigAvg += piOrg[7];
    1916     iOrigAvg += piOrg[8];
    1917     iOrigAvg += piOrg[9];
    1918     iOrigAvg += piOrg[10];
    1919     iOrigAvg += piOrg[11];
    1920     iOrigAvg += piOrg[12];
    1921     iOrigAvg += piOrg[13];
    1922     iOrigAvg += piOrg[14];
    1923     iOrigAvg += piOrg[15];
    1924     iOrigAvg += piOrg[16];
    1925     iOrigAvg += piOrg[17];
    1926     iOrigAvg += piOrg[18];
    1927     iOrigAvg += piOrg[19];
    1928     iOrigAvg += piOrg[20];
    1929     iOrigAvg += piOrg[21];
    1930     iOrigAvg += piOrg[22];
    1931     iOrigAvg += piOrg[23];
    1932 
    1933     iCurAvg  += piCur[0];
    1934     iCurAvg  += piCur[1];
    1935     iCurAvg  += piCur[2];
    1936     iCurAvg  += piCur[3];
    1937     iCurAvg  += piCur[4];
    1938     iCurAvg  += piCur[5];
    1939     iCurAvg  += piCur[6];
    1940     iCurAvg  += piCur[7];
    1941     iCurAvg  += piCur[8];
    1942     iCurAvg  += piCur[9];
    1943     iCurAvg  += piCur[10];
    1944     iCurAvg  += piCur[11];
    1945     iCurAvg  += piCur[12];
    1946     iCurAvg  += piCur[13];
    1947     iCurAvg  += piCur[14];
    1948     iCurAvg  += piCur[15];
    1949     iCurAvg  += piCur[16];
    1950     iCurAvg  += piCur[17];
    1951     iCurAvg  += piCur[18];
    1952     iCurAvg  += piCur[19];
    1953     iCurAvg  += piCur[20];
    1954     iCurAvg  += piCur[21];
    1955     iCurAvg  += piCur[22];
    1956     iCurAvg  += piCur[23];
    1957 
    1958     piOrg += iStrideOrg;
    1959     piCur += iStrideCur;
    1960     uiRowCnt++;
    1961   }
    1962 
    1963   piOrg   = pcDtParam->pOrg;
    1964   piCur   = pcDtParam->pCur;
    1965   iRows   = pcDtParam->iRows;
    1966 
    1967   iDeltaC = uiRowCnt ? ((iOrigAvg - iCurAvg)/uiRowCnt/24) : 0;
    1968 
    1969   for( ; iRows != 0; iRows-=iSubStep )
    1970   {
    1971     uiSum += abs( piOrg[0] - piCur[0] - iDeltaC );
    1972     uiSum += abs( piOrg[1] - piCur[1] - iDeltaC );
    1973     uiSum += abs( piOrg[2] - piCur[2] - iDeltaC );
    1974     uiSum += abs( piOrg[3] - piCur[3] - iDeltaC );
    1975     uiSum += abs( piOrg[4] - piCur[4] - iDeltaC );
    1976     uiSum += abs( piOrg[5] - piCur[5] - iDeltaC );
    1977     uiSum += abs( piOrg[6] - piCur[6] - iDeltaC );
    1978     uiSum += abs( piOrg[7] - piCur[7] - iDeltaC );
    1979     uiSum += abs( piOrg[8] - piCur[8] - iDeltaC );
    1980     uiSum += abs( piOrg[9] - piCur[9] - iDeltaC );
    1981     uiSum += abs( piOrg[10] - piCur[10] - iDeltaC );
    1982     uiSum += abs( piOrg[11] - piCur[11] - iDeltaC );
    1983     uiSum += abs( piOrg[12] - piCur[12] - iDeltaC );
    1984     uiSum += abs( piOrg[13] - piCur[13] - iDeltaC );
    1985     uiSum += abs( piOrg[14] - piCur[14] - iDeltaC );
    1986     uiSum += abs( piOrg[15] - piCur[15] - iDeltaC );
    1987     uiSum += abs( piOrg[16] - piCur[16] - iDeltaC );
    1988     uiSum += abs( piOrg[17] - piCur[17] - iDeltaC );
    1989     uiSum += abs( piOrg[18] - piCur[18] - iDeltaC );
    1990     uiSum += abs( piOrg[19] - piCur[19] - iDeltaC );
    1991     uiSum += abs( piOrg[20] - piCur[20] - iDeltaC );
    1992     uiSum += abs( piOrg[21] - piCur[21] - iDeltaC );
    1993     uiSum += abs( piOrg[22] - piCur[22] - iDeltaC );
    1994     uiSum += abs( piOrg[23] - piCur[23] - iDeltaC );
    1995 
    1996     piOrg += iStrideOrg;
    1997     piCur += iStrideCur;
    1998   }
    1999 
    2000   uiSum <<= iSubShift;
    2001   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    2002 }
    2003 
    2004 UInt TComRdCost::xGetSAD64ic( DistParam* pcDtParam )
    2005 {
    2006   if ( pcDtParam->bApplyWeight )
    2007   {
    2008     return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    2009   }
    2010   const Pel* piOrg   = pcDtParam->pOrg;
    2011   const Pel* piCur   = pcDtParam->pCur;
    2012   Int  iRows   = pcDtParam->iRows;
    2013   Int  iSubShift  = pcDtParam->iSubShift;
    2014   Int  iSubStep   = ( 1 << iSubShift );
    2015   Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
    2016   Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
    2017 
    2018   UInt uiSum = 0;
    2019 
    2020   Int  iOrigAvg = 0, iCurAvg = 0, uiRowCnt = 0;
    2021   Int  iDeltaC;
    2022 
    2023   for( ; iRows != 0; iRows-=iSubStep )
    2024   {
    2025     iOrigAvg += piOrg[0] ;
    2026     iOrigAvg += piOrg[1] ;
    2027     iOrigAvg += piOrg[2] ;
    2028     iOrigAvg += piOrg[3] ;
    2029     iOrigAvg += piOrg[4] ;
    2030     iOrigAvg += piOrg[5] ;
    2031     iOrigAvg += piOrg[6] ;
    2032     iOrigAvg += piOrg[7] ;
    2033     iOrigAvg += piOrg[8] ;
    2034     iOrigAvg += piOrg[9] ;
    2035     iOrigAvg += piOrg[10] ;
    2036     iOrigAvg += piOrg[11] ;
    2037     iOrigAvg += piOrg[12] ;
    2038     iOrigAvg += piOrg[13] ;
    2039     iOrigAvg += piOrg[14] ;
    2040     iOrigAvg += piOrg[15] ;
    2041     iOrigAvg += piOrg[16] ;
    2042     iOrigAvg += piOrg[17] ;
    2043     iOrigAvg += piOrg[18] ;
    2044     iOrigAvg += piOrg[19] ;
    2045     iOrigAvg += piOrg[20] ;
    2046     iOrigAvg += piOrg[21] ;
    2047     iOrigAvg += piOrg[22] ;
    2048     iOrigAvg += piOrg[23] ;
    2049     iOrigAvg += piOrg[24] ;
    2050     iOrigAvg += piOrg[25] ;
    2051     iOrigAvg += piOrg[26] ;
    2052     iOrigAvg += piOrg[27] ;
    2053     iOrigAvg += piOrg[28] ;
    2054     iOrigAvg += piOrg[29] ;
    2055     iOrigAvg += piOrg[30] ;
    2056     iOrigAvg += piOrg[31] ;
    2057     iOrigAvg += piOrg[32] ;
    2058     iOrigAvg += piOrg[33] ;
    2059     iOrigAvg += piOrg[34] ;
    2060     iOrigAvg += piOrg[35] ;
    2061     iOrigAvg += piOrg[36] ;
    2062     iOrigAvg += piOrg[37] ;
    2063     iOrigAvg += piOrg[38] ;
    2064     iOrigAvg += piOrg[39] ;
    2065     iOrigAvg += piOrg[40] ;
    2066     iOrigAvg += piOrg[41] ;
    2067     iOrigAvg += piOrg[42] ;
    2068     iOrigAvg += piOrg[43] ;
    2069     iOrigAvg += piOrg[44] ;
    2070     iOrigAvg += piOrg[45] ;
    2071     iOrigAvg += piOrg[46] ;
    2072     iOrigAvg += piOrg[47] ;
    2073     iOrigAvg += piOrg[48] ;
    2074     iOrigAvg += piOrg[49] ;
    2075     iOrigAvg += piOrg[50] ;
    2076     iOrigAvg += piOrg[51] ;
    2077     iOrigAvg += piOrg[52] ;
    2078     iOrigAvg += piOrg[53] ;
    2079     iOrigAvg += piOrg[54] ;
    2080     iOrigAvg += piOrg[55] ;
    2081     iOrigAvg += piOrg[56] ;
    2082     iOrigAvg += piOrg[57] ;
    2083     iOrigAvg += piOrg[58] ;
    2084     iOrigAvg += piOrg[59] ;
    2085     iOrigAvg += piOrg[60] ;
    2086     iOrigAvg += piOrg[61] ;
    2087     iOrigAvg += piOrg[62] ;
    2088     iOrigAvg += piOrg[63] ;
    2089 
    2090     iCurAvg += piCur[0] ;
    2091     iCurAvg += piCur[1] ;
    2092     iCurAvg += piCur[2] ;
    2093     iCurAvg += piCur[3] ;
    2094     iCurAvg += piCur[4] ;
    2095     iCurAvg += piCur[5] ;
    2096     iCurAvg += piCur[6] ;
    2097     iCurAvg += piCur[7] ;
    2098     iCurAvg += piCur[8] ;
    2099     iCurAvg += piCur[9] ;
    2100     iCurAvg += piCur[10] ;
    2101     iCurAvg += piCur[11] ;
    2102     iCurAvg += piCur[12] ;
    2103     iCurAvg += piCur[13] ;
    2104     iCurAvg += piCur[14] ;
    2105     iCurAvg += piCur[15] ;
    2106     iCurAvg += piCur[16] ;
    2107     iCurAvg += piCur[17] ;
    2108     iCurAvg += piCur[18] ;
    2109     iCurAvg += piCur[19] ;
    2110     iCurAvg += piCur[20] ;
    2111     iCurAvg += piCur[21] ;
    2112     iCurAvg += piCur[22] ;
    2113     iCurAvg += piCur[23] ;
    2114     iCurAvg += piCur[24] ;
    2115     iCurAvg += piCur[25] ;
    2116     iCurAvg += piCur[26] ;
    2117     iCurAvg += piCur[27] ;
    2118     iCurAvg += piCur[28] ;
    2119     iCurAvg += piCur[29] ;
    2120     iCurAvg += piCur[30] ;
    2121     iCurAvg += piCur[31] ;
    2122     iCurAvg += piCur[32] ;
    2123     iCurAvg += piCur[33] ;
    2124     iCurAvg += piCur[34] ;
    2125     iCurAvg += piCur[35] ;
    2126     iCurAvg += piCur[36] ;
    2127     iCurAvg += piCur[37] ;
    2128     iCurAvg += piCur[38] ;
    2129     iCurAvg += piCur[39] ;
    2130     iCurAvg += piCur[40] ;
    2131     iCurAvg += piCur[41] ;
    2132     iCurAvg += piCur[42] ;
    2133     iCurAvg += piCur[43] ;
    2134     iCurAvg += piCur[44] ;
    2135     iCurAvg += piCur[45] ;
    2136     iCurAvg += piCur[46] ;
    2137     iCurAvg += piCur[47] ;
    2138     iCurAvg += piCur[48] ;
    2139     iCurAvg += piCur[49] ;
    2140     iCurAvg += piCur[50] ;
    2141     iCurAvg += piCur[51] ;
    2142     iCurAvg += piCur[52] ;
    2143     iCurAvg += piCur[53] ;
    2144     iCurAvg += piCur[54] ;
    2145     iCurAvg += piCur[55] ;
    2146     iCurAvg += piCur[56] ;
    2147     iCurAvg += piCur[57] ;
    2148     iCurAvg += piCur[58] ;
    2149     iCurAvg += piCur[59] ;
    2150     iCurAvg += piCur[60] ;
    2151     iCurAvg += piCur[61] ;
    2152     iCurAvg += piCur[62] ;
    2153     iCurAvg += piCur[63] ;
    2154 
    2155     piOrg += iStrideOrg;
    2156     piCur += iStrideCur;
    2157     uiRowCnt++;
    2158   }
    2159 
    2160   piOrg   = pcDtParam->pOrg;
    2161   piCur   = pcDtParam->pCur;
    2162   iRows   = pcDtParam->iRows;
    2163 
    2164   iDeltaC = uiRowCnt ? ((iOrigAvg - iCurAvg)/uiRowCnt/64) : 0;
    2165 
    2166   for( ; iRows != 0; iRows-=iSubStep )
    2167   {
    2168     uiSum += abs( piOrg[0] - piCur[0] - iDeltaC );
    2169     uiSum += abs( piOrg[1] - piCur[1] - iDeltaC );
    2170     uiSum += abs( piOrg[2] - piCur[2] - iDeltaC );
    2171     uiSum += abs( piOrg[3] - piCur[3] - iDeltaC );
    2172     uiSum += abs( piOrg[4] - piCur[4] - iDeltaC );
    2173     uiSum += abs( piOrg[5] - piCur[5] - iDeltaC );
    2174     uiSum += abs( piOrg[6] - piCur[6] - iDeltaC );
    2175     uiSum += abs( piOrg[7] - piCur[7] - iDeltaC );
    2176     uiSum += abs( piOrg[8] - piCur[8] - iDeltaC );
    2177     uiSum += abs( piOrg[9] - piCur[9] - iDeltaC );
    2178     uiSum += abs( piOrg[10] - piCur[10] - iDeltaC );
    2179     uiSum += abs( piOrg[11] - piCur[11] - iDeltaC );
    2180     uiSum += abs( piOrg[12] - piCur[12] - iDeltaC );
    2181     uiSum += abs( piOrg[13] - piCur[13] - iDeltaC );
    2182     uiSum += abs( piOrg[14] - piCur[14] - iDeltaC );
    2183     uiSum += abs( piOrg[15] - piCur[15] - iDeltaC );
    2184     uiSum += abs( piOrg[16] - piCur[16] - iDeltaC );
    2185     uiSum += abs( piOrg[17] - piCur[17] - iDeltaC );
    2186     uiSum += abs( piOrg[18] - piCur[18] - iDeltaC );
    2187     uiSum += abs( piOrg[19] - piCur[19] - iDeltaC );
    2188     uiSum += abs( piOrg[20] - piCur[20] - iDeltaC );
    2189     uiSum += abs( piOrg[21] - piCur[21] - iDeltaC );
    2190     uiSum += abs( piOrg[22] - piCur[22] - iDeltaC );
    2191     uiSum += abs( piOrg[23] - piCur[23] - iDeltaC );
    2192     uiSum += abs( piOrg[24] - piCur[24] - iDeltaC );
    2193     uiSum += abs( piOrg[25] - piCur[25] - iDeltaC );
    2194     uiSum += abs( piOrg[26] - piCur[26] - iDeltaC );
    2195     uiSum += abs( piOrg[27] - piCur[27] - iDeltaC );
    2196     uiSum += abs( piOrg[28] - piCur[28] - iDeltaC );
    2197     uiSum += abs( piOrg[29] - piCur[29] - iDeltaC );
    2198     uiSum += abs( piOrg[30] - piCur[30] - iDeltaC );
    2199     uiSum += abs( piOrg[31] - piCur[31] - iDeltaC );
    2200     uiSum += abs( piOrg[32] - piCur[32] - iDeltaC );
    2201     uiSum += abs( piOrg[33] - piCur[33] - iDeltaC );
    2202     uiSum += abs( piOrg[34] - piCur[34] - iDeltaC );
    2203     uiSum += abs( piOrg[35] - piCur[35] - iDeltaC );
    2204     uiSum += abs( piOrg[36] - piCur[36] - iDeltaC );
    2205     uiSum += abs( piOrg[37] - piCur[37] - iDeltaC );
    2206     uiSum += abs( piOrg[38] - piCur[38] - iDeltaC );
    2207     uiSum += abs( piOrg[39] - piCur[39] - iDeltaC );
    2208     uiSum += abs( piOrg[40] - piCur[40] - iDeltaC );
    2209     uiSum += abs( piOrg[41] - piCur[41] - iDeltaC );
    2210     uiSum += abs( piOrg[42] - piCur[42] - iDeltaC );
    2211     uiSum += abs( piOrg[43] - piCur[43] - iDeltaC );
    2212     uiSum += abs( piOrg[44] - piCur[44] - iDeltaC );
    2213     uiSum += abs( piOrg[45] - piCur[45] - iDeltaC );
    2214     uiSum += abs( piOrg[46] - piCur[46] - iDeltaC );
    2215     uiSum += abs( piOrg[47] - piCur[47] - iDeltaC );
    2216     uiSum += abs( piOrg[48] - piCur[48] - iDeltaC );
    2217     uiSum += abs( piOrg[49] - piCur[49] - iDeltaC );
    2218     uiSum += abs( piOrg[50] - piCur[50] - iDeltaC );
    2219     uiSum += abs( piOrg[51] - piCur[51] - iDeltaC );
    2220     uiSum += abs( piOrg[52] - piCur[52] - iDeltaC );
    2221     uiSum += abs( piOrg[53] - piCur[53] - iDeltaC );
    2222     uiSum += abs( piOrg[54] - piCur[54] - iDeltaC );
    2223     uiSum += abs( piOrg[55] - piCur[55] - iDeltaC );
    2224     uiSum += abs( piOrg[56] - piCur[56] - iDeltaC );
    2225     uiSum += abs( piOrg[57] - piCur[57] - iDeltaC );
    2226     uiSum += abs( piOrg[58] - piCur[58] - iDeltaC );
    2227     uiSum += abs( piOrg[59] - piCur[59] - iDeltaC );
    2228     uiSum += abs( piOrg[60] - piCur[60] - iDeltaC );
    2229     uiSum += abs( piOrg[61] - piCur[61] - iDeltaC );
    2230     uiSum += abs( piOrg[62] - piCur[62] - iDeltaC );
    2231     uiSum += abs( piOrg[63] - piCur[63] - iDeltaC );
    2232 
    2233     piOrg += iStrideOrg;
    2234     piCur += iStrideCur;
    2235   }
    2236 
    2237   uiSum <<= iSubShift;
    2238   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    2239 }
    2240 
    2241 
    2242 UInt TComRdCost::xGetSAD48ic( DistParam* pcDtParam )
    2243 {
    2244   if ( pcDtParam->bApplyWeight )
    2245   {
    2246     return TComRdCostWeightPrediction::xGetSADw( pcDtParam );
    2247   }
    2248 
    2249   const Pel* piOrg   = pcDtParam->pOrg;
    2250   const Pel* piCur   = pcDtParam->pCur;
    2251   Int  iRows   = pcDtParam->iRows;
    2252   Int  iSubShift  = pcDtParam->iSubShift;
    2253   Int  iSubStep   = ( 1 << iSubShift );
    2254   Int  iStrideCur = pcDtParam->iStrideCur*iSubStep;
    2255   Int  iStrideOrg = pcDtParam->iStrideOrg*iSubStep;
    2256 
    2257   UInt uiSum = 0;
    2258 
    2259   Int  iOrigAvg = 0, iCurAvg = 0, uiRowCnt = 0;
    2260   Int  iDeltaC;
    2261 
    2262   for( ; iRows != 0; iRows-=iSubStep )
    2263   {
    2264     iOrigAvg += piOrg[0] ;
    2265     iOrigAvg += piOrg[1] ;
    2266     iOrigAvg += piOrg[2] ;
    2267     iOrigAvg += piOrg[3] ;
    2268     iOrigAvg += piOrg[4] ;
    2269     iOrigAvg += piOrg[5] ;
    2270     iOrigAvg += piOrg[6] ;
    2271     iOrigAvg += piOrg[7] ;
    2272     iOrigAvg += piOrg[8] ;
    2273     iOrigAvg += piOrg[9] ;
    2274     iOrigAvg += piOrg[10] ;
    2275     iOrigAvg += piOrg[11] ;
    2276     iOrigAvg += piOrg[12] ;
    2277     iOrigAvg += piOrg[13] ;
    2278     iOrigAvg += piOrg[14] ;
    2279     iOrigAvg += piOrg[15] ;
    2280     iOrigAvg += piOrg[16] ;
    2281     iOrigAvg += piOrg[17] ;
    2282     iOrigAvg += piOrg[18] ;
    2283     iOrigAvg += piOrg[19] ;
    2284     iOrigAvg += piOrg[20] ;
    2285     iOrigAvg += piOrg[21] ;
    2286     iOrigAvg += piOrg[22] ;
    2287     iOrigAvg += piOrg[23] ;
    2288     iOrigAvg += piOrg[24] ;
    2289     iOrigAvg += piOrg[25] ;
    2290     iOrigAvg += piOrg[26] ;
    2291     iOrigAvg += piOrg[27] ;
    2292     iOrigAvg += piOrg[28] ;
    2293     iOrigAvg += piOrg[29] ;
    2294     iOrigAvg += piOrg[30] ;
    2295     iOrigAvg += piOrg[31] ;
    2296     iOrigAvg += piOrg[32] ;
    2297     iOrigAvg += piOrg[33] ;
    2298     iOrigAvg += piOrg[34] ;
    2299     iOrigAvg += piOrg[35] ;
    2300     iOrigAvg += piOrg[36] ;
    2301     iOrigAvg += piOrg[37] ;
    2302     iOrigAvg += piOrg[38] ;
    2303     iOrigAvg += piOrg[39] ;
    2304     iOrigAvg += piOrg[40] ;
    2305     iOrigAvg += piOrg[41] ;
    2306     iOrigAvg += piOrg[42] ;
    2307     iOrigAvg += piOrg[43] ;
    2308     iOrigAvg += piOrg[44] ;
    2309     iOrigAvg += piOrg[45] ;
    2310     iOrigAvg += piOrg[46] ;
    2311     iOrigAvg += piOrg[47] ;
    2312 
    2313     iCurAvg += piCur[0] ;
    2314     iCurAvg += piCur[1] ;
    2315     iCurAvg += piCur[2] ;
    2316     iCurAvg += piCur[3] ;
    2317     iCurAvg += piCur[4] ;
    2318     iCurAvg += piCur[5] ;
    2319     iCurAvg += piCur[6] ;
    2320     iCurAvg += piCur[7] ;
    2321     iCurAvg += piCur[8] ;
    2322     iCurAvg += piCur[9] ;
    2323     iCurAvg += piCur[10] ;
    2324     iCurAvg += piCur[11] ;
    2325     iCurAvg += piCur[12] ;
    2326     iCurAvg += piCur[13] ;
    2327     iCurAvg += piCur[14] ;
    2328     iCurAvg += piCur[15] ;
    2329     iCurAvg += piCur[16] ;
    2330     iCurAvg += piCur[17] ;
    2331     iCurAvg += piCur[18] ;
    2332     iCurAvg += piCur[19] ;
    2333     iCurAvg += piCur[20] ;
    2334     iCurAvg += piCur[21] ;
    2335     iCurAvg += piCur[22] ;
    2336     iCurAvg += piCur[23] ;
    2337     iCurAvg += piCur[24] ;
    2338     iCurAvg += piCur[25] ;
    2339     iCurAvg += piCur[26] ;
    2340     iCurAvg += piCur[27] ;
    2341     iCurAvg += piCur[28] ;
    2342     iCurAvg += piCur[29] ;
    2343     iCurAvg += piCur[30] ;
    2344     iCurAvg += piCur[31] ;
    2345     iCurAvg += piCur[32] ;
    2346     iCurAvg += piCur[33] ;
    2347     iCurAvg += piCur[34] ;
    2348     iCurAvg += piCur[35] ;
    2349     iCurAvg += piCur[36] ;
    2350     iCurAvg += piCur[37] ;
    2351     iCurAvg += piCur[38] ;
    2352     iCurAvg += piCur[39] ;
    2353     iCurAvg += piCur[40] ;
    2354     iCurAvg += piCur[41] ;
    2355     iCurAvg += piCur[42] ;
    2356     iCurAvg += piCur[43] ;
    2357     iCurAvg += piCur[44] ;
    2358     iCurAvg += piCur[45] ;
    2359     iCurAvg += piCur[46] ;
    2360     iCurAvg += piCur[47] ;
    2361 
    2362     piOrg += iStrideOrg;
    2363     piCur += iStrideCur;
    2364     uiRowCnt++;
    2365   }
    2366 
    2367   piOrg   = pcDtParam->pOrg;
    2368   piCur   = pcDtParam->pCur;
    2369   iRows   = pcDtParam->iRows;
    2370 
    2371   iDeltaC = uiRowCnt ? ((iOrigAvg - iCurAvg)/uiRowCnt/48) : 0;
    2372 
    2373   for( ; iRows != 0; iRows-=iSubStep )
    2374   {
    2375     uiSum += abs( piOrg[0] - piCur[0] - iDeltaC );
    2376     uiSum += abs( piOrg[1] - piCur[1] - iDeltaC );
    2377     uiSum += abs( piOrg[2] - piCur[2] - iDeltaC );
    2378     uiSum += abs( piOrg[3] - piCur[3] - iDeltaC );
    2379     uiSum += abs( piOrg[4] - piCur[4] - iDeltaC );
    2380     uiSum += abs( piOrg[5] - piCur[5] - iDeltaC );
    2381     uiSum += abs( piOrg[6] - piCur[6] - iDeltaC );
    2382     uiSum += abs( piOrg[7] - piCur[7] - iDeltaC );
    2383     uiSum += abs( piOrg[8] - piCur[8] - iDeltaC );
    2384     uiSum += abs( piOrg[9] - piCur[9] - iDeltaC );
    2385     uiSum += abs( piOrg[10] - piCur[10] - iDeltaC );
    2386     uiSum += abs( piOrg[11] - piCur[11] - iDeltaC );
    2387     uiSum += abs( piOrg[12] - piCur[12] - iDeltaC );
    2388     uiSum += abs( piOrg[13] - piCur[13] - iDeltaC );
    2389     uiSum += abs( piOrg[14] - piCur[14] - iDeltaC );
    2390     uiSum += abs( piOrg[15] - piCur[15] - iDeltaC );
    2391     uiSum += abs( piOrg[16] - piCur[16] - iDeltaC );
    2392     uiSum += abs( piOrg[17] - piCur[17] - iDeltaC );
    2393     uiSum += abs( piOrg[18] - piCur[18] - iDeltaC );
    2394     uiSum += abs( piOrg[19] - piCur[19] - iDeltaC );
    2395     uiSum += abs( piOrg[20] - piCur[20] - iDeltaC );
    2396     uiSum += abs( piOrg[21] - piCur[21] - iDeltaC );
    2397     uiSum += abs( piOrg[22] - piCur[22] - iDeltaC );
    2398     uiSum += abs( piOrg[23] - piCur[23] - iDeltaC );
    2399     uiSum += abs( piOrg[24] - piCur[24] - iDeltaC );
    2400     uiSum += abs( piOrg[25] - piCur[25] - iDeltaC );
    2401     uiSum += abs( piOrg[26] - piCur[26] - iDeltaC );
    2402     uiSum += abs( piOrg[27] - piCur[27] - iDeltaC );
    2403     uiSum += abs( piOrg[28] - piCur[28] - iDeltaC );
    2404     uiSum += abs( piOrg[29] - piCur[29] - iDeltaC );
    2405     uiSum += abs( piOrg[30] - piCur[30] - iDeltaC );
    2406     uiSum += abs( piOrg[31] - piCur[31] - iDeltaC );
    2407     uiSum += abs( piOrg[32] - piCur[32] - iDeltaC );
    2408     uiSum += abs( piOrg[33] - piCur[33] - iDeltaC );
    2409     uiSum += abs( piOrg[34] - piCur[34] - iDeltaC );
    2410     uiSum += abs( piOrg[35] - piCur[35] - iDeltaC );
    2411     uiSum += abs( piOrg[36] - piCur[36] - iDeltaC );
    2412     uiSum += abs( piOrg[37] - piCur[37] - iDeltaC );
    2413     uiSum += abs( piOrg[38] - piCur[38] - iDeltaC );
    2414     uiSum += abs( piOrg[39] - piCur[39] - iDeltaC );
    2415     uiSum += abs( piOrg[40] - piCur[40] - iDeltaC );
    2416     uiSum += abs( piOrg[41] - piCur[41] - iDeltaC );
    2417     uiSum += abs( piOrg[42] - piCur[42] - iDeltaC );
    2418     uiSum += abs( piOrg[43] - piCur[43] - iDeltaC );
    2419     uiSum += abs( piOrg[44] - piCur[44] - iDeltaC );
    2420     uiSum += abs( piOrg[45] - piCur[45] - iDeltaC );
    2421     uiSum += abs( piOrg[46] - piCur[46] - iDeltaC );
    2422     uiSum += abs( piOrg[47] - piCur[47] - iDeltaC );
    2423 
    2424     piOrg += iStrideOrg;
    2425     piCur += iStrideCur;
    2426   }
    2427 
    2428   uiSum <<= iSubShift;
    2429   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    2430 }
    2431 #endif
    2432887// --------------------------------------------------------------------------------------------------------------------
    2433888// SSE
     
    27811236}
    27821237
    2783 #if NH_3D_VSO
    2784 //SAIT_VSO_EST_A0033
    2785 UInt TComRdCost::getVSDEstimate( Int dDM, const Pel* pOrg, Int iOrgStride, const Pel* pVirRec, const Pel* pVirOrg, Int iVirStride, Int x, Int y )
    2786 {
    2787   // change to use bit depth from DistParam struct
    2788   Double  dD = ( (Double) ( dDM >> ( ENC_INTERNAL_BIT_DEPTH - 8 ) ) ) * m_dDisparityCoeff;
    2789 
    2790   Double dDepthWeight = ( pOrg[x] >=  ( (1<<(REN_BIT_DEPTH - 3)) + (1<<(REN_BIT_DEPTH - 2)) ) ? 4 : pOrg[x] > ((1<<REN_BIT_DEPTH) >> 4) ? (Float)(pOrg[x] - ((1<<REN_BIT_DEPTH) >> 4))/(Float)((1<<REN_BIT_DEPTH) >> 3) + 1 : 1.0 );
    2791 
    2792   Double dTemp = ( 0.5 * fabs(dD) * dDepthWeight * ( abs( (Int) pVirRec[ x+y*iVirStride ] - (Int) pVirRec[ x-1+y*iVirStride ] ) + abs( (Int) pVirRec[ x+y*iVirStride ] - (Int) pVirRec[ x+1+y*iVirStride ] ) ) );
    2793   Int iTemp = (Int) (((dTemp) < 0)? (Int)((dTemp) - 0.5) : (Int)((dTemp) + 0.5));
    2794 
    2795   return (UInt) ( (iTemp*iTemp)>>1 );
    2796 }
    2797 
    2798 UInt TComRdCost::xGetVSD( DistParam* pcDtParam )
    2799 {
    2800   const Pel* piOrg    = pcDtParam->pOrg;
    2801   const Pel* piCur    = pcDtParam->pCur;
    2802   const Pel* piVirRec = pcDtParam->pVirRec;
    2803   const Pel* piVirOrg = pcDtParam->pVirOrg;
    2804   Int  iRows    = pcDtParam->iRows;
    2805   Int  iCols    = pcDtParam->iCols;
    2806   Int  iStrideOrg = pcDtParam->iStrideOrg;
    2807   Int  iStrideCur = pcDtParam->iStrideCur;
    2808   Int  iStrideVir = pcDtParam->iStrideVir;
    2809 
    2810   UInt uiSum = 0;
    2811   UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8)<<1;
    2812 
    2813   Int dDM;
    2814 
    2815   for ( Int y = 0 ; y < iRows ; y++ )
    2816   {
    2817     for (Int x = 0; x < iCols; x++ )
    2818     {
    2819       dDM = (Int) ( piOrg[x  ] - piCur[x  ] );
    2820       uiSum += getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, x, y ) >> uiShift;
    2821     }
    2822     piOrg += iStrideOrg;
    2823     piCur += iStrideCur;
    2824   }
    2825 
    2826   return ( uiSum );
    2827 }
    2828 
    2829 UInt TComRdCost::xGetVSD4( DistParam* pcDtParam )
    2830 {
    2831   const Pel* piOrg   = pcDtParam->pOrg;
    2832   const Pel* piCur   = pcDtParam->pCur;
    2833   const Pel* piVirRec = pcDtParam->pVirRec;
    2834   const Pel* piVirOrg = pcDtParam->pVirOrg;
    2835   Int  iRows   = pcDtParam->iRows;
    2836   Int  iStrideOrg = pcDtParam->iStrideOrg;
    2837   Int  iStrideCur = pcDtParam->iStrideCur;
    2838   Int  iStrideVir = pcDtParam->iStrideVir;
    2839 
    2840   UInt uiSum = 0;
    2841   UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8)<<1;
    2842 
    2843   Int dDM;
    2844 
    2845   for ( Int y = 0 ; y < iRows ; y++ )
    2846   {
    2847     dDM = (Int) ( piOrg[0] - piCur[0] );  uiSum += ( getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, 0, y ) ) >> uiShift;
    2848     dDM = (Int) ( piOrg[1] - piCur[1] );  uiSum += ( getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, 1, y ) ) >> uiShift;
    2849     dDM = (Int) ( piOrg[2] - piCur[2] );  uiSum += ( getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, 2, y ) ) >> uiShift;
    2850     dDM = (Int) ( piOrg[3] - piCur[3] );  uiSum += ( getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, 3, y ) ) >> uiShift;
    2851 
    2852     piOrg += iStrideOrg;
    2853     piCur += iStrideCur;
    2854   }
    2855 
    2856   return ( uiSum );
    2857 }
    2858 
    2859 UInt TComRdCost::xGetVSD8( DistParam* pcDtParam )
    2860 {
    2861   const Pel* piOrg   = pcDtParam->pOrg;
    2862   const Pel* piCur   = pcDtParam->pCur;
    2863   const Pel* piVirRec = pcDtParam->pVirRec;
    2864   const Pel* piVirOrg = pcDtParam->pVirOrg;
    2865   Int  iRows   = pcDtParam->iRows;
    2866   Int  iStrideOrg = pcDtParam->iStrideOrg;
    2867   Int  iStrideCur = pcDtParam->iStrideCur;
    2868   Int  iStrideVir = pcDtParam->iStrideVir;
    2869 
    2870   UInt uiSum = 0;
    2871   UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8)<<1;
    2872 
    2873   Int dDM;
    2874 
    2875   for ( Int y = 0 ; y < iRows ; y++ )
    2876   {
    2877     for (Int x = 0; x < 8; x++ )
    2878     {
    2879       dDM = (Int) ( piOrg[x] - piCur[x] );
    2880       uiSum += getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, x, y ) >> uiShift;
    2881     }
    2882     piOrg += iStrideOrg;
    2883     piCur += iStrideCur;
    2884   }
    2885 
    2886   return ( uiSum );
    2887 }
    2888 
    2889 UInt TComRdCost::xGetVSD16( DistParam* pcDtParam )
    2890 {
    2891   const Pel* piOrg   = pcDtParam->pOrg;
    2892   const Pel* piCur   = pcDtParam->pCur;
    2893   const Pel* piVirRec = pcDtParam->pVirRec;
    2894   const Pel* piVirOrg = pcDtParam->pVirOrg;
    2895   Int  iRows   = pcDtParam->iRows;
    2896   Int  iStrideOrg = pcDtParam->iStrideOrg;
    2897   Int  iStrideCur = pcDtParam->iStrideCur;
    2898   Int  iStrideVir = pcDtParam->iStrideVir;
    2899 
    2900   UInt uiSum = 0;
    2901   UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8)<<1;
    2902 
    2903   Int dDM;
    2904 
    2905   for ( Int y = 0 ; y < iRows ; y++ )
    2906   {
    2907     for (Int x = 0; x < 16; x++ )
    2908     {
    2909       dDM = (Int) ( piOrg[x] - piCur[x] );
    2910       uiSum += getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, x, y ) >> uiShift;
    2911     }
    2912     piOrg += iStrideOrg;
    2913     piCur += iStrideCur;
    2914   }
    2915 
    2916   return ( uiSum );
    2917 }
    2918 
    2919 UInt TComRdCost::xGetVSD16N( DistParam* pcDtParam )
    2920 {
    2921   const Pel* piOrg   = pcDtParam->pOrg;
    2922   const Pel* piCur   = pcDtParam->pCur;
    2923   const Pel* piVirRec = pcDtParam->pVirRec;
    2924   const Pel* piVirOrg = pcDtParam->pVirOrg;
    2925   Int  iRows   = pcDtParam->iRows;
    2926   Int  iCols   = pcDtParam->iCols;
    2927   Int  iStrideOrg = pcDtParam->iStrideOrg;
    2928   Int  iStrideCur = pcDtParam->iStrideCur;
    2929   Int  iStrideVir = pcDtParam->iStrideVir;
    2930 
    2931   UInt uiSum = 0;
    2932   UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8)<<1;
    2933 
    2934   Int dDM;
    2935 
    2936   for ( Int y = 0 ; y < iRows ; y++ )
    2937   {
    2938     for (Int x = 0; x < iCols; x+=16 )
    2939     {
    2940       for ( Int k = 0 ; k < 16 ; k++ )
    2941       {
    2942         dDM = (Int) ( piOrg[x+k] - piCur[x+k] );
    2943         uiSum += getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, x+k, y ) >> uiShift;
    2944       }
    2945     }
    2946     piOrg += iStrideOrg;
    2947     piCur += iStrideCur;
    2948   }
    2949 
    2950   return ( uiSum );
    2951 }
    2952 
    2953 UInt TComRdCost::xGetVSD32( DistParam* pcDtParam )
    2954 {
    2955   const Pel* piOrg   = pcDtParam->pOrg;
    2956   const Pel* piCur   = pcDtParam->pCur;
    2957   const Pel* piVirRec = pcDtParam->pVirRec;
    2958   const Pel* piVirOrg = pcDtParam->pVirOrg;
    2959   Int  iRows   = pcDtParam->iRows;
    2960   Int  iStrideOrg = pcDtParam->iStrideOrg;
    2961   Int  iStrideCur = pcDtParam->iStrideCur;
    2962   Int  iStrideVir = pcDtParam->iStrideVir;
    2963 
    2964   UInt uiSum = 0;
    2965   UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8)<<1;
    2966 
    2967   Int dDM;
    2968 
    2969   for ( Int y = 0 ; y < iRows ; y++ )
    2970   {
    2971     for (Int x = 0; x < 32 ; x++ )
    2972     {
    2973       dDM = (Int) ( piOrg[x] - piCur[x] );
    2974       uiSum += getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, x, y ) >> uiShift;
    2975     }
    2976     piOrg += iStrideOrg;
    2977     piCur += iStrideCur;
    2978   }
    2979 
    2980   return ( uiSum );
    2981 }
    2982 
    2983 UInt TComRdCost::xGetVSD64( DistParam* pcDtParam )
    2984 {
    2985   const Pel* piOrg      = pcDtParam->pOrg;
    2986   const Pel* piCur      = pcDtParam->pCur;
    2987   const Pel* piVirRec   = pcDtParam->pVirRec;
    2988   const Pel* piVirOrg   = pcDtParam->pVirOrg;
    2989   Int  iRows      = pcDtParam->iRows;
    2990   Int  iStrideOrg = pcDtParam->iStrideOrg;
    2991   Int  iStrideCur = pcDtParam->iStrideCur;
    2992   Int  iStrideVir = pcDtParam->iStrideVir;
    2993 
    2994   UInt uiSum = 0;
    2995   UInt uiShift = DISTORTION_PRECISION_ADJUSTMENT(pcDtParam->bitDepth-8)<<1;
    2996 
    2997   Int dDM;
    2998 
    2999   for ( Int y = 0 ; y < iRows ; y++ )
    3000   {
    3001     for (Int x = 0; x < 64; x++ )
    3002     {
    3003       dDM = (Int) ( piOrg[x] - piCur[x] );
    3004       uiSum += getVSDEstimate( dDM, piOrg, iStrideOrg, piVirRec, piVirOrg, iStrideVir, x, y ) >> uiShift;
    3005     }
    3006     piOrg += iStrideOrg;
    3007     piCur += iStrideCur;
    3008   }
    3009 
    3010   return ( uiSum );
    3011 }
    3012 
    3013 #endif
    30141238
    30151239// --------------------------------------------------------------------------------------------------------------------
     
    32391463    return TComRdCostWeightPrediction::xGetHADsw( pcDtParam );
    32401464  }
    3241 #if NH_3D_IC
    3242   if( pcDtParam->bUseIC )
    3243   {
    3244     return xGetHADsic( pcDtParam );
    3245   }
    3246 #endif
    3247 #if NH_3D_SDC_INTER
    3248   if( pcDtParam->bUseSDCMRSAD )
    3249   {
    3250     return xGetHADsic( pcDtParam );
    3251   }
    3252 #endif
    32531465
    32541466  const Pel* piOrg      = pcDtParam->pOrg;
     
    33151527}
    33161528
    3317 #if NH_3D_IC || NH_3D_SDC_INTER
    3318 UInt TComRdCost::xGetHADsic( DistParam* pcDtParam )
    3319 {
    3320   if ( pcDtParam->bApplyWeight )
    3321   {
    3322     return TComRdCostWeightPrediction::xGetHADsw( pcDtParam );
    3323   }
    3324   const Pel* piOrg   = pcDtParam->pOrg;
    3325   const Pel* piCur   = pcDtParam->pCur;
    3326  
    3327   Int  iRows   = pcDtParam->iRows;
    3328   Int  iCols   = pcDtParam->iCols;
    3329   Int  iStrideCur = pcDtParam->iStrideCur;
    3330   Int  iStrideOrg = pcDtParam->iStrideOrg;
    3331   Int  iStep  = pcDtParam->iStep;
    3332 
    3333   Int  x, y;
    3334 
    3335   UInt uiSum = 0;
    3336 
    3337   Int  iOrigAvg = 0, iCurAvg = 0;
    3338   Int  iDeltaC;
    3339 
    3340   for ( y=0; y<iRows; y++ )
    3341   {
    3342     for ( x=0; x<iCols; x++ )
    3343     {       
    3344       iOrigAvg += piOrg[x];
    3345       iCurAvg  += piCur[x];
    3346     }
    3347     piOrg += iStrideOrg;
    3348     piCur += iStrideCur;
    3349   }
    3350 
    3351   piOrg   = pcDtParam->pOrg;
    3352   piCur   = pcDtParam->pCur;
    3353 
    3354   iDeltaC = (iOrigAvg - iCurAvg)/iRows/iCols;
    3355 
    3356   const Int orgMaxSize = MAX_CU_SIZE*MAX_CU_SIZE;
    3357   assert( iRows * iCols <= orgMaxSize );
    3358  
    3359   Pel orgMinusDeltaDc[ orgMaxSize ];
    3360   Pel* tempOrgMinusDeltaDc = orgMinusDeltaDc;
    3361  
    3362   for ( y=0; y<iRows; y++ )
    3363   {
    3364     for ( x=0; x<iCols; x++ )
    3365     {       
    3366       tempOrgMinusDeltaDc[x] = (piOrg[x] - iDeltaC);
    3367     }
    3368     piOrg               += iStrideOrg;
    3369     tempOrgMinusDeltaDc += iStrideOrg;
    3370   }
    3371 
    3372   tempOrgMinusDeltaDc = orgMinusDeltaDc;
    3373 
    3374   piOrg   = pcDtParam->pOrg;
    3375 
    3376 #if NS_HAD
    3377   if( ( ( iRows % 8 == 0) && (iCols % 8 == 0) && ( iRows == iCols ) ) || ( ( iRows % 8 == 0 ) && (iCols % 8 == 0) && !pcDtParam->bUseNSHAD ) )
    3378 #else
    3379   if( ( iRows % 8 == 0) && (iCols % 8 == 0) )
    3380 #endif
    3381   {
    3382     Int  iOffsetOrg = iStrideOrg<<3;
    3383     Int  iOffsetCur = iStrideCur<<3;
    3384     for ( y=0; y<iRows; y+= 8 )
    3385     {
    3386       for ( x=0; x<iCols; x+= 8 )
    3387       {
    3388         uiSum += xCalcHADs8x8( &tempOrgMinusDeltaDc[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
    3389       }
    3390       tempOrgMinusDeltaDc += iOffsetOrg;
    3391       piCur               += iOffsetCur;
    3392     }
    3393   }
    3394 #if NS_HAD
    3395   else if ( ( iCols > 8 ) && ( iCols > iRows ) && pcDtParam->bUseNSHAD )
    3396   {
    3397     Int  iOffsetOrg = iStrideOrg<<2;
    3398     Int  iOffsetCur = iStrideCur<<2;
    3399     for ( y=0; y<iRows; y+= 4 )
    3400     {
    3401       for ( x=0; x<iCols; x+= 16 )
    3402       {
    3403         uiSum += xCalcHADs16x4( &tempOrgMinusDeltaDc[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
    3404       }
    3405       tempOrgMinusDeltaDc += iOffsetOrg;
    3406       piCur               += iOffsetCur;
    3407     }
    3408   }
    3409   else if ( ( iRows > 8 ) && ( iCols < iRows ) && pcDtParam->bUseNSHAD )
    3410   {
    3411     Int  iOffsetOrg = iStrideOrg<<4;
    3412     Int  iOffsetCur = iStrideCur<<4;
    3413     for ( y=0; y<iRows; y+= 16 )
    3414     {
    3415       for ( x=0; x<iCols; x+= 4 )
    3416       {
    3417         uiSum += xCalcHADs4x16( &tempOrgMinusDeltaDc[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
    3418       }
    3419       tempOrgMinusDeltaDc += iOffsetOrg;
    3420       piCur               += iOffsetCur;
    3421     }
    3422   }
    3423 #endif
    3424   else if( ( iRows % 4 == 0) && (iCols % 4 == 0) )
    3425   {
    3426     Int  iOffsetOrg = iStrideOrg<<2;
    3427     Int  iOffsetCur = iStrideCur<<2;
    3428 
    3429     for ( y=0; y<iRows; y+= 4 )
    3430     {
    3431       for ( x=0; x<iCols; x+= 4 )
    3432       {
    3433         uiSum += xCalcHADs4x4( &tempOrgMinusDeltaDc[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
    3434       }
    3435       tempOrgMinusDeltaDc += iOffsetOrg;
    3436       piCur               += iOffsetCur;
    3437     }
    3438   }
    3439   else if( ( iRows % 2 == 0) && (iCols % 2 == 0) )
    3440   {
    3441     Int  iOffsetOrg = iStrideOrg<<1;
    3442     Int  iOffsetCur = iStrideCur<<1;
    3443     for ( y=0; y<iRows; y+=2 )
    3444     {
    3445       for ( x=0; x<iCols; x+=2 )
    3446       {
    3447         uiSum += xCalcHADs2x2( &tempOrgMinusDeltaDc[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
    3448       }
    3449       tempOrgMinusDeltaDc += iOffsetOrg;
    3450       piCur               += iOffsetCur;
    3451     }
    3452   }
    3453   else
    3454   {
    3455     assert(false);
    3456   }
    3457 
    3458   return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );
    3459 }
    3460 #endif
    3461 #if NH_3D_VSO
    3462 Void TComRdCost::setLambdaVSO( Double dLambdaVSO )
    3463 {
    3464   m_dLambdaVSO           = dLambdaVSO;
    3465   m_dSqrtLambdaVSO       = sqrt(m_dLambdaVSO);
    3466   m_uiLambdaMotionSADVSO = (UInt)floor(65536.0 *       m_dSqrtLambdaVSO);
    3467   m_uiLambdaMotionSSEVSO = (UInt)floor(65536.0 *       m_dLambdaVSO    );
    3468 }
    3469 #endif
    3470 #if NH_3D_VSO
    3471 Dist TComRdCost::xGetDistVSOMode4( Int iStartPosX, Int iStartPosY, Pel* piCur, Int iCurStride, Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, Bool bSAD )
    3472 {
    3473   AOT(bSAD);
    3474 #if H_3D_VSO_EARLY_SKIP
    3475   RMDist iDist = m_pcRenModel->getDist( iStartPosX, iStartPosY, (Int) uiBlkWidth, (Int) uiBlkHeight, iCurStride, piCur, piOrg, iOrgStride); 
    3476 #else
    3477   RMDist iDist = m_pcRenModel->getDist( iStartPosX, iStartPosY, (Int) uiBlkWidth, (Int) uiBlkHeight, iCurStride, piCur ); 
    3478 #endif
    3479 
    3480   RMDist iDistMin = (RMDist) RDO_DIST_MIN;
    3481   iDistMin = m_bAllowNegDist ? RDO_DIST_MIN : 0;
    3482  
    3483   iDist = std::min( iDist, (RMDist) RDO_DIST_MAX);
    3484   iDist = std::max( iDist, iDistMin);
    3485   return (Dist) iDist;
    3486 }
    3487 
    3488 
    3489 Dist TComRdCost::getDistPartVSO( TComDataCU* pcCU, UInt uiAbsPartIndex, Int bitDepth, Pel* piCur, Int iCurStride, Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, Bool bHAD )
    3490 {
    3491   assert( m_bUseVSO ); 
    3492   assert( this->m_fpDistortFuncVSO != 0 );
    3493 
    3494   Int iPosX;
    3495   Int iPosY;
    3496  
    3497   pcCU->getPosInPic( uiAbsPartIndex, iPosX, iPosY );
    3498    
    3499   Dist dist = (this->*m_fpDistortFuncVSO) ( iPosX, iPosY, piCur, iCurStride, piOrg, iOrgStride, uiBlkWidth, uiBlkHeight, bHAD ); 
    3500  
    3501   if ( m_bUseWVSO )   
    3502   {
    3503     Int iDWeight   = m_iDWeight   * m_iDWeight  ;
    3504     Int iVSOWeight = m_iVSOWeight * m_iVSOWeight;
    3505     Dist distDepth;
    3506    
    3507     if ( !bHAD )
    3508     {
    3509        distDepth = (Dist) getDistPart( bitDepth, piCur, iCurStride, piOrg, iOrgStride, uiBlkWidth, uiBlkHeight, COMPONENT_Y);
    3510     }
    3511     else
    3512     {
    3513        distDepth = (Dist) calcHAD    ( bitDepth, piCur, iCurStride, piOrg, iOrgStride, uiBlkWidth, uiBlkHeight);
    3514     }
    3515    
    3516     dist = (Dist) (iDWeight * distDepth + iVSOWeight * dist ) / ( iDWeight + iVSOWeight);
    3517   }
    3518   return dist;
    3519 };
    3520 
    3521 
    3522 Void TComRdCost::setVSOMode( UInt uiIn )
    3523 {
    3524   m_uiVSOMode = uiIn;
    3525   switch (m_uiVSOMode )
    3526   {
    3527   case   4:
    3528     m_fpDistortFuncVSO = &TComRdCost::xGetDistVSOMode4;
    3529     break;
    3530   default:
    3531     assert(0);
    3532     break;
    3533   }
    3534 }
    3535 
    3536 
    3537 Double TComRdCost::calcRdCostVSO( UInt uiBits, Dist uiDistortion, Bool bFlag, DFunc eDFunc )
    3538 {
    3539   assert( m_bUseLambdaScaleVSO );   
    3540 
    3541   Double dRdCost = 0.0;
    3542   Double dLambda = 0.0;   
    3543 
    3544   switch ( eDFunc )
    3545   {
    3546   case DF_SSE:
    3547     assert(0);
    3548     break;
    3549   case DF_SAD:
    3550     dLambda = (Double)m_uiLambdaMotionSADVSO;
    3551     break;
    3552   case DF_DEFAULT:
    3553     dLambda =         m_dLambdaVSO;
    3554     break;
    3555   case DF_SSE_FRAME:
    3556     dLambda =         m_dFrameLambdaVSO;
    3557     break;
    3558   default:
    3559     assert (0);
    3560     break;
    3561   }
    3562 
    3563   if (bFlag)
    3564   {
    3565     // Intra8x8, Intra4x4 Block only...
    3566 #if SEQUENCE_LEVEL_LOSSLESS
    3567     dRdCost = (Double)(uiBits);
    3568 #else
    3569     dRdCost = (((Double)uiDistortion) + ((Double)uiBits * dLambda));
    3570 #endif
    3571   }
    3572   else
    3573   {
    3574     if (eDFunc == DF_SAD)
    3575     {
    3576       dRdCost = ((Double)uiDistortion + (Double)((Int)(uiBits * dLambda+.5)>>16));
    3577       dRdCost = (Double)(Dist)floor(dRdCost);
    3578     }
    3579     else
    3580     {
    3581 #if SEQUENCE_LEVEL_LOSSLESS
    3582       dRdCost = (Double)(uiBits);
    3583 #else
    3584       dRdCost = ((Double)uiDistortion + (Double)((Int)(uiBits * dLambda+.5)));
    3585       dRdCost = (Double)(Dist)floor(dRdCost);
    3586 #endif
    3587     }
    3588   }
    3589 
    3590 #if NH_MV
    3591   D_PRINT_INDENT( g_traceRDCost, "VSO Dist: " + n2s(uiDistortion) + " Bits: " + n2s(uiBits) + " RD Cost: " + n2s(dRdCost));
    3592 #endif
    3593 
    3594   return dRdCost;
    3595 }
    3596 
    3597 Void TComRdCost::setRenModelData( const TComDataCU* pcCU, UInt uiAbsPartIndex, const TComYuv* pcYuv, const TComTURecurse* tuRecurseWithPU )
    3598 {
    3599   const TComRectangle &puRect=tuRecurseWithPU->getRect(COMPONENT_Y);
    3600   const UInt  uiCompWidth   = puRect.width;
    3601   const UInt  uiCompHeight  = puRect.height;
    3602 
    3603   const Pel*  piSrc         = pcYuv->getAddr( COMPONENT_Y, uiAbsPartIndex );
    3604   const UInt  uiSrcStride   = pcYuv->getStride( COMPONENT_Y);
    3605   setRenModelData( pcCU, uiAbsPartIndex, piSrc, uiSrcStride, uiCompWidth, uiCompHeight );
    3606 }
    3607 
    3608 Void TComRdCost::setRenModelData( const TComDataCU* pcCU, UInt uiAbsPartIndex, const Pel* piData, Int iStride, Int iBlkWidth, Int iBlkHeight )
    3609 {
    3610   UInt iBlkX = g_auiRasterToPelX[g_auiZscanToRaster[uiAbsPartIndex]];
    3611   UInt iBlkY = g_auiRasterToPelY[g_auiZscanToRaster[uiAbsPartIndex]];
    3612 
    3613   Int iStartPosX = iBlkX + pcCU->getCUPelX();
    3614   Int iStartPosY = iBlkY + pcCU->getCUPelY();
    3615 
    3616   m_pcRenModel->setData( iStartPosX, iStartPosY, iBlkWidth, iBlkHeight, iStride, piData );
    3617 }
    3618 
    3619 Void TComRdCost::setAllowNegDist( Bool bAllowNegDist )
    3620 {
    3621   m_bAllowNegDist = bAllowNegDist;
    3622 }
    3623 #endif
    36241529
    36251530//! \}
Note: See TracChangeset for help on using the changeset viewer.