Ignore:
Timestamp:
6 Jun 2013, 11:46:05 (11 years ago)
Author:
hhi
Message:

Integation of depth intra methods in macro H_3D_DIM, including:

  • DMM coding modes in H_3D_DIM_DMM.
  • RBC coding mode in H_3D_DIM_RBC.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-DEV-0.3-dev1/source/Lib/TLibDecoder/TDecSbac.cpp

    r324 r459  
    7777, m_cTransformSkipSCModel     ( 1,             2,               NUM_TRANSFORMSKIP_FLAG_CTX    , m_contextModels + m_numContextModels, m_numContextModels)
    7878, m_CUTransquantBypassFlagSCModel( 1,          1,               NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
     79#if H_3D_DIM
     80, m_cDepthIntraModeSCModel    ( 1,             1,               NUM_DEPTH_INTRA_MODE_CTX      , m_contextModels + m_numContextModels, m_numContextModels)
     81, m_cDdcFlagSCModel           ( 1,             1,               NUM_DDC_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     82, m_cDdcDataSCModel           ( 1,             1,               NUM_DDC_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     83#if H_3D_DIM_DMM
     84, m_cDmm1DataSCModel          ( 1,             1,               NUM_DMM1_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     85, m_cDmm2DataSCModel          ( 1,             1,               NUM_DMM2_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     86, m_cDmm3DataSCModel          ( 1,             1,               NUM_DMM3_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     87#endif
     88#if H_3D_DIM_RBC
     89, m_cRbcDataSCModel           ( 1,             1,               NUM_RBC_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     90#endif
     91#endif
    7992{
    8093  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
     
    137150  m_cTransformSkipSCModel.initBuffer     ( sliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
    138151  m_CUTransquantBypassFlagSCModel.initBuffer( sliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
     152
     153#if H_3D_DIM
     154  m_cDepthIntraModeSCModel.initBuffer    ( sliceType, qp, (UChar*)INIT_DEPTH_INTRA_MODE );
     155  m_cDdcFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DDC_FLAG );
     156  m_cDdcDataSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DDC_DATA );
     157#if H_3D_DIM_DMM
     158  m_cDmm1DataSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_DMM1_DATA );
     159  m_cDmm2DataSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_DMM2_DATA );
     160  m_cDmm3DataSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_DMM3_DATA );
     161#endif
     162#if H_3D_DIM_RBC
     163  m_cRbcDataSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_RBC_DATA );
     164#endif
     165#endif
     166
    139167  m_uiLastDQpNonZero  = 0;
    140168 
     
    181209  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
    182210  m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
     211
     212#if H_3D_DIM
     213  m_cDepthIntraModeSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE );
     214  m_cDdcFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG );
     215  m_cDdcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_DATA );
     216#if H_3D_DIM_DMM
     217  m_cDmm1DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA );
     218  m_cDmm2DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM2_DATA );
     219  m_cDmm3DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA );
     220#endif
     221#if H_3D_DIM_RBC
     222  m_cRbcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_RBC_DATA );
     223#endif
     224#endif
    183225  m_pcTDecBinIf->start();
    184226}
     
    297339  }
    298340}
     341
     342#if H_3D_DIM
     343Void TDecSbac::xReadExGolombLevel( UInt& ruiSymbol, ContextModel& rcSCModel  )
     344{
     345  UInt uiSymbol;
     346  UInt uiCount = 0;
     347  do
     348  {
     349    m_pcTDecBinIf->decodeBin( uiSymbol, rcSCModel );
     350    uiCount++;
     351  }
     352  while( uiSymbol && ( uiCount != 13 ) );
     353
     354  ruiSymbol = uiCount - 1;
     355
     356  if( uiSymbol )
     357  {
     358    xReadEpExGolomb( uiSymbol, 0 );
     359    ruiSymbol += uiSymbol + 1;
     360  }
     361
     362  return;
     363}
     364
     365Void TDecSbac::xParseDimDeltaDC( Pel& rValDeltaDC, UInt dimType )
     366{
     367  UInt absValDeltaDC = 0;
     368  xReadExGolombLevel( absValDeltaDC, m_cDdcDataSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) );
     369  rValDeltaDC = (Pel)absValDeltaDC;
     370
     371  if( rValDeltaDC != 0 )
     372  {
     373    UInt uiSign;
     374    m_pcTDecBinIf->decodeBinEP( uiSign );
     375    if ( uiSign )
     376    {
     377      rValDeltaDC = -rValDeltaDC;
     378    }
     379  }
     380}
     381#if H_3D_DIM_DMM
     382Void TDecSbac::xParseDmm1WedgeIdx( UInt& ruiTabIdx, Int iNumBit )
     383{
     384  UInt uiSymbol, uiIdx = 0;
     385  for( Int i = 0; i < iNumBit; i++ )
     386  {
     387    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmm1DataSCModel.get(0, 0, 0) );
     388    uiIdx += uiSymbol << i;
     389  }
     390  ruiTabIdx = uiIdx;
     391}
     392Void TDecSbac::xParseDmm2Offset( Int& riOffset )
     393{
     394  Int iDeltaEnd = 0;
     395  if( DMM2_DELTAEND_MAX > 0 )
     396  {
     397    UInt uiFlag = 0;
     398    m_pcTDecBinIf->decodeBin( uiFlag, m_cDmm2DataSCModel.get(0, 0, 0) );
     399
     400    if( uiFlag )
     401    {
     402      UInt uiAbsValMinus1;
     403      UInt uiSymbol;
     404      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmm2DataSCModel.get(0, 0, 0) ); uiAbsValMinus1  = uiSymbol;
     405      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmm2DataSCModel.get(0, 0, 0) ); uiAbsValMinus1 |= uiSymbol << 1;
     406      iDeltaEnd = uiAbsValMinus1 + 1;
     407      UInt uiSign;
     408      m_pcTDecBinIf->decodeBinEP( uiSign );
     409      if( uiSign )
     410      {
     411        iDeltaEnd = -iDeltaEnd;
     412      }
     413    }
     414  }
     415  riOffset = iDeltaEnd;
     416}
     417Void TDecSbac::xParseDmm3WedgeIdx( UInt& ruiIntraIdx, Int iNumBit )
     418{
     419  UInt uiSymbol, uiIdx = 0;
     420  for( Int i = 0; i < iNumBit; i++ )
     421  {
     422    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmm3DataSCModel.get(0, 0, 0) );
     423    uiIdx += uiSymbol << i;
     424  }
     425  ruiIntraIdx = uiIdx;
     426}
     427#endif
     428#if H_3D_DIM_RBC
     429Void TDecSbac::xParseRbcEdge( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     430{
     431  UInt uiSymbol = 0;
     432
     433  // 1. Top(0) or Left(1)
     434  UChar ucLeft;
     435  m_pcTDecBinIf->decodeBinEP( uiSymbol );
     436  ucLeft = uiSymbol;
     437
     438  // 2. Start position (lowest bit first)
     439  UChar ucStart = 0;
     440  for( UInt ui = 0; ui < 6 - uiDepth; ui++ )
     441  {
     442    m_pcTDecBinIf->decodeBinEP( uiSymbol );
     443    ucStart |= (uiSymbol << ui);
     444  }
     445
     446  // 3. Number of edges
     447  UChar ucMax = 0;
     448  for( UInt ui = 0; ui < 7 - uiDepth; ui++ )
     449  {
     450    m_pcTDecBinIf->decodeBinEP( uiSymbol );
     451    ucMax |= (uiSymbol << ui);
     452  }
     453  ucMax++; // +1
     454
     455  // 4. Edges
     456  UChar* pucSymbolList = (UChar*) xMalloc( UChar, 256 * RBC_MAX_EDGE_NUM_PER_4x4 );
     457  for( Int iPtr = 0; iPtr < ucMax; iPtr++ )
     458  {
     459    UChar ucEdge = 0;
     460    UInt  uiReorderEdge = 0;
     461    for( UInt ui = 0; ui < 6; ui++ )
     462    {
     463      m_pcTDecBinIf->decodeBin( uiSymbol, m_cRbcDataSCModel.get( 0, 0, 0 ) );
     464      ucEdge <<= 1;
     465      ucEdge |= uiSymbol;
     466      if( uiSymbol == 0 )
     467        break;
     468    }
     469
     470    switch( ucEdge )
     471    {
     472    case 0 :  // "0"       
     473      uiReorderEdge = 0;
     474      break;
     475    case 2 :  // "10"
     476      uiReorderEdge = 1;
     477      break;
     478    case 6 :  // "110"
     479      uiReorderEdge = 2;
     480      break;
     481    case 14 : // "1110"
     482      uiReorderEdge = 3;
     483      break;
     484    case 30 : // "11110"
     485      uiReorderEdge = 4;
     486      break;
     487    case 62 : // "111110"
     488      uiReorderEdge = 5;
     489      break;
     490    case 63 : // "111111"
     491      uiReorderEdge = 6;
     492      break;
     493    default :
     494      printf("parseIntraEdgeChain: error (unknown code %d)\n",ucEdge);
     495      assert(false);
     496      break;
     497    }
     498    pucSymbolList[iPtr] = uiReorderEdge;
     499  }
     500  /////////////////////
     501  // Edge Reconstruction
     502  Bool* pbRegion = pcCU->getEdgePartition( uiAbsPartIdx );
     503  pcCU->reconPartition( uiAbsPartIdx, uiDepth, ucLeft == 1, ucStart, ucMax, pucSymbolList, pbRegion );
     504  xFree( pucSymbolList );
     505}
     506#endif
     507#endif
    299508
    300509/** Parse I_PCM information.
     
    619828  for (j=0;j<partNum;j++)
    620829  {
     830#if H_3D_DIM
     831    if( pcCU->getSlice()->getVpsDepthModesFlag() )
     832    {
     833      parseIntraDepth( pcCU, absPartIdx+partOffset*j, depth );
     834    }
     835    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
     836#if H_3D_DIM_SDC
     837      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
     838#endif
     839    {
     840#endif
    621841    m_pcTDecBinIf->decodeBin( symbol, m_cCUIntraPredSCModel.get( 0, 0, 0) );
    622842    mpmPred[j] = symbol;
     843#if H_3D_DIM
     844    }
     845#endif
    623846  }
    624847  for (j=0;j<partNum;j++)
    625848  {
     849#if H_3D_DIM
     850    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
     851#if H_3D_DIM_SDC
     852      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
     853#endif
     854    {
     855#endif
    626856    Int preds[3] = {-1, -1, -1};
    627857    Int predNum = pcCU->getIntraDirLumaPredictor(absPartIdx+partOffset*j, preds); 
     
    661891    }
    662892    pcCU->setLumaIntraDirSubParts( (UChar)intraPredMode, absPartIdx+partOffset*j, depth );
     893#if H_3D_DIM
     894    }
     895#endif
    663896  }
    664897}
     
    687920  return;
    688921}
     922
     923#if H_3D_DIM
     924Void TDecSbac::parseIntraDepth( TComDataCU* pcCU, UInt absPartIdx, UInt depth )
     925{
     926  parseIntraDepthMode( pcCU, absPartIdx, depth );
     927
     928  UInt dir     = pcCU->getLumaIntraDir( absPartIdx );
     929  UInt dimType = getDimType( dir );
     930
     931  switch( dimType )
     932  {
     933#if H_3D_DIM_DMM
     934  case( DMM1_IDX ):
     935    {
     936      UInt uiTabIdx = 0;
     937      xParseDmm1WedgeIdx( uiTabIdx, g_dmm1TabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] );
     938      pcCU->setDmmWedgeTabIdxSubParts( uiTabIdx, dimType, absPartIdx, depth );
     939    } break;
     940  case( DMM2_IDX ):
     941    {
     942      Int iOffset = 0;
     943      xParseDmm2Offset( iOffset );
     944      pcCU->setDmm2DeltaEndSubParts( iOffset, absPartIdx, depth );
     945    } break;
     946  case( DMM3_IDX ):
     947    {
     948      UInt uiIntraIdx = 0;
     949      xParseDmm3WedgeIdx( uiIntraIdx, g_dmm3IntraTabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] );
     950      pcCU->setDmm3IntraTabIdxSubParts( uiIntraIdx, absPartIdx, depth );
     951    } break;
     952  case( DMM4_IDX ): break;
     953#endif
     954#if H_3D_DIM_RBC
     955  case( RBC_IDX ):
     956    {
     957      xParseRbcEdge( pcCU, absPartIdx, depth );
     958    } break;
     959#endif
     960  default: break;
     961  }
     962
     963#if H_3D_DIM_SDC
     964  if( pcCU->getSDCAvailable(absPartIdx) && pcCU->getSDCFlag(absPartIdx) ) // sdcFlag
     965  {
     966    //assert(pcCU->getPartitionSize(uiAbsPartIdx)!=SIZE_NxN);
     967    //pcCU->setTrIdxSubParts(0, uiAbsPartIdx, uiDepth);
     968    //pcCU->setCbfSubParts(1, 1, 1, uiAbsPartIdx, uiDepth);
     969
     970    //UInt uiNumSegments = ( uiDir == DC_IDX || uiDir == PLANAR_IDX )? 1 : 2;
     971    //for (int uiSeg=0; uiSeg<uiNumSegments; uiSeg++)
     972    //{
     973    //  parseSDCResidualData(pcCU, uiAbsPartIdx, uiDepth, uiSeg);
     974    //}
     975  }
     976  else
     977  {
     978#endif
     979  if( dimType < DIM_NUM_TYPE )
     980  {
     981    UInt symbol;
     982    m_pcTDecBinIf->decodeBin( symbol, m_cDdcFlagSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) );
     983    if( symbol )
     984    {
     985      dir += symbol;
     986      for( UInt segment = 0; segment < 2; segment++ )
     987      {
     988        Pel valDeltaDC = 0;
     989        xParseDimDeltaDC( valDeltaDC, dimType );
     990        pcCU->setDimDeltaDC( dimType, segment, absPartIdx, valDeltaDC );
     991      }
     992    }
     993  }
     994#if H_3D_DIM_SDC
     995  }
     996#endif
     997
     998  pcCU->setLumaIntraDirSubParts( (UChar)dir, absPartIdx, depth );
     999}
     1000
     1001Void TDecSbac::parseIntraDepthMode( TComDataCU* pcCU, UInt absPartIdx, UInt depth )
     1002{
     1003  UInt puIdx = (pcCU->getWidth(absPartIdx) == 64) ? 2 : ( (pcCU->getPartitionSize(absPartIdx) == SIZE_NxN && pcCU->getWidth(absPartIdx) == 8) ? 0 : 1 );
     1004  UInt dir = 0;
     1005  Bool sdcFlag = 0;
     1006  UInt symbol = 1;
     1007  UInt modeCode = 0 ;
     1008  UInt binNum = 0;
     1009  UInt ctxDepthMode = 0;
     1010
     1011  if( puIdx == 2 )
     1012  {
     1013    while( binNum < 2 && symbol )
     1014    {
     1015      ctxDepthMode = puIdx*3 + binNum;
     1016      m_pcTDecBinIf->decodeBin( symbol, m_cDepthIntraModeSCModel.get(0,0,ctxDepthMode) );
     1017      modeCode = (modeCode<<1) + symbol;
     1018      binNum++;
     1019    }
     1020         if( modeCode == 0 ) { dir = PLANAR_IDX; sdcFlag = 1;}
     1021    else if( modeCode == 2 ) { dir = 0;          sdcFlag = 0;}
     1022    else if( modeCode == 3 ) { dir =     DC_IDX; sdcFlag = 1;}
     1023  }
     1024  else if( puIdx == 0 )
     1025  {
     1026    while( binNum < 3 && symbol )
     1027    {
     1028      ctxDepthMode = puIdx*3 + ((binNum >= 2) ? 2 : binNum);
     1029      m_pcTDecBinIf->decodeBin( symbol, m_cDepthIntraModeSCModel.get(0,0,ctxDepthMode) );
     1030      modeCode = (modeCode<<1) + symbol;
     1031      binNum++;
     1032    }
     1033         if( modeCode == 0 ) { dir = 0;                       sdcFlag = 0;}
     1034    else if( modeCode == 2 ) { dir = (2*DMM1_IDX+DIM_OFFSET); sdcFlag = 0;}
     1035    else if( modeCode == 6 ) { dir = (2*DMM3_IDX+DIM_OFFSET); sdcFlag = 0;}
     1036    else if( modeCode == 7 ) { dir = (2* RBC_IDX+DIM_OFFSET); sdcFlag = 0;}
     1037  }
     1038  else
     1039  {
     1040    ctxDepthMode = puIdx*3 ;
     1041    m_pcTDecBinIf->decodeBin( symbol, m_cDepthIntraModeSCModel.get(0,0,ctxDepthMode) );
     1042    modeCode = (modeCode<<1) + symbol;
     1043    if( !symbol )
     1044    {
     1045      ctxDepthMode = puIdx*3 + 1;
     1046      m_pcTDecBinIf->decodeBin( symbol, m_cDepthIntraModeSCModel.get(0,0,ctxDepthMode) );
     1047      modeCode = (modeCode<<1) + symbol;
     1048      if( symbol )
     1049      {
     1050        ctxDepthMode = puIdx*3 + 2;
     1051        m_pcTDecBinIf->decodeBin( symbol, m_cDepthIntraModeSCModel.get(0,0,ctxDepthMode) );
     1052        modeCode = (modeCode<<1) + symbol;
     1053      }
     1054    }
     1055    else
     1056    {
     1057      ctxDepthMode = puIdx*3 + 1;
     1058      m_pcTDecBinIf->decodeBin( symbol, m_cDepthIntraModeSCModel.get(0,0,ctxDepthMode) );
     1059      modeCode = (modeCode<<1) + symbol;
     1060      if( !symbol )
     1061      {
     1062        ctxDepthMode = puIdx*3 + 2;
     1063        m_pcTDecBinIf->decodeBin( symbol, m_cDepthIntraModeSCModel.get(0,0,ctxDepthMode) );
     1064        modeCode = (modeCode<<1) + symbol;
     1065      }
     1066      else
     1067      {
     1068        binNum = 0;
     1069        while( symbol && binNum < 3 )
     1070        {
     1071          ctxDepthMode = puIdx*3 + 2;
     1072          m_pcTDecBinIf->decodeBin( symbol, m_cDepthIntraModeSCModel.get(0,0,ctxDepthMode) );
     1073          modeCode = (modeCode<<1) + symbol;
     1074          binNum++;
     1075        }
     1076      }
     1077    }
     1078         if( modeCode == 0  ) { dir =  PLANAR_IDX;             sdcFlag = 1;}
     1079    else if( modeCode == 2  ) { dir = 5;                       sdcFlag = 0;}
     1080    else if( modeCode == 3  ) { dir = (2*DMM1_IDX+DIM_OFFSET); sdcFlag = 1;}
     1081    else if( modeCode == 4  ) { dir = (2*DMM1_IDX+DIM_OFFSET); sdcFlag = 0;}
     1082    else if( modeCode == 5  ) { dir = (2*DMM4_IDX+DIM_OFFSET); sdcFlag = 0;}
     1083    else if( modeCode == 6  ) { dir = (2*DMM3_IDX+DIM_OFFSET); sdcFlag = 0;}
     1084    else if( modeCode == 14 ) { dir =      DC_IDX;             sdcFlag = 1;}
     1085    else if( modeCode == 30 ) { dir = (2* RBC_IDX+DIM_OFFSET); sdcFlag = 0;}
     1086    else if( modeCode == 31 ) { dir = (2*DMM2_IDX+DIM_OFFSET); sdcFlag = 0;}
     1087  }
     1088  pcCU->setLumaIntraDirSubParts( (UChar)dir, absPartIdx, depth );
     1089#if H_3D_DIM_SDC
     1090  pcCU->setSDCFlagSubParts( sdcFlag, absPartIdx, 0, depth );
     1091#endif
     1092}
     1093#endif
    6891094
    6901095Void TDecSbac::parseInterDir( TComDataCU* pcCU, UInt& ruiInterDir, UInt uiAbsPartIdx )
Note: See TracChangeset for help on using the changeset viewer.