Changeset 443 in 3DVCSoftware for trunk/source/Lib/TLibDecoder/TDecSbac.cpp


Ignore:
Timestamp:
26 May 2013, 15:41:34 (11 years ago)
Author:
tech
Message:
  • Reintegrated branch 6.2-dev0 rev. 442.
  • Changed version number.
  • Added coding results.
File:
1 edited

Legend:

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

    r332 r443  
    3838#include "TDecSbac.h"
    3939
    40 #if RWTH_SDC_DLT_B0036
    41 #define GetNumDepthValues()     (pcCU->getSlice()->getSPS()->getNumDepthValues())
    42 #define GetBitsPerDepthValue()  (pcCU->getSlice()->getSPS()->getBitsPerDepthValue())
    43 #endif
    44 
    4540//! \ingroup TLibDecoder
    4641//! \{
     
    6459#if H3D_IVRP
    6560, m_cResPredFlagSCModel       ( 1,             1,               NUM_RES_PRED_FLAG_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
     61#endif
     62#if QC_ARP_D0177
     63, m_cCUPUARPW                 ( 1,             1,               NUM_ARPW_CTX                 , m_contextModels + m_numContextModels, m_numContextModels)
    6664#endif
    6765, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     
    8886, m_cALFSvlcSCModel           ( 1,             1,               NUM_ALF_SVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    8987, m_cCUAMPSCModel             ( 1,             1,               NUM_CU_AMP_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
     88#if LGE_SAO_MIGRATION_D0091
     89, m_cSaoMergeSCModel          ( 1,             1,               NUM_SAO_MERGE_FLAG_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
     90, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
     91#else
    9092, m_cSaoFlagSCModel           ( 1,             1,               NUM_SAO_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    9193, m_cSaoUvlcSCModel           ( 1,             1,               NUM_SAO_UVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     
    9496, m_cSaoMergeUpSCModel        ( 1,             1,               NUM_SAO_MERGE_UP_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
    9597, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
     98#endif
    9699#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     100#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    97101, m_cDmmFlagSCModel           ( 1,             1,               NUM_DMM_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    98102, m_cDmmModeSCModel           ( 1,             1,               NUM_DMM_MODE_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     103#endif
    99104, m_cDmmDataSCModel           ( 1,             1,               NUM_DMM_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    100105#endif
     
    106111#endif
    107112#if RWTH_SDC_DLT_B0036
     113#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    108114, m_cSDCFlagSCModel             ( 1,             1,                 SDC_NUM_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
     115#else
     116, m_cDepthModeModel             ( 1,             1,                 DEPTH_MODE_NUM_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
     117, m_cDmmDeltaFlagModel             ( 1,             1,                 DMM_DELTA_NUM_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
     118#endif
     119#if RWTH_SDC_CTX_SIMPL_D0032
     120, m_cSDCResidualFlagSCModel     ( 1,             1,  SDC_NUM_RESIDUAL_FLAG_CTX  , m_contextModels + m_numContextModels, m_numContextModels)
     121, m_cSDCResidualSCModel         ( 1,             1,  SDC_NUM_RESIDUAL_CTX       , m_contextModels + m_numContextModels, m_numContextModels)
     122, m_cSDCPredModeSCModel             ( 1,             3,                 SDC_NUM_PRED_MODE_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
     123#else
    109124, m_cSDCResidualFlagSCModel     ( 1,             2,  SDC_NUM_RESIDUAL_FLAG_CTX  , m_contextModels + m_numContextModels, m_numContextModels)
    110125, m_cSDCResidualSignFlagSCModel ( 1,             2,  SDC_NUM_SIGN_FLAG_CTX      , m_contextModels + m_numContextModels, m_numContextModels)
    111126, m_cSDCResidualSCModel         ( 1,             2,  SDC_NUM_RESIDUAL_CTX       , m_contextModels + m_numContextModels, m_numContextModels)
    112127, m_cSDCPredModeSCModel             ( 1,             3,                 SDC_NUM_PRED_MODE_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
     128#endif
    113129#endif
    114130{
     
    161177#if H3D_IVRP
    162178  m_cResPredFlagSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_RES_PRED_FLAG );
     179#endif
     180#if QC_ARP_D0177
     181  m_cCUPUARPW.initBuffer                ( sliceType, qp, (UChar*)INIT_ARPW );
    163182#endif
    164183  m_cCUAlfCtrlFlagSCModel.initBuffer     ( sliceType, qp, (UChar*)INIT_ALF_CTRL_FLAG );
     
    184203  m_cALFUvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_UVLC );
    185204  m_cALFSvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_SVLC );
     205#if LGE_SAO_MIGRATION_D0091
     206  m_cSaoMergeSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG );
     207  m_cSaoTypeIdxSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
     208#else
    186209  m_cSaoFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_FLAG );
    187210  m_cSaoUvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_UVLC );
     
    190213  m_cSaoMergeUpSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
    191214  m_cSaoTypeIdxSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
     215#endif
    192216
    193217  m_cCUTransSubdivFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
     
    200224  m_uiLastDQpNonZero  = 0;
    201225#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     226#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    202227  m_cDmmFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMM_FLAG );
    203228  m_cDmmModeSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMM_MODE );
     229#endif
    204230  m_cDmmDataSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMM_DATA );
    205231#endif
    206232#if RWTH_SDC_DLT_B0036
     233#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    207234  m_cSDCFlagSCModel.initBuffer              ( sliceType, qp, (UChar*)INIT_SDC_FLAG );
     235#else
     236  m_cDepthModeModel.initBuffer              ( sliceType, qp, (UChar*)INIT_DEPTHMODE_FLAG );
     237  m_cDmmDeltaFlagModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMMDELTA_FLAG );
     238#endif
    208239  m_cSDCResidualFlagSCModel.initBuffer      ( sliceType, qp, (UChar*)INIT_SDC_RESIDUAL_FLAG );
    209240  m_cSDCResidualSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_SDC_RESIDUAL );
     241#if !RWTH_SDC_CTX_SIMPL_D0032
    210242  m_cSDCResidualSignFlagSCModel.initBuffer  ( sliceType, qp, (UChar*)INIT_SDC_SIGN_FLAG );
     243#endif
    211244  m_cSDCPredModeSCModel.initBuffer              ( sliceType, qp, (UChar*)INIT_SDC_PRED_MODE );
    212245#endif
     
    248281#if H3D_IVRP
    249282  m_cResPredFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_RES_PRED_FLAG );
     283#endif
     284#if QC_ARP_D0177
     285  m_cCUPUARPW.initBuffer                 ( eSliceType, iQp, (UChar*)INIT_ARPW );
    250286#endif
    251287  m_cCUAlfCtrlFlagSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_ALF_CTRL_FLAG );
     
    271307  m_cALFUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_UVLC );
    272308  m_cALFSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_SVLC );
     309#if LGE_SAO_MIGRATION_D0091
     310  m_cSaoMergeSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
     311  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
     312#else
    273313  m_cSaoFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_FLAG );
    274314  m_cSaoUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_UVLC );
     
    277317  m_cSaoMergeUpSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
    278318  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
     319#endif
    279320  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
    280321#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     322#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    281323  m_cDmmFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_FLAG );
    282324  m_cDmmModeSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_MODE );
     325#endif
    283326  m_cDmmDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_DATA );
    284327#endif
    285328#if RWTH_SDC_DLT_B0036
     329#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    286330  m_cSDCFlagSCModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_SDC_FLAG );
     331#else
     332  m_cDepthModeModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_DEPTHMODE_FLAG );
     333  m_cDmmDeltaFlagModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMMDELTA_FLAG );
     334#endif
    287335  m_cSDCResidualFlagSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL_FLAG );
    288336  m_cSDCResidualSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL );
     337#if !RWTH_SDC_CTX_SIMPL_D0032
    289338  m_cSDCResidualSignFlagSCModel.initBuffer  ( eSliceType, iQp, (UChar*)INIT_SDC_SIGN_FLAG );
     339#endif
    290340  m_cSDCPredModeSCModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_SDC_PRED_MODE );
    291341#endif
     
    869919  pcCU->setPredModeSubParts( (PredMode)iPredMode, uiAbsPartIdx, uiDepth );
    870920}
    871  
     921#if PKU_QC_DEPTH_INTRA_UNI_D0195
     922Void TDecSbac::parseDepthIntraMode  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     923{
     924  UInt uiPuIdx = ( pcCU->getWidth(uiAbsPartIdx) == 64 )? 2 : ( ( pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && pcCU->getWidth(uiAbsPartIdx) == 8 )? 0 : 1);
     925  UInt uiDir = 0;
     926  Bool bSDCFlag = 0;
     927  UInt uiSymbol = 1;
     928  UInt uiCode = 0 ;
     929  UInt uiBinNum = 0;
     930  UInt uiCtxDepthMode = 0;
     931  if ( uiPuIdx ==2 )
     932  {
     933    while(uiBinNum<2 && uiSymbol)
     934    {
     935      uiCtxDepthMode = uiPuIdx*3 + uiBinNum;
     936      m_pcTDecBinIf->decodeBin(uiSymbol,m_cDepthModeModel.get(0,0,uiCtxDepthMode));
     937      uiCode = (uiCode<<1)+uiSymbol;
     938      uiBinNum++;
     939    }
     940    if (uiCode == 0)      { uiDir = PLANAR_IDX; bSDCFlag = 1;}
     941    else if (uiCode == 2) { uiDir = 0;          bSDCFlag = 0;}
     942    else if (uiCode == 3) { uiDir = DC_IDX;     bSDCFlag = 1;}
     943  }
     944  else if ( uiPuIdx ==0 )
     945  {
     946    while(uiBinNum<3 && uiSymbol)
     947    {
     948      uiCtxDepthMode = uiPuIdx*3 + ( uiBinNum >= 2? 2 : uiBinNum );
     949      m_pcTDecBinIf->decodeBin(uiSymbol,m_cDepthModeModel.get(0,0,uiCtxDepthMode));
     950      uiCode = (uiCode<<1)+uiSymbol;
     951      uiBinNum++;
     952    }
     953    if (uiCode == 0)      { uiDir = 0;                     bSDCFlag = 0;}
     954    else if (uiCode == 2) { uiDir = DMM_WEDGE_FULL_IDX;    bSDCFlag = 0;}
     955    else if (uiCode == 6) { uiDir = DMM_WEDGE_PREDTEX_IDX; bSDCFlag = 0;}
     956    else if (uiCode == 7) { uiDir = EDGE_INTRA_IDX;        bSDCFlag = 0;}
     957  }
     958  else
     959  {
     960    uiCtxDepthMode = uiPuIdx*3 ;
     961    m_pcTDecBinIf->decodeBin(uiSymbol,m_cDepthModeModel.get(0,0,uiCtxDepthMode));
     962    uiCode = (uiCode<<1)+uiSymbol;
     963    if (!uiSymbol)
     964    {
     965      uiCtxDepthMode = uiPuIdx*3 + 1;
     966      m_pcTDecBinIf->decodeBin(uiSymbol,m_cDepthModeModel.get(0,0,uiCtxDepthMode));
     967      uiCode = (uiCode<<1)+uiSymbol;
     968      if (uiSymbol)
     969      {
     970        uiCtxDepthMode = uiPuIdx*3 + 2;
     971        m_pcTDecBinIf->decodeBin(uiSymbol,m_cDepthModeModel.get(0,0,uiCtxDepthMode));
     972        uiCode = (uiCode<<1)+uiSymbol;
     973      }
     974    }
     975    else
     976    {
     977      uiCtxDepthMode = uiPuIdx*3 + 1;
     978      m_pcTDecBinIf->decodeBin(uiSymbol,m_cDepthModeModel.get(0,0,uiCtxDepthMode));
     979      uiCode = (uiCode<<1)+uiSymbol;
     980      if (!uiSymbol)
     981      {
     982        uiCtxDepthMode = uiPuIdx*3 + 2;
     983        m_pcTDecBinIf->decodeBin(uiSymbol,m_cDepthModeModel.get(0,0,uiCtxDepthMode));
     984        uiCode = (uiCode<<1)+uiSymbol;
     985      }
     986      else
     987      {
     988        uiBinNum = 0;
     989        while( uiSymbol && uiBinNum<3 )
     990        {
     991          uiCtxDepthMode = uiPuIdx*3 + 2;
     992          m_pcTDecBinIf->decodeBin(uiSymbol,m_cDepthModeModel.get(0,0,uiCtxDepthMode));
     993          uiCode = (uiCode<<1)+uiSymbol;
     994          uiBinNum++;
     995        }
     996      }
     997    }
     998    if (uiCode == 0)       { uiDir = PLANAR_IDX;              bSDCFlag = 1;}
     999    else if (uiCode == 2)  { uiDir = 5;                       bSDCFlag = 0;}
     1000    else if (uiCode == 3)  { uiDir = DMM_WEDGE_FULL_IDX;      bSDCFlag = 1;}
     1001    else if (uiCode == 4)  { uiDir = DMM_WEDGE_FULL_IDX;      bSDCFlag = 0;}
     1002    else if (uiCode == 5)  { uiDir = DMM_CONTOUR_PREDTEX_IDX; bSDCFlag = 0;}
     1003    else if (uiCode == 6)  { uiDir = DMM_WEDGE_PREDTEX_IDX;   bSDCFlag = 0;}
     1004    else if (uiCode == 14) { uiDir = DC_IDX;                  bSDCFlag = 1;}
     1005    else if (uiCode == 31) { uiDir = DMM_WEDGE_PREDDIR_IDX;   bSDCFlag = 0;}
     1006    else if (uiCode == 30) { uiDir = EDGE_INTRA_IDX;          bSDCFlag = 0;}
     1007  }
     1008  pcCU->setLumaIntraDirSubParts( (UChar)uiDir, uiAbsPartIdx, uiDepth );
     1009  pcCU->setSDCFlagSubParts(bSDCFlag, uiAbsPartIdx, 0, uiDepth);
     1010}
     1011Void TDecSbac::parseDepthModelingTable  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     1012{
     1013  parseDepthIntraMode(pcCU,uiAbsPartIdx,uiDepth);
     1014 
     1015  UInt uiDir = pcCU->getLumaIntraDir(uiAbsPartIdx);
     1016  Bool bSdcFlag =  pcCU->getSDCAvailable(uiAbsPartIdx) && pcCU->getSDCFlag(uiAbsPartIdx);
     1017  Bool bDmmFlag = (uiDir >= NUM_INTRA_MODE && uiDir < EDGE_INTRA_IDX &&(!bSdcFlag))? 1:0;
     1018  if (uiDir >= NUM_INTRA_MODE && uiDir < EDGE_INTRA_IDX)//DMM modes and SDC DMM1
     1019  {
     1020    if( uiDir == DMM_WEDGE_FULL_IDX )          { xParseWedgeFullInfo          ( pcCU, uiAbsPartIdx, uiDepth ); }
     1021    else if( uiDir == DMM_WEDGE_PREDTEX_IDX )  { xParseWedgePredTexInfo       ( pcCU, uiAbsPartIdx, uiDepth ); }
     1022    else if( uiDir == DMM_WEDGE_PREDDIR_IDX )  { xParseWedgePredDirInfo       ( pcCU, uiAbsPartIdx, uiDepth ); }
     1023  }
     1024  else if(uiDir >= EDGE_INTRA_IDX)//CCM mode
     1025  {
     1026    xParseEdgeIntraInfo( pcCU, uiAbsPartIdx, uiDepth );
     1027  }
     1028 
     1029  UInt uiSymbol;
     1030  if (bDmmFlag)
     1031  {
     1032    if (bDmmFlag)
     1033    {
     1034      m_pcTDecBinIf->decodeBin( uiSymbol , m_cDmmDeltaFlagModel.get(0, 0, 0) );
     1035      uiDir += uiSymbol;
     1036    }
     1037    if (uiSymbol)
     1038    {
     1039      UInt uiDC;
     1040      Int iDC = 0,iDC1 = 0,iDC2 = 0;
     1041      for ( Int i = 0; i  <2; i++ )
     1042      {
     1043        xReadExGolombLevel( uiDC, m_cDmmDataSCModel.get(0, 0, 1) );
     1044        iDC = uiDC;
     1045        if ( uiDC )
     1046        {
     1047          UInt uiSign;
     1048          m_pcTDecBinIf->decodeBinEP( uiSign );
     1049          if ( uiSign )
     1050          {
     1051            iDC = -iDC;
     1052          }
     1053        }
     1054        if ( i == 0 ) { iDC1 = iDC; }
     1055        else          { iDC2 = iDC; }
     1056      }
     1057
     1058      if( uiDir == DMM_WEDGE_FULL_D_IDX )   
     1059      {
     1060        pcCU->setWedgeFullDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
     1061        pcCU->setWedgeFullDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
     1062      }
     1063      else if( uiDir == DMM_WEDGE_PREDDIR_D_IDX )
     1064      {
     1065        pcCU->setWedgePredDirDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
     1066        pcCU->setWedgePredDirDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
     1067      }
     1068      else if( uiDir == DMM_WEDGE_PREDTEX_D_IDX) 
     1069      {
     1070        pcCU->setWedgePredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
     1071        pcCU->setWedgePredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
     1072      }
     1073      else if (uiDir== DMM_CONTOUR_PREDTEX_D_IDX )
     1074      {
     1075        pcCU->setContourPredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
     1076        pcCU->setContourPredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
     1077      }
     1078    }
     1079  }
     1080  else if (uiDir >= EDGE_INTRA_IDX)
     1081  {
     1082    m_pcTDecBinIf->decodeBin( uiSymbol, m_cEdgeIntraDeltaDCSCModel.get(0, 0, 0) );
     1083    if( uiSymbol )
     1084    {
     1085      uiDir = EDGE_INTRA_DELTA_IDX;
     1086      Int iDeltaDC = 0,iDeltaDC0 = 0,iDeltaDC1 = 0;
     1087      for (Int i = 0; i<2; i++)
     1088      {
     1089        xReadExGolombLevel( (UInt &) iDeltaDC, m_cEdgeIntraDeltaDCSCModel.get(0, 0, 1) );
     1090        if( iDeltaDC != 0 )
     1091        {
     1092          UInt uiSign;
     1093          m_pcTDecBinIf->decodeBinEP( uiSign );
     1094          if ( uiSign )
     1095          {
     1096            iDeltaDC = -iDeltaDC;
     1097          }
     1098        }
     1099        if ( i == 0 ) { iDeltaDC0 = iDeltaDC; }
     1100        else          { iDeltaDC1 = iDeltaDC; }
     1101      }
     1102
     1103      pcCU->setEdgeDeltaDC0( uiAbsPartIdx, iDeltaDC0 );
     1104      pcCU->setEdgeDeltaDC1( uiAbsPartIdx, iDeltaDC1 );
     1105    }
     1106  }
     1107  else if(bSdcFlag)//SDC mode
     1108  {
     1109    assert(pcCU->getPartitionSize(uiAbsPartIdx)!=SIZE_NxN);
     1110    pcCU->setTrIdxSubParts(0, uiAbsPartIdx, uiDepth);
     1111    pcCU->setCbfSubParts(1, 1, 1, uiAbsPartIdx, uiDepth);
     1112
     1113    UInt uiNumSegments = ( uiDir == DC_IDX || uiDir == PLANAR_IDX )? 1 : 2;
     1114    for (int uiSeg=0; uiSeg<uiNumSegments; uiSeg++)
     1115    {
     1116      parseSDCResidualData(pcCU, uiAbsPartIdx, uiDepth, uiSeg);
     1117    }
     1118  }
     1119
     1120  pcCU->setLumaIntraDirSubParts( (UChar)uiDir, uiAbsPartIdx, uiDepth );
     1121}
     1122#endif
    8721123Void TDecSbac::parseIntraDirLumaAng  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    8731124{
    8741125  UInt uiSymbol;
    8751126  Int  intraPredMode;
    876 
     1127#if PKU_QC_DEPTH_INTRA_UNI_D0195
     1128  if (pcCU->getSlice()->getSPS()->isDepth())
     1129  {
     1130    parseDepthModelingTable(pcCU, uiAbsPartIdx, uiDepth);
     1131  }
     1132  if (pcCU->getLumaIntraDir(uiAbsPartIdx)<NUM_INTRA_MODE && !pcCU->getSDCFlag(uiAbsPartIdx))
     1133  {
     1134#else
    8771135#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    8781136  UInt uiFlag = 0;
     
    9281186    }
    9291187#endif
    930 
     1188#endif
    9311189    Int uiPreds[3] = {-1, -1, -1};
    9321190    Int uiPredNum = pcCU->getIntraDirLumaPredictor(uiAbsPartIdx, uiPreds); 
     1191#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    9331192#if LGE_EDGE_INTRA_A0070
    9341193    UInt uiCheckBit = 0;
    9351194#endif
     1195#endif
    9361196
    9371197    m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 0) );
     
    9531213
    9541214      m_pcTDecBinIf->decodeBinsEP( uiSymbol, 5 );
     1215#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    9551216#if LGE_EDGE_INTRA_A0070
    9561217      if (bCodeEdgeIntra)
     
    9631224        }
    9641225      }
     1226#endif
    9651227#endif
    9661228      intraPredMode = uiSymbol;
     
    9791241        std::swap(uiPreds[1], uiPreds[2]);
    9801242      }
     1243#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    9811244#if LGE_EDGE_INTRA_A0070
    9821245      if ( intraPredMode != EDGE_INTRA_IDX)
    9831246      {
    9841247#endif
     1248#endif
    9851249        for ( Int i = 0; i < uiPredNum; i++ )
    9861250        {
    9871251          intraPredMode += ( intraPredMode >= uiPreds[i] );
    9881252        }
     1253#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    9891254#if LGE_EDGE_INTRA_A0070
    9901255      }
    9911256#endif
    992     }
    993 
     1257#endif
     1258    }
     1259
     1260#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    9941261#if LGE_EDGE_INTRA_A0070
    9951262    if( intraPredMode == EDGE_INTRA_IDX )
     
    10351302  }
    10361303#endif
    1037 
    10381304  pcCU->setLumaIntraDirSubParts( (UChar)intraPredMode, uiAbsPartIdx, uiDepth );
     1305#else
     1306  pcCU->setLumaIntraDirSubParts( (UChar)intraPredMode, uiAbsPartIdx, uiDepth );
     1307}
     1308#endif
    10391309}
    10401310
     
    16721942}
    16731943
    1674 
     1944#if LGE_SAO_MIGRATION_D0091
     1945Void TDecSbac::parseSaoMaxUvlc ( UInt& val, UInt maxSymbol )
     1946{
     1947    if (maxSymbol == 0)
     1948    {
     1949        val = 0;
     1950        return;
     1951    }
     1952
     1953    UInt code;
     1954    Int  i;
     1955    m_pcTDecBinIf->decodeBinEP( code );
     1956    if ( code == 0 )
     1957    {
     1958        val = 0;
     1959        return;
     1960    }
     1961
     1962    i=1;
     1963    while (1)
     1964    {
     1965        m_pcTDecBinIf->decodeBinEP( code );
     1966        if ( code == 0 )
     1967        {
     1968            break;
     1969        }
     1970        i++;
     1971        if (i == maxSymbol)
     1972        {
     1973            break;
     1974        }
     1975    }   
     1976
     1977    val = i;
     1978}
     1979
     1980Void TDecSbac::parseSaoUflc (UInt uiLength, UInt&  riVal)
     1981{
     1982    m_pcTDecBinIf->decodeBinsEP ( riVal, uiLength );
     1983}
     1984
     1985Void TDecSbac::parseSaoMerge (UInt&  ruiVal)
     1986{
     1987    UInt uiCode;
     1988    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoMergeSCModel.get( 0, 0, 0 ) );
     1989    ruiVal = (Int)uiCode;
     1990}
     1991
     1992Void TDecSbac::parseSaoTypeIdx (UInt&  ruiVal)
     1993{
     1994    UInt uiCode;
     1995    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
     1996    if (uiCode == 0)
     1997    {
     1998        ruiVal = 0;
     1999    }
     2000    else
     2001    {
     2002        m_pcTDecBinIf->decodeBinEP( uiCode );
     2003        if (uiCode == 0)
     2004        {
     2005            ruiVal = 5;
     2006        }
     2007        else
     2008        {
     2009            ruiVal = 1;
     2010        }
     2011    }
     2012}
     2013
     2014inline Void copySaoOneLcuParam(SaoLcuParam* psDst,  SaoLcuParam* psSrc)
     2015{
     2016    Int i;
     2017    psDst->partIdx = psSrc->partIdx;
     2018    psDst->typeIdx = psSrc->typeIdx;
     2019    if (psDst->typeIdx != -1)
     2020    {
     2021        psDst->subTypeIdx = psSrc->subTypeIdx ;
     2022        psDst->length  = psSrc->length;
     2023        for (i=0;i<psDst->length;i++)
     2024        {
     2025            psDst->offset[i] = psSrc->offset[i];
     2026        }
     2027    }
     2028    else
     2029    {
     2030        psDst->length  = 0;
     2031        for (i=0;i<SAO_BO_LEN;i++)
     2032        {
     2033            psDst->offset[i] = 0;
     2034        }
     2035    }
     2036}
     2037
     2038Void TDecSbac::parseSaoOffset(SaoLcuParam* psSaoLcuParam, UInt compIdx)
     2039{
     2040    UInt uiSymbol;
     2041    static Int iTypeLength[MAX_NUM_SAO_TYPE] =
     2042    {
     2043        SAO_EO_LEN,
     2044        SAO_EO_LEN,
     2045        SAO_EO_LEN,
     2046        SAO_EO_LEN,
     2047        SAO_BO_LEN
     2048    };
     2049
     2050    if (compIdx==2)
     2051    {
     2052        uiSymbol = (UInt)( psSaoLcuParam->typeIdx + 1);
     2053    }
     2054    else
     2055    {
     2056        parseSaoTypeIdx(uiSymbol);
     2057    }
     2058    psSaoLcuParam->typeIdx = (Int)uiSymbol - 1;
     2059
     2060    if (uiSymbol)
     2061    {
     2062        psSaoLcuParam->length = iTypeLength[psSaoLcuParam->typeIdx];
     2063#if FULL_NBIT
     2064        Int offsetTh = 1 << ( min((Int)(g_uiBitDepth + (g_uiBitDepth-8)-5),5) );
     2065#else
     2066        Int offsetTh = 1 << ( min((Int)(g_uiBitDepth + g_uiBitIncrement-5),5) );
     2067#endif
     2068
     2069        if( psSaoLcuParam->typeIdx == SAO_BO )
     2070        {
     2071            for(Int i=0; i< psSaoLcuParam->length; i++)
     2072            {
     2073                parseSaoMaxUvlc(uiSymbol, offsetTh -1 );
     2074                psSaoLcuParam->offset[i] = uiSymbol;
     2075            }   
     2076            for(Int i=0; i< psSaoLcuParam->length; i++)
     2077            {
     2078                if (psSaoLcuParam->offset[i] != 0)
     2079                {
     2080                    m_pcTDecBinIf->decodeBinEP ( uiSymbol);
     2081                    if (uiSymbol)
     2082                    {
     2083                        psSaoLcuParam->offset[i] = -psSaoLcuParam->offset[i] ;
     2084                    }
     2085                }
     2086            }
     2087            parseSaoUflc(5, uiSymbol );
     2088            psSaoLcuParam->subTypeIdx = uiSymbol;
     2089        }
     2090        else if( psSaoLcuParam->typeIdx < 4 )
     2091        {
     2092            parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[0] = uiSymbol;   
     2093            parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[1] = uiSymbol;
     2094            parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[2] = -(Int)uiSymbol;
     2095            parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[3] = -(Int)uiSymbol;
     2096            if (compIdx != 2)
     2097            {
     2098                parseSaoUflc(2, uiSymbol );
     2099                psSaoLcuParam->subTypeIdx = uiSymbol;
     2100                psSaoLcuParam->typeIdx += psSaoLcuParam->subTypeIdx;
     2101            }
     2102        }
     2103    }
     2104    else
     2105    {
     2106        psSaoLcuParam->length = 0;
     2107    }
     2108}
     2109
     2110Void TDecSbac::parseSaoOneLcuInterleaving(Int rx, Int ry, SAOParam* pSaoParam, TComDataCU* pcCU, Int iCUAddrInSlice, Int iCUAddrUpInSlice, Int allowMergeLeft, Int allowMergeUp)
     2111{
     2112    Int iAddr = pcCU->getAddr();
     2113    UInt uiSymbol;
     2114
     2115    for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
     2116    {
     2117        pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag    = 0;
     2118        pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag  = 0;
     2119        pSaoParam->saoLcuParam[iCompIdx][iAddr].subTypeIdx     = 0;
     2120        pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx        =-1;
     2121        pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[0]      = 0;
     2122        pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[1]      = 0;
     2123        pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[2]      = 0;
     2124        pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[3]      = 0;
     2125    }
     2126    if (pSaoParam->bSaoFlag[0] || pSaoParam->bSaoFlag[1] )
     2127    {
     2128        if (rx>0 && iCUAddrInSlice!=0 && allowMergeLeft)
     2129        {
     2130            parseSaoMerge(uiSymbol);
     2131            pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag = (Bool)uiSymbol; 
     2132        }
     2133        if (pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag==0)
     2134        {
     2135            if ((ry > 0) && (iCUAddrUpInSlice>=0) && allowMergeUp)
     2136            {
     2137                parseSaoMerge(uiSymbol);
     2138                pSaoParam->saoLcuParam[0][iAddr].mergeUpFlag = (Bool)uiSymbol;
     2139            }
     2140        }
     2141    }
     2142
     2143    for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
     2144    {
     2145        if ((iCompIdx == 0  && pSaoParam->bSaoFlag[0]) || (iCompIdx > 0  && pSaoParam->bSaoFlag[1]) )
     2146        {
     2147            if (rx>0 && iCUAddrInSlice!=0 && allowMergeLeft)
     2148            {
     2149                pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag;
     2150            }
     2151            else
     2152            {
     2153                pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = 0;
     2154            }
     2155
     2156            if (pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag==0)
     2157            {
     2158                if ((ry > 0) && (iCUAddrUpInSlice>=0) && allowMergeUp)
     2159                {
     2160                    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = pSaoParam->saoLcuParam[0][iAddr].mergeUpFlag;
     2161                }
     2162                else
     2163                {
     2164                    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = 0;
     2165                }
     2166   
     2167                if (!pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag)
     2168                {
     2169                    pSaoParam->saoLcuParam[2][iAddr].typeIdx = pSaoParam->saoLcuParam[1][iAddr].typeIdx;
     2170                    parseSaoOffset(&(pSaoParam->saoLcuParam[iCompIdx][iAddr]), iCompIdx);
     2171                }
     2172                else
     2173                {
     2174                    copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr], &pSaoParam->saoLcuParam[iCompIdx][iAddr-pSaoParam->numCuInWidth]);
     2175                }
     2176            }
     2177            else
     2178            {
     2179                copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr],  &pSaoParam->saoLcuParam[iCompIdx][iAddr-1]);
     2180            }
     2181        }
     2182        else
     2183        {
     2184            pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx    = -1;
     2185            pSaoParam->saoLcuParam[iCompIdx][iAddr].subTypeIdx = 0;
     2186        }
     2187    }
     2188}
     2189#else
    16752190Void TDecSbac::parseSaoUvlc (UInt& ruiVal)
    16762191{
     
    19092424  }
    19102425}
    1911 
     2426#endif
    19122427/**
    19132428 - Initialize our contexts from the nominated source.
     
    22352750}
    22362751#endif
    2237 
     2752#if QC_ARP_D0177
     2753Void TDecSbac::parseARPW( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     2754{
     2755  UInt nMaxW = pcCU->getSlice()->getARPStepNum() - 1;
     2756#if !QC_ARP_WARNING_FIX
     2757  assert (nMaxW >= 0);
     2758#endif
     2759  UInt nW = 0;
     2760  if( nMaxW > 0 )
     2761  {
     2762    UInt nOffset = pcCU->getCTXARPWFlag(uiAbsPartIdx);
     2763#if !QC_ARP_WARNING_FIX
     2764    assert( 0 <= nOffset && nOffset <= 2 );
     2765#endif
     2766    UInt uiCode = 0;
     2767    m_pcTDecBinIf->decodeBin( uiCode , m_cCUPUARPW.get( 0, 0, 0 + nOffset ) );
     2768    nW = uiCode;
     2769    if( nW == 1 )   
     2770    {
     2771      m_pcTDecBinIf->decodeBin( uiCode , m_cCUPUARPW.get( 0, 0, 3 ) );
     2772      nW += ( uiCode == 1 );
     2773    }
     2774  }
     2775  pcCU->setARPWSubParts( ( UChar )( nW ) , uiAbsPartIdx, uiDepth ); 
     2776}
     2777#endif
    22382778#if LGE_EDGE_INTRA_A0070
    22392779Void TDecSbac::xParseEdgeIntraInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     
    23352875 
    23362876#if RWTH_SDC_DLT_B0036
     2877#if !PKU_QC_DEPTH_INTRA_UNI_D0195
    23372878Void TDecSbac::parseSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    23382879{
     
    23672908  {
    23682909    UInt uiIsMostProb = 0;
     2910#if INTEL_SDC64_D0193
     2911    if( !(pcCU->getWidth(uiAbsPartIdx) == 64 && i == 1))
     2912#endif
    23692913    m_pcTDecBinIf->decodeBin( uiIsMostProb, m_cSDCPredModeSCModel.get( 0, i, uiCtx ) );
    23702914   
     
    23852929  pcCU->setLumaIntraDirSubParts((UChar)intraPredMode, uiAbsPartIdx, uiDepth);
    23862930}
     2931#endif
    23872932
    23882933Void TDecSbac::parseSDCResidualData ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiSegment )
     
    23982943  Int  iIdx       = 0;
    23992944 
    2400   UInt uiMaxResidualBits  = GetBitsPerDepthValue();
     2945  UInt uiMaxResidualBits  = pcCU->getSlice()->getSPS()->getBitsPerDepthValue();
    24012946  assert( uiMaxResidualBits <= g_uiBitDepth );
    24022947 
     2948#if RWTH_SDC_CTX_SIMPL_D0032
     2949  m_pcTDecBinIf->decodeBin(uiResidual, m_cSDCResidualFlagSCModel.get( 0, 0, 0 ) );
     2950#else
    24032951  m_pcTDecBinIf->decodeBin(uiResidual, m_cSDCResidualFlagSCModel.get( 0, uiSegment, 0 ) );
     2952#endif
    24042953 
    24052954  if (uiResidual)
    24062955  {
    24072956    // decode residual sign bit
     2957#if RWTH_SDC_CTX_SIMPL_D0032
     2958    m_pcTDecBinIf->decodeBinEP(uiSign);
     2959#else
    24082960    m_pcTDecBinIf->decodeBin(uiSign, m_cSDCResidualSignFlagSCModel.get( 0, uiSegment, 0 ) );
     2961#endif
    24092962   
    24102963    // decode residual magnitude
     2964#if LGE_CONCATENATE_D0141
     2965    //prefix part
     2966    UInt uiCount = 0;
     2967    UInt uiNumDepthValues = pcCU->getSlice()->getSPS()->getNumDepthValues();
     2968    UInt uiPrefixThreshold = ((uiNumDepthValues * 3) >> 2);
     2969    for ( UInt ui = 0; ui < uiPrefixThreshold; ui++)
     2970    {
     2971        m_pcTDecBinIf->decodeBin( uiBit, m_cSDCResidualSCModel.get(0, 0, 0) );
     2972        if ( uiBit == 0 )
     2973            break;
     2974        else
     2975            uiCount++;
     2976    }
     2977    //suffix part
     2978    if ( uiCount == uiPrefixThreshold )
     2979    {
     2980        for ( UInt ui = 0; ui < ( (UInt)ceil( Log2(uiNumDepthValues - uiPrefixThreshold) ) ); ui++ )
     2981        {
     2982            m_pcTDecBinIf->decodeBinEP( uiBit );
     2983            uiAbsIdx |= uiBit << ui;
     2984        }
     2985        uiAbsIdx += uiCount;
     2986    }
     2987    else
     2988        uiAbsIdx = uiCount;
     2989#else
    24112990    for (Int i=0; i<uiMaxResidualBits; i++)
    24122991    {
     2992#if RWTH_SDC_CTX_SIMPL_D0032
     2993      m_pcTDecBinIf->decodeBin(uiBit, m_cSDCResidualSCModel.get( 0, 0, i ) );
     2994#else
    24132995      m_pcTDecBinIf->decodeBin(uiBit, m_cSDCResidualSCModel.get( 0, uiSegment, i ) );
     2996#endif
    24142997      uiAbsIdx |= uiBit << i;
    24152998    }
     2999#endif
    24163000   
    24173001    uiAbsIdx += 1;
Note: See TracChangeset for help on using the changeset viewer.