Changeset 177 in 3DVCSoftware for branches/HTM-4.1-dev2-RWTH/source/Lib/TLibDecoder/TDecCu.cpp
- Timestamp:
- 10 Nov 2012, 19:05:41 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-4.1-dev2-RWTH/source/Lib/TLibDecoder/TDecCu.cpp
r156 r177 37 37 38 38 #include "TDecCu.h" 39 40 #if RWTH_SDC_DLT_B0036 41 #define GetDepthValue2Idx(val) (pcCU->getSlice()->getSPS()->depthValue2idx(val)) 42 #define GetIdx2DepthValue(val) (pcCU->getSlice()->getSPS()->idx2DepthValue(val)) 43 #endif 39 44 40 45 //! \ingroup TLibDecoder … … 608 613 break; 609 614 case MODE_INTRA: 615 #if RWTH_SDC_DLT_B0036 616 if( m_ppcCU[uiDepth]->getSDCFlag(0) ) 617 xReconIntraSDC( m_ppcCU[uiDepth], 0, uiDepth ); 618 else 619 #endif 610 620 xReconIntraQT( m_ppcCU[uiDepth], uiAbsPartIdx, uiDepth ); 611 621 break; … … 951 961 952 962 } 963 964 #if RWTH_SDC_DLT_B0036 965 Void TDecCu::xReconIntraSDC( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) 966 { 967 UInt uiWidth = pcCU->getWidth ( 0 ); 968 UInt uiHeight = pcCU->getHeight ( 0 ); 969 970 TComYuv* pcRecoYuv = m_ppcYuvReco[uiDepth]; 971 TComYuv* pcPredYuv = m_ppcYuvReco[uiDepth]; 972 TComYuv* pcResiYuv = m_ppcYuvResi[uiDepth]; 973 974 UInt uiStride = pcRecoYuv->getStride (); 975 Pel* piReco = pcRecoYuv->getLumaAddr( uiAbsPartIdx ); 976 Pel* piPred = pcPredYuv->getLumaAddr( uiAbsPartIdx ); 977 Pel* piResi = pcResiYuv->getLumaAddr( uiAbsPartIdx ); 978 979 UInt uiZOrder = pcCU->getZorderIdxInCU() + uiAbsPartIdx; 980 Pel* piRecIPred = pcCU->getPic()->getPicYuvRec()->getLumaAddr( pcCU->getAddr(), uiZOrder ); 981 UInt uiRecIPredStride = pcCU->getPic()->getPicYuvRec()->getStride (); 982 983 UInt uiLumaPredMode = pcCU->getLumaIntraDir ( uiAbsPartIdx ); 984 985 AOF( uiWidth == uiHeight ); 986 AOF( uiAbsPartIdx == 0 ); 987 AOF( pcCU->getSDCAvailable(uiAbsPartIdx) ); 988 AOF( pcCU->getSDCFlag(uiAbsPartIdx) ); 989 990 //===== init availability pattern ===== 991 Bool bAboveAvail = false; 992 Bool bLeftAvail = false; 993 pcCU->getPattern()->initPattern ( pcCU, 0, uiAbsPartIdx ); 994 pcCU->getPattern()->initAdiPattern( pcCU, uiAbsPartIdx, 0, m_pcPrediction->getPredicBuf(), m_pcPrediction->getPredicBufWidth(), m_pcPrediction->getPredicBufHeight(), bAboveAvail, bLeftAvail ); 995 996 //===== get prediction signal ===== 997 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX 998 if( uiLumaPredMode >= NUM_INTRA_MODE ) 999 { 1000 m_pcPrediction->predIntraLumaDMM( pcCU, uiAbsPartIdx, uiLumaPredMode, piPred, uiStride, uiWidth, uiHeight, bAboveAvail, bLeftAvail, false ); 1001 } 1002 else 1003 { 1004 #endif 1005 m_pcPrediction->predIntraLumaAng( pcCU->getPattern(), uiLumaPredMode, piPred, uiStride, uiWidth, uiHeight, pcCU, bAboveAvail, bLeftAvail ); 1006 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX 1007 } 1008 #endif 1009 1010 // number of segments depends on prediction mode 1011 UInt uiNumSegments = 1; 1012 Bool* pbMask = NULL; 1013 UInt uiMaskStride = 0; 1014 1015 //if( uiLumaPredMode == DMM_WEDGE_FULL_IDX || uiLumaPredMode == DMM_WEDGE_PREDDIR_IDX ) 1016 if( 0 ) 1017 { 1018 Int uiTabIdx = (uiLumaPredMode == DMM_WEDGE_FULL_IDX)?pcCU->getWedgeFullTabIdx(uiAbsPartIdx):pcCU->getWedgePredDirTabIdx(uiAbsPartIdx); 1019 1020 WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiWidth])]; 1021 TComWedgelet* pcWedgelet = &(pacWedgeList->at( uiTabIdx )); 1022 1023 uiNumSegments = 2; 1024 pbMask = pcWedgelet->getPattern(); 1025 uiMaskStride = pcWedgelet->getStride(); 1026 } 1027 1028 // get DC prediction for each segment 1029 Pel apDCPredValues[2]; 1030 xAnalyzeSegmentsSDC(piPred, uiStride, uiWidth, apDCPredValues, uiNumSegments, pbMask, uiMaskStride); 1031 1032 // reconstruct residual based on mask + DC residuals 1033 Pel apDCResiValues[2]; 1034 Pel apDCRecoValues[2]; 1035 for( UInt ui = 0; ui < uiNumSegments; ui++ ) 1036 { 1037 Pel pPredIdx = GetDepthValue2Idx( apDCPredValues[ui] ); 1038 Pel pResiIdx = pcCU->getSDCSegmentDCOffset(ui, uiAbsPartIdx); 1039 Pel pRecoValue = GetIdx2DepthValue( pPredIdx + pResiIdx ); 1040 1041 apDCRecoValues[ui] = pRecoValue; 1042 apDCResiValues[ui] = pRecoValue - apDCPredValues[ui]; 1043 } 1044 1045 //===== reconstruction ===== 1046 Bool*pMask = pbMask; 1047 Pel* pPred = piPred; 1048 Pel* pResi = piResi; 1049 Pel* pReco = piReco; 1050 Pel* pRecIPred = piRecIPred; 1051 1052 for( UInt uiY = 0; uiY < uiHeight; uiY++ ) 1053 { 1054 for( UInt uiX = 0; uiX < uiWidth; uiX++ ) 1055 { 1056 UChar ucSegment = pMask?(UChar)pMask[uiX]:0; 1057 assert( ucSegment < uiNumSegments ); 1058 1059 Pel pPredVal= apDCPredValues[ucSegment]; 1060 Pel pResiDC = apDCResiValues[ucSegment]; 1061 1062 pReco [ uiX ] = Clip( pPredVal + pResiDC ); 1063 pRecIPred[ uiX ] = pReco[ uiX ]; 1064 } 1065 pPred += uiStride; 1066 pResi += uiStride; 1067 pReco += uiStride; 1068 pRecIPred += uiRecIPredStride; 1069 pMask += uiMaskStride; 1070 } 1071 1072 // clear UV 1073 UInt uiStrideC = pcPredYuv->getCStride(); 1074 Pel *pRecCb = pcPredYuv->getCbAddr(); 1075 Pel *pRecCr = pcPredYuv->getCrAddr(); 1076 1077 for (Int y=0; y<uiHeight/2; y++) 1078 { 1079 for (Int x=0; x<uiWidth/2; x++) 1080 { 1081 pRecCb[x] = (Pel)(128<<g_uiBitIncrement); 1082 pRecCr[x] = (Pel)(128<<g_uiBitIncrement); 1083 } 1084 1085 pRecCb += uiStrideC; 1086 pRecCr += uiStrideC; 1087 } 1088 } 1089 #endif 953 1090 954 1091 /** Function for deriving recontructed PU/CU Luma sample with QTree structure … … 1216 1353 #endif 1217 1354 1355 #if RWTH_SDC_DLT_B0036 1356 Void TDecCu::xAnalyzeSegmentsSDC( Pel* pOrig, UInt uiStride, UInt uiSize, Pel* rpSegMeans, UInt uiNumSegments, Bool* pMask, UInt uiMaskStride ) 1357 { 1358 Int iSumDepth[uiNumSegments]; 1359 memset(iSumDepth, 0, sizeof(Int)*uiNumSegments); 1360 Int iSumPix[uiNumSegments]; 1361 memset(iSumPix, 0, sizeof(Int)*uiNumSegments); 1362 1363 for (Int y=0; y<uiSize; y++) 1364 { 1365 for (Int x=0; x<uiSize; x++) 1366 { 1367 UChar ucSegment = pMask?(UChar)pMask[x]:0; 1368 assert( ucSegment < uiNumSegments ); 1369 1370 iSumDepth[ucSegment] += pOrig[x]; 1371 iSumPix[ucSegment] += 1; 1372 } 1373 1374 pOrig += uiStride; 1375 pMask += uiMaskStride; 1376 } 1377 1378 // compute mean for each segment 1379 for( UChar ucSeg = 0; ucSeg < uiNumSegments; ucSeg++ ) 1380 { 1381 if( iSumPix[ucSeg] > 0 ) 1382 rpSegMeans[ucSeg] = iSumDepth[ucSeg] / iSumPix[ucSeg]; 1383 else 1384 rpSegMeans[ucSeg] = 0; // this happens for zero-segments 1385 } 1386 } 1387 #endif 1388 1218 1389 //! \}
Note: See TracChangeset for help on using the changeset viewer.