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/TLibCommon/TComRom.cpp

    r446 r459  
    8282    delete[] g_auiSigLastScan[2][i];
    8383  }
     84
     85#if H_3D_DIM_DMM
     86  if( !g_dmmWedgeLists.empty() )
     87  {
     88    for( UInt ui = 0; ui < g_dmmWedgeLists.size(); ui++ ) { g_dmmWedgeLists[ui].clear(); }
     89    g_dmmWedgeLists.clear();
     90  }
     91  if( !g_dmmWedgeRefLists.empty() )
     92  {
     93    for( UInt ui = 0; ui < g_dmmWedgeRefLists.size(); ui++ ) { g_dmmWedgeRefLists[ui].clear(); }
     94    g_dmmWedgeRefLists.clear();
     95  }
     96
     97  if( !g_dmmWedgeNodeLists.empty() )
     98  {
     99    for( UInt ui = 0; ui < g_dmmWedgeNodeLists.size(); ui++ ) { g_dmmWedgeNodeLists[ui].clear(); }
     100    g_dmmWedgeNodeLists.clear();
     101  }
     102#endif
    84103}
    85104
     
    312331
    313332// ====================================================================================================================
     333// Depth coding modes
     334// ====================================================================================================================
     335#if H_3D_DIM_DMM
     336const WedgeResolution g_dmmWedgeResolution[6] =
     337{
     338  HALF_PEL,    //   4x4
     339  HALF_PEL,    //   8x8
     340  FULL_PEL,    //  16x16
     341  DOUBLE_PEL,  //  32x32
     342  DOUBLE_PEL,  //  64x64
     343  DOUBLE_PEL   // 128x128
     344};
     345
     346const UChar g_dmm1TabIdxBits[6] =
     347{ //2x2   4x4   8x8 16x16 32x32 64x64
     348     0,    7,   10,   11,   11,   13 };
     349const UChar g_dmm3IntraTabIdxBits[6] =
     350{ //2x2   4x4   8x8 16x16 32x32 64x64
     351     0,    6,    9,    9,    9,    0 };
     352
     353extern std::vector< std::vector<TComWedgelet> >   g_dmmWedgeLists;
     354extern std::vector< std::vector<TComWedgeRef> >   g_dmmWedgeRefLists;
     355extern std::vector< std::vector<TComWedgeNode> >  g_dmmWedgeNodeLists;
     356#endif
     357
     358// ====================================================================================================================
    314359// Misc.
    315360// ====================================================================================================================
     
    518563Int  g_eTTable[4] = {0,3,1,2};
    519564
     565#if H_3D_DIM_DMM
     566std::vector< std::vector<TComWedgelet>  > g_dmmWedgeLists;
     567std::vector< std::vector<TComWedgeRef>  > g_dmmWedgeRefLists;
     568std::vector< std::vector<TComWedgeNode> > g_dmmWedgeNodeLists;
     569std::vector< std::vector< std::vector<UInt> > > g_aauiWdgLstM3;
     570
     571Void initWedgeLists( Bool initRefinements )
     572{
     573  if( !g_dmmWedgeLists.empty() ) return;
     574
     575  for( UInt ui = g_aucConvertToBit[DIM_MIN_SIZE]; ui < (g_aucConvertToBit[DIM_MAX_SIZE]+1); ui++ )
     576  {
     577    UInt uiWedgeBlockSize = ((UInt)DIM_MIN_SIZE)<<ui;
     578    std::vector<TComWedgelet> acWedgeList;
     579    std::vector<TComWedgeRef> acWedgeRefList;
     580    createWedgeList( uiWedgeBlockSize, uiWedgeBlockSize, acWedgeList, acWedgeRefList, g_dmmWedgeResolution[ui] );
     581    g_dmmWedgeLists.push_back( acWedgeList );
     582    g_dmmWedgeRefLists.push_back( acWedgeRefList );
     583
     584    // create WedgeNodeList
     585    std::vector<TComWedgeNode> acWedgeNodeList;
     586    for( UInt uiPos = 0; uiPos < acWedgeList.size(); uiPos++ )
     587    {
     588      if( acWedgeList[uiPos].getIsCoarse() )
     589      {
     590        TComWedgeNode cWedgeNode;
     591        cWedgeNode.setPatternIdx( uiPos );
     592
     593        if( initRefinements )
     594        {
     595          UInt uiRefPos = 0;
     596          for( Int iOffS = -1; iOffS <= 1; iOffS++ )
     597          {
     598            for( Int iOffE = -1; iOffE <= 1; iOffE++ )
     599            {
     600              if( iOffS == 0 && iOffE == 0 ) { continue; }
     601
     602              Int iSx = (Int)acWedgeList[uiPos].getStartX();
     603              Int iSy = (Int)acWedgeList[uiPos].getStartY();
     604              Int iEx = (Int)acWedgeList[uiPos].getEndX();
     605              Int iEy = (Int)acWedgeList[uiPos].getEndY();
     606
     607              switch( acWedgeList[uiPos].getOri() )
     608              {
     609              case( 0 ): { iSx += iOffS; iEy += iOffE; } break;
     610              case( 1 ): { iSy += iOffS; iEx -= iOffE; } break;
     611              case( 2 ): { iSx -= iOffS; iEy -= iOffE; } break;
     612              case( 3 ): { iSy -= iOffS; iEx += iOffE; } break;
     613              case( 4 ): { iSx += iOffS; iEx += iOffE; } break;
     614              case( 5 ): { iSy += iOffS; iEy += iOffE; } break;
     615              default: assert( 0 );
     616              }
     617
     618              for( UInt k = 0; k < acWedgeRefList.size(); k++ )
     619              {
     620                if( iSx == (Int)acWedgeRefList[k].getStartX() &&
     621                    iSy == (Int)acWedgeRefList[k].getStartY() &&
     622                    iEx == (Int)acWedgeRefList[k].getEndX()   &&
     623                    iEy == (Int)acWedgeRefList[k].getEndY()      )
     624                {
     625                  if( acWedgeRefList[k].getRefIdx() != cWedgeNode.getPatternIdx() )
     626                  {
     627                    Bool bNew = true;
     628                    for( UInt m = 0; m < uiRefPos; m++ ) { if( acWedgeRefList[k].getRefIdx() == cWedgeNode.getRefineIdx( m ) ) { bNew = false; break; } }
     629
     630                    if( bNew )
     631                    {
     632                      cWedgeNode.setRefineIdx( acWedgeRefList[k].getRefIdx(), uiRefPos );
     633                      uiRefPos++;
     634                      break;
     635                    }
     636                  }
     637                }
     638              }
     639            }
     640          }
     641        }
     642        acWedgeNodeList.push_back( cWedgeNode );
     643      }
     644    }
     645    g_dmmWedgeNodeLists.push_back( acWedgeNodeList );
     646  }
     647  return;
     648}
     649
     650Void createWedgeList( UInt uiWidth, UInt uiHeight, std::vector<TComWedgelet> &racWedgeList, std::vector<TComWedgeRef> &racWedgeRefList, WedgeResolution eWedgeRes )
     651{
     652  assert( uiWidth == uiHeight );
     653
     654  UChar    uhStartX = 0,    uhStartY = 0,    uhEndX = 0,    uhEndY = 0;
     655  Int   iStepStartX = 0, iStepStartY = 0, iStepEndX = 0, iStepEndY = 0;
     656
     657  UInt uiBlockSize = 0;
     658  switch( eWedgeRes )
     659  {
     660  case( DOUBLE_PEL ): { uiBlockSize = (uiWidth>>1); break; }
     661  case(   FULL_PEL ): { uiBlockSize =  uiWidth;     break; }
     662  case(   HALF_PEL ): { uiBlockSize = (uiWidth<<1); break; }
     663  }
     664
     665  TComWedgelet cTempWedgelet( uiWidth, uiHeight );
     666  for( UInt uiOri = 0; uiOri < 6; uiOri++ )
     667  {
     668    // init the edge line parameters for each of the 6 wedgelet types
     669    switch( uiOri )
     670    {
     671    case( 0 ): {  uhStartX = 0;               uhStartY = 0;               uhEndX = 0;               uhEndY = 0;               iStepStartX = +1; iStepStartY =  0; iStepEndX =  0; iStepEndY = +1; break; }
     672    case( 1 ): {  uhStartX = (uiBlockSize-1); uhStartY = 0;               uhEndX = (uiBlockSize-1); uhEndY = 0;               iStepStartX =  0; iStepStartY = +1; iStepEndX = -1; iStepEndY =  0; break; }
     673    case( 2 ): {  uhStartX = (uiBlockSize-1); uhStartY = (uiBlockSize-1); uhEndX = (uiBlockSize-1); uhEndY = (uiBlockSize-1); iStepStartX = -1; iStepStartY =  0; iStepEndX =  0; iStepEndY = -1; break; }
     674    case( 3 ): {  uhStartX = 0;               uhStartY = (uiBlockSize-1); uhEndX = 0;               uhEndY = (uiBlockSize-1); iStepStartX =  0; iStepStartY = -1; iStepEndX = +1; iStepEndY =  0; break; }
     675    case( 4 ): {  uhStartX = 0;               uhStartY = 0;               uhEndX = 0;               uhEndY = (uiBlockSize-1); iStepStartX = +1; iStepStartY =  0; iStepEndX = +1; iStepEndY =  0; break; }
     676    case( 5 ): {  uhStartX = (uiBlockSize-1); uhStartY = 0;               uhEndX = 0;               uhEndY = 0;               iStepStartX =  0; iStepStartY = +1; iStepEndX =  0; iStepEndY = +1; break; }
     677    }
     678
     679    for( Int iK = 0; iK < uiBlockSize; iK++ )
     680    {
     681      for( Int iL = 0; iL < uiBlockSize; iL++ )
     682      {
     683        cTempWedgelet.setWedgelet( uhStartX + (iK*iStepStartX) , uhStartY + (iK*iStepStartY), uhEndX + (iL*iStepEndX), uhEndY + (iL*iStepEndY), (UChar)uiOri, eWedgeRes, ((iL%2)==0 && (iK%2)==0) );
     684        addWedgeletToList( cTempWedgelet, racWedgeList, racWedgeRefList );
     685      }
     686    }
     687  }
     688
     689  UInt uiThrSz = DMM3_SIMPLIFY_TR;
     690  std::vector< std::vector<UInt> > auiWdgListSz;
     691  for( Int idxM=2; idxM<=34 ; idxM++)
     692  {
     693    std::vector<UInt> auiWdgList;
     694    for( Int idxW=0; idxW<racWedgeList.size(); idxW++)
     695    {
     696      UInt uiAbsDiff = abs(idxM-(Int)racWedgeList[idxW].getAng());
     697      if( uiAbsDiff <= uiThrSz )
     698      {
     699        auiWdgList.push_back(idxW);
     700      }
     701    }
     702    auiWdgListSz.push_back(auiWdgList);
     703  }
     704  g_aauiWdgLstM3.push_back(auiWdgListSz);
     705}
     706
     707Void addWedgeletToList( TComWedgelet cWedgelet, std::vector<TComWedgelet> &racWedgeList, std::vector<TComWedgeRef> &racWedgeRefList )
     708{
     709  Bool bValid = cWedgelet.checkNotPlain();
     710  if( bValid )
     711  {
     712    for( UInt uiPos = 0; uiPos < racWedgeList.size(); uiPos++ )
     713    {
     714      if( cWedgelet.checkIdentical( racWedgeList[uiPos].getPattern() ) )
     715      {
     716        TComWedgeRef cWedgeRef;
     717        cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), uiPos );
     718        racWedgeRefList.push_back( cWedgeRef );
     719        bValid = false;
     720        return;
     721      }
     722    }
     723  }
     724  if( bValid )
     725  {
     726    for( UInt uiPos = 0; uiPos < racWedgeList.size(); uiPos++ )
     727    {
     728      if( cWedgelet.checkInvIdentical( racWedgeList[uiPos].getPattern() ) )
     729      {
     730        TComWedgeRef cWedgeRef;
     731        cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), uiPos );
     732        racWedgeRefList.push_back( cWedgeRef );
     733        bValid = false;
     734        return;
     735      }
     736    }
     737  }
     738  if( bValid )
     739  {
     740    cWedgelet.findClosestAngle();
     741    racWedgeList.push_back( cWedgelet );
     742    TComWedgeRef cWedgeRef;
     743    cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), (UInt)(racWedgeList.size()-1) );
     744    racWedgeRefList.push_back( cWedgeRef );
     745  }
     746}
     747#endif //H_3D_DIM_DMM
    520748//! \}
Note: See TracChangeset for help on using the changeset viewer.