Changeset 20 in 3DVCSoftware for branches/0.2-HHI/source/Lib/TLibCommon/TComDepthMapGenerator.cpp
- Timestamp:
- 15 Feb 2012, 18:58:36 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/0.2-HHI/source/Lib/TLibCommon/TComDepthMapGenerator.cpp
r5 r20 57 57 m_uiMaxDepth = 0; 58 58 m_uiOrgDepthBitDepth = 0; 59 m_uiSubSampExpX = 0; 60 m_uiSubSampExpY = 0; 59 61 m_ppcYuv = 0; 60 62 m_ppcCU = 0; … … 68 70 69 71 Void 70 TComDepthMapGenerator::create( Bool bDecoder, UInt uiPicWidth, UInt uiPicHeight, UInt uiMaxCUDepth, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiOrgBitDepth )72 TComDepthMapGenerator::create( Bool bDecoder, UInt uiPicWidth, UInt uiPicHeight, UInt uiMaxCUDepth, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiOrgBitDepth, UInt uiSubSampExpX, UInt uiSubSampExpY ) 71 73 { 72 74 destroy(); … … 74 76 m_uiMaxDepth = uiMaxCUDepth; 75 77 m_uiOrgDepthBitDepth = uiOrgBitDepth; 78 m_uiSubSampExpX = uiSubSampExpX; 79 m_uiSubSampExpY = uiSubSampExpY; 76 80 m_ppcYuv = new TComYuv* [ m_uiMaxDepth ]; 77 81 m_ppcCU = new TComDataCU* [ m_uiMaxDepth ]; … … 82 86 UInt uiHeight = uiMaxCUHeight >> uiDepth; 83 87 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 ); 85 89 m_ppcCU [ uiDepth ] = new TComDataCU; m_ppcCU [ uiDepth ]->create( uiNumPart, uiWidth, uiHeight, true ); 86 90 } 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 ); 88 92 xSetChroma( &m_cTmpPic, ( 1 << uiOrgBitDepth ) >> 1 ); 89 93 m_bCreated = true; … … 106 110 m_uiMaxDepth = 0; 107 111 m_uiOrgDepthBitDepth = 0; 112 m_uiSubSampExpX = 0; 113 m_uiSubSampExpY = 0; 108 114 m_bDecoder = false; 109 115 } … … 372 378 if( pcBasePic->getPOC() == 0 ) 373 379 { 380 pcBasePic->removePrdDepthMapBuffer(); 381 pcBasePic->addPrdDepthMapBuffer( PDM_SUB_SAMP_EXP_X(m_pcSPSAccess->getPdm()), PDM_SUB_SAMP_EXP_Y(m_pcSPSAccess->getPdm()) ); 374 382 xClearDepthMap( pcBasePic ); 375 383 } … … 643 651 TComPicYuv* pcBaseRec = pcBasePic->getPicYuvRec (); 644 652 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 ) ); 646 656 Int iBasePosY = Clip3( 0, pcBasePdm->getHeight() - 1, iCurrPosY ); 647 657 Int iBaseCUAddr; 648 658 Int iBaseAbsPartIdx; 649 pcBaseRec->getCUAddrAndPartIdx( iBasePosX , iBasePosY, iBaseCUAddr, iBaseAbsPartIdx );659 pcBaseRec->getCUAddrAndPartIdx( iBasePosX << m_uiSubSampExpX, iBasePosY << m_uiSubSampExpY, iBaseCUAddr, iBaseAbsPartIdx ); 650 660 TComDataCU* pcBaseCU = pcBasePic->getCU( iBaseCUAddr ); 651 661 if( pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) != MODE_INTER && pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) != MODE_SKIP ) … … 744 754 Pel* pRefSamples = pcRefDepthMap->getLumaAddr( 0 ); 745 755 Int iRefViewIdx = pcRef->getViewIdx(); 756 Int iShiftX = m_uiSubSampExpX + 2; 757 Int iAddX = ( 1 << iShiftX ) >> 1; 746 758 for( Int iY = 0; iY < iHeight; iY++, pCurSamples += iCurStride, pRefSamples += iRefStride ) 747 759 { … … 750 762 Int iDepth = pCurSamples[ iXCur ]; 751 763 Int iDisp = xGetDisparityFromVirtDepth( iRefViewIdx, iDepth ); 752 Int iXRef = iXCur + ( ( iDisp + 2 ) >> 2);764 Int iXRef = iXCur + ( ( iDisp + iAddX ) >> iShiftX ); 753 765 if( iXRef >= 0 && iXRef < iWidth && iDepth > pRefSamples[ iXRef ] ) 754 766 { … … 784 796 Pel* pCurSamples = pcCurDepthMap->getLumaAddr( 0 ); 785 797 Int iRefViewIdx = pcRef->getViewIdx(); 798 Int iShiftX = m_uiSubSampExpX + 2; 799 Int iAddX = ( 1 << iShiftX ) >> 1; 786 800 for( Int iY = 0; iY < iHeight; iY++, pRefSamples += iRefStride, pCurSamples += iCurStride ) 787 801 { … … 790 804 Int iDepth = pRefSamples[ iXRef ]; 791 805 Int iDisp = xGetDisparityFromVirtDepth( iRefViewIdx, iDepth ); 792 Int iXCur = iXRef - ( ( iDisp + 2 ) >> 2);806 Int iXCur = iXRef - ( ( iDisp + iAddX ) >> iShiftX ); 793 807 if( iXCur >= 0 && iXCur < iWidth && iDepth > pCurSamples[ iXCur ] ) 794 808 { … … 1022 1036 if( uiTrMode == uiTrDepth ) 1023 1037 { 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 ); 1026 1040 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; 1028 1044 UInt uiLumaPredMode = pcCU->getLumaIntraDir ( uiAbsPartIdx ); 1029 1045 Bool bAboveAvail = false; … … 1034 1050 m_pcPrediction->getPredicBufWidth (), 1035 1051 m_pcPrediction->getPredicBufHeight (), 1036 bAboveAvail, bLeftAvail, true );1052 bAboveAvail, bLeftAvail, true, m_uiSubSampExpX, m_uiSubSampExpY ); 1037 1053 m_pcPrediction->predIntraDepthAng ( pcCU->getPattern(), uiLumaPredMode, pDepthMap, uiStride, uiWidth, uiHeight ); // could be replaced with directional intra prediction 1038 1054 // using "predIntraLumaAng", but note: … … 1106 1122 UInt uiAbsPartIdx; 1107 1123 pcCU->getPartIndexAndSize( uiPartIdx, uiAbsPartIdx, iWidth, iHeight ); 1124 iWidth >>= m_uiSubSampExpX; 1125 iHeight >>= m_uiSubSampExpY; 1108 1126 1109 1127 // get depth values … … 1125 1143 if( aiPrdDepth[ 0 ] != PDM_UNDEFINED_DEPTH && aiPrdDepth[ 1 ] != PDM_UNDEFINED_DEPTH ) 1126 1144 { 1127 iDepthValue = ( aiPrdDepth[ 0 ] + aiPrdDepth[ 1 ] + 1 ) >> 2;1145 iDepthValue = ( aiPrdDepth[ 0 ] + aiPrdDepth[ 1 ] + 1 ) >> 1; 1128 1146 } 1129 1147 else … … 1135 1153 1136 1154 // 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; 1138 1158 Int iStride = pcCUDepthMap->getStride (); 1139 1159 for( Int iY = 0; iY < iHeight; iY++, pDMSamples += iStride ) … … 1160 1180 Int iNum4x4BlksY = iHeight >> 2; 1161 1181 Int iNum4x4BlksX = iWidth >> 2; 1182 iWidth >>= m_uiSubSampExpX; 1183 iHeight >>= m_uiSubSampExpY; 1184 1162 1185 TComPicYuv* pcCurrDepthMap = pcCU->getPic()->getPredDepthMap(); 1163 1186 Pel* piCurrDepthMap = pcCurrDepthMap->getLumaAddr(); … … 1184 1207 Pel* piBaseDepthMap = pcBaseDepthMap->getLumaAddr(); 1185 1208 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; 1186 1213 1187 1214 //===== initialize 4x4 block arrays ===== … … 1202 1229 { 1203 1230 // 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 ); 1208 1235 Int iCurrPredDepth = piCurrDepthMap[ iCurrSamplePosY * iCurrStride + iCurrSamplePosX ]; 1209 1236 Int iCurrPredDisp = xGetDisparityFromVirtDepth( uiBaseId, iCurrPredDepth ); 1210 Int iBaseSamplePosX = iCurrSamplePosX + ( ( iCurrPredDisp + 2 ) >> 2);1237 Int iBaseSamplePosX = iCurrSamplePosX + ( ( iCurrPredDisp + iAddX ) >> iShiftX ); 1211 1238 Int iBaseSamplePosY = iCurrSamplePosY; 1212 1239 iBaseSamplePosX = Clip3( 0, pcBaseDepthMap->getWidth () - 1, iBaseSamplePosX ); … … 1222 1249 Int iBaseCUAddr; 1223 1250 Int iBaseAbsPartIdx; 1224 pcBaseRecPic->getCUAddrAndPartIdx( iBaseSamplePosX , iBaseSamplePosY, iBaseCUAddr, iBaseAbsPartIdx );1251 pcBaseRecPic->getCUAddrAndPartIdx( iBaseSamplePosX << m_uiSubSampExpX, iBaseSamplePosY << m_uiSubSampExpY, iBaseCUAddr, iBaseAbsPartIdx ); 1225 1252 TComDataCU* pcBaseCU = pcBasePic->getCU( iBaseCUAddr ); 1226 1253 if( pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) != MODE_INTER && pcBaseCU->getPredictionMode( iBaseAbsPartIdx ) != MODE_SKIP ) … … 1256 1283 Int iCurrRefStride = pcCurrRefDMap->getStride(); 1257 1284 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 ); 1260 1287 Int iCurrRefSamplePosXC = Clip3( 0, pcCurrRefDMap->getWidth () - 1, iCurrRefSamplePosX ); 1261 1288 Int iCurrRefSamplePosYC = Clip3( 0, pcCurrRefDMap->getHeight() - 1, iCurrRefSamplePosY ); … … 1271 1298 // location and depth for path currView/currAU -> currView/refAU -> baseView/refAU 1272 1299 Int iCurrRefDisp = xGetDisparityFromVirtDepth( uiBaseId, iCurrRefDepth ); 1273 Int iBaseRefSamplePosX = iCurrRefSamplePosX + ( ( iCurrRefDisp + 2 ) >> 2);1300 Int iBaseRefSamplePosX = iCurrRefSamplePosX + ( ( iCurrRefDisp + iAddX ) >> iShiftX ); 1274 1301 Int iBaseRefSamplePosY = iCurrRefSamplePosY; 1275 1302 TComPic* pcBaseRefPic = pcBaseCU->getSlice()->getRefPic( eBaseRefPicList, aiBaseRefIdx[ iBaseRefListId ] ); … … 1328 1355 for( Int i4x4BlkX = 0; i4x4BlkX < iNum4x4BlksX; i4x4BlkX++ ) 1329 1356 { 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 ); 1332 1359 m_aai4x4Depth[i4x4BlkY][i4x4BlkX] = piCurrDepthMap[ iCurrSamplePosY * iCurrStride + iCurrSamplePosX ]; 1333 1360 m_aabDepthSet[i4x4BlkY][i4x4BlkX] = true; … … 1389 1416 1390 1417 //===== 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; 1392 1421 Int iCUStride = pcCUDepthMap->getStride (); 1393 1422 for( Int iRow = 0; iRow < iHeight; iRow++, piDepthMap += iCUStride ) … … 1395 1424 for( Int iCol = 0; iCol < iWidth; iCol++ ) 1396 1425 { 1397 piDepthMap[ iCol ] = m_aai4x4Depth[ iRow >> 2 ][ iCol>> 2 ];1426 piDepthMap[ iCol ] = m_aai4x4Depth[ (iRow << m_uiSubSampExpY) >> 2 ][ (iCol << m_uiSubSampExpX) >> 2 ]; 1398 1427 } 1399 1428 } … … 1404 1433 TComDepthMapGenerator::xInterPUDepthMapPrediction( TComDataCU* pcCU, TComYuv* pcCUDepthMap, UInt uiPartIdx ) 1405 1434 { 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 ); 1407 1436 } 1408 1437 … … 1432 1461 Int iCurrPosY; 1433 1462 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; 1436 1465 riPrdDepth = piPredDepthMap[ iCurrPosX + iCurrPosY * iCurrStride ]; 1437 1466 if( piPosX )
Note: See TracChangeset for help on using the changeset viewer.