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/TLibEncoder/TEncSbac.cpp

    r446 r459  
    8383, m_cTransformSkipSCModel     ( 1,             2,               NUM_TRANSFORMSKIP_FLAG_CTX    , m_contextModels + m_numContextModels, m_numContextModels)
    8484, m_CUTransquantBypassFlagSCModel( 1,          1,               NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
     85#if H_3D_DIM
     86, m_cDepthIntraModeSCModel    ( 1,             1,               NUM_DEPTH_INTRA_MODE_CTX      , m_contextModels + m_numContextModels, m_numContextModels)
     87, m_cDdcFlagSCModel           ( 1,             1,               NUM_DDC_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     88, m_cDdcDataSCModel           ( 1,             1,               NUM_DDC_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     89#if H_3D_DIM_DMM
     90, m_cDmm1DataSCModel          ( 1,             1,               NUM_DMM1_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     91, m_cDmm2DataSCModel          ( 1,             1,               NUM_DMM2_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     92, m_cDmm3DataSCModel          ( 1,             1,               NUM_DMM3_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     93#endif
     94#if H_3D_DIM_RBC
     95, m_cRbcDataSCModel           ( 1,             1,               NUM_RBC_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     96#endif
     97#endif
    8598{
    8699  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
     
    134147  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
    135148  m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
     149
     150#if H_3D_DIM
     151  m_cDepthIntraModeSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE );
     152  m_cDdcFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG );
     153  m_cDdcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_DATA );
     154#if H_3D_DIM_DMM
     155  m_cDmm1DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA );
     156  m_cDmm2DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM2_DATA );
     157  m_cDmm3DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA );
     158#endif
     159#if H_3D_DIM_RBC
     160  m_cRbcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_RBC_DATA );
     161#endif
     162#endif
    136163  // new structure
    137164  m_uiLastQp = iQp;
     
    188215      curCost += m_cTransformSkipSCModel.calcCost     ( curSliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
    189216      curCost += m_CUTransquantBypassFlagSCModel.calcCost( curSliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
     217#if H_3D_DIM
     218    if( m_pcSlice->getVpsDepthModesFlag() )
     219    {
     220      curCost += m_cDepthIntraModeSCModel.calcCost    ( curSliceType, qp, (UChar*)INIT_DEPTH_INTRA_MODE );
     221      curCost += m_cDdcFlagSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_DDC_FLAG );
     222      curCost += m_cDdcDataSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_DDC_DATA );
     223#if H_3D_DIM_DMM
     224      curCost += m_cDmm1DataSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_DMM1_DATA );
     225      curCost += m_cDmm2DataSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_DMM2_DATA );
     226      curCost += m_cDmm3DataSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_DMM3_DATA );
     227#endif
     228#if H_3D_DIM_RBC
     229      curCost += m_cRbcDataSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_RBC_DATA );
     230#endif
     231    }
     232#endif
    190233      if (curCost < bestCost)
    191234      {
     
    237280  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
    238281  m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
     282
     283#if H_3D_DIM
     284  m_cDepthIntraModeSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE );
     285  m_cDdcFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG );
     286  m_cDdcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_DATA );
     287#if H_3D_DIM_DMM
     288  m_cDmm1DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA );
     289  m_cDmm2DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM2_DATA );
     290  m_cDmm3DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA );
     291#endif
     292#if H_3D_DIM_RBC
     293  m_cRbcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_RBC_DATA );
     294#endif
     295#endif
    239296  m_pcBinIf->start();
    240297}
     
    379436}
    380437
     438#if H_3D_DIM
     439Void TEncSbac::xWriteExGolombLevel( UInt uiSymbol, ContextModel& rcSCModel  )
     440{
     441  if( uiSymbol )
     442  {
     443    m_pcBinIf->encodeBin( 1, rcSCModel );
     444    UInt uiCount = 0;
     445    Bool bNoExGo = (uiSymbol < 13);
     446
     447    while( --uiSymbol && ++uiCount < 13 )
     448    {
     449      m_pcBinIf->encodeBin( 1, rcSCModel );
     450    }
     451    if( bNoExGo )
     452    {
     453      m_pcBinIf->encodeBin( 0, rcSCModel );
     454    }
     455    else
     456    {
     457      xWriteEpExGolomb( uiSymbol, 0 );
     458    }
     459  }
     460  else
     461  {
     462    m_pcBinIf->encodeBin( 0, rcSCModel );
     463  }
     464
     465  return;
     466}
     467
     468Void TEncSbac::xCodeDimDeltaDC( Pel valDeltaDC, UInt dimType )
     469{
     470  xWriteExGolombLevel( UInt( abs( valDeltaDC ) ), m_cDdcDataSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) );
     471  if( valDeltaDC != 0 )
     472  {
     473    UInt uiSign = valDeltaDC > 0 ? 0 : 1;
     474    m_pcBinIf->encodeBinEP( uiSign );
     475  }
     476}
     477
     478#if H_3D_DIM_DMM
     479Void TEncSbac::xCodeDmm1WedgeIdx( UInt uiTabIdx, Int iNumBit )
     480{
     481  for ( Int i = 0; i < iNumBit; i++ )
     482  {
     483    m_pcBinIf->encodeBin( ( uiTabIdx >> i ) & 1, m_cDmm1DataSCModel.get(0, 0, 0) );
     484  }
     485}
     486
     487Void TEncSbac::xCodeDmm2Offset( Int iOffset )
     488{
     489  if( DMM2_DELTAEND_MAX > 0 )
     490  {
     491    m_pcBinIf->encodeBin( (iOffset != 0) , m_cDmm2DataSCModel.get(0, 0, 0) );
     492    if( iOffset != 0 )
     493    {
     494      UInt uiAbsValMinus1 = abs(iOffset)-1;
     495      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x01),      m_cDmm2DataSCModel.get(0, 0, 0) );
     496      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x02) >> 1, m_cDmm2DataSCModel.get(0, 0, 0) );
     497
     498      UInt uiSign = (iOffset > 0) ? 0 : 1;
     499      m_pcBinIf->encodeBinEP( uiSign );
     500    }
     501  }
     502}
     503
     504Void TEncSbac::xCodeDmm3WedgeIdx( UInt uiIntraIdx, Int iNumBit )
     505{
     506  for( Int i = 0; i < iNumBit; i++ )
     507  {
     508    m_pcBinIf->encodeBin( ( uiIntraIdx >> i ) & 1, m_cDmm3DataSCModel.get(0, 0, 0) );
     509  }
     510}
     511#endif
     512#if H_3D_DIM_RBC
     513Void TEncSbac::xCodeRbcEdge( TComDataCU* pcCU, UInt uiAbsPartIdx )
     514{
     515  UInt   uiDepth        = pcCU->getDepth( uiAbsPartIdx ) + (pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 1 : 0);
     516  UChar* pucSymbolList  = pcCU->getEdgeCode     ( uiAbsPartIdx );
     517  UChar  ucEdgeNumber   = pcCU->getEdgeNumber   ( uiAbsPartIdx );
     518  Bool   bLeft          = pcCU->getEdgeLeftFirst( uiAbsPartIdx );
     519  UChar  ucStart        = pcCU->getEdgeStartPos ( uiAbsPartIdx );
     520  UInt   uiSymbol;
     521
     522  // 1. Top(0) or Left(1)
     523  uiSymbol = (bLeft == false) ? 0 : 1;
     524  m_pcBinIf->encodeBinEP( uiSymbol );
     525
     526  // 2. Start position (lowest bit first)
     527  uiSymbol = ucStart;
     528  for( UInt ui = 6; ui > uiDepth; ui-- ) // 64(0)->6, 32(1)->5, 16(2)->4, 8(3)->3, 4(4)->2
     529  {
     530    m_pcBinIf->encodeBinEP( uiSymbol & 0x1 );
     531    uiSymbol >>= 1;
     532  }
     533
     534  // 3. Number of edges
     535  uiSymbol = ucEdgeNumber > 0 ? ucEdgeNumber - 1 : 0;
     536  for( UInt ui = 7; ui > uiDepth; ui-- ) // 64(0)->7, 32(1)->6, 16(2)->5, 8(3)->4, 4(4)->3
     537  {
     538    m_pcBinIf->encodeBinEP( uiSymbol & 0x1 );
     539    uiSymbol >>= 1;
     540  }
     541
     542  if(uiSymbol != 0)
     543  {
     544    printf(" ucEdgeNumber %d at depth %d\n",ucEdgeNumber, uiDepth);
     545    assert(false);
     546  }
     547
     548  // 4. Edges
     549  for( Int iPtr2 = 0; iPtr2 < ucEdgeNumber; iPtr2++ )
     550  {
     551    UInt uiReorderSymbol = pucSymbolList[iPtr2];
     552    for( UInt ui = 0; ui < uiReorderSymbol; ui++ )
     553    {
     554      m_pcBinIf->encodeBin( 1, m_cRbcDataSCModel.get( 0, 0, 0 ) );
     555    }
     556
     557    if( uiReorderSymbol != 6 )
     558      m_pcBinIf->encodeBin( 0, m_cRbcDataSCModel.get( 0, 0, 0 ) );
     559  }
     560}
     561#endif
     562#endif
     563
    381564// SBAC RD
    382565Void  TEncSbac::load ( TEncSbac* pSrc)
     
    391574  this->m_cCUIntraPredSCModel      .copyFrom( &pSrc->m_cCUIntraPredSCModel       );
    392575}
    393 
     576#if H_3D_DIM
     577Void TEncSbac::loadIntraDepthMode( TEncSbac* pSrc)
     578{
     579  m_pcBinIf->copyState( pSrc->m_pcBinIf );
     580
     581  this->m_cDepthIntraModeSCModel .copyFrom( &pSrc->m_cDepthIntraModeSCModel );
     582  this->m_cDdcFlagSCModel        .copyFrom( &pSrc->m_cDdcFlagSCModel );
     583}
     584#endif
    394585
    395586Void  TEncSbac::store( TEncSbac* pDest)
     
    628819  {
    629820    dir[j] = pcCU->getLumaIntraDir( absPartIdx+partOffset*j );
     821#if H_3D_DIM
     822    if( pcCU->getSlice()->getVpsDepthModesFlag() )
     823    {
     824      codeIntraDepth( pcCU, absPartIdx+partOffset*j );
     825    }
     826    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
     827#if H_3D_DIM_SDC
     828      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
     829#endif
     830    {
     831#endif
    630832    predNum[j] = pcCU->getIntraDirLumaPredictor(absPartIdx+partOffset*j, preds[j]); 
    631833    for(UInt i = 0; i < predNum[j]; i++)
     
    637839    }
    638840    m_pcBinIf->encodeBin((predIdx[j] != -1)? 1 : 0, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
     841#if H_3D_DIM
     842    }
     843#endif
    639844  } 
    640845  for (j=0;j<partNum;j++)
    641846  {
     847#if H_3D_DIM
     848    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
     849#if H_3D_DIM_SDC
     850      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
     851#endif
     852    {
     853#endif
    642854    if(predIdx[j] != -1)
    643855    {
     
    668880      m_pcBinIf->encodeBinsEP( dir[j], 5 );
    669881    }
     882#if H_3D_DIM
     883    }
     884#endif
    670885  }
    671886  return;
     
    699914  return;
    700915}
     916
     917#if H_3D_DIM
     918Void TEncSbac::codeIntraDepth( TComDataCU* pcCU, UInt absPartIdx, Bool sdcRD )
     919{
     920  codeIntraDepthMode( pcCU, absPartIdx );
     921
     922  UInt dir     = pcCU->getLumaIntraDir( absPartIdx );
     923  UInt dimType = getDimType( dir );
     924
     925  switch( dimType )
     926  {
     927#if H_3D_DIM_DMM
     928  case( DMM1_IDX ):
     929    {
     930      xCodeDmm1WedgeIdx( pcCU->getDmmWedgeTabIdx( dimType, absPartIdx ), g_dmm1TabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] );
     931    } break;
     932  case( DMM2_IDX ):
     933    {
     934      xCodeDmm2Offset( pcCU->getDmm2DeltaEnd( absPartIdx ) );
     935    } break;
     936  case( DMM3_IDX ):
     937    {
     938      xCodeDmm3WedgeIdx( pcCU->getDmm3IntraTabIdx( absPartIdx ), g_dmm3IntraTabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] );
     939    } break;
     940  case( DMM4_IDX ): break;
     941#endif
     942#if H_3D_DIM_RBC
     943  case( RBC_IDX ):
     944    {
     945      assert( pcCU->getWidth( absPartIdx ) < 64 );
     946      xCodeRbcEdge( pcCU, absPartIdx );
     947    } break;
     948#endif
     949  default: break;
     950  }
     951
     952#if H_3D_DIM_SDC
     953  if( pcCU->getSDCFlag( absPartIdx ) )
     954  {
     955  //  assert(pcCU->getPartitionSize(uiAbsPartIdx)==SIZE_2Nx2N);
     956  //  UInt uiNumSegments = ( uiDir == DC_IDX || uiDir == PLANAR_IDX )? 1 : 2;
     957  //  if(!bSdcRD)
     958  //  {
     959  //    for (int uiSeg=0; uiSeg<uiNumSegments; uiSeg++)
     960  //    {
     961  //      codeSDCResidualData(pcCU, uiAbsPartIdx, uiSeg);
     962  //    }
     963  //  }
     964  }
     965  else
     966  {
     967#endif
     968    if( dimType < DIM_NUM_TYPE )
     969    {
     970      UInt dimDeltaDC = isDimDeltaDC( dir );
     971      m_pcBinIf->encodeBin( dimDeltaDC, m_cDdcFlagSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) );
     972      if( dimDeltaDC )
     973      {
     974        for( UInt segment = 0; segment < 2; segment++ )
     975        {
     976          xCodeDimDeltaDC( pcCU->getDimDeltaDC( dimType, segment, absPartIdx ), dimType );
     977        }
     978      }
     979    }
     980#if H_3D_DIM_SDC
     981  }
     982#endif
     983}
     984
     985Void TEncSbac::codeIntraDepthMode( TComDataCU* pcCU, UInt absPartIdx )
     986{
     987  UInt codeWordTable[3][9] =    {{0, 0, 0, 2, 0,6, 0, 0, 7},{0, 2, 3, 4, 5, 6, 14, 31, 30},{0, 2, 0, 0, 0, 0, 3, 0, 0}};
     988  UInt codeWordLenTable[3][9] = {{0, 1, 0, 2, 0,3, 0, 0, 3},{2, 3, 3, 3, 3, 3,  4,  5,  5},{1, 2, 0, 0, 0, 0, 2, 0, 0}};
     989  UInt dir = pcCU->getLumaIntraDir( absPartIdx );
     990  UInt puIdx = (pcCU->getWidth(absPartIdx) == 64) ? 2 : ( (pcCU->getPartitionSize(absPartIdx) == SIZE_NxN && pcCU->getWidth(absPartIdx) == 8) ? 0 : 1 );
     991  UInt codeIdx = 0;
     992
     993  if( dir < NUM_INTRA_MODE )
     994  {
     995    codeIdx = 1;
     996  }
     997  if( isDimMode( dir ) )
     998  {
     999    switch( getDimType( dir ) )
     1000    {
     1001    case DMM1_IDX: codeIdx = 3; break;
     1002    case DMM4_IDX: codeIdx = 4; break;
     1003    case DMM3_IDX: codeIdx = 5; break;
     1004    case DMM2_IDX: codeIdx = 7; break;
     1005    case  RBC_IDX: codeIdx = 8; break;
     1006    default:                    break;
     1007    }
     1008  }
     1009
     1010#if H_3D_DIM_SDC
     1011  if( pcCU->getSDCFlag( absPartIdx ) )
     1012  {
     1013  //  switch( dir )
     1014  //  {
     1015  //  case PLANAR_IDX:              codeIdx = 0; break;
     1016  //  case DC_IDX:                  codeIdx = 6; break;
     1017  //  case (2*DMM1_IDX+DIM_OFFSET): codeIdx = 2; break;
     1018  //  default:                                   break;
     1019  //  }
     1020  }
     1021#endif
     1022  //mode coding
     1023  for( UInt i = 0; i < codeWordLenTable[puIdx][codeIdx]; i++ )
     1024  {
     1025    UInt bit = codeWordTable[puIdx][codeIdx] & ( 1<<(codeWordLenTable[puIdx][codeIdx] - i - 1) );
     1026    UInt ctxDepthMode = puIdx*3 + ( (i >= 2) ? 2 : i );
     1027    m_pcBinIf->encodeBin( bit!=0 , m_cDepthIntraModeSCModel.get(0, 0, ctxDepthMode) );
     1028  }
     1029}
     1030#endif
    7011031
    7021032Void TEncSbac::codeInterDir( TComDataCU* pcCU, UInt uiAbsPartIdx )
Note: See TracChangeset for help on using the changeset viewer.