Ignore:
Timestamp:
28 Jan 2013, 22:13:59 (11 years ago)
Author:
qualcomm
Message:

QC_C0047&51

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-5.1-dev2-Qualcomm/source/Lib/TLibCommon/TComDepthMapGenerator.cpp

    r189 r237  
    605605
    606606#if HHI_INTER_VIEW_MOTION_PRED
     607#if QC_AMVP_MRG_UNIFY_IVCAN_C0051
     608Bool
     609TComDepthMapGenerator::getPdmCandidate(TComDataCU* pcCU, UInt uiPartIdx, RefPicList eRefPicList, Int iRefIdx, Int* paiPdmRefIdx, TComMv* pacPdmMv, DisInfo* pDInfo, Int* iPdm, Bool bMerge )
     610{
     611  AOF  ( m_bCreated && m_bInit );
     612  TComSlice*    pcSlice     = pcCU->getSlice ();
     613  TComSPS*      pcSPS       = pcSlice->getSPS();
     614  AOF  ( pcSPS->getViewId() == m_uiCurrViewId );
     615
     616  TComPic*      pcRefPic    = pcSlice->getRefPic( eRefPicList, iRefIdx );
     617  UInt          uiRefViewId = pcRefPic->getSPS()->getViewId();
     618  Bool          bInterview  = ( uiRefViewId < m_uiCurrViewId );
     619  Bool          bPdmIView   = ( ( pcSPS->getMultiviewMvPredMode() & PDM_USE_FOR_IVIEW ) == PDM_USE_FOR_IVIEW );
     620  Bool          bPdmInter   = ( ( pcSPS->getMultiviewMvPredMode() & PDM_USE_FOR_INTER ) == PDM_USE_FOR_INTER );
     621  Bool          bPdmMerge   = ( ( pcSPS->getMultiviewMvPredMode() & PDM_USE_FOR_MERGE ) == PDM_USE_FOR_MERGE );
     622  if(!bMerge)
     623  {
     624    ROTRS( ( bInterview && !bMerge ) && !bPdmIView, false );
     625    ROTRS( (!bInterview && !bMerge ) && !bPdmInter, false );
     626    ROTRS(                  bMerge   && !bPdmMerge, false );
     627  }
     628  else
     629    ROTRS( !bPdmMerge, 0 );
     630
     631#if QC_MRG_CANS_B0048
     632  Bool abPdmAvailable[4] = {false, false, false, false};
     633#else
     634  Bool abPdmAvailable[2] = {false,false};
     635#endif
     636
     637  Int iValid = 0;
     638  Int iViewId = 0;
     639  for( UInt uiBId = 0; uiBId < m_uiCurrViewId && iValid==0; uiBId++ )
     640  {
     641    UInt        uiBaseId    = m_auiBaseIdList[ uiBId ];
     642    TComPic*    pcBasePic   = m_pcAUPicAccess->getPic( uiBaseId );
     643    for( Int iRefListId = 0; iRefListId < 2 && iValid==0; iRefListId++ )
     644    {
     645      RefPicList  eRefPicListTest = RefPicList( iRefListId );
     646      Int         iNumRefPics = pcSlice->getNumRefIdx( eRefPicListTest ) ;
     647      for( Int iRefIndex = 0; iRefIndex < iNumRefPics; iRefIndex++ )
     648      {
     649        if(pcBasePic->getPOC() == pcSlice->getRefPic( eRefPicListTest, iRefIndex )->getPOC()
     650          && pcBasePic->getViewId() == pcSlice->getRefPic( eRefPicListTest, iRefIndex )->getViewId())
     651        {
     652          iValid=1;
     653          iViewId = uiBaseId;
     654          break;
     655        }
     656      }
     657    }
     658  }
     659  if (iValid == 0)
     660    return false;
     661
     662  //--- get base CU/PU and check prediction mode ---
     663  TComPic*    pcBasePic   = m_pcAUPicAccess->getPic( iViewId );
     664  TComPicYuv* pcBaseRec   = pcBasePic->getPicYuvRec   ();
     665  if(bMerge || !bInterview)
     666  {
     667#if QC_MULTI_DIS_CAN_A0097
     668    Int  iCurrPosX, iCurrPosY;
     669    UInt          uiPartAddr;
     670    Int           iWidth;
     671    Int           iHeight;
     672
     673    pcCU->getPartIndexAndSize( uiPartIdx, uiPartAddr, iWidth, iHeight );
     674    pcBaseRec->getTopLeftSamplePos( pcCU->getAddr(), pcCU->getZorderIdxInCU() + uiPartAddr, iCurrPosX, iCurrPosY );
     675    iCurrPosX  += ( ( iWidth  - 1 ) >> 1 );
     676    iCurrPosY  += ( ( iHeight - 1 ) >> 1 );
     677
     678    Int         iBasePosX   = Clip3( 0, pcBaseRec->getWidth () - 1, iCurrPosX + ( (pDInfo->m_acMvCand[0].getHor() + 2 ) >> 2 ) );
     679    Int         iBasePosY   = Clip3( 0, pcBaseRec->getHeight() - 1, iCurrPosY + ( (pDInfo->m_acMvCand[0].getVer() + 2 ) >> 2 ));
     680    Int         iBaseCUAddr;
     681    Int         iBaseAbsPartIdx;
     682    pcBaseRec->getCUAddrAndPartIdx( iBasePosX , iBasePosY , iBaseCUAddr, iBaseAbsPartIdx );
     683#else
     684    Int  iPrdDepth, iCurrPosX, iCurrPosY;
     685    Bool bAvailable  = xGetPredDepth( pcCU, uiPartIdx, iPrdDepth, &iCurrPosX, &iCurrPosY );
     686    AOF( bAvailable );
     687    TComPicYuv* pcBasePdm   = pcBasePic->getPredDepthMap();
     688    Int         iDisparity  = xGetDisparityFromVirtDepth( iViewId, iPrdDepth );
     689    Int         iShiftX     = m_uiSubSampExpX + 2;
     690    Int         iAddX       = ( 1 << iShiftX ) >> 1;
     691    Int         iBasePosX   = Clip3( 0, pcBasePdm->getWidth () - 1, iCurrPosX + ( ( iDisparity + iAddX ) >> iShiftX ) );
     692    Int         iBasePosY   = Clip3( 0, pcBasePdm->getHeight() - 1, iCurrPosY                               );
     693    Int         iBaseCUAddr;
     694    Int         iBaseAbsPartIdx;
     695    pcBaseRec->getCUAddrAndPartIdx( iBasePosX<< m_uiSubSampExpX , iBasePosY<< m_uiSubSampExpY , iBaseCUAddr, iBaseAbsPartIdx );
     696#endif
     697    TComDataCU* pcBaseCU    = pcBasePic->getCU( iBaseCUAddr );
     698    if( pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) == MODE_INTER || pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) == MODE_SKIP )
     699    {
     700      for( UInt uiCurrRefListId = 0; uiCurrRefListId < 2; uiCurrRefListId++ )
     701      {
     702        RefPicList  eCurrRefPicList = RefPicList( uiCurrRefListId );
     703        if(!bMerge && eCurrRefPicList != eRefPicList)
     704          continue;
     705        Bool bLoop_stop = false;
     706        for(Int iLoop = 0; iLoop < 2 && !bLoop_stop; ++iLoop)
     707        {
     708          RefPicList eBaseRefPicList = (iLoop ==1)? RefPicList( 1 -  uiCurrRefListId ) : RefPicList( uiCurrRefListId );
     709          TComMvField cBaseMvField;
     710          pcBaseCU->getMvField( pcBaseCU, iBaseAbsPartIdx, eBaseRefPicList, cBaseMvField );
     711          Int         iBaseRefIdx     = cBaseMvField.getRefIdx();
     712          if (iBaseRefIdx >= 0)
     713          {
     714            Int iBaseRefPOC = pcBaseCU->getSlice()->getRefPOC(eBaseRefPicList, iBaseRefIdx);
     715            if (iBaseRefPOC != pcSlice->getPOC())   
     716            {
     717              for (Int iPdmRefIdx = (bMerge?0: iRefIdx); iPdmRefIdx < (bMerge? pcSlice->getNumRefIdx( eCurrRefPicList ): (iRefIdx+1)); iPdmRefIdx++)
     718              {
     719                if (iBaseRefPOC == pcSlice->getRefPOC(eCurrRefPicList, iPdmRefIdx))
     720                {
     721                  abPdmAvailable[ uiCurrRefListId ] = true;
     722                  TComMv cMv(cBaseMvField.getHor(), cBaseMvField.getVer());
     723#if LGE_DVMCP_A0126
     724                  if( bMerge )
     725                  {
     726                    cMv.m_bDvMcp = true;
     727                    cMv.m_iDvMcpDispX = pDInfo->m_acMvCand[0].getHor();
     728                  }
     729#endif
     730                  pcCU->clipMv( cMv );
     731                  if(bMerge)
     732                  {
     733                    paiPdmRefIdx  [ uiCurrRefListId ] = iPdmRefIdx;
     734                    pacPdmMv      [ uiCurrRefListId ] = cMv;
     735                    bLoop_stop = true;
     736                    break;
     737                  }else
     738                  {
     739                    pacPdmMv  [0] = cMv;
     740                    return true;
     741                  }
     742                }
     743              }
     744            }
     745          }
     746        }
     747      }
     748    }
     749    if( bMerge )
     750      iPdm[0] = ( abPdmAvailable[0] ? 1 : 0 ) + ( abPdmAvailable[1] ? 2 : 0 );
     751  }
     752  if(bMerge || bInterview)
     753  {
     754    for( Int iRefListId = 0; iRefListId < 2 ; iRefListId++ )
     755    {
     756      RefPicList  eRefPicListDMV       = RefPicList( iRefListId );
     757      Int         iNumRefPics       = pcSlice->getNumRefIdx( eRefPicListDMV );
     758      for( Int iPdmRefIdx = (bMerge ? 0: iRefIdx); iPdmRefIdx < (bMerge ? iNumRefPics: (iRefIdx+1) ); iPdmRefIdx++ )
     759      {
     760        if( pcSlice->getRefPOC( eRefPicListDMV, iPdmRefIdx ) == pcSlice->getPOC())
     761        {
     762#if QC_MRG_CANS_B0048
     763          abPdmAvailable[ iRefListId+2 ] = true;
     764          paiPdmRefIdx  [ iRefListId+2 ] = iPdmRefIdx;
     765#else
     766          abPdmAvailable[ iRefListId ] = true;
     767          paiPdmRefIdx  [ iRefListId ] = iPdmRefIdx;
     768#endif
     769#if QC_MULTI_DIS_CAN_A0097
     770          TComMv cMv = pDInfo->m_acMvCand[0];
     771          cMv.setVer(0);
     772#else
     773          TComMv cMv(iDisparity, 0);
     774#endif
     775          pcCU->clipMv( cMv );
     776#if QC_MRG_CANS_B0048
     777          pacPdmMv      [ iRefListId + 2] = cMv;
     778#else
     779          pacPdmMv      [ iRefListId ] = cMv;
     780#endif
     781          if(bMerge)
     782            break;
     783          else
     784          {
     785            pacPdmMv [0] = cMv;
     786            return true;
     787          }
     788        }
     789      }
     790    }
     791#if QC_MRG_CANS_B0048
     792    iPdm[1] = ( abPdmAvailable[2] ? 1 : 0 ) + ( abPdmAvailable[3] ? 2 : 0 );
     793#else
     794    iPdmInterDir = ( abPdmAvailable[0] ? 1 : 0 ) + ( abPdmAvailable[1] ? 2 : 0 ) ;
     795   }
     796#endif
     797  }
     798  return false;
     799}
     800#else
    607801#if QC_MULTI_DIS_CAN_A0097
    608802Int
     
    10141208  return false;
    10151209}
     1210#endif
    10161211#endif
    10171212
Note: See TracChangeset for help on using the changeset viewer.