Ticket #266: ZeroMvdEst_Fix.patch

File ZeroMvdEst_Fix.patch, 9.0 KB (added by Tammy, 12 years ago)
  • Lib/TLibCommon/TypeDef.h

     
    193193
    194194#define FAST_UDI_MAX_RDMODE_NUM               35          ///< maximum number of RD comparison in fast-UDI estimation loop
    195195
    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
    197200
    198201#define NUM_INTRA_MODE 36
    199202#define PLANAR_IDX     34
  • Lib/TLibEncoder/TEncSearch.cpp

     
    27422742            uiZeroMvdBitsTemp += uiMbBits[2];
    27432743            uiZeroMvdBitsTemp += m_auiMVPIdxCost[iL0MVPIdx][aaiMvpNum[0][iL0RefIdxTemp]] + m_auiMVPIdxCost[iL1MVPIdx][aaiMvpNum[1][iL1RefIdxTemp]];
    27442744            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
    27452758            pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( aacAMVPInfo[0][iL0RefIdxTemp].m_acMvCand[iL0MVPIdx], iL0RefIdxTemp, ePartSize, uiPartAddr, iPartIdx, 0 );
    27462759            pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( aacAMVPInfo[1][iL1RefIdxTemp].m_acMvCand[iL1MVPIdx], iL1RefIdxTemp, ePartSize, uiPartAddr, iPartIdx, 0 );
    2747  
     2760#endif
    27482761            xGetInterPredictionError( pcCU, pcOrgYuv, iPartIdx, uiZeroMvdDistTemp, m_pcEncCfg->getUseHADME() );
    27492762            uiZeroMvdCostTemp = uiZeroMvdDistTemp + m_pcRdCost->getCost( uiZeroMvdBitsTemp );
    27502763            if (uiZeroMvdCostTemp < uiZeroMvdCost)
     
    28002813      if (iZeroMvdDir == 3)
    28012814      {
    28022815        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
    28042829        pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, iPartIdx, 0 );
    28052830        pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, iPartIdx, 0 );
    2806  
     2831#endif 
    28072832        pcCU->setInterDirSubParts( 3, uiPartAddr, iPartIdx, pcCU->getDepth(0) );
    28082833       
    28092834        pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[0], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     
    28152840      else if (iZeroMvdDir == 1)
    28162841      {       
    28172842        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
    28192852        pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, iPartIdx, 0 );
    2820 
     2853#endif
    28212854        pcCU->setInterDirSubParts( 1, uiPartAddr, iPartIdx, pcCU->getDepth(0) );
    28222855       
    28232856        pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[0], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     
    28272860      else if (iZeroMvdDir == 2)
    28282861      {
    28292862        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
    28312872        pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, iPartIdx, 0 );
    2832 
     2873#endif
    28332874        pcCU->setInterDirSubParts( 2, uiPartAddr, iPartIdx, pcCU->getDepth(0) );
    28342875       
    28352876        pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[1], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     
    33303371#if ZERO_MVD_EST
    33313372  m_pcRdCost->getMotionCost( 1, 0 );
    33323373  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
    33333380  m_pcRdCost->setDistParam( cDistParam,
    33343381                            pcOrgYuv->getLumaAddr(uiPartAddr), pcOrgYuv->getStride(),
    33353382                            pcTemplateCand->getLumaAddr(uiPartAddr), pcTemplateCand->getStride(),
     
    54255472    m_cDistParam.wpCur = wp1;
    54265473  }
    54275474}
     5475
     5476#if ZERO_MVD_EST_FIX
     5477Void  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}
    54285512#endif
    54295513
     5514#endif
     5515
    54305516//! \}
  • Lib/TLibEncoder/TEncSearch.h

     
    427427#if WEIGHT_PRED
    428428  Void  setWpScalingDistParam( TComDataCU* pcCU, Int iRefIdx, RefPicList eRefPicListCur );
    429429  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; }
    430433#endif
     434#endif
    431435 
    432436};// END CLASS DEFINITION TEncSearch
    433437