Ticket #266: ZeroMvdEst_Fix.patch
File ZeroMvdEst_Fix.patch, 9.0 KB (added by Tammy, 11 years ago) |
---|
-
Lib/TLibCommon/TypeDef.h
193 193 194 194 #define FAST_UDI_MAX_RDMODE_NUM 35 ///< maximum number of RD comparison in fast-UDI estimation loop 195 195 196 #define ZERO_MVD_EST 0 ///< Zero Mvd Estimation in normal mode 196 #define ZERO_MVD_EST 0 ///< Zero Mvd Estimation in normal mode 197 #if ZERO_MVD_EST 198 #define ZERO_MVD_EST_FIX 1 199 #endif 197 200 198 201 #define NUM_INTRA_MODE 36 199 202 #define PLANAR_IDX 34 -
Lib/TLibEncoder/TEncSearch.cpp
2742 2742 uiZeroMvdBitsTemp += uiMbBits[2]; 2743 2743 uiZeroMvdBitsTemp += m_auiMVPIdxCost[iL0MVPIdx][aaiMvpNum[0][iL0RefIdxTemp]] + m_auiMVPIdxCost[iL1MVPIdx][aaiMvpNum[1][iL1RefIdxTemp]]; 2744 2744 uiZeroMvdBitsTemp += 4; //zero mvd for both directions 2745 #if ZERO_MVD_EST_FIX 2746 #if AMP 2747 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( aacAMVPInfo[0][iL0RefIdxTemp].m_acMvCand[iL0MVPIdx], ePartSize, uiPartAddr, 0, iPartIdx ); 2748 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( iL0RefIdxTemp, ePartSize, uiPartAddr, 0, iPartIdx ); 2749 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( aacAMVPInfo[1][iL1RefIdxTemp].m_acMvCand[iL1MVPIdx], ePartSize, uiPartAddr, 0, iPartIdx ); 2750 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( iL1RefIdxTemp, ePartSize, uiPartAddr, 0, iPartIdx ); 2751 #else 2752 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( aacAMVPInfo[0][iL0RefIdxTemp].m_acMvCand[iL0MVPIdx], ePartSize, uiPartAddr, 0 ); 2753 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( iL0RefIdxTemp, ePartSize, uiPartAddr, 0 ); 2754 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( aacAMVPInfo[1][iL1RefIdxTemp].m_acMvCand[iL1MVPIdx], ePartSize, uiPartAddr, 0 ); 2755 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( iL1RefIdxTemp, ePartSize, uiPartAddr, 0 ); 2756 #endif 2757 #else 2745 2758 pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( aacAMVPInfo[0][iL0RefIdxTemp].m_acMvCand[iL0MVPIdx], iL0RefIdxTemp, ePartSize, uiPartAddr, iPartIdx, 0 ); 2746 2759 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( aacAMVPInfo[1][iL1RefIdxTemp].m_acMvCand[iL1MVPIdx], iL1RefIdxTemp, ePartSize, uiPartAddr, iPartIdx, 0 ); 2747 2760 #endif 2748 2761 xGetInterPredictionError( pcCU, pcOrgYuv, iPartIdx, uiZeroMvdDistTemp, m_pcEncCfg->getUseHADME() ); 2749 2762 uiZeroMvdCostTemp = uiZeroMvdDistTemp + m_pcRdCost->getCost( uiZeroMvdBitsTemp ); 2750 2763 if (uiZeroMvdCostTemp < uiZeroMvdCost) … … 2800 2813 if (iZeroMvdDir == 3) 2801 2814 { 2802 2815 uiLastMode = 2; 2803 2816 #if ZERO_MVD_EST_FIX 2817 #if AMP 2818 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], ePartSize, uiPartAddr, 0, iPartIdx ); 2819 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, 0, iPartIdx ); 2820 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], ePartSize, uiPartAddr, 0, iPartIdx ); 2821 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, 0, iPartIdx ); 2822 #else 2823 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], ePartSize, uiPartAddr, 0 ); 2824 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, 0 ); 2825 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], ePartSize, uiPartAddr, 0 ); 2826 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, 0 ); 2827 #endif 2828 #else 2804 2829 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, iPartIdx, 0 ); 2805 2830 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, iPartIdx, 0 ); 2806 2831 #endif 2807 2832 pcCU->setInterDirSubParts( 3, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 2808 2833 2809 2834 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[0], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); … … 2815 2840 else if (iZeroMvdDir == 1) 2816 2841 { 2817 2842 uiLastMode = 0; 2818 2843 #if ZERO_MVD_EST_FIX 2844 #if AMP 2845 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], ePartSize, uiPartAddr, 0, iPartIdx ); 2846 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, 0, iPartIdx ); 2847 #else 2848 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], ePartSize, uiPartAddr, 0 ); 2849 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, 0 ); 2850 #endif 2851 #else 2819 2852 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, iPartIdx, 0 ); 2820 2853 #endif 2821 2854 pcCU->setInterDirSubParts( 1, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 2822 2855 2823 2856 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[0], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); … … 2827 2860 else if (iZeroMvdDir == 2) 2828 2861 { 2829 2862 uiLastMode = 1; 2830 2863 #if ZERO_MVD_EST_FIX 2864 #if AMP 2865 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], ePartSize, uiPartAddr, 0, iPartIdx ); 2866 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, 0, iPartIdx ); 2867 #else 2868 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], ePartSize, uiPartAddr, 0 ); 2869 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, 0 ); 2870 #endif 2871 #else 2831 2872 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, iPartIdx, 0 ); 2832 2873 #endif 2833 2874 pcCU->setInterDirSubParts( 2, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 2834 2875 2835 2876 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[1], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); … … 3330 3371 #if ZERO_MVD_EST 3331 3372 m_pcRdCost->getMotionCost( 1, 0 ); 3332 3373 DistParam cDistParam; 3374 #if ZERO_MVD_EST_FIX 3375 #if WEIGHT_PRED 3376 setDistParamComp(&cDistParam, 0); 3377 setWpScalingDistParam( &cDistParam, pcCU, -1, REF_PIC_LIST_X ); 3378 #endif 3379 #endif 3333 3380 m_pcRdCost->setDistParam( cDistParam, 3334 3381 pcOrgYuv->getLumaAddr(uiPartAddr), pcOrgYuv->getStride(), 3335 3382 pcTemplateCand->getLumaAddr(uiPartAddr), pcTemplateCand->getStride(), … … 5425 5472 m_cDistParam.wpCur = wp1; 5426 5473 } 5427 5474 } 5475 5476 #if ZERO_MVD_EST_FIX 5477 Void TEncSearch::setWpScalingDistParam( DistParam* pcDistParam, TComDataCU* pcCU, Int iRefIdx, RefPicList eRefPicListCur ) 5478 { 5479 if ( iRefIdx<0 ) 5480 { 5481 pcDistParam->bApplyWeight = false; 5482 return; 5483 } 5484 5485 TComSlice *pcSlice = pcCU->getSlice(); 5486 TComPPS *pps = pcCU->getSlice()->getPPS(); 5487 wpScalingParam *wp0 , *wp1; 5488 5489 pcDistParam->bApplyWeight = ( pcSlice->getSliceType()==P_SLICE && pps->getUseWP() ) || ( pcSlice->getSliceType()==B_SLICE && pps->getWPBiPredIdc() ) ; 5490 5491 if ( !pcDistParam->bApplyWeight ) return; 5492 5493 Int iRefIdx0 = ( eRefPicListCur == REF_PIC_LIST_0 ) ? iRefIdx : (-1); 5494 Int iRefIdx1 = ( eRefPicListCur == REF_PIC_LIST_1 ) ? iRefIdx : (-1); 5495 5496 getWpScaling( pcCU, iRefIdx0, iRefIdx1, wp0 , wp1 ); 5497 5498 if ( iRefIdx0 < 0 ) wp0 = NULL; 5499 if ( iRefIdx1 < 0 ) wp1 = NULL; 5500 5501 pcDistParam->wpCur = NULL; 5502 5503 if ( eRefPicListCur == REF_PIC_LIST_0 ) 5504 { 5505 pcDistParam->wpCur = wp0; 5506 } 5507 else 5508 { 5509 pcDistParam->wpCur = wp1; 5510 } 5511 } 5428 5512 #endif 5429 5513 5514 #endif 5515 5430 5516 //! \} -
Lib/TLibEncoder/TEncSearch.h
427 427 #if WEIGHT_PRED 428 428 Void setWpScalingDistParam( TComDataCU* pcCU, Int iRefIdx, RefPicList eRefPicListCur ); 429 429 inline Void setDistParamComp( UInt uiComp ) { m_cDistParam.uiComp = uiComp; } 430 #if ZERO_MVD_EST_FIX 431 Void setWpScalingDistParam( DistParam* pcDistParam, TComDataCU* pcCU, Int iRefIdx, RefPicList eRefPicListCur ); 432 inline Void setDistParamComp( DistParam* pcDistParam, UInt uiComp ) { pcDistParam->uiComp = uiComp; } 430 433 #endif 434 #endif 431 435 432 436 };// END CLASS DEFINITION TEncSearch 433 437