Changeset 5 in 3DVCSoftware for trunk/source/Lib/TLibCommon/TComPrediction.cpp
- Timestamp:
- 12 Dec 2011, 18:35:44 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/Lib/TLibCommon/TComPrediction.cpp
r2 r5 1 /* The copyright in this software is being made available under the BSD 2 * License, included below. This software may be subject to other third party 3 * and contributor rights, including patent rights, and no such rights are 4 * granted under this license. 5 * 6 * Copyright (c) 2010-2011, ISO/IEC 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions are met: 11 * 12 * * Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * * Redistributions in binary form must reproduce the above copyright notice, 15 * this list of conditions and the following disclaimer in the documentation 16 * and/or other materials provided with the distribution. 17 * * Neither the name of the ISO/IEC nor the names of its contributors may 18 * be used to endorse or promote products derived from this software without 19 * specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 1 34 2 35 … … 268 301 269 302 #if QC_MDIS 270 #if HHI_DISABLE_INTRA_SMOOTHING_DEPTH271 ptrSrc = pcTComPattern->getPredictorPtr( uiDirMode, g_aucConvertToBit[ iWidth ] + 1, iWidth, iHeight, m_piYuvExt, pcCU->getSlice()->getSPS()->isDepth() );272 #else273 303 ptrSrc = pcTComPattern->getPredictorPtr( uiDirMode, g_aucConvertToBit[ iWidth ] + 1, iWidth, iHeight, m_piYuvExt ); 274 #endif275 304 #else 276 305 ptrSrc = pcTComPattern->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt ); … … 433 462 } 434 463 435 #if HHI_DMM_ INTRA464 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX 436 465 Void TComPrediction::predIntraLumaDMM( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiMode, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder ) 437 466 { 467 #if HHI_DMM_WEDGE_INTRA 438 468 if( uiMode == DMM_WEDGE_FULL_IDX ) { xPredIntraWedgeFull ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, false, pcCU->getWedgeFullTabIdx ( uiAbsPartIdx ) ); } 439 469 if( uiMode == DMM_WEDGE_FULL_D_IDX ) { xPredIntraWedgeFull ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, true, pcCU->getWedgeFullTabIdx( uiAbsPartIdx ), pcCU->getWedgeFullDeltaDC1( uiAbsPartIdx ), pcCU->getWedgeFullDeltaDC2( uiAbsPartIdx ) ); } 440 470 if( uiMode == DMM_WEDGE_PREDDIR_IDX ) { xPredIntraWedgeDir ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, false, pcCU->getWedgePredDirDeltaEnd( uiAbsPartIdx ) ); } 441 471 if( uiMode == DMM_WEDGE_PREDDIR_D_IDX ) { xPredIntraWedgeDir ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, true, pcCU->getWedgePredDirDeltaEnd( uiAbsPartIdx ), pcCU->getWedgePredDirDeltaDC1( uiAbsPartIdx ), pcCU->getWedgePredDirDeltaDC2( uiAbsPartIdx ) ); } 472 #endif 473 #if HHI_DMM_PRED_TEX 442 474 if( uiMode == DMM_WEDGE_PREDTEX_IDX ) { xPredIntraWedgeTex ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, false ); } 443 475 if( uiMode == DMM_WEDGE_PREDTEX_D_IDX ) { xPredIntraWedgeTex ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, true, pcCU->getWedgePredTexDeltaDC1( uiAbsPartIdx ), pcCU->getWedgePredTexDeltaDC2( uiAbsPartIdx ) ); } 444 476 if( uiMode == DMM_CONTOUR_PREDTEX_IDX ) { xPredIntraContourTex ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, false ); } 445 477 if( uiMode == DMM_CONTOUR_PREDTEX_D_IDX ) { xPredIntraContourTex ( pcCU, uiAbsPartIdx, piPred, uiStride, iWidth, iHeight, bAbove, bLeft, bEncoder, true, pcCU->getContourPredTexDeltaDC1( uiAbsPartIdx ), pcCU->getContourPredTexDeltaDC2( uiAbsPartIdx ) ); } 446 } 478 #endif 479 } 447 480 448 481 Void TComPrediction::xDeltaDCQuantScaleUp( TComDataCU* pcCU, Int& riDeltaDC ) … … 459 492 } 460 493 461 Void TComPrediction::xPredIntraWedgeFull( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, UInt uiTabIdx, Int iDeltaDC1, Int iDeltaDC2 )462 {463 assert( iWidth >= DMM_WEDGEMODEL_MIN_SIZE && iWidth <= DMM_WEDGEMODEL_MAX_SIZE );464 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[iWidth])];465 TComWedgelet* pcWedgelet = &(pacWedgeList->at(uiTabIdx));466 467 // get wedge pred DCs468 Int iPredDC1 = 0;469 Int iPredDC2 = 0;470 471 Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt );472 Int iMaskStride = ( iWidth<<1 ) + 1;473 piMask += iMaskStride+1;474 getWedgePredDCs( pcWedgelet, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft );475 476 if( bDelta )477 {478 xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 );479 xDeltaDCQuantScaleUp( pcCU, iDeltaDC2 );480 }481 482 // assign wedge pred DCs to prediction483 if( bDelta ) { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, Clip( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); }484 else { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, iPredDC1, iPredDC2 ); }485 }486 487 Void TComPrediction::getWedgePredDCs( TComWedgelet* pcWedgelet, Int* piMask, Int iMaskStride, Int& riPredDC1, Int& riPredDC2, Bool bAbove, Bool bLeft )488 {489 riPredDC1 = ( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) ); //pred val, if no neighbors are available490 riPredDC2 = ( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) );491 492 if( !bAbove && !bLeft ) { return; }493 494 UInt uiNumSmpDC1 = 0, uiNumSmpDC2 = 0;495 Int iPredDC1 = 0, iPredDC2 = 0;496 497 Bool* pabWedgePattern = pcWedgelet->getPattern();498 UInt uiWedgeStride = pcWedgelet->getStride();499 500 if( bAbove )501 {502 for( Int k = 0; k < pcWedgelet->getWidth(); k++ )503 {504 if( true == pabWedgePattern[k] )505 {506 iPredDC2 += piMask[k-iMaskStride];507 uiNumSmpDC2++;508 }509 else510 {511 iPredDC1 += piMask[k-iMaskStride];512 uiNumSmpDC1++;513 }514 }515 }516 if( bLeft )517 {518 for( Int k = 0; k < pcWedgelet->getHeight(); k++ )519 {520 if( true == pabWedgePattern[k*uiWedgeStride] )521 {522 iPredDC2 += piMask[k*iMaskStride-1];523 uiNumSmpDC2++;524 }525 else526 {527 iPredDC1 += piMask[k*iMaskStride-1];528 uiNumSmpDC1++;529 }530 }531 }532 533 if( uiNumSmpDC1 > 0 )534 {535 iPredDC1 /= uiNumSmpDC1;536 riPredDC1 = iPredDC1;537 }538 if( uiNumSmpDC2 > 0 )539 {540 iPredDC2 /= uiNumSmpDC2;541 riPredDC2 = iPredDC2;542 }543 }544 545 Void TComPrediction::getBestContourFromText( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, TComWedgelet* pcContourWedge )546 {547 pcContourWedge->clear();548 Bool* pabContourPattern = pcContourWedge->getPattern();549 550 // get copy of according texture luma block551 UInt uiPartAddr = 0;552 Int iBlockWidth, iBlockHeight;553 554 pcCU->getPartIndexAndSize( uiAbsPartIdx, uiPartAddr, iBlockWidth, iBlockHeight );555 556 TComPicYuv* pcPicYuvRef = pcCU->getSlice()->getTexturePic()->getPicYuvRec();557 Int iRefStride = pcPicYuvRef->getStride();558 Pel* piRefY = pcPicYuvRef->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() + uiPartAddr );559 560 TComYuv cTempYuv; cTempYuv.create( pcCU->getWidth(0), pcCU->getHeight(0) ); cTempYuv.clear();561 UInt uiTempStride = cTempYuv.getStride();562 Pel* piTempY = cTempYuv.getLumaAddr( uiAbsPartIdx, uiWidth );563 564 for ( Int y = 0; y < iBlockHeight; y++ )565 {566 ::memcpy(piTempY, piRefY, sizeof(Pel)*iBlockWidth);567 piTempY += uiTempStride;568 piRefY += iRefStride;569 }570 piTempY = cTempYuv.getLumaAddr( uiAbsPartIdx, uiWidth );571 572 // find contour for texture luma block573 UInt iDC = 0;574 for( UInt k = 0; k < (iBlockWidth*iBlockHeight); k++ ) { iDC += piTempY[k]; }575 iDC /= (iBlockWidth*iBlockHeight);576 577 for( UInt k = 0; k < (iBlockWidth*iBlockHeight); k++ )578 {579 pabContourPattern[k] = (piTempY[k] > iDC) ? true : false;580 }581 582 cTempYuv.destroy();583 }584 585 UInt TComPrediction::getBestContinueWedge( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Int iDeltaEnd )586 {587 UInt uiThisBlockSize = uiWidth;588 assert( uiThisBlockSize >= DMM_WEDGEMODEL_MIN_SIZE && uiThisBlockSize <= DMM_WEDGEMODEL_MAX_SIZE );589 WedgeList* pacContDWedgeList = &g_aacWedgeLists [(g_aucConvertToBit[uiThisBlockSize])];590 WedgeRefList* pacContDWedgeRefList = &g_aacWedgeRefLists[(g_aucConvertToBit[uiThisBlockSize])];591 592 UInt uiPredDirWedgeTabIdx = 0;593 TComDataCU* pcTempCU;594 UInt uiTempPartIdx;595 // 1st: try continue above wedgelet596 pcTempCU = pcCU->getPUAbove( uiTempPartIdx, pcCU->getZorderIdxInCU() + uiAbsPartIdx );597 if( pcTempCU )598 {599 UChar uhLumaIntraDir = pcTempCU->getLumaIntraDir( uiTempPartIdx );600 if( DMM_WEDGE_FULL_IDX == uhLumaIntraDir ||601 DMM_WEDGE_FULL_D_IDX == uhLumaIntraDir ||602 DMM_WEDGE_PREDDIR_IDX == uhLumaIntraDir ||603 DMM_WEDGE_PREDDIR_D_IDX == uhLumaIntraDir ||604 DMM_WEDGE_PREDTEX_IDX == uhLumaIntraDir ||605 DMM_WEDGE_PREDTEX_D_IDX == uhLumaIntraDir )606 {607 UInt uiRefWedgeSize = (UInt)g_aucIntraSizeIdxToWedgeSize[pcTempCU->getIntraSizeIdx( uiTempPartIdx )];608 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiRefWedgeSize])];609 610 // get offset between current and reference block611 UInt uiOffsetX = 0;612 UInt uiOffsetY = 0;613 xGetBlockOffset( pcCU, uiAbsPartIdx, pcTempCU, uiTempPartIdx, uiOffsetX, uiOffsetY );614 615 // get reference wedgelet616 UInt uiRefWedgeTabIdx = 0;617 switch( uhLumaIntraDir )618 {619 case( DMM_WEDGE_FULL_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx ( uiTempPartIdx ); } break;620 case( DMM_WEDGE_FULL_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx ( uiTempPartIdx ); } break;621 case( DMM_WEDGE_PREDDIR_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break;622 case( DMM_WEDGE_PREDDIR_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break;623 case( DMM_WEDGE_PREDTEX_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break;624 case( DMM_WEDGE_PREDTEX_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break;625 default: { assert( 0 ); return uiPredDirWedgeTabIdx; }626 }627 TComWedgelet* pcRefWedgelet;628 pcRefWedgelet = &(pacWedgeList->at( uiRefWedgeTabIdx ));629 630 // find reference wedgelet, if direction is suitable for continue wedge631 if( pcRefWedgelet->checkPredDirAbovePossible( uiThisBlockSize, uiOffsetX ) )632 {633 UChar uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye;634 pcRefWedgelet->getPredDirStartEndAbove( uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye, uiThisBlockSize, uiOffsetX, iDeltaEnd );635 getWedgeListIdx( pacContDWedgeList, pacContDWedgeRefList, uiPredDirWedgeTabIdx, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye );636 return uiPredDirWedgeTabIdx;637 }638 }639 }640 641 // 2nd: try continue left wedglelet642 pcTempCU = pcCU->getPULeft( uiTempPartIdx, pcCU->getZorderIdxInCU() + uiAbsPartIdx );643 if( pcTempCU )644 {645 UChar uhLumaIntraDir = pcTempCU->getLumaIntraDir( uiTempPartIdx );646 if( DMM_WEDGE_FULL_IDX == uhLumaIntraDir ||647 DMM_WEDGE_FULL_D_IDX == uhLumaIntraDir ||648 DMM_WEDGE_PREDDIR_IDX == uhLumaIntraDir ||649 DMM_WEDGE_PREDDIR_D_IDX == uhLumaIntraDir ||650 DMM_WEDGE_PREDTEX_IDX == uhLumaIntraDir ||651 DMM_WEDGE_PREDTEX_D_IDX == uhLumaIntraDir )652 {653 UInt uiRefWedgeSize = (UInt)g_aucIntraSizeIdxToWedgeSize[pcTempCU->getIntraSizeIdx( uiTempPartIdx )];654 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiRefWedgeSize])];655 656 // get offset between current and reference block657 UInt uiOffsetX = 0;658 UInt uiOffsetY = 0;659 xGetBlockOffset( pcCU, uiAbsPartIdx, pcTempCU, uiTempPartIdx, uiOffsetX, uiOffsetY );660 661 // get reference wedgelet662 UInt uiRefWedgeTabIdx = 0;663 switch( uhLumaIntraDir )664 {665 case( DMM_WEDGE_FULL_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx ( uiTempPartIdx ); } break;666 case( DMM_WEDGE_FULL_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx ( uiTempPartIdx ); } break;667 case( DMM_WEDGE_PREDDIR_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break;668 case( DMM_WEDGE_PREDDIR_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break;669 case( DMM_WEDGE_PREDTEX_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break;670 case( DMM_WEDGE_PREDTEX_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break;671 default: { assert( 0 ); return uiPredDirWedgeTabIdx; }672 }673 TComWedgelet* pcRefWedgelet;674 pcRefWedgelet = &(pacWedgeList->at( uiRefWedgeTabIdx ));675 676 // find reference wedgelet, if direction is suitable for continue wedge677 if( pcRefWedgelet->checkPredDirLeftPossible( uiThisBlockSize, uiOffsetY ) )678 {679 UChar uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye;680 pcRefWedgelet->getPredDirStartEndLeft( uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye, uiThisBlockSize, uiOffsetY, iDeltaEnd );681 getWedgeListIdx( pacContDWedgeList, pacContDWedgeRefList, uiPredDirWedgeTabIdx, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye );682 return uiPredDirWedgeTabIdx;683 }684 }685 }686 687 // 3rd: (default) make wedglet from intra dir and max slope point688 Int iSlopeX = 0;689 Int iSlopeY = 0;690 UInt uiStartPosX = 0;691 UInt uiStartPosY = 0;692 if( xGetWedgeIntraDirPredData( pcCU, uiAbsPartIdx, uiThisBlockSize, iSlopeX, iSlopeY, uiStartPosX, uiStartPosY ) )693 {694 UChar uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye;695 xGetWedgeIntraDirStartEnd( pcCU, uiAbsPartIdx, uiThisBlockSize, iSlopeX, iSlopeY, uiStartPosX, uiStartPosY, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye, iDeltaEnd );696 getWedgeListIdx( pacContDWedgeList, pacContDWedgeRefList, uiPredDirWedgeTabIdx, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye );697 return uiPredDirWedgeTabIdx;698 }699 700 return uiPredDirWedgeTabIdx;701 }702 703 Void TComPrediction::xGetBlockOffset( TComDataCU* pcCU, UInt uiAbsPartIdx, TComDataCU* pcRefCU, UInt uiRefAbsPartIdx, UInt& ruiOffsetX, UInt& ruiOffsetY )704 {705 ruiOffsetX = 0;706 ruiOffsetY = 0;707 708 // get offset between current and above/left block709 UInt uiThisOriginX = pcCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ];710 UInt uiThisOriginY = pcCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ];711 712 UInt uiNumPartInRefCU = pcRefCU->getTotalNumPart();713 UInt uiMaxDepthRefCU = 0;714 while( uiNumPartInRefCU > 1 )715 {716 uiNumPartInRefCU >>= 2;717 uiMaxDepthRefCU++;718 }719 720 UInt uiDepthRefPU = (pcRefCU->getDepth(uiRefAbsPartIdx)) + (pcRefCU->getPartitionSize(uiRefAbsPartIdx) == SIZE_2Nx2N ? 0 : 1);721 UInt uiShifts = (uiMaxDepthRefCU - uiDepthRefPU)*2;722 UInt uiRefBlockOriginPartIdx = (uiRefAbsPartIdx>>uiShifts)<<uiShifts;723 724 UInt uiRefOriginX = pcRefCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiRefBlockOriginPartIdx] ];725 UInt uiRefOriginY = pcRefCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiRefBlockOriginPartIdx] ];726 727 if( (uiThisOriginX - uiRefOriginX) > 0 ) { ruiOffsetX = (UInt)(uiThisOriginX - uiRefOriginX); }728 if( (uiThisOriginY - uiRefOriginY) > 0 ) { ruiOffsetY = (UInt)(uiThisOriginY - uiRefOriginY); }729 }730 731 Bool TComPrediction::xGetWedgeIntraDirPredData( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiBlockSize, Int& riSlopeX, Int& riSlopeY, UInt& ruiStartPosX, UInt& ruiStartPosY )732 {733 riSlopeX = 0;734 riSlopeY = 0;735 ruiStartPosX = 0;736 ruiStartPosY = 0;737 738 // 1st step: get wedge start point (max. slope)739 Int* piSource = pcCU->getPattern()->getAdiOrgBuf( uiBlockSize, uiBlockSize, m_piYuvExt );740 Int iSourceStride = ( uiBlockSize<<1 ) + 1;741 742 UInt uiSlopeMaxAbove = 0;743 UInt uiPosSlopeMaxAbove = 0;744 for( UInt uiPosHor = 0; uiPosHor < (uiBlockSize-1); uiPosHor++ )745 {746 if( abs( piSource[uiPosHor+1] - piSource[uiPosHor] ) > uiSlopeMaxAbove )747 {748 uiSlopeMaxAbove = abs( piSource[uiPosHor+1] - piSource[uiPosHor] );749 uiPosSlopeMaxAbove = uiPosHor;750 }751 }752 753 UInt uiSlopeMaxLeft = 0;754 UInt uiPosSlopeMaxLeft = 0;755 for( UInt uiPosVer = 0; uiPosVer < (uiBlockSize-1); uiPosVer++ )756 {757 if( abs( piSource[(uiPosVer+1)*iSourceStride] - piSource[uiPosVer*iSourceStride] ) > uiSlopeMaxLeft )758 {759 uiSlopeMaxLeft = abs( piSource[(uiPosVer+1)*iSourceStride] - piSource[uiPosVer*iSourceStride] );760 uiPosSlopeMaxLeft = uiPosVer;761 }762 }763 764 if( uiSlopeMaxAbove == 0 && uiSlopeMaxLeft == 0 )765 {766 return false;767 }768 769 if( uiSlopeMaxAbove > uiSlopeMaxLeft )770 {771 ruiStartPosX = uiPosSlopeMaxAbove;772 ruiStartPosY = 0;773 }774 else775 {776 ruiStartPosX = 0;777 ruiStartPosY = uiPosSlopeMaxLeft;778 }779 780 // 2nd step: derive wedge direction781 Int angTable[9] = {0,2,5,9,13,17,21,26,32};782 783 Int uiPreds[2] = {-1, -1};784 Int uiPredNum = pcCU->getIntraDirLumaPredictor( uiAbsPartIdx, uiPreds );785 786 UInt uiDirMode = 0;787 if( uiPredNum == 1 )788 {789 uiDirMode = g_aucAngIntraModeOrder[uiPreds[0]];790 }791 else if( uiPredNum == 2 )792 {793 uiDirMode = g_aucAngIntraModeOrder[uiPreds[1]];794 }795 796 if( uiDirMode == 0 )797 {798 return false;799 }800 801 Bool modeVer = (uiDirMode < 18);802 Bool modeHor = !modeVer;803 Int intraPredAngle = modeVer ? uiDirMode - 9 : modeHor ? uiDirMode - 25 : 0;804 Int absAng = abs(intraPredAngle);805 Int signAng = intraPredAngle < 0 ? -1 : 1;806 absAng = angTable[absAng];807 intraPredAngle = signAng * absAng;808 809 // 3rd step: set slope for direction810 if( modeHor )811 {812 if( intraPredAngle > 0 )813 {814 riSlopeX = -32;815 riSlopeY = intraPredAngle;816 }817 else818 {819 riSlopeX = 32;820 riSlopeY = -intraPredAngle;821 }822 }823 else if( modeVer )824 {825 if( intraPredAngle > 0 )826 {827 riSlopeX = intraPredAngle;828 riSlopeY = -32;829 }830 else831 {832 riSlopeX = -intraPredAngle;833 riSlopeY = 32;834 }835 }836 837 return true;838 }839 840 Void TComPrediction::xGetWedgeIntraDirStartEnd( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiBlockSize, Int iDeltaX, Int iDeltaY, UInt uiPMSPosX, UInt uiPMSPosY, UChar& ruhXs, UChar& ruhYs, UChar& ruhXe, UChar& ruhYe, Int iDeltaEnd )841 {842 ruhXs = 0;843 ruhYs = 0;844 ruhXe = 0;845 ruhYe = 0;846 UInt uiOri;847 848 // scaling of start pos and block size to wedge resolution849 UInt uiScaledStartPosX = 0;850 UInt uiScaledStartPosY = 0;851 UInt uiScaledBlockSize = 0;852 WedgeResolution eWedgeRes = g_aeWedgeResolutionList[(UInt)g_aucConvertToBit[uiBlockSize]];853 switch( eWedgeRes )854 {855 case( DOUBLE_PEL ): { uiScaledStartPosX = (uiPMSPosX>>1); uiScaledStartPosY = (uiPMSPosY>>1); uiScaledBlockSize = (uiBlockSize>>1); break; }856 case( FULL_PEL ): { uiScaledStartPosX = uiPMSPosX; uiScaledStartPosY = uiPMSPosY; uiScaledBlockSize = uiBlockSize; break; }857 case( HALF_PEL ): { uiScaledStartPosX = (uiPMSPosX<<1); uiScaledStartPosY = (uiPMSPosY<<1); uiScaledBlockSize = (uiBlockSize<<1); break; }858 }859 860 // case above861 if( uiScaledStartPosX > 0 && uiScaledStartPosY == 0 )862 {863 ruhXs = (UChar)uiScaledStartPosX;864 ruhYs = 0;865 866 if( iDeltaY == 0 )867 {868 if( iDeltaX < 0 )869 {870 uiOri = 0;871 ruhXe = 0;872 ruhYe = (UChar)Min( Max( iDeltaEnd, 0 ), (uiScaledBlockSize-1) );873 return;874 }875 else876 {877 uiOri = 1;878 ruhXe = (UChar)(uiScaledBlockSize-1); ;879 ruhYe = (UChar)Min( Max( -iDeltaEnd, 0 ), (uiScaledBlockSize-1) );880 std::swap( ruhXs, ruhXe );881 std::swap( ruhYs, ruhYe );882 return;883 }884 }885 886 // regular case887 Int iVirtualEndX = (Int)ruhXs + roftoi( (Double)(uiScaledBlockSize-1) * ((Double)iDeltaX / (Double)iDeltaY) );888 889 if( iVirtualEndX < 0 )890 {891 Int iYe = roftoi( (Double)(0 - (Int)ruhXs) * ((Double)iDeltaY / (Double)iDeltaX) ) + iDeltaEnd;892 if( iYe < (Int)uiScaledBlockSize )893 {894 uiOri = 0;895 ruhXe = 0;896 ruhYe = (UChar)Max( iYe, 0 );897 return;898 }899 else900 {901 uiOri = 4;902 ruhXe = (UChar)Min( (iYe - (uiScaledBlockSize-1)), (uiScaledBlockSize-1) );903 ruhYe = (UChar)(uiScaledBlockSize-1);904 return;905 }906 }907 else if( iVirtualEndX > (uiScaledBlockSize-1) )908 {909 Int iYe = roftoi( (Double)((Int)(uiScaledBlockSize-1) - (Int)ruhXs) * ((Double)iDeltaY / (Double)iDeltaX) ) - iDeltaEnd;910 if( iYe < (Int)uiScaledBlockSize )911 {912 uiOri = 1;913 ruhXe = (UChar)(uiScaledBlockSize-1);914 ruhYe = (UChar)Max( iYe, 0 );915 std::swap( ruhXs, ruhXe );916 std::swap( ruhYs, ruhYe );917 return;918 }919 else920 {921 uiOri = 4;922 ruhXe = (UChar)Max( ((uiScaledBlockSize-1) - (iYe - (uiScaledBlockSize-1))), 0 );923 ruhYe = (UChar)(uiScaledBlockSize-1);924 return;925 }926 }927 else928 {929 Int iXe = iVirtualEndX + iDeltaEnd;930 if( iXe < 0 )931 {932 uiOri = 0;933 ruhXe = 0;934 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) + iXe), 0 );935 return;936 }937 else if( iXe > (uiScaledBlockSize-1) )938 {939 uiOri = 1;940 ruhXe = (UChar)(uiScaledBlockSize-1);941 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) - (iXe - (uiScaledBlockSize-1))), 0 );942 std::swap( ruhXs, ruhXe );943 std::swap( ruhYs, ruhYe );944 return;945 }946 else947 {948 uiOri = 4;949 ruhXe = (UChar)iXe;950 ruhYe = (UChar)(uiScaledBlockSize-1);951 return;952 }953 }954 }955 956 // case left957 if( uiScaledStartPosY > 0 && uiScaledStartPosX == 0 )958 {959 ruhXs = 0;960 ruhYs = (UChar)uiScaledStartPosY;961 962 if( iDeltaX == 0 )963 {964 if( iDeltaY < 0 )965 {966 uiOri = 0;967 ruhXe = (UChar)Min( Max( -iDeltaEnd, 0 ), (uiScaledBlockSize-1) );968 ruhYe = 0;969 std::swap( ruhXs, ruhXe );970 std::swap( ruhYs, ruhYe );971 return;972 }973 else974 {975 uiOri = 3;976 ruhXe = (UChar)Min( Max( iDeltaEnd, 0 ), (uiScaledBlockSize-1) );977 ruhYe = (UChar)(uiScaledBlockSize-1);978 return;979 }980 }981 982 // regular case983 Int iVirtualEndY = (Int)ruhYs + roftoi( (Double)(uiScaledBlockSize-1) * ((Double)iDeltaY / (Double)iDeltaX) );984 985 if( iVirtualEndY < 0 )986 {987 Int iXe = roftoi( (Double)(0 - (Int)ruhYs ) * ((Double)iDeltaX / (Double)iDeltaY) ) - iDeltaEnd;988 if( iXe < (Int)uiScaledBlockSize )989 {990 uiOri = 0;991 ruhXe = (UChar)Max( iXe, 0 );992 ruhYe = 0;993 std::swap( ruhXs, ruhXe );994 std::swap( ruhYs, ruhYe );995 return;996 }997 else998 {999 uiOri = 5;1000 ruhXe = (UChar)(uiScaledBlockSize-1);1001 ruhYe = (UChar)Min( (iXe - (uiScaledBlockSize-1)), (uiScaledBlockSize-1) );1002 std::swap( ruhXs, ruhXe );1003 std::swap( ruhYs, ruhYe );1004 return;1005 }1006 }1007 else if( iVirtualEndY > (uiScaledBlockSize-1) )1008 {1009 Int iXe = roftoi( (Double)((Int)(uiScaledBlockSize-1) - (Int)ruhYs ) * ((Double)iDeltaX / (Double)iDeltaY) ) + iDeltaEnd;1010 if( iXe < (Int)uiScaledBlockSize )1011 {1012 uiOri = 3;1013 ruhXe = (UChar)Max( iXe, 0 );1014 ruhYe = (UChar)(uiScaledBlockSize-1);1015 return;1016 }1017 else1018 {1019 uiOri = 5;1020 ruhXe = (UChar)(uiScaledBlockSize-1);1021 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) - (iXe - (uiScaledBlockSize-1))), 0 );1022 std::swap( ruhXs, ruhXe );1023 std::swap( ruhYs, ruhYe );1024 return;1025 }1026 }1027 else1028 {1029 Int iYe = iVirtualEndY - iDeltaEnd;1030 if( iYe < 0 )1031 {1032 uiOri = 0;1033 ruhXe = (UChar)Max( ((uiScaledBlockSize-1) + iYe), 0 );1034 ruhYe = 0;1035 std::swap( ruhXs, ruhXe );1036 std::swap( ruhYs, ruhYe );1037 return;1038 }1039 else if( iYe > (uiScaledBlockSize-1) )1040 {1041 uiOri = 3;1042 ruhXe = (UChar)Max( ((uiScaledBlockSize-1) - (iYe - (uiScaledBlockSize-1))), 0 );1043 ruhYe = (UChar)(uiScaledBlockSize-1);1044 return;1045 }1046 else1047 {1048 uiOri = 5;1049 ruhXe = (UChar)(uiScaledBlockSize-1);1050 ruhYe = (UChar)iYe;1051 std::swap( ruhXs, ruhXe );1052 std::swap( ruhYs, ruhYe );1053 return;1054 }1055 }1056 }1057 1058 // case origin1059 if( uiScaledStartPosX == 0 && uiScaledStartPosY == 0 )1060 {1061 if( iDeltaX*iDeltaY < 0 )1062 {1063 return;1064 }1065 1066 ruhXs = 0;1067 ruhYs = 0;1068 1069 if( iDeltaY == 0 )1070 {1071 uiOri = 1;1072 ruhXe = (UChar)(uiScaledBlockSize-1);1073 ruhYe = 0;1074 std::swap( ruhXs, ruhXe );1075 std::swap( ruhYs, ruhYe );1076 return;1077 }1078 1079 if( iDeltaX == 0 )1080 {1081 uiOri = 0;1082 ruhXe = 0;1083 ruhYe = (UChar)(uiScaledBlockSize-1);1084 return;1085 }1086 1087 Int iVirtualEndX = (Int)ruhXs + roftoi( (Double)(uiScaledBlockSize-1) * ((Double)iDeltaX / (Double)iDeltaY) );1088 1089 if( iVirtualEndX > (uiScaledBlockSize-1) )1090 {1091 Int iYe = roftoi( (Double)((Int)(uiScaledBlockSize-1) - (Int)ruhXs) * ((Double)iDeltaY / (Double)iDeltaX) ) - iDeltaEnd;1092 if( iYe < (Int)uiScaledBlockSize )1093 {1094 uiOri = 1;1095 ruhXe = (UChar)(uiScaledBlockSize-1);1096 ruhYe = (UChar)Max( iYe, 0 );1097 std::swap( ruhXs, ruhXe );1098 std::swap( ruhYs, ruhYe );1099 return;1100 }1101 else1102 {1103 uiOri = 3;1104 ruhXe = (UChar)Max( ((uiScaledBlockSize-1) - (iYe - (uiScaledBlockSize-1))), 0 );1105 ruhYe = (UChar)(uiScaledBlockSize-1);1106 return;1107 }1108 }1109 else1110 {1111 Int iXe = iVirtualEndX + iDeltaEnd;1112 if( iXe < 0 )1113 {1114 uiOri = 0;1115 ruhXe = 0;1116 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) + iXe), 0 );1117 return;1118 }1119 else if( iXe > (uiScaledBlockSize-1) )1120 {1121 uiOri = 1;1122 ruhXe = (UChar)(uiScaledBlockSize-1);1123 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) - (iXe - (uiScaledBlockSize-1))), 0 );1124 std::swap( ruhXs, ruhXe );1125 std::swap( ruhYs, ruhYe );1126 return;1127 }1128 else1129 {1130 uiOri = 3;1131 ruhXe = (UChar)iXe;1132 ruhYe = (UChar)(uiScaledBlockSize-1);1133 return;1134 }1135 }1136 }1137 }1138 1139 Bool TComPrediction::getWedgeListIdx( WedgeList* pcWedgeList, WedgeRefList* pcWedgeRefList, UInt& ruiTabIdx, UChar uhXs, UChar uhYs, UChar uhXe, UChar uhYe )1140 {1141 ruiTabIdx = 0;1142 1143 for( UInt uiIdx = 0; uiIdx < pcWedgeList->size(); uiIdx++ )1144 {1145 TComWedgelet* pcTestWedge = &(pcWedgeList->at(uiIdx));1146 1147 if( pcTestWedge->getStartX() == uhXs &&1148 pcTestWedge->getStartY() == uhYs &&1149 pcTestWedge->getEndX() == uhXe &&1150 pcTestWedge->getEndY() == uhYe )1151 {1152 ruiTabIdx = uiIdx;1153 return true;1154 }1155 }1156 1157 // additionally search in WedgeRef lists of duplicated patterns1158 for( UInt uiIdx = 0; uiIdx < pcWedgeRefList->size(); uiIdx++ )1159 {1160 TComWedgeRef* pcTestWedgeRef = &(pcWedgeRefList->at(uiIdx));1161 1162 if( pcTestWedgeRef->getStartX() == uhXs &&1163 pcTestWedgeRef->getStartY() == uhYs &&1164 pcTestWedgeRef->getEndX() == uhXe &&1165 pcTestWedgeRef->getEndY() == uhYe )1166 {1167 ruiTabIdx = pcTestWedgeRef->getRefIdx();1168 return true;1169 }1170 }1171 1172 return false;1173 }1174 1175 Void TComPrediction::xPredIntraWedgeDir( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, Int iWedgeDeltaEnd, Int iDeltaDC1, Int iDeltaDC2 )1176 {1177 assert( iWidth >= DMM_WEDGEMODEL_MIN_SIZE && iWidth <= DMM_WEDGEMODEL_MAX_SIZE );1178 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[iWidth])];1179 1180 // get wedge pattern1181 UInt uiDirWedgeTabIdx = 0;1182 if( bEncoder )1183 {1184 // encoder: load stored wedge pattern from CU1185 uiDirWedgeTabIdx = pcCU->getWedgePredDirTabIdx( uiAbsPartIdx );1186 }1187 else1188 {1189 uiDirWedgeTabIdx = getBestContinueWedge( pcCU, uiAbsPartIdx, iWidth, iHeight, iWedgeDeltaEnd );1190 1191 UInt uiDepth = (pcCU->getDepth(0)) + (pcCU->getPartitionSize(0) == SIZE_2Nx2N ? 0 : 1);1192 pcCU->setWedgePredDirTabIdxSubParts( uiDirWedgeTabIdx, uiAbsPartIdx, uiDepth );1193 }1194 TComWedgelet* pcWedgelet = &(pacWedgeList->at(uiDirWedgeTabIdx));1195 1196 // get wedge pred DCs1197 Int iPredDC1 = 0;1198 Int iPredDC2 = 0;1199 1200 Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt );1201 Int iMaskStride = ( iWidth<<1 ) + 1;1202 piMask += iMaskStride+1;1203 getWedgePredDCs( pcWedgelet, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft );1204 1205 if( bDelta )1206 {1207 xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 );1208 xDeltaDCQuantScaleUp( pcCU, iDeltaDC2 );1209 }1210 1211 // assign wedge pred DCs to prediction1212 if( bDelta ) { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, Clip ( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); }1213 else { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, iPredDC1, iPredDC2 ); }1214 }1215 1216 Void TComPrediction::xPredIntraWedgeTex( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, Int iDeltaDC1, Int iDeltaDC2 )1217 {1218 assert( iWidth >= DMM_WEDGEMODEL_MIN_SIZE && iWidth <= DMM_WEDGEMODEL_MAX_SIZE );1219 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[iWidth])];1220 1221 // get wedge pattern1222 UInt uiTextureWedgeTabIdx = 0;1223 if( bEncoder )1224 {1225 // encoder: load stored wedge pattern from CU1226 uiTextureWedgeTabIdx = pcCU->getWedgePredTexTabIdx( uiAbsPartIdx );1227 }1228 else1229 {1230 // decoder: get and store wedge pattern in CU1231 uiTextureWedgeTabIdx = getBestWedgeFromText( pcCU, uiAbsPartIdx, (UInt)iWidth, (UInt)iHeight );1232 UInt uiDepth = (pcCU->getDepth(0)) + (pcCU->getPartitionSize(0) == SIZE_2Nx2N ? 0 : 1);1233 pcCU->setWedgePredTexTabIdxSubParts( uiTextureWedgeTabIdx, uiAbsPartIdx, uiDepth );1234 }1235 TComWedgelet* pcWedgelet = &(pacWedgeList->at(uiTextureWedgeTabIdx));1236 1237 // get wedge pred DCs1238 Int iPredDC1 = 0;1239 Int iPredDC2 = 0;1240 Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt );1241 Int iMaskStride = ( iWidth<<1 ) + 1;1242 piMask += iMaskStride+1;1243 getWedgePredDCs( pcWedgelet, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft );1244 1245 if( bDelta )1246 {1247 xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 );1248 xDeltaDCQuantScaleUp( pcCU, iDeltaDC2 );1249 }1250 1251 // assign wedge pred DCs to prediction1252 if( bDelta ) { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, Clip ( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); }1253 else { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, iPredDC1, iPredDC2 ); }1254 }1255 1256 Void TComPrediction::xPredIntraContourTex( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, Int iDeltaDC1, Int iDeltaDC2 )1257 {1258 // get contour pattern1259 TComWedgelet* pcContourWedge = new TComWedgelet( iWidth, iHeight );1260 getBestContourFromText( pcCU, uiAbsPartIdx, (UInt)iWidth, (UInt)iHeight, pcContourWedge );1261 1262 // get wedge pred DCs1263 Int iPredDC1 = 0;1264 Int iPredDC2 = 0;1265 Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt );1266 Int iMaskStride = ( iWidth<<1 ) + 1;1267 piMask += iMaskStride+1;1268 getWedgePredDCs( pcContourWedge, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft );1269 1270 if( bDelta )1271 {1272 xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 );1273 xDeltaDCQuantScaleUp( pcCU, iDeltaDC2 );1274 }1275 1276 // assign wedge pred DCs to prediction1277 if( bDelta ) { assignWedgeDCs2Pred( pcContourWedge, piPred, uiStride, Clip ( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); }1278 else { assignWedgeDCs2Pred( pcContourWedge, piPred, uiStride, iPredDC1, iPredDC2 ); }1279 1280 pcContourWedge->destroy();1281 delete pcContourWedge;1282 }1283 #endif1284 #if HHI_DMM_INTRA1285 494 Void TComPrediction::calcWedgeDCs( TComWedgelet* pcWedgelet, Pel* piOrig, UInt uiStride, Int& riDC1, Int& riDC2 ) 1286 495 { … … 1367 576 } 1368 577 else 1369 578 { 1370 579 piTemp[uiX] = iDC1; 1371 580 } … … 1377 586 } 1378 587 1379 UInt TComPrediction::getBestWedgeFromText( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, WedgeDist eWedgeDist ) 588 Void TComPrediction::getWedgePredDCs( TComWedgelet* pcWedgelet, Int* piMask, Int iMaskStride, Int& riPredDC1, Int& riPredDC2, Bool bAbove, Bool bLeft ) 589 { 590 riPredDC1 = ( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) ); //pred val, if no neighbors are available 591 riPredDC2 = ( 1<<( g_uiBitDepth + g_uiBitIncrement - 1) ); 592 593 if( !bAbove && !bLeft ) { return; } 594 595 UInt uiNumSmpDC1 = 0, uiNumSmpDC2 = 0; 596 Int iPredDC1 = 0, iPredDC2 = 0; 597 598 Bool* pabWedgePattern = pcWedgelet->getPattern(); 599 UInt uiWedgeStride = pcWedgelet->getStride(); 600 601 if( bAbove ) 602 { 603 for( Int k = 0; k < pcWedgelet->getWidth(); k++ ) 604 { 605 if( true == pabWedgePattern[k] ) 606 { 607 iPredDC2 += piMask[k-iMaskStride]; 608 uiNumSmpDC2++; 609 } 610 else 611 { 612 iPredDC1 += piMask[k-iMaskStride]; 613 uiNumSmpDC1++; 614 } 615 } 616 } 617 if( bLeft ) 618 { 619 for( Int k = 0; k < pcWedgelet->getHeight(); k++ ) 620 { 621 if( true == pabWedgePattern[k*uiWedgeStride] ) 622 { 623 iPredDC2 += piMask[k*iMaskStride-1]; 624 uiNumSmpDC2++; 625 } 626 else 627 { 628 iPredDC1 += piMask[k*iMaskStride-1]; 629 uiNumSmpDC1++; 630 } 631 } 632 } 633 634 if( uiNumSmpDC1 > 0 ) 635 { 636 iPredDC1 /= uiNumSmpDC1; 637 riPredDC1 = iPredDC1; 638 } 639 if( uiNumSmpDC2 > 0 ) 640 { 641 iPredDC2 /= uiNumSmpDC2; 642 riPredDC2 = iPredDC2; 643 } 644 } 645 #endif 646 647 #if HHI_DMM_WEDGE_INTRA 648 Void TComPrediction::xPredIntraWedgeFull( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, UInt uiTabIdx, Int iDeltaDC1, Int iDeltaDC2 ) 649 { 650 assert( iWidth >= DMM_WEDGEMODEL_MIN_SIZE && iWidth <= DMM_WEDGEMODEL_MAX_SIZE ); 651 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[iWidth])]; 652 TComWedgelet* pcWedgelet = &(pacWedgeList->at(uiTabIdx)); 653 654 // get wedge pred DCs 655 Int iPredDC1 = 0; 656 Int iPredDC2 = 0; 657 658 Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt ); 659 Int iMaskStride = ( iWidth<<1 ) + 1; 660 piMask += iMaskStride+1; 661 getWedgePredDCs( pcWedgelet, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft ); 662 663 if( bDelta ) 664 { 665 xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 ); 666 xDeltaDCQuantScaleUp( pcCU, iDeltaDC2 ); 667 } 668 669 // assign wedge pred DCs to prediction 670 if( bDelta ) { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, Clip( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); } 671 else { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, iPredDC1, iPredDC2 ); } 672 } 673 674 UInt TComPrediction::getBestContinueWedge( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Int iDeltaEnd ) 675 { 676 UInt uiThisBlockSize = uiWidth; 677 assert( uiThisBlockSize >= DMM_WEDGEMODEL_MIN_SIZE && uiThisBlockSize <= DMM_WEDGEMODEL_MAX_SIZE ); 678 WedgeList* pacContDWedgeList = &g_aacWedgeLists [(g_aucConvertToBit[uiThisBlockSize])]; 679 WedgeRefList* pacContDWedgeRefList = &g_aacWedgeRefLists[(g_aucConvertToBit[uiThisBlockSize])]; 680 681 UInt uiPredDirWedgeTabIdx = 0; 682 TComDataCU* pcTempCU; 683 UInt uiTempPartIdx; 684 // 1st: try continue above wedgelet 685 pcTempCU = pcCU->getPUAbove( uiTempPartIdx, pcCU->getZorderIdxInCU() + uiAbsPartIdx ); 686 if( pcTempCU ) 687 { 688 UChar uhLumaIntraDir = pcTempCU->getLumaIntraDir( uiTempPartIdx ); 689 if( DMM_WEDGE_FULL_IDX == uhLumaIntraDir || 690 DMM_WEDGE_FULL_D_IDX == uhLumaIntraDir || 691 DMM_WEDGE_PREDDIR_IDX == uhLumaIntraDir || 692 DMM_WEDGE_PREDDIR_D_IDX == uhLumaIntraDir 693 #if HHI_DMM_PRED_TEX 694 || 695 DMM_WEDGE_PREDTEX_IDX == uhLumaIntraDir || 696 DMM_WEDGE_PREDTEX_D_IDX == uhLumaIntraDir 697 #endif 698 ) 699 { 700 UInt uiRefWedgeSize = (UInt)g_aucIntraSizeIdxToWedgeSize[pcTempCU->getIntraSizeIdx( uiTempPartIdx )]; 701 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiRefWedgeSize])]; 702 703 // get offset between current and reference block 704 UInt uiOffsetX = 0; 705 UInt uiOffsetY = 0; 706 xGetBlockOffset( pcCU, uiAbsPartIdx, pcTempCU, uiTempPartIdx, uiOffsetX, uiOffsetY ); 707 708 // get reference wedgelet 709 UInt uiRefWedgeTabIdx = 0; 710 switch( uhLumaIntraDir ) 711 { 712 case( DMM_WEDGE_FULL_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx ( uiTempPartIdx ); } break; 713 case( DMM_WEDGE_FULL_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx ( uiTempPartIdx ); } break; 714 case( DMM_WEDGE_PREDDIR_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break; 715 case( DMM_WEDGE_PREDDIR_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break; 716 #if HHI_DMM_PRED_TEX 717 case( DMM_WEDGE_PREDTEX_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break; 718 case( DMM_WEDGE_PREDTEX_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break; 719 #endif 720 default: { assert( 0 ); return uiPredDirWedgeTabIdx; } 721 } 722 TComWedgelet* pcRefWedgelet; 723 pcRefWedgelet = &(pacWedgeList->at( uiRefWedgeTabIdx )); 724 725 // find reference wedgelet, if direction is suitable for continue wedge 726 if( pcRefWedgelet->checkPredDirAbovePossible( uiThisBlockSize, uiOffsetX ) ) 727 { 728 UChar uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye; 729 pcRefWedgelet->getPredDirStartEndAbove( uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye, uiThisBlockSize, uiOffsetX, iDeltaEnd ); 730 getWedgeListIdx( pacContDWedgeList, pacContDWedgeRefList, uiPredDirWedgeTabIdx, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye ); 731 return uiPredDirWedgeTabIdx; 732 } 733 } 734 } 735 736 // 2nd: try continue left wedglelet 737 pcTempCU = pcCU->getPULeft( uiTempPartIdx, pcCU->getZorderIdxInCU() + uiAbsPartIdx ); 738 if( pcTempCU ) 739 { 740 UChar uhLumaIntraDir = pcTempCU->getLumaIntraDir( uiTempPartIdx ); 741 if( DMM_WEDGE_FULL_IDX == uhLumaIntraDir || 742 DMM_WEDGE_FULL_D_IDX == uhLumaIntraDir || 743 DMM_WEDGE_PREDDIR_IDX == uhLumaIntraDir || 744 DMM_WEDGE_PREDDIR_D_IDX == uhLumaIntraDir 745 #if HHI_DMM_PRED_TEX 746 || 747 DMM_WEDGE_PREDTEX_IDX == uhLumaIntraDir || 748 DMM_WEDGE_PREDTEX_D_IDX == uhLumaIntraDir 749 #endif 750 ) 751 { 752 UInt uiRefWedgeSize = (UInt)g_aucIntraSizeIdxToWedgeSize[pcTempCU->getIntraSizeIdx( uiTempPartIdx )]; 753 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiRefWedgeSize])]; 754 755 // get offset between current and reference block 756 UInt uiOffsetX = 0; 757 UInt uiOffsetY = 0; 758 xGetBlockOffset( pcCU, uiAbsPartIdx, pcTempCU, uiTempPartIdx, uiOffsetX, uiOffsetY ); 759 760 // get reference wedgelet 761 UInt uiRefWedgeTabIdx = 0; 762 switch( uhLumaIntraDir ) 763 { 764 case( DMM_WEDGE_FULL_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx ( uiTempPartIdx ); } break; 765 case( DMM_WEDGE_FULL_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgeFullTabIdx ( uiTempPartIdx ); } break; 766 case( DMM_WEDGE_PREDDIR_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break; 767 case( DMM_WEDGE_PREDDIR_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredDirTabIdx( uiTempPartIdx ); } break; 768 #if HHI_DMM_PRED_TEX 769 case( DMM_WEDGE_PREDTEX_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break; 770 case( DMM_WEDGE_PREDTEX_D_IDX ): { uiRefWedgeTabIdx = pcTempCU->getWedgePredTexTabIdx( uiTempPartIdx ); } break; 771 #endif 772 default: { assert( 0 ); return uiPredDirWedgeTabIdx; } 773 } 774 TComWedgelet* pcRefWedgelet; 775 pcRefWedgelet = &(pacWedgeList->at( uiRefWedgeTabIdx )); 776 777 // find reference wedgelet, if direction is suitable for continue wedge 778 if( pcRefWedgelet->checkPredDirLeftPossible( uiThisBlockSize, uiOffsetY ) ) 779 { 780 UChar uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye; 781 pcRefWedgelet->getPredDirStartEndLeft( uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye, uiThisBlockSize, uiOffsetY, iDeltaEnd ); 782 getWedgeListIdx( pacContDWedgeList, pacContDWedgeRefList, uiPredDirWedgeTabIdx, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye ); 783 return uiPredDirWedgeTabIdx; 784 } 785 } 786 } 787 788 // 3rd: (default) make wedglet from intra dir and max slope point 789 Int iSlopeX = 0; 790 Int iSlopeY = 0; 791 UInt uiStartPosX = 0; 792 UInt uiStartPosY = 0; 793 if( xGetWedgeIntraDirPredData( pcCU, uiAbsPartIdx, uiThisBlockSize, iSlopeX, iSlopeY, uiStartPosX, uiStartPosY ) ) 794 { 795 UChar uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye; 796 xGetWedgeIntraDirStartEnd( pcCU, uiAbsPartIdx, uiThisBlockSize, iSlopeX, iSlopeY, uiStartPosX, uiStartPosY, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye, iDeltaEnd ); 797 getWedgeListIdx( pacContDWedgeList, pacContDWedgeRefList, uiPredDirWedgeTabIdx, uhContD_Xs, uhContD_Ys, uhContD_Xe, uhContD_Ye ); 798 return uiPredDirWedgeTabIdx; 799 } 800 801 return uiPredDirWedgeTabIdx; 802 } 803 804 Void TComPrediction::xGetBlockOffset( TComDataCU* pcCU, UInt uiAbsPartIdx, TComDataCU* pcRefCU, UInt uiRefAbsPartIdx, UInt& ruiOffsetX, UInt& ruiOffsetY ) 805 { 806 ruiOffsetX = 0; 807 ruiOffsetY = 0; 808 809 // get offset between current and above/left block 810 UInt uiThisOriginX = pcCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ]; 811 UInt uiThisOriginY = pcCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ]; 812 813 UInt uiNumPartInRefCU = pcRefCU->getTotalNumPart(); 814 UInt uiMaxDepthRefCU = 0; 815 while( uiNumPartInRefCU > 1 ) 816 { 817 uiNumPartInRefCU >>= 2; 818 uiMaxDepthRefCU++; 819 } 820 821 UInt uiDepthRefPU = (pcRefCU->getDepth(uiRefAbsPartIdx)) + (pcRefCU->getPartitionSize(uiRefAbsPartIdx) == SIZE_2Nx2N ? 0 : 1); 822 UInt uiShifts = (uiMaxDepthRefCU - uiDepthRefPU)*2; 823 UInt uiRefBlockOriginPartIdx = (uiRefAbsPartIdx>>uiShifts)<<uiShifts; 824 825 UInt uiRefOriginX = pcRefCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiRefBlockOriginPartIdx] ]; 826 UInt uiRefOriginY = pcRefCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiRefBlockOriginPartIdx] ]; 827 828 if( (uiThisOriginX - uiRefOriginX) > 0 ) { ruiOffsetX = (UInt)(uiThisOriginX - uiRefOriginX); } 829 if( (uiThisOriginY - uiRefOriginY) > 0 ) { ruiOffsetY = (UInt)(uiThisOriginY - uiRefOriginY); } 830 } 831 832 Bool TComPrediction::xGetWedgeIntraDirPredData( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiBlockSize, Int& riSlopeX, Int& riSlopeY, UInt& ruiStartPosX, UInt& ruiStartPosY ) 833 { 834 riSlopeX = 0; 835 riSlopeY = 0; 836 ruiStartPosX = 0; 837 ruiStartPosY = 0; 838 839 // 1st step: get wedge start point (max. slope) 840 Int* piSource = pcCU->getPattern()->getAdiOrgBuf( uiBlockSize, uiBlockSize, m_piYuvExt ); 841 Int iSourceStride = ( uiBlockSize<<1 ) + 1; 842 843 UInt uiSlopeMaxAbove = 0; 844 UInt uiPosSlopeMaxAbove = 0; 845 for( UInt uiPosHor = 0; uiPosHor < (uiBlockSize-1); uiPosHor++ ) 846 { 847 if( abs( piSource[uiPosHor+1] - piSource[uiPosHor] ) > uiSlopeMaxAbove ) 848 { 849 uiSlopeMaxAbove = abs( piSource[uiPosHor+1] - piSource[uiPosHor] ); 850 uiPosSlopeMaxAbove = uiPosHor; 851 } 852 } 853 854 UInt uiSlopeMaxLeft = 0; 855 UInt uiPosSlopeMaxLeft = 0; 856 for( UInt uiPosVer = 0; uiPosVer < (uiBlockSize-1); uiPosVer++ ) 857 { 858 if( abs( piSource[(uiPosVer+1)*iSourceStride] - piSource[uiPosVer*iSourceStride] ) > uiSlopeMaxLeft ) 859 { 860 uiSlopeMaxLeft = abs( piSource[(uiPosVer+1)*iSourceStride] - piSource[uiPosVer*iSourceStride] ); 861 uiPosSlopeMaxLeft = uiPosVer; 862 } 863 } 864 865 if( uiSlopeMaxAbove == 0 && uiSlopeMaxLeft == 0 ) 866 { 867 return false; 868 } 869 870 if( uiSlopeMaxAbove > uiSlopeMaxLeft ) 871 { 872 ruiStartPosX = uiPosSlopeMaxAbove; 873 ruiStartPosY = 0; 874 } 875 else 876 { 877 ruiStartPosX = 0; 878 ruiStartPosY = uiPosSlopeMaxLeft; 879 } 880 881 // 2nd step: derive wedge direction 882 Int angTable[9] = {0,2,5,9,13,17,21,26,32}; 883 884 Int uiPreds[2] = {-1, -1}; 885 Int uiPredNum = pcCU->getIntraDirLumaPredictor( uiAbsPartIdx, uiPreds ); 886 887 UInt uiDirMode = 0; 888 if( uiPredNum == 1 ) 889 { 890 uiDirMode = g_aucAngIntraModeOrder[uiPreds[0]]; 891 } 892 else if( uiPredNum == 2 ) 893 { 894 uiDirMode = g_aucAngIntraModeOrder[uiPreds[1]]; 895 } 896 897 if( uiDirMode == 0 ) 898 { 899 return false; 900 } 901 902 Bool modeVer = (uiDirMode < 18); 903 Bool modeHor = !modeVer; 904 Int intraPredAngle = modeVer ? uiDirMode - 9 : modeHor ? uiDirMode - 25 : 0; 905 Int absAng = abs(intraPredAngle); 906 Int signAng = intraPredAngle < 0 ? -1 : 1; 907 absAng = angTable[absAng]; 908 intraPredAngle = signAng * absAng; 909 910 // 3rd step: set slope for direction 911 if( modeHor ) 912 { 913 if( intraPredAngle > 0 ) 914 { 915 riSlopeX = -32; 916 riSlopeY = intraPredAngle; 917 } 918 else 919 { 920 riSlopeX = 32; 921 riSlopeY = -intraPredAngle; 922 } 923 } 924 else if( modeVer ) 925 { 926 if( intraPredAngle > 0 ) 927 { 928 riSlopeX = intraPredAngle; 929 riSlopeY = -32; 930 } 931 else 932 { 933 riSlopeX = -intraPredAngle; 934 riSlopeY = 32; 935 } 936 } 937 938 return true; 939 } 940 941 Void TComPrediction::xGetWedgeIntraDirStartEnd( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiBlockSize, Int iDeltaX, Int iDeltaY, UInt uiPMSPosX, UInt uiPMSPosY, UChar& ruhXs, UChar& ruhYs, UChar& ruhXe, UChar& ruhYe, Int iDeltaEnd ) 942 { 943 ruhXs = 0; 944 ruhYs = 0; 945 ruhXe = 0; 946 ruhYe = 0; 947 UInt uiOri; 948 949 // scaling of start pos and block size to wedge resolution 950 UInt uiScaledStartPosX = 0; 951 UInt uiScaledStartPosY = 0; 952 UInt uiScaledBlockSize = 0; 953 WedgeResolution eWedgeRes = g_aeWedgeResolutionList[(UInt)g_aucConvertToBit[uiBlockSize]]; 954 switch( eWedgeRes ) 955 { 956 case( DOUBLE_PEL ): { uiScaledStartPosX = (uiPMSPosX>>1); uiScaledStartPosY = (uiPMSPosY>>1); uiScaledBlockSize = (uiBlockSize>>1); break; } 957 case( FULL_PEL ): { uiScaledStartPosX = uiPMSPosX; uiScaledStartPosY = uiPMSPosY; uiScaledBlockSize = uiBlockSize; break; } 958 case( HALF_PEL ): { uiScaledStartPosX = (uiPMSPosX<<1); uiScaledStartPosY = (uiPMSPosY<<1); uiScaledBlockSize = (uiBlockSize<<1); break; } 959 } 960 961 // case above 962 if( uiScaledStartPosX > 0 && uiScaledStartPosY == 0 ) 963 { 964 ruhXs = (UChar)uiScaledStartPosX; 965 ruhYs = 0; 966 967 if( iDeltaY == 0 ) 968 { 969 if( iDeltaX < 0 ) 970 { 971 uiOri = 0; 972 ruhXe = 0; 973 ruhYe = (UChar)Min( Max( iDeltaEnd, 0 ), (uiScaledBlockSize-1) ); 974 return; 975 } 976 else 977 { 978 uiOri = 1; 979 ruhXe = (UChar)(uiScaledBlockSize-1); ; 980 ruhYe = (UChar)Min( Max( -iDeltaEnd, 0 ), (uiScaledBlockSize-1) ); 981 std::swap( ruhXs, ruhXe ); 982 std::swap( ruhYs, ruhYe ); 983 return; 984 } 985 } 986 987 // regular case 988 Int iVirtualEndX = (Int)ruhXs + roftoi( (Double)(uiScaledBlockSize-1) * ((Double)iDeltaX / (Double)iDeltaY) ); 989 990 if( iVirtualEndX < 0 ) 991 { 992 Int iYe = roftoi( (Double)(0 - (Int)ruhXs) * ((Double)iDeltaY / (Double)iDeltaX) ) + iDeltaEnd; 993 if( iYe < (Int)uiScaledBlockSize ) 994 { 995 uiOri = 0; 996 ruhXe = 0; 997 ruhYe = (UChar)Max( iYe, 0 ); 998 return; 999 } 1000 else 1001 { 1002 uiOri = 4; 1003 ruhXe = (UChar)Min( (iYe - (uiScaledBlockSize-1)), (uiScaledBlockSize-1) ); 1004 ruhYe = (UChar)(uiScaledBlockSize-1); 1005 return; 1006 } 1007 } 1008 else if( iVirtualEndX > (uiScaledBlockSize-1) ) 1009 { 1010 Int iYe = roftoi( (Double)((Int)(uiScaledBlockSize-1) - (Int)ruhXs) * ((Double)iDeltaY / (Double)iDeltaX) ) - iDeltaEnd; 1011 if( iYe < (Int)uiScaledBlockSize ) 1012 { 1013 uiOri = 1; 1014 ruhXe = (UChar)(uiScaledBlockSize-1); 1015 ruhYe = (UChar)Max( iYe, 0 ); 1016 std::swap( ruhXs, ruhXe ); 1017 std::swap( ruhYs, ruhYe ); 1018 return; 1019 } 1020 else 1021 { 1022 uiOri = 4; 1023 ruhXe = (UChar)Max( ((uiScaledBlockSize-1) - (iYe - (uiScaledBlockSize-1))), 0 ); 1024 ruhYe = (UChar)(uiScaledBlockSize-1); 1025 return; 1026 } 1027 } 1028 else 1029 { 1030 Int iXe = iVirtualEndX + iDeltaEnd; 1031 if( iXe < 0 ) 1032 { 1033 uiOri = 0; 1034 ruhXe = 0; 1035 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) + iXe), 0 ); 1036 return; 1037 } 1038 else if( iXe > (uiScaledBlockSize-1) ) 1039 { 1040 uiOri = 1; 1041 ruhXe = (UChar)(uiScaledBlockSize-1); 1042 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) - (iXe - (uiScaledBlockSize-1))), 0 ); 1043 std::swap( ruhXs, ruhXe ); 1044 std::swap( ruhYs, ruhYe ); 1045 return; 1046 } 1047 else 1048 { 1049 uiOri = 4; 1050 ruhXe = (UChar)iXe; 1051 ruhYe = (UChar)(uiScaledBlockSize-1); 1052 return; 1053 } 1054 } 1055 } 1056 1057 // case left 1058 if( uiScaledStartPosY > 0 && uiScaledStartPosX == 0 ) 1059 { 1060 ruhXs = 0; 1061 ruhYs = (UChar)uiScaledStartPosY; 1062 1063 if( iDeltaX == 0 ) 1064 { 1065 if( iDeltaY < 0 ) 1066 { 1067 uiOri = 0; 1068 ruhXe = (UChar)Min( Max( -iDeltaEnd, 0 ), (uiScaledBlockSize-1) ); 1069 ruhYe = 0; 1070 std::swap( ruhXs, ruhXe ); 1071 std::swap( ruhYs, ruhYe ); 1072 return; 1073 } 1074 else 1075 { 1076 uiOri = 3; 1077 ruhXe = (UChar)Min( Max( iDeltaEnd, 0 ), (uiScaledBlockSize-1) ); 1078 ruhYe = (UChar)(uiScaledBlockSize-1); 1079 return; 1080 } 1081 } 1082 1083 // regular case 1084 Int iVirtualEndY = (Int)ruhYs + roftoi( (Double)(uiScaledBlockSize-1) * ((Double)iDeltaY / (Double)iDeltaX) ); 1085 1086 if( iVirtualEndY < 0 ) 1087 { 1088 Int iXe = roftoi( (Double)(0 - (Int)ruhYs ) * ((Double)iDeltaX / (Double)iDeltaY) ) - iDeltaEnd; 1089 if( iXe < (Int)uiScaledBlockSize ) 1090 { 1091 uiOri = 0; 1092 ruhXe = (UChar)Max( iXe, 0 ); 1093 ruhYe = 0; 1094 std::swap( ruhXs, ruhXe ); 1095 std::swap( ruhYs, ruhYe ); 1096 return; 1097 } 1098 else 1099 { 1100 uiOri = 5; 1101 ruhXe = (UChar)(uiScaledBlockSize-1); 1102 ruhYe = (UChar)Min( (iXe - (uiScaledBlockSize-1)), (uiScaledBlockSize-1) ); 1103 std::swap( ruhXs, ruhXe ); 1104 std::swap( ruhYs, ruhYe ); 1105 return; 1106 } 1107 } 1108 else if( iVirtualEndY > (uiScaledBlockSize-1) ) 1109 { 1110 Int iXe = roftoi( (Double)((Int)(uiScaledBlockSize-1) - (Int)ruhYs ) * ((Double)iDeltaX / (Double)iDeltaY) ) + iDeltaEnd; 1111 if( iXe < (Int)uiScaledBlockSize ) 1112 { 1113 uiOri = 3; 1114 ruhXe = (UChar)Max( iXe, 0 ); 1115 ruhYe = (UChar)(uiScaledBlockSize-1); 1116 return; 1117 } 1118 else 1119 { 1120 uiOri = 5; 1121 ruhXe = (UChar)(uiScaledBlockSize-1); 1122 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) - (iXe - (uiScaledBlockSize-1))), 0 ); 1123 std::swap( ruhXs, ruhXe ); 1124 std::swap( ruhYs, ruhYe ); 1125 return; 1126 } 1127 } 1128 else 1129 { 1130 Int iYe = iVirtualEndY - iDeltaEnd; 1131 if( iYe < 0 ) 1132 { 1133 uiOri = 0; 1134 ruhXe = (UChar)Max( ((uiScaledBlockSize-1) + iYe), 0 ); 1135 ruhYe = 0; 1136 std::swap( ruhXs, ruhXe ); 1137 std::swap( ruhYs, ruhYe ); 1138 return; 1139 } 1140 else if( iYe > (uiScaledBlockSize-1) ) 1141 { 1142 uiOri = 3; 1143 ruhXe = (UChar)Max( ((uiScaledBlockSize-1) - (iYe - (uiScaledBlockSize-1))), 0 ); 1144 ruhYe = (UChar)(uiScaledBlockSize-1); 1145 return; 1146 } 1147 else 1148 { 1149 uiOri = 5; 1150 ruhXe = (UChar)(uiScaledBlockSize-1); 1151 ruhYe = (UChar)iYe; 1152 std::swap( ruhXs, ruhXe ); 1153 std::swap( ruhYs, ruhYe ); 1154 return; 1155 } 1156 } 1157 } 1158 1159 // case origin 1160 if( uiScaledStartPosX == 0 && uiScaledStartPosY == 0 ) 1161 { 1162 if( iDeltaX*iDeltaY < 0 ) 1163 { 1164 return; 1165 } 1166 1167 ruhXs = 0; 1168 ruhYs = 0; 1169 1170 if( iDeltaY == 0 ) 1171 { 1172 uiOri = 1; 1173 ruhXe = (UChar)(uiScaledBlockSize-1); 1174 ruhYe = 0; 1175 std::swap( ruhXs, ruhXe ); 1176 std::swap( ruhYs, ruhYe ); 1177 return; 1178 } 1179 1180 if( iDeltaX == 0 ) 1181 { 1182 uiOri = 0; 1183 ruhXe = 0; 1184 ruhYe = (UChar)(uiScaledBlockSize-1); 1185 return; 1186 } 1187 1188 Int iVirtualEndX = (Int)ruhXs + roftoi( (Double)(uiScaledBlockSize-1) * ((Double)iDeltaX / (Double)iDeltaY) ); 1189 1190 if( iVirtualEndX > (uiScaledBlockSize-1) ) 1191 { 1192 Int iYe = roftoi( (Double)((Int)(uiScaledBlockSize-1) - (Int)ruhXs) * ((Double)iDeltaY / (Double)iDeltaX) ) - iDeltaEnd; 1193 if( iYe < (Int)uiScaledBlockSize ) 1194 { 1195 uiOri = 1; 1196 ruhXe = (UChar)(uiScaledBlockSize-1); 1197 ruhYe = (UChar)Max( iYe, 0 ); 1198 std::swap( ruhXs, ruhXe ); 1199 std::swap( ruhYs, ruhYe ); 1200 return; 1201 } 1202 else 1203 { 1204 uiOri = 3; 1205 ruhXe = (UChar)Max( ((uiScaledBlockSize-1) - (iYe - (uiScaledBlockSize-1))), 0 ); 1206 ruhYe = (UChar)(uiScaledBlockSize-1); 1207 return; 1208 } 1209 } 1210 else 1211 { 1212 Int iXe = iVirtualEndX + iDeltaEnd; 1213 if( iXe < 0 ) 1214 { 1215 uiOri = 0; 1216 ruhXe = 0; 1217 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) + iXe), 0 ); 1218 return; 1219 } 1220 else if( iXe > (uiScaledBlockSize-1) ) 1221 { 1222 uiOri = 1; 1223 ruhXe = (UChar)(uiScaledBlockSize-1); 1224 ruhYe = (UChar)Max( ((uiScaledBlockSize-1) - (iXe - (uiScaledBlockSize-1))), 0 ); 1225 std::swap( ruhXs, ruhXe ); 1226 std::swap( ruhYs, ruhYe ); 1227 return; 1228 } 1229 else 1230 { 1231 uiOri = 3; 1232 ruhXe = (UChar)iXe; 1233 ruhYe = (UChar)(uiScaledBlockSize-1); 1234 return; 1235 } 1236 } 1237 } 1238 } 1239 1240 Bool TComPrediction::getWedgeListIdx( WedgeList* pcWedgeList, WedgeRefList* pcWedgeRefList, UInt& ruiTabIdx, UChar uhXs, UChar uhYs, UChar uhXe, UChar uhYe ) 1241 { 1242 ruiTabIdx = 0; 1243 1244 for( UInt uiIdx = 0; uiIdx < pcWedgeList->size(); uiIdx++ ) 1245 { 1246 TComWedgelet* pcTestWedge = &(pcWedgeList->at(uiIdx)); 1247 1248 if( pcTestWedge->getStartX() == uhXs && 1249 pcTestWedge->getStartY() == uhYs && 1250 pcTestWedge->getEndX() == uhXe && 1251 pcTestWedge->getEndY() == uhYe ) 1252 { 1253 ruiTabIdx = uiIdx; 1254 return true; 1255 } 1256 } 1257 1258 // additionally search in WedgeRef lists of duplicated patterns 1259 for( UInt uiIdx = 0; uiIdx < pcWedgeRefList->size(); uiIdx++ ) 1260 { 1261 TComWedgeRef* pcTestWedgeRef = &(pcWedgeRefList->at(uiIdx)); 1262 1263 if( pcTestWedgeRef->getStartX() == uhXs && 1264 pcTestWedgeRef->getStartY() == uhYs && 1265 pcTestWedgeRef->getEndX() == uhXe && 1266 pcTestWedgeRef->getEndY() == uhYe ) 1267 { 1268 ruiTabIdx = pcTestWedgeRef->getRefIdx(); 1269 return true; 1270 } 1271 } 1272 1273 return false; 1274 } 1275 1276 Void TComPrediction::xPredIntraWedgeDir( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, Int iWedgeDeltaEnd, Int iDeltaDC1, Int iDeltaDC2 ) 1277 { 1278 assert( iWidth >= DMM_WEDGEMODEL_MIN_SIZE && iWidth <= DMM_WEDGEMODEL_MAX_SIZE ); 1279 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[iWidth])]; 1280 1281 // get wedge pattern 1282 UInt uiDirWedgeTabIdx = 0; 1283 if( bEncoder ) 1284 { 1285 // encoder: load stored wedge pattern from CU 1286 uiDirWedgeTabIdx = pcCU->getWedgePredDirTabIdx( uiAbsPartIdx ); 1287 } 1288 else 1289 { 1290 uiDirWedgeTabIdx = getBestContinueWedge( pcCU, uiAbsPartIdx, iWidth, iHeight, iWedgeDeltaEnd ); 1291 1292 UInt uiDepth = (pcCU->getDepth(0)) + (pcCU->getPartitionSize(0) == SIZE_2Nx2N ? 0 : 1); 1293 pcCU->setWedgePredDirTabIdxSubParts( uiDirWedgeTabIdx, uiAbsPartIdx, uiDepth ); 1294 } 1295 TComWedgelet* pcWedgelet = &(pacWedgeList->at(uiDirWedgeTabIdx)); 1296 1297 // get wedge pred DCs 1298 Int iPredDC1 = 0; 1299 Int iPredDC2 = 0; 1300 1301 Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt ); 1302 Int iMaskStride = ( iWidth<<1 ) + 1; 1303 piMask += iMaskStride+1; 1304 getWedgePredDCs( pcWedgelet, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft ); 1305 1306 if( bDelta ) 1307 { 1308 xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 ); 1309 xDeltaDCQuantScaleUp( pcCU, iDeltaDC2 ); 1310 } 1311 1312 // assign wedge pred DCs to prediction 1313 if( bDelta ) { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, Clip ( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); } 1314 else { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, iPredDC1, iPredDC2 ); } 1315 } 1316 #endif 1317 1318 #if HHI_DMM_PRED_TEX 1319 Void TComPrediction::xPredIntraWedgeTex( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, Int iDeltaDC1, Int iDeltaDC2 ) 1320 { 1321 assert( iWidth >= DMM_WEDGEMODEL_MIN_SIZE && iWidth <= DMM_WEDGEMODEL_MAX_SIZE ); 1322 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[iWidth])]; 1323 1324 // get wedge pattern 1325 UInt uiTextureWedgeTabIdx = 0; 1326 if( bEncoder ) 1327 { 1328 // encoder: load stored wedge pattern from CU 1329 uiTextureWedgeTabIdx = pcCU->getWedgePredTexTabIdx( uiAbsPartIdx ); 1330 } 1331 else 1332 { 1333 // decoder: get and store wedge pattern in CU 1334 uiTextureWedgeTabIdx = getBestWedgeFromText( pcCU, uiAbsPartIdx, (UInt)iWidth, (UInt)iHeight ); 1335 UInt uiDepth = (pcCU->getDepth(0)) + (pcCU->getPartitionSize(0) == SIZE_2Nx2N ? 0 : 1); 1336 pcCU->setWedgePredTexTabIdxSubParts( uiTextureWedgeTabIdx, uiAbsPartIdx, uiDepth ); 1337 } 1338 TComWedgelet* pcWedgelet = &(pacWedgeList->at(uiTextureWedgeTabIdx)); 1339 1340 // get wedge pred DCs 1341 Int iPredDC1 = 0; 1342 Int iPredDC2 = 0; 1343 Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt ); 1344 Int iMaskStride = ( iWidth<<1 ) + 1; 1345 piMask += iMaskStride+1; 1346 getWedgePredDCs( pcWedgelet, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft ); 1347 1348 if( bDelta ) 1349 { 1350 xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 ); 1351 xDeltaDCQuantScaleUp( pcCU, iDeltaDC2 ); 1352 } 1353 1354 // assign wedge pred DCs to prediction 1355 if( bDelta ) { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, Clip ( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); } 1356 else { assignWedgeDCs2Pred( pcWedgelet, piPred, uiStride, iPredDC1, iPredDC2 ); } 1357 } 1358 1359 Void TComPrediction::xPredIntraContourTex( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, Int iWidth, Int iHeight, Bool bAbove, Bool bLeft, Bool bEncoder, Bool bDelta, Int iDeltaDC1, Int iDeltaDC2 ) 1360 { 1361 // get contour pattern 1362 TComWedgelet* pcContourWedge = new TComWedgelet( iWidth, iHeight ); 1363 getBestContourFromText( pcCU, uiAbsPartIdx, (UInt)iWidth, (UInt)iHeight, pcContourWedge ); 1364 1365 // get wedge pred DCs 1366 Int iPredDC1 = 0; 1367 Int iPredDC2 = 0; 1368 Int* piMask = pcCU->getPattern()->getAdiOrgBuf( iWidth, iHeight, m_piYuvExt ); 1369 Int iMaskStride = ( iWidth<<1 ) + 1; 1370 piMask += iMaskStride+1; 1371 getWedgePredDCs( pcContourWedge, piMask, iMaskStride, iPredDC1, iPredDC2, bAbove, bLeft ); 1372 1373 if( bDelta ) 1374 { 1375 xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 ); 1376 xDeltaDCQuantScaleUp( pcCU, iDeltaDC2 ); 1377 } 1378 1379 // assign wedge pred DCs to prediction 1380 if( bDelta ) { assignWedgeDCs2Pred( pcContourWedge, piPred, uiStride, Clip ( iPredDC1+iDeltaDC1 ), Clip( iPredDC2+iDeltaDC2 ) ); } 1381 else { assignWedgeDCs2Pred( pcContourWedge, piPred, uiStride, iPredDC1, iPredDC2 ); } 1382 1383 pcContourWedge->destroy(); 1384 delete pcContourWedge; 1385 } 1386 1387 Void TComPrediction::getBestContourFromText( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, TComWedgelet* pcContourWedge, Pel* piTextureBlock ) 1388 { 1389 pcContourWedge->clear(); 1390 Bool* pabContourPattern = pcContourWedge->getPattern(); 1391 1392 // get copy of according texture luma block 1393 Pel* piTempY = NULL; 1394 TComYuv cTempYuv; 1395 1396 if ( piTextureBlock ) 1397 { 1398 piTempY = piTextureBlock; 1399 } 1400 else 1401 { 1402 cTempYuv.create( uiWidth, uiHeight ); cTempYuv.clear(); 1403 piTempY = cTempYuv.getLumaAddr(); 1404 1405 fillTexturePicTempBlock( pcCU, uiAbsPartIdx, piTempY, uiWidth, uiHeight ); 1406 1407 piTempY = cTempYuv.getLumaAddr(); 1408 } 1409 1410 // find contour for texture luma block 1411 UInt iDC = 0; 1412 for( UInt k = 0; k < (uiWidth*uiHeight); k++ ) { iDC += piTempY[k]; } 1413 iDC /= (uiWidth*uiHeight); 1414 1415 if ( piTextureBlock ) 1416 { 1417 piTempY = piTextureBlock; 1418 } 1419 else 1420 { 1421 piTempY = cTempYuv.getLumaAddr(); 1422 } 1423 1424 for( UInt k = 0; k < (uiWidth*uiHeight); k++ ) 1425 { 1426 pabContourPattern[k] = (piTempY[k] > iDC) ? true : false; 1427 } 1428 1429 cTempYuv.destroy(); 1430 } 1431 1432 UInt TComPrediction::getBestWedgeFromText( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, WedgeDist eWedgeDist, Pel* piTextureBlock ) 1380 1433 { 1381 1434 assert( uiWidth >= DMM_WEDGEMODEL_MIN_SIZE && uiWidth <= DMM_WEDGEMODEL_MAX_SIZE ); … … 1383 1436 1384 1437 // get copy of according texture luma block 1385 UInt uiPartAddr = 0; 1386 Int iBlockWidth, iBlockHeight; 1438 Pel* piTempY = NULL; 1387 1439 TComYuv cTempYuv; 1388 UInt uiTempStride; 1389 Pel* piTempY; 1390 1391 TComPicYuv* pcPicYuvRef = pcCU->getSlice()->getTexturePic()->getPicYuvRec(); 1392 Int iRefStride = pcPicYuvRef->getStride(); 1393 Pel* piRefY; 1394 1395 pcCU->getPartIndexAndSize( uiAbsPartIdx, uiPartAddr, iBlockWidth, iBlockHeight ); 1396 1397 piRefY = pcPicYuvRef->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() + uiPartAddr ); 1398 1399 cTempYuv.create( pcCU->getWidth(0), pcCU->getHeight(0) ); cTempYuv.clear(); 1400 uiTempStride = cTempYuv.getStride(); 1401 piTempY = cTempYuv.getLumaAddr( uiAbsPartIdx, uiWidth ); 1402 1403 for ( Int y = 0; y < iBlockHeight; y++ ) 1404 { 1405 ::memcpy(piTempY, piRefY, sizeof(Pel)*iBlockWidth); 1406 piTempY += uiTempStride; 1407 piRefY += iRefStride; 1408 } 1409 1410 piTempY = cTempYuv.getLumaAddr( uiAbsPartIdx, uiWidth ); 1411 1440 1441 if ( piTextureBlock ) 1442 { 1443 piTempY = piTextureBlock; 1444 } 1445 else 1446 { 1447 cTempYuv.create( uiWidth, uiHeight ); cTempYuv.clear(); 1448 piTempY = cTempYuv.getLumaAddr(); 1449 1450 fillTexturePicTempBlock( pcCU, uiAbsPartIdx, piTempY, uiWidth, uiHeight ); 1451 1452 piTempY = cTempYuv.getLumaAddr(); 1453 } 1454 1412 1455 TComWedgeDist cWedgeDist; 1413 1456 UInt uiTextureWedgeTabIdx = 0; … … 1429 1472 for( UInt uiIdx = 0; uiIdx < pacWedgeList->size(); uiIdx++ ) 1430 1473 { 1431 calcWedgeDCs ( &(pacWedgeList->at(uiIdx)), piTempY, ui TempStride, iDC1, iDC2 );1474 calcWedgeDCs ( &(pacWedgeList->at(uiIdx)), piTempY, uiWidth, iDC1, iDC2 ); 1432 1475 assignWedgeDCs2Pred( &(pacWedgeList->at(uiIdx)), piPred, uiPredStride, iDC1, iDC2 ); 1433 1476 1434 UInt uiActDist = cWedgeDist.getDistPart( piPred, uiPredStride, piTempY, ui TempStride, uiWidth, uiHeight, eWedgeDist );1477 UInt uiActDist = cWedgeDist.getDistPart( piPred, uiPredStride, piTempY, uiWidth, uiWidth, uiHeight, eWedgeDist ); 1435 1478 1436 1479 if( uiActDist < uiBestDist || uiBestDist == MAX_UINT ) … … 1446 1489 return uiTextureWedgeTabIdx; 1447 1490 } 1491 1492 Void TComPrediction::fillTexturePicTempBlock( TComDataCU* pcCU, UInt uiAbsPartIdx, Pel* piTempBlockY, UInt uiWidth, UInt uiHeight ) 1493 { 1494 TComPicYuv* pcPicYuvRef = pcCU->getSlice()->getTexturePic()->getPicYuvRec(); 1495 Int iRefStride = pcPicYuvRef->getStride(); 1496 Pel* piRefY; 1497 1498 piRefY = pcPicYuvRef->getLumaAddr( pcCU->getAddr(), pcCU->getZorderIdxInCU() + uiAbsPartIdx ); 1499 1500 for ( Int y = 0; y < uiHeight; y++ ) 1501 { 1502 ::memcpy(piTempBlockY, piRefY, sizeof(Pel)*uiWidth); 1503 piTempBlockY += uiWidth; 1504 piRefY += iRefStride; 1505 } 1506 } 1448 1507 #endif 1449 1508 … … 1498 1557 1499 1558 #if HIGH_ACCURACY_BI 1559 #if DEPTH_MAP_GENERATION 1500 1560 Void TComPrediction::xPredInterUni ( TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bPrdDepthMap, Bool bi ) 1501 1561 #else 1562 Void TComPrediction::xPredInterUni ( TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bi ) 1563 #endif 1564 #else 1565 #if DEPTH_MAP_GENERATION 1502 1566 Void TComPrediction::xPredInterUni ( TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bPrdDepthMap ) 1567 #else 1568 Void TComPrediction::xPredInterUni ( TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Int iPartIdx ) 1569 #endif 1503 1570 #endif 1504 1571 { … … 1507 1574 pcCU->clipMv(cMv); 1508 1575 1576 #if DEPTH_MAP_GENERATION 1509 1577 if( bPrdDepthMap ) 1510 1578 { … … 1517 1585 return; 1518 1586 } 1519 1520 #if MW_DEPTH_MAP_INTERP_FILTER 1587 #endif 1588 1589 #if HHI_FULL_PEL_DEPTH_MAP_MV_ACC 1521 1590 if( pcCU->getSlice()->getSPS()->isDepth() ) 1522 1591 { … … 1526 1595 UInt uiRShift = 0; 1527 1596 #endif 1528 xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, uiRShift, MW_DEPTH_MAP_INTERP_FILTER);1597 xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, uiRShift, 2 ); 1529 1598 } 1530 1599 else … … 1543 1612 xPredInterLumaBlk ( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred ); 1544 1613 #endif 1545 #if MW_DEPTH_MAP_INTERP_FILTER1614 #if HHI_FULL_PEL_DEPTH_MAP_MV_ACC 1546 1615 } 1547 1616 #endif … … 1581 1650 #if HIGH_ACCURACY_BI 1582 1651 if( pcCU->getCUMvField( REF_PIC_LIST_0 )->getRefIdx( uiPartAddr ) >= 0 && pcCU->getCUMvField( REF_PIC_LIST_1 )->getRefIdx( uiPartAddr ) >= 0 ) 1652 #if DEPTH_MAP_GENERATION 1583 1653 xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, true ); 1654 #else 1655 xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, true ); 1656 #endif 1584 1657 else 1585 xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap ); 1658 #if DEPTH_MAP_GENERATION 1659 xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap ); 1586 1660 #else 1661 xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx ); 1662 #endif 1663 #else 1664 #if DEPTH_MAP_GENERATION 1587 1665 xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap ); 1666 #else 1667 xPredInterUni ( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx ); 1668 #endif 1588 1669 #endif 1589 1670 } … … 1610 1691 Int iHor = ( uiFilterMode == 2 ? ( pcMv->getHor() + 2 ) & iFPelMask : pcMv->getHor() ); 1611 1692 Int iVer = ( uiFilterMode == 2 ? ( pcMv->getVer() + 2 ) & iFPelMask : pcMv->getVer() ); 1612 #if MW_DEPTH_MAP_INTERP_FILTER == 2 && MW_FULL_PEL_DEPTH_MAP_MV_SIGNALLING1693 #if HHI_FULL_PEL_DEPTH_MAP_MV_ACC 1613 1694 if( pcCU->getSlice()->getSPS()->isDepth() ) 1614 1695 { … … 2561 2642 #endif 2562 2643 2563 #if HHI_DMM_ INTRA2644 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX 2564 2645 TComWedgeDist::TComWedgeDist() 2565 2646 {
Note: See TracChangeset for help on using the changeset viewer.