Changeset 189 in 3DVCSoftware for trunk/source/Lib/TLibDecoder/TDecCu.cpp


Ignore:
Timestamp:
18 Nov 2012, 22:11:37 (12 years ago)
Author:
tech
Message:

Reintegrated branch 4.1-dev0 Rev. 188.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TLibDecoder/TDecCu.cpp

    r100 r189  
    3838#include "TDecCu.h"
    3939
     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
     44
    4045//! \ingroup TLibDecoder
    4146//! \{
     
    389394      }
    390395    }
     396#if LGE_ILLUCOMP_B0045
     397    m_pcEntropyDecoder->decodeICFlag( pcCU, uiAbsPartIdx, uiDepth );
     398#endif
    391399#if HHI_MPI
    392400    }
     
    440448  m_pcEntropyDecoder->decodePredInfo( pcCU, uiAbsPartIdx, uiDepth, m_ppcCU[uiDepth]);
    441449 
     450#if LGE_ILLUCOMP_B0045
     451  m_pcEntropyDecoder->decodeICFlag( pcCU, uiAbsPartIdx, uiDepth );
     452#endif
     453
    442454#if HHI_INTER_VIEW_RESIDUAL_PRED
    443455  if( !pcCU->isIntra( uiAbsPartIdx ) )
     
    601613      break;
    602614    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
    603620      xReconIntraQT( m_ppcCU[uiDepth], uiAbsPartIdx, uiDepth );
    604621      break;
     
    620637{
    621638#if HHI_MPI
     639#if FIX_MPI_B0065
     640  if( pcCU->getTextureModeDepth( 0 ) != -1 )
     641  {
     642    TComDataCU *pcTextureCU = pcCU->getSlice()->getTexturePic()->getCU( pcCU->getAddr() );
     643    if( uiDepth == pcTextureCU->getDepth(uiAbsPartIdx))
     644    {
     645      PartSize partSize = pcTextureCU->getPartitionSize(uiAbsPartIdx);
     646      pcCU->setPartSizeSubParts( partSize, 0, uiDepth );
     647    }
     648    else
     649    {
     650      pcCU->setPartSizeSubParts( SIZE_NxN, 0, uiDepth );
     651    }
     652  }
     653#else
    622654  if( pcCU->getTextureModeDepth( 0 ) != -1 )
    623655    pcCU->setPartSizeSubParts( SIZE_NxN, 0, uiDepth );
     656#endif
    624657#endif
    625658 
     
    705738                                     m_pcPrediction->getPredicBufHeight (),
    706739                                     bAboveAvail, bLeftAvail );
    707 #if LGE_EDGE_INTRA
     740#if LGE_EDGE_INTRA_A0070
    708741  if( uiLumaPredMode >= EDGE_INTRA_IDX )
    709742  {
     
    944977
    945978}
     979
     980#if RWTH_SDC_DLT_B0036
     981Void TDecCu::xReconIntraSDC( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     982{
     983  UInt uiWidth        = pcCU->getWidth  ( 0 );
     984  UInt uiHeight       = pcCU->getHeight ( 0 );
     985 
     986  TComYuv* pcRecoYuv  = m_ppcYuvReco[uiDepth];
     987  TComYuv* pcPredYuv  = m_ppcYuvReco[uiDepth];
     988  TComYuv* pcResiYuv  = m_ppcYuvResi[uiDepth];
     989 
     990  UInt    uiStride    = pcRecoYuv->getStride  ();
     991  Pel*    piReco      = pcRecoYuv->getLumaAddr( uiAbsPartIdx );
     992  Pel*    piPred      = pcPredYuv->getLumaAddr( uiAbsPartIdx );
     993  Pel*    piResi      = pcResiYuv->getLumaAddr( uiAbsPartIdx );
     994 
     995  UInt    uiZOrder          = pcCU->getZorderIdxInCU() + uiAbsPartIdx;
     996  Pel*    piRecIPred        = pcCU->getPic()->getPicYuvRec()->getLumaAddr( pcCU->getAddr(), uiZOrder );
     997  UInt    uiRecIPredStride  = pcCU->getPic()->getPicYuvRec()->getStride  ();
     998 
     999  UInt    uiLumaPredMode    = pcCU->getLumaIntraDir     ( uiAbsPartIdx );
     1000 
     1001  AOF( uiWidth == uiHeight );
     1002  AOF( uiAbsPartIdx == 0 );
     1003  AOF( pcCU->getSDCAvailable(uiAbsPartIdx) );
     1004  AOF( pcCU->getSDCFlag(uiAbsPartIdx) );
     1005 
     1006  //===== init availability pattern =====
     1007  Bool  bAboveAvail = false;
     1008  Bool  bLeftAvail  = false;
     1009  pcCU->getPattern()->initPattern   ( pcCU, 0, uiAbsPartIdx );
     1010  pcCU->getPattern()->initAdiPattern( pcCU, uiAbsPartIdx, 0, m_pcPrediction->getPredicBuf(), m_pcPrediction->getPredicBufWidth(), m_pcPrediction->getPredicBufHeight(), bAboveAvail, bLeftAvail );
     1011 
     1012  //===== get prediction signal =====
     1013#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     1014  if( uiLumaPredMode >= NUM_INTRA_MODE )
     1015  {
     1016    m_pcPrediction->predIntraLumaDMM( pcCU, uiAbsPartIdx, uiLumaPredMode, piPred, uiStride, uiWidth, uiHeight, bAboveAvail, bLeftAvail, false );
     1017  }
     1018  else
     1019  {
     1020#endif
     1021    m_pcPrediction->predIntraLumaAng( pcCU->getPattern(), uiLumaPredMode, piPred, uiStride, uiWidth, uiHeight, pcCU, bAboveAvail, bLeftAvail );
     1022#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     1023  }
     1024#endif
     1025 
     1026  // number of segments depends on prediction mode
     1027  UInt uiNumSegments = 1; 
     1028  Bool* pbMask = NULL;
     1029  UInt uiMaskStride = 0;
     1030 
     1031  if( uiLumaPredMode == DMM_WEDGE_FULL_IDX || uiLumaPredMode == DMM_WEDGE_PREDDIR_IDX )
     1032  {
     1033    Int uiTabIdx = (uiLumaPredMode == DMM_WEDGE_FULL_IDX)?pcCU->getWedgeFullTabIdx(uiAbsPartIdx):pcCU->getWedgePredDirTabIdx(uiAbsPartIdx);
     1034   
     1035    WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiWidth])];
     1036    TComWedgelet* pcWedgelet = &(pacWedgeList->at( uiTabIdx ));
     1037   
     1038    uiNumSegments = 2;
     1039    pbMask = pcWedgelet->getPattern();
     1040    uiMaskStride = pcWedgelet->getStride();
     1041  }
     1042 
     1043  // get DC prediction for each segment
     1044  Pel apDCPredValues[2];
     1045  xAnalyzeSegmentsSDC(piPred, uiStride, uiWidth, apDCPredValues, uiNumSegments, pbMask, uiMaskStride);
     1046 
     1047  // reconstruct residual based on mask + DC residuals
     1048  Pel apDCResiValues[2];
     1049  Pel apDCRecoValues[2];
     1050  for( UInt ui = 0; ui < uiNumSegments; ui++ )
     1051  {
     1052    Pel   pPredIdx    = GetDepthValue2Idx( apDCPredValues[ui] );
     1053    Pel   pResiIdx    = pcCU->getSDCSegmentDCOffset(ui, uiAbsPartIdx);
     1054    Pel   pRecoValue  = GetIdx2DepthValue( pPredIdx + pResiIdx );
     1055   
     1056    apDCRecoValues[ui]  = pRecoValue;
     1057    apDCResiValues[ui]  = pRecoValue - apDCPredValues[ui];
     1058  }
     1059 
     1060  //===== reconstruction =====
     1061  Bool*pMask      = pbMask;
     1062  Pel* pPred      = piPred;
     1063  Pel* pResi      = piResi;
     1064  Pel* pReco      = piReco;
     1065  Pel* pRecIPred  = piRecIPred;
     1066 
     1067  for( UInt uiY = 0; uiY < uiHeight; uiY++ )
     1068  {
     1069    for( UInt uiX = 0; uiX < uiWidth; uiX++ )
     1070    {
     1071      UChar ucSegment = pMask?(UChar)pMask[uiX]:0;
     1072      assert( ucSegment < uiNumSegments );
     1073     
     1074      Pel pPredVal= apDCPredValues[ucSegment];
     1075      Pel pResiDC = apDCResiValues[ucSegment];
     1076     
     1077      pReco    [ uiX ] = Clip( pPredVal + pResiDC );
     1078      pRecIPred[ uiX ] = pReco[ uiX ];
     1079    }
     1080    pPred     += uiStride;
     1081    pResi     += uiStride;
     1082    pReco     += uiStride;
     1083    pRecIPred += uiRecIPredStride;
     1084    pMask     += uiMaskStride;
     1085  }
     1086 
     1087  // clear UV
     1088  UInt  uiStrideC     = pcPredYuv->getCStride();
     1089  Pel   *pRecCb       = pcPredYuv->getCbAddr();
     1090  Pel   *pRecCr       = pcPredYuv->getCrAddr();
     1091 
     1092  for (Int y=0; y<uiHeight/2; y++)
     1093  {
     1094    for (Int x=0; x<uiWidth/2; x++)
     1095    {
     1096      pRecCb[x] = (Pel)(128<<g_uiBitIncrement);
     1097      pRecCr[x] = (Pel)(128<<g_uiBitIncrement);
     1098    }
     1099   
     1100    pRecCb += uiStrideC;
     1101    pRecCr += uiStrideC;
     1102  }
     1103}
     1104#endif
    9461105
    9471106/** Function for deriving recontructed PU/CU Luma sample with QTree structure
     
    12091368#endif
    12101369
     1370#if RWTH_SDC_DLT_B0036
     1371Void TDecCu::xAnalyzeSegmentsSDC( Pel* pOrig, UInt uiStride, UInt uiSize, Pel* rpSegMeans, UInt uiNumSegments, Bool* pMask, UInt uiMaskStride )
     1372{
     1373  Int iSumDepth[2];
     1374  memset(iSumDepth, 0, sizeof(Int)*2);
     1375  Int iSumPix[2];
     1376  memset(iSumPix, 0, sizeof(Int)*2);
     1377 
     1378  for (Int y=0; y<uiSize; y++)
     1379  {
     1380    for (Int x=0; x<uiSize; x++)
     1381    {
     1382      UChar ucSegment = pMask?(UChar)pMask[x]:0;
     1383      assert( ucSegment < uiNumSegments );
     1384     
     1385      iSumDepth[ucSegment] += pOrig[x];
     1386      iSumPix[ucSegment]   += 1;
     1387    }
     1388   
     1389    pOrig  += uiStride;
     1390    pMask  += uiMaskStride;
     1391  }
     1392 
     1393  // compute mean for each segment
     1394  for( UChar ucSeg = 0; ucSeg < uiNumSegments; ucSeg++ )
     1395  {
     1396    if( iSumPix[ucSeg] > 0 )
     1397      rpSegMeans[ucSeg] = iSumDepth[ucSeg] / iSumPix[ucSeg];
     1398    else
     1399      rpSegMeans[ucSeg] = 0;  // this happens for zero-segments
     1400  }
     1401}
     1402#endif
     1403
    12111404//! \}
Note: See TracChangeset for help on using the changeset viewer.