Ignore:
Timestamp:
13 Jul 2013, 10:26:41 (11 years ago)
Author:
tech
Message:

MergeMerged tags/HTM-DEV-1.0.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-DEV-0.3-dev2/source/Lib/TLibCommon/TComSlice.cpp

    r532 r534  
    108108, m_enableTMVPFlag                ( true )
    109109#if H_MV
     110, m_refPicSetInterLayer           ( NULL )
    110111, m_layerId                       (0)
    111112, m_viewId                        (0)
     
    114115, m_isDepth                       (false)
    115116#endif
     117, m_discardableFlag               (false)
     118, m_interLayerPredEnabledFlag     (false)
     119, m_numInterLayerRefPicsMinus1    (0)
     120, m_interLayerSamplePredOnlyFlag  (false)
     121, m_altCollocatedIndicationFlag   (0)
     122, m_collocatedRefLayerIdx         (0)
    116123#if H_3D_IC
    117124, m_bApplyIC                      ( false )
     
    162169  initWpAcDcParam();
    163170  m_saoEnabledFlag = false;
     171#if H_MV
     172  for (Int i = 0; i < MAX_NUM_LAYERS; i++ )
     173  {
     174   m_interLayerPredLayerIdc[ i ] = 0;
     175  }
     176#endif
    164177}
    165178
     
    492505  UInt NumPocStCurr1 = 0;
    493506  UInt NumPocLtCurr = 0;
    494 #if H_MV
    495   Int numDirectRefLayers  = getVPS()->getNumDirectRefLayers( getLayerIdInVps() );
    496   assert( numDirectRefLayers == refPicSetInterLayer.size() );
    497 #endif
    498507  Int i;
    499508  for(i=0; i < m_pcRPS->getNumberOfNegativePictures(); i++)
     
    544553  TComPic*  rpsCurrList1[MAX_NUM_REF+1];
    545554#if H_MV
    546   Int numPocTotalCurr = NumPocStCurr0 + NumPocStCurr1 + NumPocLtCurr + numDirectRefLayers;
     555  Int numPocInterCurr = NumPocStCurr0 + NumPocStCurr1 + NumPocLtCurr;
     556  assert( numPocInterCurr == 0 || getInterRefEnabledInRPLFlag() );
     557  Int numPocTotalCurr = numPocInterCurr + getNumActiveRefLayerPics( );
    547558  assert( numPocTotalCurr == getNumRpsCurrTempList() );
    548559#else
     
    582593
    583594  Int cIdx = 0;
     595#if H_MV
     596  if ( getInterRefEnabledInRPLFlag() )
     597  { 
     598#endif
    584599  for ( i=0; i<NumPocStCurr0; i++, cIdx++)
    585600  {
     
    595610  }
    596611#if H_MV
    597   for ( i=0; i<numDirectRefLayers;  i++, cIdx++)
    598   {
    599     if( cIdx <= MAX_NUM_REF )
    600     {
     612  }
     613  for ( i=0; i < getNumActiveRefLayerPics( );  i++, cIdx++)
     614    {
     615    assert( cIdx < MAX_NUM_REF );   
    601616      rpsCurrList0[cIdx] = refPicSetInterLayer[i];
    602617    }
    603   }
    604618#endif
    605619
     
    607621  {
    608622    cIdx = 0;
     623#if H_MV
     624    if ( getInterRefEnabledInRPLFlag() )
     625    { 
     626#endif
    609627    for ( i=0; i<NumPocStCurr1; i++, cIdx++)
    610628    {
     
    620638    }
    621639#if H_MV
    622     for ( i=0; i<numDirectRefLayers;  i++, cIdx++)
    623     {
    624       if( cIdx <= MAX_NUM_REF )
    625       {
     640    }
     641    for ( i=0; i < getNumActiveRefLayerPics( );  i++, cIdx++)
     642      {
     643      assert( cIdx < MAX_NUM_REF );   
    626644        rpsCurrList1[cIdx] = refPicSetInterLayer[i];
    627645      }
    628     }
    629646#endif
    630647  }
    631648
    632649  ::memset(m_bIsUsedAsLongTerm, 0, sizeof(m_bIsUsedAsLongTerm));
     650
     651#if H_MV
     652  Int numPocSt = NumPocStCurr0 + NumPocStCurr1;
     653  assert(  getInterRefEnabledInRPLFlag( ) || numPocSt == 0 );
     654
     655  for (Int li = 0; li < 2; li++)
     656  {
     657    if ( m_eSliceType == P_SLICE && li == 1 )
     658    {
     659      m_aiNumRefIdx[1] = 0;
     660      ::memset( m_apcRefPicList[1], 0, sizeof(m_apcRefPicList[1]));
     661    }
     662    else
     663    {
     664      for (Int rIdx = 0; rIdx <= (m_aiNumRefIdx[ li ] - 1 ); rIdx ++)
     665      {
     666        Bool listModified             =                m_RefPicListModification.getRefPicListModificationFlagL( li );
     667        Int orgIdx                    = listModified ? m_RefPicListModification.getRefPicSetIdxL(li, rIdx) : (rIdx % numPocTotalCurr);
     668
     669        m_apcRefPicList    [li][rIdx] = ( li == 0 )  ? rpsCurrList0[ orgIdx  ] : rpsCurrList1[ orgIdx  ];
     670        m_bIsUsedAsLongTerm[li][rIdx] = ( orgIdx >= numPocSt ) ;
     671      }
     672    }
     673  }
     674#else
    633675
    634676  for (Int rIdx = 0; rIdx <= (m_aiNumRefIdx[0]-1); rIdx ++)
     
    652694    }
    653695  }
     696#endif
    654697}
    655698
     
    687730  }
    688731#if H_MV
    689   numRpsCurrTempList = numRpsCurrTempList + getVPS()->getNumDirectRefLayers( getLayerIdInVps() );
     732  assert( ( numRpsCurrTempList == 0 ) || getInterRefEnabledInRPLFlag() );
     733  numRpsCurrTempList = numRpsCurrTempList + getNumActiveRefLayerPics();
    690734#endif
    691735  return numRpsCurrTempList;
     
    10221066  m_enableTMVPFlag                = pSrc->m_enableTMVPFlag;
    10231067  m_maxNumMergeCand               = pSrc->m_maxNumMergeCand;
     1068
     1069#if H_MV
     1070  // Additional slice header syntax elements
     1071  m_discardableFlag            = pSrc->m_discardableFlag;
     1072  m_interLayerPredEnabledFlag  = pSrc->m_interLayerPredEnabledFlag;
     1073  m_numInterLayerRefPicsMinus1 = pSrc->m_numInterLayerRefPicsMinus1;
     1074
     1075  for (Int layer = 0; layer < MAX_NUM_LAYERS; layer++ )
     1076  {
     1077    m_interLayerPredLayerIdc[ layer ] = pSrc->m_interLayerPredLayerIdc[ layer ];
     1078  }
     1079 
     1080  m_interLayerSamplePredOnlyFlag = pSrc->m_interLayerSamplePredOnlyFlag;
     1081  m_altCollocatedIndicationFlag  = pSrc->m_altCollocatedIndicationFlag ;   
     1082  m_collocatedRefLayerIdx        = pSrc->m_collocatedRefLayerIdx       ;
     1083  m_numActiveMotionPredRefLayers = pSrc->m_numActiveMotionPredRefLayers;
     1084
     1085  for (Int layer = 0; layer < MAX_NUM_LAYER_IDS; layer++)
     1086  {   
     1087    m_interLayerPredLayerIdc[layer] = pSrc->m_interLayerPredLayerIdc[layer];
     1088  }
     1089#endif
    10241090#if H_3D_IC
    10251091  m_bApplyIC = pSrc->m_bApplyIC;
     
    14891555, m_numHrdParameters          (  0)
    14901556#if H_MV
    1491 , m_maxNuhLayerId             (  0)
     1557, m_maxLayerId             (  0)
    14921558#else
    14931559, m_maxNuhReservedZeroLayerId (  0)
     
    15081574  }
    15091575#if H_MV
     1576  for (Int lsIdx = 0; lsIdx < MAX_VPS_OP_SETS_PLUS1; lsIdx++ )
     1577  { 
     1578    for( Int layerId = 0; layerId < MAX_VPS_NUH_LAYER_ID_PLUS1; layerId++ )
     1579    {
     1580      m_layerIdIncludedFlag[lsIdx][layerId] = false;
     1581    }
     1582  }
     1583
     1584  m_vpsNumberLayerSetsMinus1     = -1;
     1585  m_vpsNumProfileTierLevelMinus1 = -1;
     1586   
     1587  for ( Int i = 0; i < MAX_VPS_PROFILE_TIER_LEVEL; i++)
     1588  {
     1589    m_profileRefMinus1[ i ] = -1;
     1590  }
     1591   
     1592  m_moreOutputLayerSetsThanDefaultFlag = false;   
     1593  m_numAddOutputLayerSetsMinus1        = -1;   
     1594  m_defaultOneTargetOutputLayerFlag    = false;
     1595 
     1596  for ( Int i = 0; i < MAX_VPS_OUTPUTLAYER_SETS; i++)
     1597  {
     1598    m_outputLayerSetIdxMinus1[i]  = -1;
     1599    m_profileLevelTierIdx[i]      = 0;
     1600    for ( Int j = 0; j < MAX_VPS_NUH_LAYER_ID_PLUS1; j++)
     1601    {
     1602      m_outputLayerFlag[i][j] = false;
     1603    }
     1604  }
     1605 
     1606  m_maxOneActiveRefLayerFlag = false;
     1607  m_directDepTypeLenMinus2   = 0;         
     1608 
     1609
    15101610  m_avcBaseLayerFlag = false;
    15111611  m_splittingFlag    = false;
     
    15181618
    15191619  m_vpsNuhLayerIdPresentFlag = false;
    1520   m_numOutputLayerSets       = 0;
    15211620
    15221621  for( Int i = 0; i < MAX_VPS_OP_SETS_PLUS1; i++ )
    15231622  {
    15241623    m_vpsProfilePresentFlag   [i] = false;
    1525     m_profileLayerSetRefMinus1[i] = 0;
    1526     m_outputLayerSetIdx       [i] = 0;
     1624    m_profileRefMinus1[i] = 0;
     1625    m_outputLayerSetIdxMinus1       [i] = 0;
    15271626    for( Int j = 0; j < MAX_VPS_NUH_LAYER_ID_PLUS1; j++ )
    15281627    {
     
    15401639    m_layerIdInNuh      [i] = ( i == 0 ) ? 0 : -1;
    15411640    m_numDirectRefLayers[i] = 0;
     1641    m_maxTidIlRefPicPlus1[i] = -1;
    15421642#if H_3D
    15431643    m_viewIndex         [i] = -1;
     
    15661666    {
    15671667      m_directDependencyFlag[i][j] = false;
     1668      m_directDependencyType[i][j] = -1;
    15681669      m_refLayerId[i][j]           = -1;
    15691670    }
     
    16861787Bool TComVPS::checkVPSExtensionSyntax()
    16871788{
    1688   // check splitting flag constraint
    1689   if ( getSplittingFlag() )
    1690   {
    1691     // Derive dimBitOffset[j]
    1692     Int dimBitOffset[MAX_NUM_SCALABILITY_TYPES+1];
    1693     Int numScalabilityTypes = getNumScalabilityTypes();
    1694     dimBitOffset[0] = 0;
    1695 
    1696     for (Int type = 1; type <= numScalabilityTypes; type++ )
    1697     {
    1698       dimBitOffset[ type ] = 0;
    1699       for (Int dimIdx = 0; dimIdx <= type - 1; dimIdx++)
    1700         dimBitOffset[ type ] += ( getDimensionIdLen( dimIdx ) );
    1701     }
    1702 
    1703     for (Int type = 0; type < getNumScalabilityTypes(); type++ )
    1704     {
    1705       for( Int layer = 1; layer < getMaxLayers(); layer++ )
    1706       {
    1707         assert( getDimensionId( layer, type ) == ( ( getLayerIdInNuh( layer ) & ( (1 << dimBitOffset[ type + 1 ] ) - 1) ) >> dimBitOffset[ type ] ) );
    1708       };
    1709   };
    1710   }
    1711 
    17121789  for( Int layer = 1; layer < getMaxLayers(); layer++ )
    17131790  {
     
    17371814}
    17381815
    1739 
    1740 
    17411816Void TComVPS::setScalabilityMask( UInt val )
    17421817{
     
    17451820}
    17461821
    1747 Void TComVPS::calcIvRefLayers()
    1748 {
    1749   for( Int i = 1; i <= getMaxLayers(); i++ )
     1822Void TComVPS::setRefLayers()
     1823{
     1824  for( Int i = 0; i < MAX_NUM_LAYERS; i++ )
    17501825  {
     1826    m_numSamplePredRefLayers[ i ] = 0;
     1827    m_numMotionPredRefLayers[ i ] = 0;
    17511828    m_numDirectRefLayers[ i ] = 0;
     1829    for( Int j = 0; j < MAX_NUM_LAYERS; j++ ) {
     1830      m_samplePredEnabledFlag[ i ][ j ] = 0;
     1831      m_motionPredEnabledFlag[ i ][ j ] = 0;
     1832      m_refLayerId[ i ][ j ] = 0;
     1833      m_samplePredRefLayerId[ i ][ j ] = 0;
     1834      m_motionPredRefLayerId[ i ][ j ] = 0;
     1835    }
     1836  }
     1837
     1838  for( Int i = 1; i  <= getMaxLayers()- 1; i++ )
     1839  {
     1840    for( Int j = 0; j < i; j++ )
     1841    {
     1842      if( getDirectDependencyFlag(i,j) )
     1843      {
     1844        m_refLayerId[ i ][m_numDirectRefLayers[ i ]++ ] = getLayerIdInNuh( j );
     1845
     1846        m_samplePredEnabledFlag [ i ][ j ]  = ( (   getDirectDependencyType( i , j ) + 1 ) & 1 ) == 1;
     1847        m_numSamplePredRefLayers[ i ]      += m_samplePredEnabledFlag [ i ][ j ] ? 1 : 0;
     1848        m_motionPredEnabledFlag [ i ][ j ]  = ( ( ( getDirectDependencyType( i , j ) + 1 ) & 2 ) >> 1 ) == 1;
     1849        m_numMotionPredRefLayers[ i ]      += m_motionPredEnabledFlag  [ i][ j ] ? 1 : 0;
     1850      }
     1851    }
     1852  }
     1853
     1854  for( Int i = 1, mIdx = 0, sIdx = 0; i <= getMaxLayers()- 1; i++ )
     1855  {   
    17521856    for( Int j = 0 ; j < i; j++ )
    1753       if( m_directDependencyFlag[ i ][ j ])
    1754         m_refLayerId[ i ][ m_numDirectRefLayers[ i ]++ ] = m_layerIdInNuh[ j ];   
     1857    {
     1858      if( m_motionPredEnabledFlag[ i ][ j ] )
     1859      {
     1860        m_motionPredRefLayerId[ i ][ mIdx++ ] = getLayerIdInNuh( j );
     1861      }
     1862     
     1863      if( m_samplePredEnabledFlag[ i ][ j ] )
     1864      {
     1865        m_samplePredRefLayerId[ i ][ sIdx++ ] = getLayerIdInNuh( j );
     1866      }
     1867    }
    17551868  }
    17561869}
     
    18141927  return getLayerIdInNuh( foundlayerId );
    18151928}
     1929
    18161930#endif // H_3D
     1931
     1932Int TComVPS::xCeilLog2( Int val )
     1933{
     1934  assert( val > 0 );
     1935  Int ceilLog2 = 0;
     1936  while( val > ( 1 << ceilLog2 ) ) ceilLog2++;
     1937  return ceilLog2;
     1938}
     1939
     1940
     1941Int TComVPS::xGetDimBitOffset( Int j )
     1942{
     1943  Int dimBitOffset = 0;
     1944  if ( getSplittingFlag() && j == getNumScalabilityTypes() )
     1945  {
     1946     dimBitOffset = 6;
     1947  }
     1948  else
     1949  {
     1950    for (Int dimIdx = 0; dimIdx <= j-1; dimIdx++)
     1951    {
     1952      dimBitOffset += getDimensionIdLen( dimIdx );
     1953    }
     1954  }
     1955  return dimBitOffset;
     1956}
     1957
     1958Int TComVPS::inferDimensionId( Int i, Int j )
     1959{
     1960    return ( ( getLayerIdInNuh( i ) & ( (1 << xGetDimBitOffset( j + 1 ) ) - 1) ) >> xGetDimBitOffset( j ) );
     1961}
     1962
     1963Int TComVPS::inferLastDimsionIdLenMinus1()
     1964{
     1965  return ( 5 - xGetDimBitOffset( getNumScalabilityTypes() - 1 ) );
     1966}
     1967
     1968Int TComVPS::getNumLayersInIdList( Int lsIdx )
     1969{
     1970  assert( lsIdx >= 0 );
     1971  assert( lsIdx <= getVpsNumLayerSetsMinus1() );
     1972  Int numLayersInIdList = 0;
     1973  for (Int layerId = 0; layerId < getVpsMaxLayerId(); layerId++ )
     1974  {
     1975    numLayersInIdList += ( getLayerIdIncludedFlag( lsIdx, layerId ) );
     1976  }
     1977  return numLayersInIdList;
     1978}
    18171979#endif // H_MV
    18181980
     
    18652027#if H_MV
    18662028, m_interViewMvVertConstraintFlag (false)
     2029, m_numIlpRestrictedRefLayers ( 0 )
     2030
    18672031#endif
    18682032#if H_3D
     
    18832047  ::memset(m_ltRefPicPocLsbSps, 0, sizeof(m_ltRefPicPocLsbSps));
    18842048  ::memset(m_usedByCurrPicLtSPSFlag, 0, sizeof(m_usedByCurrPicLtSPSFlag));
     2049#if H_MV
     2050  for (Int i = 0; i < MAX_NUM_LAYERS; i++ )
     2051  {
     2052    m_minSpatialSegmentOffsetPlus1[ i ] = 0;
     2053    m_ctuBasedOffsetEnabledFlag   [ i ] = false;
     2054    m_minHorizontalCtuOffsetPlus1 [ i ] = 0;
     2055  }
     2056#endif
    18852057}
    18862058
     
    23612533  refPicSetInterLayer.clear();
    23622534
    2363   for( Int i = 0; i < getVPS()->getNumDirectRefLayers( getLayerIdInVps() ); i++ )
    2364   {
    2365     Int layerIdRef = getVPS()->getRefLayerId( getLayerIdInVps(), i );
     2535  for( Int i = 0; i < getNumActiveRefLayerPics(); i++ )
     2536  {
     2537    Int layerIdRef = getRefPicLayerId( i );
    23662538    TComPic* picRef = ivPicLists->getPic( layerIdRef, getPOC() ) ;
    23672539    assert ( picRef != 0 );
     
    23712543    picRef->getSlice(0)->setReferenced( true );       
    23722544
     2545    // Consider to check here:
     2546    // "If the current picture is a RADL picture, there shall be no entry in the RefPicSetInterLayer that is a RASL picture. "
    23732547    refPicSetInterLayer.push_back( picRef );
    23742548  }
     
    24412615    }
    24422616  }
     2617}
     2618Int TComSlice::xCeilLog2( Int val )
     2619{
     2620  assert( val > 0 );
     2621  Int ceilLog2 = 0;
     2622  while( val > ( 1 << ceilLog2 ) ) ceilLog2++;
     2623  return ceilLog2;
     2624}
     2625
     2626Void TComSlice::markCurrPic( TComPic* currPic )
     2627{
     2628  if ( !currPic->getSlice(0)->getDiscardableFlag() )
     2629  {
     2630    currPic->getSlice(0)->setReferenced( true ) ;
     2631    currPic->setIsLongTerm( false );
     2632  }
     2633  else
     2634  {
     2635    currPic->getSlice(0)->setReferenced( false ) ;
     2636  }
     2637}
     2638
     2639Void TComSlice::setRefPicSetInterLayer( std::vector<TComPic*>* refPicSetInterLayer )
     2640{
     2641  m_refPicSetInterLayer = refPicSetInterLayer;
     2642}
     2643
     2644TComPic* TComSlice::getPicFromRefPicSetInterLayer( Int layerId )
     2645{
     2646  assert( m_refPicSetInterLayer != 0 );
     2647  assert( (*m_refPicSetInterLayer).size() == getNumActiveRefLayerPics() );
     2648  TComPic* pcPic = NULL;
     2649  for ( Int i = 0; i < getNumActiveRefLayerPics(); i++ )
     2650  {
     2651    if ((*m_refPicSetInterLayer)[ i ]->getLayerId() == layerId)
     2652    {
     2653      pcPic = (*m_refPicSetInterLayer)[ i ];
     2654    }
     2655  }
     2656  assert(pcPic != NULL);
     2657  return pcPic;
     2658}
     2659
     2660Int TComSlice::getNumActiveRefLayerPics()
     2661{
     2662  Int numActiveRefLayerPics;
     2663
     2664  if( getLayerId() == 0 || getVPS()->getNumDirectRefLayers( getLayerIdInVps() ) ==  0 || !getInterLayerPredEnabledFlag() )
     2665  {
     2666    numActiveRefLayerPics = 0;
     2667  }
     2668  else if( getVPS()->getMaxOneActiveRefLayerFlag() || getVPS()->getNumDirectRefLayers( getLayerIdInVps() ) == 1 )
     2669  {
     2670    numActiveRefLayerPics = 1;
     2671  }
     2672  else
     2673  {
     2674    numActiveRefLayerPics = getNumInterLayerRefPicsMinus1() + 1;
     2675  }
     2676  return numActiveRefLayerPics;
     2677}
     2678
     2679Int TComSlice::getRefPicLayerId( Int i )
     2680{
     2681  return getVPS()->getRefLayerId( getLayerIdInVps(), getInterLayerPredLayerIdc( i ) );
     2682}
     2683
     2684Void TComSlice::setActiveMotionPredRefLayers()
     2685{
     2686  Int j = 0;
     2687  for( Int i = 0; i < getNumActiveRefLayerPics(); i++)
     2688  {
     2689    if( getVPS()->getMotionPredEnabledFlag( getLayerIdInVps(), getInterLayerPredLayerIdc( i ))  )
     2690    {
     2691      m_activeMotionPredRefLayerId[ j++ ] = getVPS()->getRefLayerId( getLayerIdInVps(), i );
     2692    }
     2693  }
     2694  m_numActiveMotionPredRefLayers = j;
     2695
     2696  // Consider incorporating bitstream conformance tests on derived variables here.
     2697}
     2698
     2699Bool TComSlice::getInterRefEnabledInRPLFlag()
     2700{
     2701  Bool interRefEnabledInRPLFlag;
     2702  if ( getVPS()->getNumSamplePredRefLayers( getLayerIdInVps() ) > 0 && getNumActiveRefLayerPics() > 0 )
     2703  {
     2704    interRefEnabledInRPLFlag = !getInterLayerSamplePredOnlyFlag();
     2705  }
     2706  else
     2707  {
     2708    interRefEnabledInRPLFlag = 1;
     2709  }
     2710  return interRefEnabledInRPLFlag;
    24432711}
    24442712#if H_3D_ARP
Note: See TracChangeset for help on using the changeset viewer.