Changeset 1390 in 3DVCSoftware for branches/HTM-16.0-MV-draft-5/source/Lib/TLibCommon/TComRdCost.cpp
- Timestamp:
- 13 Nov 2015, 17:00:20 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-16.0-MV-draft-5/source/Lib/TLibCommon/TComRdCost.cpp
r1386 r1390 41 41 #include "TComRom.h" 42 42 #include "TComRdCost.h" 43 #if NH_3D_VSO44 #include "TComDataCU.h"45 #include "TComRectangle.h"46 #endif47 43 48 44 //! \ingroup TLibCommon 49 45 //! \{ 50 46 51 #if NH_3D_VSO52 // SAIT_VSO_EST_A003353 Double TComRdCost::m_dDisparityCoeff = 1.0;54 #endif55 47 TComRdCost::TComRdCost() 56 48 { … … 63 55 64 56 // Calculate RD functions 65 #if NH_3D_VSO66 Double TComRdCost::calcRdCost( Double numBits, Dist intDistortion, DFunc eDFunc )67 {68 Double distortion = (Double) intDistortion;69 #else70 57 Double TComRdCost::calcRdCost( Double numBits, Double distortion, DFunc eDFunc ) 71 58 { 72 #endif73 59 74 60 Double lambda = 1.0; … … 183 169 m_afpDistortFunc[DF_HADS16N] = TComRdCost::xGetHADs; 184 170 185 #if NH_3D_VSO186 // SAIT_VSO_EST_A0033187 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 #endif195 171 196 172 m_costMode = COST_STANDARD_LOSSY; … … 199 175 m_iCostScale = 0; 200 176 201 #if NH_3D_VSO202 m_bUseVSO = false;203 m_uiVSOMode = 0;204 m_fpDistortFuncVSO = NULL;205 m_pcRenModel = NULL;206 207 // SAIT_VSO_EST_A0033208 m_bUseEstimatedVSD = false;209 #endif210 #if NH_3D_DBBP211 m_bUseMask = false;212 #endif213 177 214 178 } … … 237 201 rcDistParam.DistFunc = m_afpDistortFunc[eDFunc + g_aucConvertToBit[ rcDistParam.iCols ] + 1 ]; 238 202 239 #if NH_3D_DBBP240 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 #endif264 203 // initialize 265 204 rcDistParam.iSubShift = 0; … … 296 235 } 297 236 298 #if NH_3D_DBBP299 if( m_bUseMask )300 {301 rcDistParam.DistFunc = TComRdCost::xGetMaskedSAD;302 }303 #endif304 237 // initialize 305 238 rcDistParam.iSubShift = 0; … … 347 280 } 348 281 349 #if NH_3D_DBBP350 if( m_bUseMask )351 {352 rcDistParam.DistFunc = TComRdCost::xGetMaskedSAD;353 }354 #endif355 282 // initialize 356 283 rcDistParam.iSubShift = 0; … … 370 297 rcDP.DistFunc = m_afpDistortFunc[ ( bHadamard ? DF_HADS : DF_SADS ) + g_aucConvertToBit[ iWidth ] + 1 ]; 371 298 rcDP.m_maximumDistortionForEarlyExit = std::numeric_limits<Distortion>::max(); 372 #if NH_3D_DBBP373 if( m_bUseMask )374 {375 rcDP.DistFunc = TComRdCost::xGetMaskedSAD;376 }377 #endif378 299 } 379 300 … … 413 334 } 414 335 415 #if NH_3D_ENC_DEPTH416 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 #endif449 336 450 337 … … 463 350 cDtParam.bitDepth = bitDepth; 464 351 465 #if NH_3D_IC466 cDtParam.bUseIC = false;467 #endif468 #if NH_3D_SDC_INTER469 cDtParam.bUseSDCMRSAD = false;470 #endif471 352 472 353 if (isChroma(compID)) … … 479 360 } 480 361 } 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 553 363 554 364 // ==================================================================================================================== … … 556 366 // ==================================================================================================================== 557 367 558 #if NH_3D_DBBP559 // --------------------------------------------------------------------------------------------------------------------560 // Masked distortion functions561 // --------------------------------------------------------------------------------------------------------------------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_IC600 AOF(!pcDtParam->bUseIC);601 #endif602 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 #endif663 368 // -------------------------------------------------------------------------------------------------------------------- 664 369 // SAD … … 671 376 return TComRdCostWeightPrediction::xGetSADw( pcDtParam ); 672 377 } 673 #if NH_3D_IC674 if( pcDtParam->bUseIC )675 {676 return xGetSADic( pcDtParam );677 }678 #endif679 #if NH_3D_SDC_INTER680 if( pcDtParam->bUseSDCMRSAD )681 {682 return xGetSADic( pcDtParam );683 }684 #endif685 378 686 379 const Pel* piOrg = pcDtParam->pOrg; … … 717 410 } 718 411 719 #if NH_3D_IC720 if( pcDtParam->bUseIC )721 {722 return xGetSAD4ic( pcDtParam );723 }724 #endif725 #if NH_3D_SDC_INTER726 if( pcDtParam->bUseSDCMRSAD )727 {728 return xGetSAD4ic( pcDtParam );729 }730 #endif731 412 732 413 const Pel* piOrg = pcDtParam->pOrg; … … 762 443 } 763 444 764 #if NH_3D_IC765 if( pcDtParam->bUseIC )766 {767 return xGetSAD8ic( pcDtParam );768 }769 #endif770 #if NH_3D_SDC_INTER771 if( pcDtParam->bUseSDCMRSAD )772 {773 return xGetSAD8ic( pcDtParam );774 }775 #endif776 445 777 446 const Pel* piOrg = pcDtParam->pOrg; … … 811 480 } 812 481 813 #if NH_3D_IC814 if( pcDtParam->bUseIC )815 {816 return xGetSAD16ic( pcDtParam );817 }818 #endif819 #if NH_3D_SDC_INTER820 if( pcDtParam->bUseSDCMRSAD )821 {822 return xGetSAD16ic( pcDtParam );823 }824 #endif825 482 826 483 const Pel* piOrg = pcDtParam->pOrg; … … 867 524 return TComRdCostWeightPrediction::xGetSADw( pcDtParam ); 868 525 } 869 #if NH_3D_IC870 if( pcDtParam->bUseIC )871 {872 return xGetSAD12ic( pcDtParam );873 }874 #endif875 #if NH_3D_SDC_INTER876 if( pcDtParam->bUseSDCMRSAD )877 {878 return xGetSAD12ic( pcDtParam );879 }880 #endif881 526 882 527 const Pel* piOrg = pcDtParam->pOrg; … … 915 560 Distortion TComRdCost::xGetSAD16N( DistParam* pcDtParam ) 916 561 { 917 #if NH_3D_IC918 if( pcDtParam->bUseIC )919 {920 return xGetSAD16Nic( pcDtParam );921 }922 #endif923 #if NH_3D_SDC_INTER924 if( pcDtParam->bUseSDCMRSAD )925 {926 return xGetSAD16Nic( pcDtParam );927 }928 #endif929 562 930 563 const Pel* piOrg = pcDtParam->pOrg; … … 975 608 } 976 609 977 #if NH_3D_IC978 if( pcDtParam->bUseIC )979 {980 return xGetSAD32ic( pcDtParam );981 }982 #endif983 #if NH_3D_SDC_INTER984 if( pcDtParam->bUseSDCMRSAD )985 {986 return xGetSAD32ic( pcDtParam );987 }988 #endif989 610 990 611 const Pel* piOrg = pcDtParam->pOrg; … … 1048 669 } 1049 670 1050 #if NH_3D_IC1051 if( pcDtParam->bUseIC )1052 {1053 return xGetSAD24ic( pcDtParam );1054 }1055 #endif1056 #if NH_3D_SDC_INTER1057 if( pcDtParam->bUseSDCMRSAD )1058 {1059 return xGetSAD24ic( pcDtParam );1060 }1061 #endif1062 671 1063 672 const Pel* piOrg = pcDtParam->pOrg; … … 1113 722 } 1114 723 1115 #if NH_3D_IC1116 if( pcDtParam->bUseIC )1117 {1118 return xGetSAD64ic( pcDtParam );1119 }1120 #endif1121 #if NH_3D_SDC_INTER1122 if( pcDtParam->bUseSDCMRSAD )1123 {1124 return xGetSAD64ic( pcDtParam );1125 }1126 #endif1127 724 1128 725 const Pel* piOrg = pcDtParam->pOrg; … … 1217 814 return TComRdCostWeightPrediction::xGetSADw( pcDtParam ); 1218 815 } 1219 #if NH_3D_IC1220 if( pcDtParam->bUseIC )1221 {1222 return xGetSAD48ic( pcDtParam );1223 }1224 #endif1225 #if NH_3D_SDC_INTER1226 if( pcDtParam->bUseSDCMRSAD )1227 {1228 return xGetSAD48ic( pcDtParam );1229 }1230 #endif1231 816 1232 817 const Pel* piOrg = pcDtParam->pOrg; … … 1300 885 1301 886 1302 #if NH_3D_IC || NH_3D_SDC_INTER1303 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 #endif2432 887 // -------------------------------------------------------------------------------------------------------------------- 2433 888 // SSE … … 2781 1236 } 2782 1237 2783 #if NH_3D_VSO2784 //SAIT_VSO_EST_A00332785 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 struct2788 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 #endif3014 1238 3015 1239 // -------------------------------------------------------------------------------------------------------------------- … … 3239 1463 return TComRdCostWeightPrediction::xGetHADsw( pcDtParam ); 3240 1464 } 3241 #if NH_3D_IC3242 if( pcDtParam->bUseIC )3243 {3244 return xGetHADsic( pcDtParam );3245 }3246 #endif3247 #if NH_3D_SDC_INTER3248 if( pcDtParam->bUseSDCMRSAD )3249 {3250 return xGetHADsic( pcDtParam );3251 }3252 #endif3253 1465 3254 1466 const Pel* piOrg = pcDtParam->pOrg; … … 3315 1527 } 3316 1528 3317 #if NH_3D_IC || NH_3D_SDC_INTER3318 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_HAD3377 if( ( ( iRows % 8 == 0) && (iCols % 8 == 0) && ( iRows == iCols ) ) || ( ( iRows % 8 == 0 ) && (iCols % 8 == 0) && !pcDtParam->bUseNSHAD ) )3378 #else3379 if( ( iRows % 8 == 0) && (iCols % 8 == 0) )3380 #endif3381 {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_HAD3395 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 #endif3424 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 else3454 {3455 assert(false);3456 }3457 3458 return ( uiSum >> DISTORTION_PRECISION_ADJUSTMENT( pcDtParam->bitDepth - 8 ) );3459 }3460 #endif3461 #if NH_3D_VSO3462 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 #endif3470 #if NH_3D_VSO3471 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_SKIP3475 RMDist iDist = m_pcRenModel->getDist( iStartPosX, iStartPosY, (Int) uiBlkWidth, (Int) uiBlkHeight, iCurStride, piCur, piOrg, iOrgStride);3476 #else3477 RMDist iDist = m_pcRenModel->getDist( iStartPosX, iStartPosY, (Int) uiBlkWidth, (Int) uiBlkHeight, iCurStride, piCur );3478 #endif3479 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 else3512 {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_LOSSLESS3567 dRdCost = (Double)(uiBits);3568 #else3569 dRdCost = (((Double)uiDistortion) + ((Double)uiBits * dLambda));3570 #endif3571 }3572 else3573 {3574 if (eDFunc == DF_SAD)3575 {3576 dRdCost = ((Double)uiDistortion + (Double)((Int)(uiBits * dLambda+.5)>>16));3577 dRdCost = (Double)(Dist)floor(dRdCost);3578 }3579 else3580 {3581 #if SEQUENCE_LEVEL_LOSSLESS3582 dRdCost = (Double)(uiBits);3583 #else3584 dRdCost = ((Double)uiDistortion + (Double)((Int)(uiBits * dLambda+.5)));3585 dRdCost = (Double)(Dist)floor(dRdCost);3586 #endif3587 }3588 }3589 3590 #if NH_MV3591 D_PRINT_INDENT( g_traceRDCost, "VSO Dist: " + n2s(uiDistortion) + " Bits: " + n2s(uiBits) + " RD Cost: " + n2s(dRdCost));3592 #endif3593 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 #endif3624 1529 3625 1530 //! \}
Note: See TracChangeset for help on using the changeset viewer.