Ignore:
Timestamp:
10 Nov 2012, 19:05:41 (12 years ago)
Author:
rwth
Message:
  • added RWTH_B0036 (SDC+DLT)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-4.1-dev2-RWTH/source/Lib/TLibDecoder/TDecCu.cpp

    r156 r177  
    3737
    3838#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
    3944
    4045//! \ingroup TLibDecoder
     
    608613      break;
    609614    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
    610620      xReconIntraQT( m_ppcCU[uiDepth], uiAbsPartIdx, uiDepth );
    611621      break;
     
    951961
    952962}
     963
     964#if RWTH_SDC_DLT_B0036
     965Void 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
    9531090
    9541091/** Function for deriving recontructed PU/CU Luma sample with QTree structure
     
    12161353#endif
    12171354
     1355#if RWTH_SDC_DLT_B0036
     1356Void 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
    12181389//! \}
Note: See TracChangeset for help on using the changeset viewer.