Ignore:
Timestamp:
15 Feb 2012, 18:58:36 (12 years ago)
Author:
hschwarz
Message:

HHI+Sony modifications

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/0.2-HHI/source/Lib/TLibCommon/TComDepthMapGenerator.cpp

    r5 r20  
    5757  m_uiMaxDepth          = 0;
    5858  m_uiOrgDepthBitDepth  = 0;
     59  m_uiSubSampExpX       = 0;
     60  m_uiSubSampExpY       = 0;
    5961  m_ppcYuv              = 0;
    6062  m_ppcCU               = 0;
     
    6870
    6971Void
    70 TComDepthMapGenerator::create( Bool bDecoder, UInt uiPicWidth, UInt uiPicHeight, UInt uiMaxCUDepth, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiOrgBitDepth )
     72TComDepthMapGenerator::create( Bool bDecoder, UInt uiPicWidth, UInt uiPicHeight, UInt uiMaxCUDepth, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiOrgBitDepth, UInt uiSubSampExpX, UInt uiSubSampExpY )
    7173{
    7274  destroy();
     
    7476  m_uiMaxDepth          = uiMaxCUDepth;
    7577  m_uiOrgDepthBitDepth  = uiOrgBitDepth;
     78  m_uiSubSampExpX       = uiSubSampExpX;
     79  m_uiSubSampExpY       = uiSubSampExpY;
    7680  m_ppcYuv              = new TComYuv*    [ m_uiMaxDepth ];
    7781  m_ppcCU               = new TComDataCU* [ m_uiMaxDepth ];
     
    8286    UInt  uiHeight  = uiMaxCUHeight >> uiDepth;
    8387
    84     m_ppcYuv[ uiDepth ] = new TComYuv;    m_ppcYuv[ uiDepth ]->create(            uiWidth, uiHeight      );
     88    m_ppcYuv[ uiDepth ] = new TComYuv;    m_ppcYuv[ uiDepth ]->create( uiWidth >> m_uiSubSampExpX, uiHeight >> m_uiSubSampExpY );
    8589    m_ppcCU [ uiDepth ] = new TComDataCU; m_ppcCU [ uiDepth ]->create( uiNumPart, uiWidth, uiHeight, true );
    8690  }
    87   m_cTmpPic.create( uiPicWidth, uiPicHeight, uiMaxCUWidth, uiMaxCUHeight, uiMaxCUDepth );
     91  m_cTmpPic.create( uiPicWidth >> m_uiSubSampExpX, uiPicHeight >> m_uiSubSampExpY, uiMaxCUWidth >> m_uiSubSampExpX, uiMaxCUHeight >> m_uiSubSampExpY, uiMaxCUDepth );
    8892  xSetChroma( &m_cTmpPic, ( 1 << uiOrgBitDepth ) >> 1 );
    8993  m_bCreated    = true;
     
    106110    m_uiMaxDepth          = 0;
    107111    m_uiOrgDepthBitDepth  = 0;
     112    m_uiSubSampExpX       = 0;
     113    m_uiSubSampExpY       = 0;
    108114    m_bDecoder            = false;
    109115  }
     
    372378      if( pcBasePic->getPOC() == 0 )
    373379      {
     380        pcBasePic->removePrdDepthMapBuffer();
     381        pcBasePic->addPrdDepthMapBuffer( PDM_SUB_SAMP_EXP_X(m_pcSPSAccess->getPdm()), PDM_SUB_SAMP_EXP_Y(m_pcSPSAccess->getPdm()) );
    374382        xClearDepthMap( pcBasePic );
    375383      }
     
    643651    TComPicYuv* pcBaseRec   = pcBasePic->getPicYuvRec   ();
    644652    Int         iDisparity  = xGetDisparityFromVirtDepth( uiBaseId, iPrdDepth );
    645     Int         iBasePosX   = Clip3( 0, pcBasePdm->getWidth () - 1, iCurrPosX + ( ( iDisparity + 2 ) >> 2 ) );
     653    Int         iShiftX     = m_uiSubSampExpX + 2;
     654    Int         iAddX       = ( 1 << iShiftX ) >> 1;
     655    Int         iBasePosX   = Clip3( 0, pcBasePdm->getWidth () - 1, iCurrPosX + ( ( iDisparity + iAddX ) >> iShiftX ) );
    646656    Int         iBasePosY   = Clip3( 0, pcBasePdm->getHeight() - 1, iCurrPosY                               );
    647657    Int         iBaseCUAddr;
    648658    Int         iBaseAbsPartIdx;
    649     pcBaseRec->getCUAddrAndPartIdx( iBasePosX, iBasePosY, iBaseCUAddr, iBaseAbsPartIdx );
     659    pcBaseRec->getCUAddrAndPartIdx( iBasePosX << m_uiSubSampExpX, iBasePosY << m_uiSubSampExpY, iBaseCUAddr, iBaseAbsPartIdx );
    650660    TComDataCU* pcBaseCU    = pcBasePic->getCU( iBaseCUAddr );
    651661    if( pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) != MODE_INTER && pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) != MODE_SKIP )
     
    744754  Pel*        pRefSamples   =  pcRefDepthMap->getLumaAddr( 0 );
    745755  Int         iRefViewIdx   =  pcRef->getViewIdx();
     756  Int         iShiftX       = m_uiSubSampExpX + 2;
     757  Int         iAddX         = ( 1 << iShiftX ) >> 1;
    746758  for( Int iY = 0; iY < iHeight; iY++, pCurSamples += iCurStride, pRefSamples += iRefStride )
    747759  {
     
    750762      Int iDepth = pCurSamples[ iXCur ];
    751763      Int iDisp  = xGetDisparityFromVirtDepth( iRefViewIdx, iDepth );
    752       Int iXRef  = iXCur + ( ( iDisp + 2 ) >> 2 );
     764      Int iXRef  = iXCur + ( ( iDisp + iAddX ) >> iShiftX );
    753765      if( iXRef >= 0 && iXRef < iWidth && iDepth > pRefSamples[ iXRef ] )
    754766      {
     
    784796  Pel*        pCurSamples   =  pcCurDepthMap->getLumaAddr( 0 );
    785797  Int         iRefViewIdx   =  pcRef->getViewIdx();
     798  Int         iShiftX       = m_uiSubSampExpX + 2;
     799  Int         iAddX         = ( 1 << iShiftX ) >> 1;
    786800  for( Int iY = 0; iY < iHeight; iY++, pRefSamples += iRefStride, pCurSamples += iCurStride )
    787801  {
     
    790804      Int iDepth = pRefSamples[ iXRef ];
    791805      Int iDisp  = xGetDisparityFromVirtDepth( iRefViewIdx, iDepth );
    792       Int iXCur  = iXRef - ( ( iDisp + 2 ) >> 2 );
     806      Int iXCur  = iXRef - ( ( iDisp + iAddX ) >> iShiftX );
    793807      if( iXCur >= 0 && iXCur < iWidth && iDepth > pCurSamples[ iXCur ] )
    794808      {
     
    10221036  if( uiTrMode == uiTrDepth )
    10231037  {
    1024     UInt  uiWidth         = pcCU->getWidth ( 0 ) >> uiTrDepth;
    1025     UInt  uiHeight        = pcCU->getHeight( 0 ) >> uiTrDepth;
     1038    UInt  uiWidth         = pcCU->getWidth ( 0 ) >> ( uiTrDepth + m_uiSubSampExpX );
     1039    UInt  uiHeight        = pcCU->getHeight( 0 ) >> ( uiTrDepth + m_uiSubSampExpY );
    10261040    UInt  uiStride        = pcCUDepthMap->getStride  ();
    1027     Pel*  pDepthMap       = pcCUDepthMap->getLumaAddr( uiAbsPartIdx );
     1041    UInt  uiBlkX          = g_auiRasterToPelX[ g_auiZscanToRaster[ uiAbsPartIdx ] ] >> m_uiSubSampExpX;
     1042    UInt  uiBlkY          = g_auiRasterToPelY[ g_auiZscanToRaster[ uiAbsPartIdx ] ] >> m_uiSubSampExpY;
     1043    Pel*  pDepthMap       = pcCUDepthMap->getLumaAddr() + uiBlkY * pcCUDepthMap->getStride() + uiBlkX;
    10281044    UInt  uiLumaPredMode  = pcCU->getLumaIntraDir    ( uiAbsPartIdx );
    10291045    Bool  bAboveAvail     = false;
     
    10341050                                        m_pcPrediction->getPredicBufWidth  (),
    10351051                                        m_pcPrediction->getPredicBufHeight (),
    1036                                         bAboveAvail, bLeftAvail, true );
     1052                                        bAboveAvail, bLeftAvail, true, m_uiSubSampExpX, m_uiSubSampExpY );
    10371053    m_pcPrediction->predIntraDepthAng ( pcCU->getPattern(), uiLumaPredMode, pDepthMap, uiStride, uiWidth, uiHeight ); // could be replaced with directional intra prediction
    10381054                                                                                                                      // using "predIntraLumaAng", but note:
     
    11061122  UInt  uiAbsPartIdx;
    11071123  pcCU->getPartIndexAndSize( uiPartIdx, uiAbsPartIdx, iWidth, iHeight );
     1124  iWidth  >>= m_uiSubSampExpX;
     1125  iHeight >>= m_uiSubSampExpY;
    11081126
    11091127  // get depth values
     
    11251143  if( aiPrdDepth[ 0 ] != PDM_UNDEFINED_DEPTH && aiPrdDepth[ 1 ] != PDM_UNDEFINED_DEPTH )
    11261144  {
    1127     iDepthValue = ( aiPrdDepth[ 0 ] + aiPrdDepth[ 1 ] + 1 ) >> 2;
     1145    iDepthValue = ( aiPrdDepth[ 0 ] + aiPrdDepth[ 1 ] + 1 ) >> 1;
    11281146  }
    11291147  else
     
    11351153
    11361154  // set depth map for PU
    1137   Pel*  pDMSamples  = pcCUDepthMap->getLumaAddr( uiAbsPartIdx );
     1155  UInt  uiBlkX      = g_auiRasterToPelX[ g_auiZscanToRaster[ uiAbsPartIdx ] ] >> m_uiSubSampExpX;
     1156  UInt  uiBlkY      = g_auiRasterToPelY[ g_auiZscanToRaster[ uiAbsPartIdx ] ] >> m_uiSubSampExpY;
     1157  Pel*  pDMSamples  = pcCUDepthMap->getLumaAddr() + uiBlkY * pcCUDepthMap->getStride() + uiBlkX;
    11381158  Int   iStride     = pcCUDepthMap->getStride  ();
    11391159  for( Int iY = 0; iY < iHeight; iY++, pDMSamples += iStride )
     
    11601180  Int             iNum4x4BlksY      = iHeight >> 2;
    11611181  Int             iNum4x4BlksX      = iWidth  >> 2;
     1182  iWidth  >>= m_uiSubSampExpX;
     1183  iHeight >>= m_uiSubSampExpY;
     1184
    11621185  TComPicYuv*     pcCurrDepthMap    = pcCU->getPic()->getPredDepthMap();
    11631186  Pel*            piCurrDepthMap    = pcCurrDepthMap->getLumaAddr();
     
    11841207  Pel*            piBaseDepthMap    = pcBaseDepthMap->getLumaAddr();
    11851208  Int             iBaseStride       = pcBaseDepthMap->getStride();
     1209  Int             iShiftX           = m_uiSubSampExpX + 2;
     1210  Int             iShiftY           = m_uiSubSampExpY + 2;
     1211  Int             iAddX             = ( 1 << iShiftX ) >> 1;
     1212  Int             iAddY             = ( 1 << iShiftY ) >> 1;
    11861213
    11871214  //===== initialize 4x4 block arrays =====
     
    12021229    {
    12031230      // position parameters
    1204       Int               iCurrBlkPosX        = iCurrPUPosX + ( i4x4BlkX << 2 );
    1205       Int               iCurrBlkPosY        = iCurrPUPosY + ( i4x4BlkY << 2 );
    1206       Int               iCurrSamplePosX     = iCurrBlkPosX + 1;
    1207       Int               iCurrSamplePosY     = iCurrBlkPosY + 1;
     1231      Int               iCurrBlkPosX        = iCurrPUPosX + ( ( i4x4BlkX << 2 ) >> m_uiSubSampExpX );
     1232      Int               iCurrBlkPosY        = iCurrPUPosY + ( ( i4x4BlkY << 2 ) >> m_uiSubSampExpY );
     1233      Int               iCurrSamplePosX     = iCurrBlkPosX + ( 1 >> m_uiSubSampExpX );
     1234      Int               iCurrSamplePosY     = iCurrBlkPosY + ( 1 >> m_uiSubSampExpY );
    12081235      Int               iCurrPredDepth      = piCurrDepthMap[ iCurrSamplePosY * iCurrStride + iCurrSamplePosX ];
    12091236      Int               iCurrPredDisp       = xGetDisparityFromVirtDepth( uiBaseId, iCurrPredDepth );
    1210       Int               iBaseSamplePosX     = iCurrSamplePosX + ( ( iCurrPredDisp + 2 ) >> 2 );
     1237      Int               iBaseSamplePosX     = iCurrSamplePosX + ( ( iCurrPredDisp + iAddX ) >> iShiftX );
    12111238      Int               iBaseSamplePosY     = iCurrSamplePosY;
    12121239      iBaseSamplePosX                       = Clip3( 0, pcBaseDepthMap->getWidth () - 1, iBaseSamplePosX );
     
    12221249      Int               iBaseCUAddr;
    12231250      Int               iBaseAbsPartIdx;
    1224       pcBaseRecPic->getCUAddrAndPartIdx( iBaseSamplePosX, iBaseSamplePosY, iBaseCUAddr, iBaseAbsPartIdx );
     1251      pcBaseRecPic->getCUAddrAndPartIdx( iBaseSamplePosX << m_uiSubSampExpX, iBaseSamplePosY << m_uiSubSampExpY, iBaseCUAddr, iBaseAbsPartIdx );
    12251252      TComDataCU*       pcBaseCU            = pcBasePic->getCU( iBaseCUAddr );
    12261253      if( pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) != MODE_INTER && pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) != MODE_SKIP )
     
    12561283        Int             iCurrRefStride      = pcCurrRefDMap->getStride();
    12571284        TComMv&         rcCurrMv            = aiCurrMvField[ iCurrRefListId ]->getMv( uiAbsPartIdx );
    1258         Int             iCurrRefSamplePosX  = iCurrSamplePosX + ( ( rcCurrMv.getHor() + 2 ) >> 2 );
    1259         Int             iCurrRefSamplePosY  = iCurrSamplePosY + ( ( rcCurrMv.getVer() + 2 ) >> 2 );
     1285        Int             iCurrRefSamplePosX  = iCurrSamplePosX + ( ( rcCurrMv.getHor() + iAddX ) >> iShiftX );
     1286        Int             iCurrRefSamplePosY  = iCurrSamplePosY + ( ( rcCurrMv.getVer() + iAddY ) >> iShiftY );
    12601287        Int             iCurrRefSamplePosXC = Clip3( 0, pcCurrRefDMap->getWidth () - 1, iCurrRefSamplePosX );
    12611288        Int             iCurrRefSamplePosYC = Clip3( 0, pcCurrRefDMap->getHeight() - 1, iCurrRefSamplePosY );
     
    12711298            // location and depth for path currView/currAU -> currView/refAU -> baseView/refAU
    12721299            Int         iCurrRefDisp        = xGetDisparityFromVirtDepth( uiBaseId, iCurrRefDepth );
    1273             Int         iBaseRefSamplePosX  = iCurrRefSamplePosX + ( ( iCurrRefDisp + 2 ) >> 2 );
     1300            Int         iBaseRefSamplePosX  = iCurrRefSamplePosX + ( ( iCurrRefDisp + iAddX ) >> iShiftX );
    12741301            Int         iBaseRefSamplePosY  = iCurrRefSamplePosY;
    12751302            TComPic*    pcBaseRefPic        = pcBaseCU->getSlice()->getRefPic( eBaseRefPicList, aiBaseRefIdx[ iBaseRefListId ] );
     
    13281355      for( Int i4x4BlkX = 0; i4x4BlkX < iNum4x4BlksX; i4x4BlkX++ )
    13291356      {
    1330         Int             iCurrSamplePosX     = iCurrPUPosX + ( i4x4BlkX << 2 ) + 1;
    1331         Int             iCurrSamplePosY     = iCurrPUPosY + ( i4x4BlkY << 2 ) + 1;
     1357        Int             iCurrSamplePosX     = iCurrPUPosX + ( ( ( i4x4BlkX << 2 ) + 1 ) >> m_uiSubSampExpX );
     1358        Int             iCurrSamplePosY     = iCurrPUPosY + ( ( ( i4x4BlkY << 2 ) + 1 ) >> m_uiSubSampExpY );
    13321359        m_aai4x4Depth[i4x4BlkY][i4x4BlkX]   = piCurrDepthMap[ iCurrSamplePosY * iCurrStride + iCurrSamplePosX ];
    13331360        m_aabDepthSet[i4x4BlkY][i4x4BlkX]   = true;
     
    13891416
    13901417  //===== set depth values =====
    1391   Pel* piDepthMap = pcCUDepthMap->getLumaAddr( uiAbsPartIdx );
     1418  UInt uiBlkX     = g_auiRasterToPelX[ g_auiZscanToRaster[ uiAbsPartIdx ] ] >> m_uiSubSampExpX;
     1419  UInt uiBlkY     = g_auiRasterToPelY[ g_auiZscanToRaster[ uiAbsPartIdx ] ] >> m_uiSubSampExpY;
     1420  Pel* piDepthMap = pcCUDepthMap->getLumaAddr() + uiBlkY * pcCUDepthMap->getStride() + uiBlkX;
    13921421  Int  iCUStride  = pcCUDepthMap->getStride  ();
    13931422  for( Int iRow = 0; iRow < iHeight; iRow++, piDepthMap += iCUStride )
     
    13951424    for( Int iCol = 0; iCol < iWidth; iCol++ )
    13961425    {
    1397       piDepthMap[ iCol ] = m_aai4x4Depth[ iRow >> 2 ][ iCol >> 2 ];
     1426      piDepthMap[ iCol ] = m_aai4x4Depth[ (iRow << m_uiSubSampExpY) >> 2  ][ (iCol << m_uiSubSampExpX) >> 2 ];
    13981427    }
    13991428  }
     
    14041433TComDepthMapGenerator::xInterPUDepthMapPrediction( TComDataCU* pcCU, TComYuv* pcCUDepthMap, UInt uiPartIdx )
    14051434{
    1406   m_pcPrediction->motionCompensation( pcCU, pcCUDepthMap, REF_PIC_LIST_X, (Int)uiPartIdx, true ); 
     1435  m_pcPrediction->motionCompensation( pcCU, pcCUDepthMap, REF_PIC_LIST_X, (Int)uiPartIdx, true, m_uiSubSampExpX, m_uiSubSampExpY ); 
    14071436}
    14081437
     
    14321461  Int           iCurrPosY;
    14331462  pcPredDepthMap->getTopLeftSamplePos( pcCU->getAddr(), pcCU->getZorderIdxInCU() + uiPartAddr, iCurrPosX, iCurrPosY );
    1434   iCurrPosX  += ( iWidth - 1 ) >> 1;
    1435   iCurrPosY  += ( iHeight - 1 ) >> 1;
     1463  iCurrPosX  += ( ( iWidth  >> m_uiSubSampExpX ) - 1 ) >> 1;
     1464  iCurrPosY  += ( ( iHeight >> m_uiSubSampExpY ) - 1 ) >> 1;
    14361465  riPrdDepth  = piPredDepthMap[ iCurrPosX + iCurrPosY * iCurrStride ];
    14371466  if( piPosX )
Note: See TracChangeset for help on using the changeset viewer.