Changeset 1054 in 3DVCSoftware for branches/HTM-12.0-dev1/source/App


Ignore:
Timestamp:
26 Sep 2014, 18:34:05 (11 years ago)
Author:
tech
Message:

Integration of various MV-HEVC HLS changes.

Location:
branches/HTM-12.0-dev1/source/App
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-12.0-dev1/source/App/TAppDecoder/TAppDecCfg.cpp

    r872 r1054  
    9494  ("TarDecLayerIdSetFile,l", cfg_TargetDecLayerIdSetFile, string(""), "targetDecLayerIdSet file name. The file should include white space separated LayerId values to be decoded. Omitting the option or a value of -1 in the file decodes all layers.")
    9595  ("RespectDefDispWindow,w", m_respectDefDispWindow, 0, "Only output content inside the default display window\n")
     96#if H_MV
     97#if H_MV_HLS10_GEN_FIX
     98  ("OutputVpsInfo,v", m_outputVpsInfo, false, "Output information about the layer dependencies and layer sets")
     99#endif
     100#endif
    96101  ;
    97102  po::setDefaults(opts);
  • branches/HTM-12.0-dev1/source/App/TAppDecoder/TAppDecCfg.h

    r964 r1054  
    8080
    8181#if H_MV
     82#if H_MV_HLS10_GEN_FIX
     83  Bool          m_outputVpsInfo;                     ///< Output VPS information
     84#endif
    8285  Void xAppendToFileNameEnd( Char* pchInputFileName, const Char* pchStringToAppend, Char*& rpchOutputFileName); ///< create filenames
    8386#endif
  • branches/HTM-12.0-dev1/source/App/TAppDecoder/TAppDecTop.cpp

    r976 r1054  
    239239          {
    240240            TComVPS* vps = m_vps;
    241           if ( m_targetOptLayerSetIdx == -1 )
     241            if ( m_targetOptLayerSetIdx == -1 )
     242            {
     243              // Not normative! Corresponds to specification by "External Means". (Should be set equal to 0, when no external means available. )
     244              m_targetOptLayerSetIdx = vps->getVpsNumLayerSetsMinus1();
     245            }
     246
     247            for (Int dI = 0; dI < m_numDecoders; dI++ )
     248            {
     249              m_tDecTop[decIdx]->setTargetOptLayerSetIdx( m_targetOptLayerSetIdx );
     250            }
     251
     252            if ( m_targetOptLayerSetIdx < 0 || m_targetOptLayerSetIdx >= vps->getNumOutputLayerSets() )
     253            {
     254              fprintf(stderr, "\ntarget output layer set index must be in the range of 0 to %d, inclusive \n", vps->getNumOutputLayerSets() - 1 );           
     255              exit(EXIT_FAILURE);
     256            }
     257            m_targetDecLayerIdSet = vps->getTargetDecLayerIdList( m_targetOptLayerSetIdx );
     258          }
     259#if H_MV_HLS10_GEN_FIX
     260          if (m_outputVpsInfo )
    242261          {
    243             // Not normative! Corresponds to specification by "External Means". (Should be set equal to 0, when no external means available. )
    244             m_targetOptLayerSetIdx = vps->getVpsNumLayerSetsMinus1();
     262            m_vps->printLayerDependencies();
     263            m_vps->printLayerSets();
     264            m_vps->printPTL();
    245265          }
    246 
    247           for (Int dI = 0; dI < m_numDecoders; dI++ )
    248           {
    249             m_tDecTop[decIdx]->setTargetOptLayerSetIdx( m_targetOptLayerSetIdx );
    250           }
    251 
    252           if ( m_targetOptLayerSetIdx < 0 || m_targetOptLayerSetIdx >= vps->getNumOutputLayerSets() )
    253           {
    254             fprintf(stderr, "\ntarget output layer set index must be in the range of 0 to %d, inclusive \n", vps->getNumOutputLayerSets() - 1 );           
    255             exit(EXIT_FAILURE);
    256           }
    257           m_targetDecLayerIdSet = vps->getTargetDecLayerIdList( m_targetOptLayerSetIdx );
    258         }
    259       }
     266#endif
     267        }
    260268#if H_3D
    261269        if (nalu.m_nalUnitType == NAL_UNIT_VPS )
     
    569577  Int dpbFullness = 0;
    570578#if H_MV
     579#if H_MV_HLS10_ADD_LAYERSETS
     580  TComSPS* activeSPS = m_tDecTop[ decIdx ]->getActiveSPS();
     581#else
    571582  // preliminary fix
    572583  TComSPS* activeSPS = m_tDecTop[0]->getActiveSPS();
     584#endif
    573585#else
    574586  TComSPS* activeSPS = m_cTDecTop.getActiveSPS();
  • branches/HTM-12.0-dev1/source/App/TAppEncoder/TAppEncCfg.cpp

    r1039 r1054  
    241241  {"main-still-picture", Profile::MAINSTILLPICTURE},
    242242#if H_MV
     243#if H_MV_HLS10_PTL
     244  {"multiview-main", Profile::MULTIVIEWMAIN},
     245#if H_3D
     246  {"3d-main"       , Profile::MAIN3D},
     247#endif
     248
     249#else
    243250  {"main-stereo",    Profile::MAINSTEREO},
    244251  {"main-multiview", Profile::MAINMULTIVIEW},
    245252#if H_3D
    246253  {"main-3d"    , Profile::MAIN3D},
     254#endif
    247255#endif
    248256#endif
     
    333341#if H_MV
    334342  vector<Int>   cfg_dimensionLength;
     343#if H_MV_HLS10_PTL
     344  string        cfg_profiles;
     345  string        cfg_levels;
     346  string        cfg_tiers;
     347#endif
    335348#if H_3D
    336349  cfg_dimensionLength.push_back( 2  );  // depth
     
    388401#endif
    389402#endif
    390   ("LayerIdInNuh",          m_layerIdInNuh       , std::vector<Int>(1,0), "LayerId in Nuh")
     403#if H_MV_HLS10_GEN_FIX
     404  ("TargetEncLayerIdList",  m_targetEncLayerIdList, std::vector<Int>(0,0), "LayerIds in Nuh to be encoded") 
     405#endif
     406  ("LayerIdInNuh",          m_layerIdInNuh       , std::vector<Int>(1,0), "LayerId in Nuh") 
    391407  ("SplittingFlag",         m_splittingFlag      , false                , "Splitting Flag")   
    392408
     
    394410  ("VpsNumLayerSets",       m_vpsNumLayerSets    , 1                    , "Number of layer sets")   
    395411  ("LayerIdsInSet_%d",      m_layerIdsInSets     , std::vector<Int>(1,0), MAX_VPS_OP_SETS_PLUS1 ,"LayerIds of Layer set") 
     412#if H_MV_HLS10_ADD_LAYERSETS
     413  ("NumAddLayerSets"     , m_numAddLayerSets     , 0                                              , "NumAddLayerSets     ")
     414  ("HighestLayerIdxPlus1_%d", m_highestLayerIdxPlus1, std::vector< Int  >(0,0)  ,MAX_VPS_NUM_ADD_LAYER_SETS, "HighestLayerIdxPlus1")
     415#endif
    396416  ("DefaultTargetOutputLayerIdc"     , m_defaultOutputLayerIdc     , 0, "Specifies output layers of layer sets, 0: output all layers, 1: output highest layer, 2: specified by LayerIdsInDefOutputLayerSet")
    397417  ("OutputLayerSetIdx",     m_outputLayerSetIdx  , std::vector<Int>(0,0), "Indices of layer sets used as additional output layer sets") 
     
    400420  ("LayerIdsInDefOutputLayerSet_%d", m_layerIdsInDefOutputLayerSet      , std::vector<Int>(0,0), MAX_VPS_OP_SETS_PLUS1, "Indices in VPS of output layers in layer set") 
    401421  ("AltOutputLayerFlag",    m_altOutputLayerFlag , std::vector<Bool>(1,0), "Alt output layer flag")
     422 
     423#if H_MV_HLS10_PTL
     424  ("ProfileTierLevelIdx_%d",  m_profileTierLevelIdx, std::vector<Int>(0), MAX_NUM_LAYERS, "Indices to profile level tier")
     425#else
    402426  ("ProfileLevelTierIdx",   m_profileLevelTierIdx, std::vector<Int>(1,0), "Indices to profile level tier")
    403  
     427#endif
    404428  // Layer dependencies
    405429  ("DirectRefLayers_%d",    m_directRefLayers    , std::vector<Int>(0,0), MAX_NUM_LAYERS, "LayerIds of direct reference layers")
     
    431455 
    432456  // Profile and level
     457#if H_MV_HLS10_PTL
     458  ("Profile", cfg_profiles,   string(""),           "Profile in VpsProfileTierLevel (Indication only)")
     459  ("Level",   cfg_levels ,    string(""),           "Level indication in VpsProfileTierLevel (Indication only)")
     460  ("Tier",    cfg_tiers  ,    string(""),           "Tier indication in VpsProfileTierLevel (Indication only)")
     461  ("InblFlag",m_inblFlag ,    std::vector<Bool>(0), "InblFlags in VpsProfileTierLevel (Indication only)" )
     462#else
    433463  ("Profile", m_profile,   Profile::NONE, "Profile to be used when encoding (Incomplete)")
    434464  ("Level",   m_level,     Level::NONE,   "Level limit to be used, eg 5.1 (Incomplete)")
    435465  ("Tier",    m_levelTier, Level::MAIN,   "Tier to use for interpretation of --Level")
    436 
     466#endif
    437467  ("ProgressiveSource", m_progressiveSourceFlag, false, "Indicate that source is progressive")
    438468  ("InterlacedSource",  m_interlacedSourceFlag,  false, "Indicate that source is interlaced")
     
    613643#endif
    614644#if H_MV
    615 
     645#if H_MV_HLS10_GEN_FIX
     646// A lot of this stuff could should actually be derived by the encoder.
     647#endif // H_MV_HLS10_GEN
    616648  // VPS VUI
    617649  ("VpsVuiPresentFlag"           , m_vpsVuiPresentFlag           , false                                           , "VpsVuiPresentFlag           ")
     
    637669  ("CtuBasedOffsetEnabledFlag"   , m_ctuBasedOffsetEnabledFlag   , std::vector< Bool >(1,0)  ,MAX_NUM_LAYERS       , "CtuBasedOffsetEnabledFlag    per direct reference for the N-th layer")
    638670  ("MinHorizontalCtuOffsetPlus1" , m_minHorizontalCtuOffsetPlus1 , std::vector< Int  >(1,0)  ,MAX_NUM_LAYERS       , "MinHorizontalCtuOffsetPlus1  per direct reference for the N-th layer")
     671#if H_MV_HLS10_VPS_VUI
     672  ("SingleLayerForNonIrapFlag", m_singleLayerForNonIrapFlag, false                                          , "SingleLayerForNonIrapFlag")
     673  ("HigherLayerIrapSkipFlag"  , m_higherLayerIrapSkipFlag  , false                                          , "HigherLayerIrapSkipFlag  ")
     674#endif
    639675#endif
    640676
     
    742778  ("SEISubBitstreamAvgBitRate",               m_sbPropAvgBitRate,             std::vector< Int  >(1,0)  ,"Specifies average bit rate of the i-th sub-bitstream")
    743779  ("SEISubBitstreamMaxBitRate",               m_sbPropMaxBitRate,             std::vector< Int  >(1,0)  ,"Specifies maximum bit rate of the i-th sub-bitstream")
     780
     781#if H_MV_HLS10_GEN_FIX
     782  ("OutputVpsInfo",                           m_outputVpsInfo,                false                     ,"Output information about the layer dependencies and layer sets")
     783#endif
    744784#endif
    745785#if H_3D
     
    792832#endif //H_3D
    793833  ;
    794   #if H_MV
     834
     835#if H_MV
    795836  // parse coding structure
    796837  for( Int k = 0; k < MAX_NUM_LAYERS; k++ )
     
    10671108  xResizeVector( m_wppInUseFlag );
    10681109
     1110#if H_MV_HLS10_ADD_LAYERSETS
     1111  for (Int olsIdx = 0; olsIdx < m_vpsNumLayerSets + m_numAddLayerSets + (Int) m_outputLayerSetIdx.size(); olsIdx++)
     1112#else
    10691113  for (Int olsIdx = 0; olsIdx < m_vpsNumLayerSets + (Int) m_outputLayerSetIdx.size(); olsIdx++)
     1114#endif
    10701115  {   
    10711116    m_altOutputLayerFlag.push_back( false );     
     
    11771222    }
    11781223  }
     1224
     1225#if H_MV
     1226#if H_MV_HLS10_PTL
     1227  // parse PTL
     1228  Bool anyEmpty = false;
     1229  if( cfg_profiles.empty() )
     1230  {
     1231#if H_3D
     1232    cfg_profiles = string("main main 3D-main");
     1233#else
     1234    cfg_profiles = string("main main multiview-main");   
     1235#endif
     1236    fprintf(stderr, "\nWarning: No profiles given, using defaults: %s", cfg_profiles.c_str() );
     1237    anyEmpty = true;
     1238  }
     1239
     1240  if( cfg_levels.empty() )
     1241  {
     1242    cfg_levels = string("none none none");
     1243    fprintf(stderr, "\nWarning: No levels given, using defaults: %s", cfg_levels.c_str() );
     1244    anyEmpty = true;
     1245  }
     1246
     1247  if( cfg_tiers.empty() )
     1248  {
     1249    cfg_tiers = string("main main main");
     1250    fprintf(stderr, "\nWarning: No tiers given, using defaults: %s", cfg_tiers.c_str());
     1251    anyEmpty = true;
     1252  }
     1253
     1254  if( m_inblFlag.empty() )
     1255  {
     1256    fprintf(stderr, "\nWarning: No inblFlags given, using defaults:");
     1257    for( Int i = 0; i < 3; i++)
     1258    {
     1259      m_inblFlag.push_back( false );
     1260      fprintf(stderr," %d", (Int) m_inblFlag[i]);
     1261    }
     1262    anyEmpty = true;
     1263  }   
     1264
     1265  if ( anyEmpty )
     1266  {
     1267    fprintf( stderr, "\n" );
     1268  }
     1269
     1270  xReadStrToEnum( cfg_profiles, m_profile   );
     1271  xReadStrToEnum( cfg_levels,   m_level     );
     1272  xReadStrToEnum( cfg_tiers ,   m_levelTier );
     1273#endif
     1274#endif
    11791275#if H_3D
    11801276  // set global varibles
     
    12911387    fprintf(stderr, "******************************************************************\n");
    12921388  }
     1389
     1390
     1391#if !H_MV_HLS10_PTL
    12931392  if( m_profile==Profile::NONE )
    12941393  {
     
    13031402    fprintf(stderr, "***************************************************************************\n");
    13041403  }
     1404#endif
    13051405
    13061406  Bool check_failed = false; /* abort if there is a fatal configuration problem */
     
    14281528  {   
    14291529    Int refLayerSetIdx = m_outputLayerSetIdx[ lsIdx ];
     1530#if H_MV_HLS10_ADD_LAYERSETS
     1531    xConfirmPara(  refLayerSetIdx < 0 || refLayerSetIdx >= m_vpsNumLayerSets + m_numAddLayerSets, "Output layer set idx must be greater or equal to 0 and less than the VpsNumLayerSets plus NumAddLayerSets." );
     1532#else
    14301533    xConfirmPara(  refLayerSetIdx < 0 || refLayerSetIdx >= m_vpsNumLayerSets, "Output layer set idx must be greater or equal to 0 and less than the VpsNumLayerSets." );
    1431 
     1534#endif
     1535#if !H_MV_HLS10_ADD_LAYERSETS
    14321536    for (Int i = 0; i < m_layerIdsInAddOutputLayerSet[ lsIdx ].size(); i++)
    14331537    {
     
    14431547      xConfirmPara( !isAlsoInLayerSet, "All output layers of a output layer set be included in corresponding layer set.");
    14441548    }
     1549#endif
    14451550  }
    14461551
     
    14541559      anyDefaultOutputFlag = anyDefaultOutputFlag || ( m_layerIdsInDefOutputLayerSet[lsIdx].size() != 0 );
    14551560    }   
     1561#if H_MV_HLS10_ADD_LAYERSETS
     1562    if ( anyDefaultOutputFlag )
     1563    {   
     1564      printf( "\nWarning: Ignoring LayerIdsInDefOutputLayerSet parameters, since defaultTargetOuputLayerIdc is not equal 2.\n" );   
     1565    }
     1566#else
    14561567    printf( "\nWarning: Ignoring LayerIdsInDefOutputLayerSet parameters, since defaultTargetOuputLayerIdc is not equal 2.\n" );   
     1568#endif
    14571569  }
    14581570  else 
     
    14761588  }
    14771589
     1590#if H_MV_HLS10_ADD_LAYERSETS
     1591  xConfirmPara( m_altOutputLayerFlag.size() < m_vpsNumLayerSets + m_numAddLayerSets + m_outputLayerSetIdx.size(), "The number of alt output layer flags must be equal to the number of layer set additional output layer sets plus the number of output layer set indices" );
     1592#else
    14781593  xConfirmPara( m_altOutputLayerFlag.size() < m_vpsNumLayerSets + m_outputLayerSetIdx.size(), "The number of Profile Level Tier indices must be equal to the number of layer set plus the number of output layer set indices" );
    1479   xConfirmPara( m_profileLevelTierIdx.size() < m_vpsNumLayerSets + m_outputLayerSetIdx.size(), "The number of Profile Level Tier indices must be equal to the number of layer set plus the number of output layer set indices" );
    1480 
    1481   // Layer Dependencies 
     1594#endif
     1595
     1596  // PTL
     1597#if H_MV_HLS10_PTL
     1598    xConfirmPara( ( m_profile.size() != m_inblFlag.size() || m_profile.size() != m_level.size()  ||  m_profile.size() != m_levelTier.size() ), "The number of Profiles, Levels, Tiers and InblFlags must be equal." );
     1599
     1600    if ( m_numberOfLayers > 1)
     1601    {
     1602      xConfirmPara( m_profile.size() <= 1, "The number of profiles, tiers, levels, and inblFlags must be greater than 1.");
     1603      xConfirmPara( m_inblFlag[0], "VpsProfileTierLevel[0] must have inblFlag equal to 0");
     1604      if (m_profile.size() > 1 )
     1605      {
     1606        xConfirmPara( m_profile[0]  != m_profile[1], "The profile in VpsProfileTierLevel[1] must be equal to the profile in VpsProfileTierLevel[0].");
     1607        xConfirmPara( m_inblFlag[0] != m_inblFlag[1], "inblFlag in VpsProfileTierLevel[1] must be equal to the inblFlag in VpsProfileTierLevel[0].");
     1608      }
     1609    }
     1610#else
     1611    xConfirmPara( m_profileLevelTierIdx.size() < m_vpsNumLayerSets + m_outputLayerSetIdx.size(), "The number of Profile Level Tier indices must be equal to the number of layer set plus the number of output layer set indices" );
     1612#endif
     1613
     1614    // Layer Dependencies 
    14821615  for (Int i = 0; i < m_numberOfLayers; i++ )
    14831616  {
     
    23412474#endif
    23422475#if H_MV
     2476#if H_MV_HLS10_GEN_FIX
     2477  xPrintParaVector( "NuhLayerId"     , m_layerIdInNuh );
     2478  if ( m_targetEncLayerIdList.size() > 0)
     2479  {
     2480    xPrintParaVector( "TargetEncLayerIdList"     , m_targetEncLayerIdList );
     2481  }
     2482#endif
    23432483  xPrintParaVector( "ViewIdVal"     , m_viewId );
    23442484  xPrintParaVector( "ViewOrderIndex", m_viewOrderIndex );
  • branches/HTM-12.0-dev1/source/App/TAppEncoder/TAppEncCfg.h

    r1039 r1054  
    8181  std::vector<Int>       m_depthFlag;                         ///< depth flag
    8282#endif
     83#if H_MV_HLS10_GEN_FIX
     84  std::vector<Int>       m_targetEncLayerIdList;              ///< layer Ids in Nuh to be encoded
     85#endif
    8386  std::vector<Int>       m_layerIdInNuh;                      ///< layer Id in Nuh for each layer
    8487  Bool                   m_splittingFlag;                     ///< Splitting Flag
     
    8992  Int                    m_vpsNumLayerSets;                   ///< Number of layer sets
    9093  std::vector< std::vector<Int> > m_layerIdsInSets;           ///< LayerIds in vps of layer set
    91   Int                    m_defaultOutputLayerIdc;       ///< Specifies output layers of layer sets, 0: output all layers, 1: output highest layers, 2: specified by LayerIdsInDefOuputLayerSet
     94#if H_MV_HLS10_ADD_LAYERSETS
     95  Int                    m_numAddLayerSets;                    ///< Number of additional layer sets
     96  std::vector< std::vector<Int> > m_highestLayerIdxPlus1;      ///< HighestLayerIdxPlus1 for each additional layer set and each independent layer (value with index 0 will be ignored)
     97#endif
     98  Int                    m_defaultOutputLayerIdc;             ///< Specifies output layers of layer sets, 0: output all layers, 1: output highest layers, 2: specified by LayerIdsInDefOuputLayerSet
    9299  std::vector<Int>       m_outputLayerSetIdx;                 ///< Indices of layer sets used as additional output layer sets 
    93100  std::vector< std::vector<Int> > m_layerIdsInAddOutputLayerSet; ///< LayerIds in vps of additional output layers
    94101  std::vector< std::vector<Int> > m_layerIdsInDefOutputLayerSet; ///< Indices in vps of output layers in layer sets
     102#if H_MV_HLS10_ADD_LAYERSETS
     103  std::vector< std::vector< Int > > m_profileTierLevelIdx;      ///< Indices of of profile, per layer in layer set
     104#else
    95105  std::vector<Int>       m_profileLevelTierIdx;               ///< Indices of of profile level tier
     106#endif
    96107  std::vector<Bool>      m_altOutputLayerFlag;                ///< Alt output layer flag
    97108
     
    124135  std::vector< std::vector<Bool > > m_ctuBasedOffsetEnabledFlag;
    125136  std::vector< std::vector<Int  > > m_minHorizontalCtuOffsetPlus1;
     137#if H_MV_HLS10_VPS_VUI
     138  Bool m_singleLayerForNonIrapFlag;
     139  Bool m_higherLayerIrapSkipFlag;
     140#endif // H_MV_HLS10_VPS_VUI
     141
    126142
    127143#if H_3D_IV_MERGE
     
    174190 
    175191  // profile/level
     192#if H_MV_HLS10_PTL
     193#if H_MV
     194  std::vector< Profile::Name > m_profile;
     195  std::vector< Level::Tier   > m_levelTier;
     196  std::vector< Level::Name   > m_level;
     197  std::vector< Bool          > m_inblFlag;
     198#else
    176199  Profile::Name m_profile;
    177200  Level::Tier   m_levelTier;
    178201  Level::Name   m_level;
     202#endif
     203#endif
     204
    179205  Bool m_progressiveSourceFlag;
    180206  Bool m_interlacedSourceFlag;
    181207  Bool m_nonPackedConstraintFlag;
    182208  Bool m_frameOnlyConstraintFlag;
    183  
    184209  // coding structure
    185210#if H_MV
     
    440465  std::vector<Int>  m_sbPropAvgBitRate;
    441466  std::vector<Int>  m_sbPropMaxBitRate;
     467#if H_MV_HLS10_GEN_FIX
     468  Bool              m_outputVpsInfo;
     469#endif
    442470#endif
    443471#if H_3D
     
    506534  Void  xPrintUsage     ();                                   ///< print usage
    507535#if H_MV
     536
     537#if H_MV_HLS10_PTL
     538  template<typename T>
     539  Void xReadStrToEnum(string in, std::vector<T> &val)
     540  {
     541    val.clear();
     542
     543    char* cElement = NULL;
     544    char* cString = new char[in.size()+1];
     545    strcpy(cString, in.c_str());
     546
     547    cElement = strtok( cString, " " );
     548    while ( cElement != NULL )
     549    {
     550      T profile;       
     551      std::istringstream ss( cElement );
     552      ss >> profile;
     553      val.push_back( profile );
     554      cElement = strtok( NULL, " " );
     555    }
     556  }
     557#endif
     558
     559
    508560  template <typename T>
    509561  Void xResizeVector(  std::vector<T> & rpcVector )
  • branches/HTM-12.0-dev1/source/App/TAppEncoder/TAppEncTop.cpp

    r1048 r1054  
    133133  xSetLayerIds             ( vps );   
    134134  xSetDimensionIdAndLength ( vps );
    135   xSetDependencies( vps );
     135  xSetDependencies         ( vps );
     136  xSetRepFormat            ( vps );
    136137  xSetProfileTierLevel     ( vps );
    137   xSetRepFormat            ( vps );
    138138  xSetLayerSets            ( vps );
    139139  xSetDpbSize              ( vps );
     
    144144  xDeriveDltArray          ( vps, dlt );
    145145#endif
    146 
     146#if H_MV_HLS10_GEN_FIX
     147  Bool wasEmpty = true;
     148  if ( m_targetEncLayerIdList.size() == 0 )
     149  {
     150    for (Int i = 0; i < m_numberOfLayers; i++ )
     151    {
     152      m_targetEncLayerIdList.push_back( m_layerIdInNuh[ i ] );
     153    }
     154  }
     155  for( Int i = (Int) m_targetEncLayerIdList.size()-1 ; i >= 0 ; i--)
     156  {
     157    Int iNuhLayerId = m_targetEncLayerIdList[i];
     158    Bool allRefLayersPresent = true;
     159    for( Int j = 0; j < vps.getNumRefLayers( iNuhLayerId ); j++)
     160    {
     161      allRefLayersPresent = allRefLayersPresent && xLayerIdInTargetEncLayerIdList( vps.getIdRefLayer( iNuhLayerId, j) );
     162    }
     163    if ( !allRefLayersPresent )
     164    {
     165      printf("\nCannot encode layer with nuh_layer_id equal to %d since not all reference layers are in TargetEncLayerIdList\n", iNuhLayerId);
     166      m_targetEncLayerIdList.erase( m_targetEncLayerIdList.begin() + i  );
     167    }
     168  }
     169#endif
     170
     171#if H_MV_HLS10_ADD_LAYERSETS
     172  if ( m_outputVpsInfo )
     173  { 
     174    vps.printLayerDependencies();
     175    vps.printLayerSets();
     176    vps.printPTL();
     177  }
     178#endif
    147179
    148180  for(Int layerIdInVps = 0; layerIdInVps < m_numberOfLayers; layerIdInVps++)
     
    248280#endif
    249281
     282#if H_MV
     283  m_cTEncTop.setProfile(m_profile[0]);
     284  m_cTEncTop.setLevel  (m_levelTier[0], m_level[0]);
     285#else
    250286  m_cTEncTop.setProfile(m_profile);
    251287  m_cTEncTop.setLevel(m_levelTier, m_level);
     288#endif
    252289  m_cTEncTop.setProgressiveSourceFlag(m_progressiveSourceFlag);
    253290  m_cTEncTop.setInterlacedSourceFlag(m_interlacedSourceFlag);
     
    801838 
    802839#if H_MV
     840#if H_MV_HLS10_GEN_FIX
     841  while ( (m_targetEncLayerIdList.size() != 0 ) && !allEos )
     842#else
    803843  while ( !allEos )
     844#endif
    804845  {
    805846    for(Int layer=0; layer < m_numberOfLayers; layer++ )
    806847    {
     848#if H_MV_HLS10_GEN_FIX
     849      if (!xLayerIdInTargetEncLayerIdList( m_layerIdInNuh[ layer ] ))
     850      {
     851        continue;
     852      }
     853#endif
     854
    807855      Int frmCnt = 0;
    808856      while ( !eos[layer] && !(frmCnt == gopSize))
     
    844892      for(Int layer=0; layer < m_numberOfLayers; layer++ )
    845893      {
     894#if H_MV_HLS10_GEN_FIX
     895        if (!xLayerIdInTargetEncLayerIdList( m_layerIdInNuh[ layer ] ))
     896        {
     897          continue;
     898        }
     899#endif
     900
    846901#if H_3D_VSO       
    847902          if( m_bUseVSO && m_bUseEstimatedVSD && iNextPoc < m_framesToBeEncoded )
     
    870925  for(Int layer=0; layer < m_numberOfLayers; layer++ )
    871926  {
     927#if H_MV_HLS10_GEN_FIX
     928    if (!xLayerIdInTargetEncLayerIdList( m_layerIdInNuh[ layer ] ))
     929    {
     930      continue;
     931    }
     932#endif
    872933    m_acTEncTopList[layer]->printSummary( m_acTEncTopList[layer]->getNumAllPicCoded(), m_isField );
    873934  }
     
    14991560Void TAppEncTop::xSetProfileTierLevel( TComVPS& vps )
    15001561{
     1562#if H_MV_HLS10_PTL
     1563
     1564  // SET PTL
     1565  assert( m_profile.size() == m_level.size() && m_profile.size() == m_levelTier.size() );
     1566  vps.setVpsNumProfileTierLevelMinus1( (Int) m_profile.size() - 1 );
     1567  for ( Int ptlIdx = 0; ptlIdx <= vps.getVpsNumProfileTierLevelMinus1(); ptlIdx++ )
     1568  {
     1569    if ( ptlIdx > 1 )
     1570    {
     1571      Bool vpsProfilePresentFlag = ( m_profile[ptlIdx] != m_profile[ptlIdx - 1] )
     1572        || ( m_inblFlag[ptlIdx ] != m_inblFlag[ptlIdx - 1] );
     1573      vps.setVpsProfilePresentFlag( ptlIdx, vpsProfilePresentFlag );
     1574    }
     1575
     1576    xSetProfileTierLevel( vps, ptlIdx, -1, m_profile[ptlIdx], m_level[ptlIdx],
     1577      m_levelTier[ ptlIdx ], m_progressiveSourceFlag, m_interlacedSourceFlag,
     1578      m_nonPackedConstraintFlag, m_frameOnlyConstraintFlag,  m_inblFlag[ptlIdx] );     
     1579  } 
     1580#else
    15011581  const Int vpsNumProfileTierLevelMinus1 = 0; //TBD
    15021582  vps.setVpsNumProfileTierLevelMinus1( vpsNumProfileTierLevelMinus1 );
     
    15061586    vps.setVpsProfilePresentFlag( i, true );
    15071587  }
     1588#endif
    15081589}
    15091590
     
    15251606  //repFormat->setSeparateColourPlaneVpsFlag( );
    15261607
     1608#if H_MV_HLS10_GEN_VSP_CONF_WIN
     1609  repFormat->setConformanceWindowVpsFlag( true );
     1610  repFormat->setConfWinVpsLeftOffset    ( m_confLeft   / TComSPS::getWinUnitX( repFormat->getChromaFormatVpsIdc() ) );
     1611  repFormat->setConfWinVpsRightOffset   ( m_confRight  / TComSPS::getWinUnitX( repFormat->getChromaFormatVpsIdc() )  );
     1612  repFormat->setConfWinVpsTopOffset     ( m_confTop    / TComSPS::getWinUnitY( repFormat->getChromaFormatVpsIdc() )  );
     1613  repFormat->setConfWinVpsBottomOffset  ( m_confBottom / TComSPS::getWinUnitY( repFormat->getChromaFormatVpsIdc() ) );
     1614#endif
     1615
    15271616  assert( vps.getRepFormat( 0 ) == NULL );
    15281617  vps.setRepFormat( 0 , repFormat );
     
    15401629  { 
    15411630    Int currLsIdx = vps.olsIdxToLsIdx( i );
     1631#if !H_MV_HLS10_ADD_LAYERSETS
    15421632    std::vector<Int> targetDecLayerIdList = vps.getTargetDecLayerIdList( i );
     1633#endif
    15431634    Bool subLayerFlagInfoPresentFlag = false;
    15441635
     
    15461637    {   
    15471638      Bool subLayerDpbInfoPresentFlag = false;
     1639#if !H_MV_HLS10_ADD_LAYERSETS
    15481640      assert( vps.getNumLayersInIdList( currLsIdx ) == targetDecLayerIdList.size() );
     1641#endif
    15491642      for( Int k = 0; k < vps.getNumLayersInIdList( currLsIdx ); k++ )   
    15501643      {
     1644#if H_MV_HLS10_DBP_SIZE
     1645        Int layerIdInVps = vps.getLayerIdInVps( vps.getLayerSetLayerIdList( currLsIdx, k ) );
     1646        if ( vps.getNecessaryLayerFlag( i,k ) && ( vps.getVpsBaseLayerInternalFlag() || vps.getLayerSetLayerIdList( currLsIdx, k ) != 0 ) )
     1647        {       
     1648          dpbSize->setMaxVpsDecPicBufferingMinus1( i, k, j, m_maxDecPicBufferingMvc[ layerIdInVps ][ j ] - 1 );
     1649          if ( j > 0 )
     1650          {
     1651            subLayerDpbInfoPresentFlag = subLayerDpbInfoPresentFlag || ( dpbSize->getMaxVpsDecPicBufferingMinus1( i, k, j ) != dpbSize->getMaxVpsDecPicBufferingMinus1( i, k, j - 1 ) );
     1652          }
     1653        }
     1654        else
     1655        {
     1656          if (vps.getNecessaryLayerFlag(i,k) && j == 0 && k == 0 )
     1657          {         
     1658            dpbSize->setMaxVpsDecPicBufferingMinus1(i, k ,j, 0 );
     1659          }
     1660        }
     1661#else
    15511662        Int layerIdInVps = vps.getLayerIdInVps( targetDecLayerIdList[k] );           
    15521663        dpbSize->setMaxVpsDecPicBufferingMinus1( i, k, j, m_maxDecPicBufferingMvc[ layerIdInVps ][ j ] - 1 );
     1664
    15531665        if ( j > 0 )
    15541666        {
    15551667          subLayerDpbInfoPresentFlag = subLayerDpbInfoPresentFlag || ( dpbSize->getMaxVpsDecPicBufferingMinus1( i, k, j ) != dpbSize->getMaxVpsDecPicBufferingMinus1( i, k, j - 1 ) );
    15561668        }
     1669#endif
    15571670      }       
    15581671
    15591672      Int maxNumReorderPics = MIN_INT;
     1673#if H_MV_HLS10_DBP_SIZE
     1674      for ( Int idx = 0; idx < vps.getNumLayersInIdList( currLsIdx ); idx++ )
     1675      {
     1676        if (vps.getNecessaryLayerFlag(i, idx ))
     1677        {       
     1678          Int layerIdInVps = vps.getLayerIdInVps( vps.getLayerSetLayerIdList(currLsIdx, idx) );       
     1679          maxNumReorderPics = std::max( maxNumReorderPics, m_numReorderPicsMvc[ layerIdInVps ][ j ] );
     1680        }
     1681      }
     1682#else
    15601683      for ( Int idx = 0; idx < targetDecLayerIdList.size(); idx++ )
    15611684      {
     
    15631686        maxNumReorderPics = std::max( maxNumReorderPics, m_numReorderPicsMvc[ layerIdInVps ][ j ] );
    15641687      }
     1688#endif
    15651689      assert( maxNumReorderPics != MIN_INT );
    15661690
     
    15881712}
    15891713
    1590 
    15911714Void TAppEncTop::xSetLayerSets( TComVPS& vps )
    15921715{   
     
    16101733  // Additional output layer sets + profileLevelTierIdx
    16111734  vps.setDefaultOutputLayerIdc      ( m_defaultOutputLayerIdc );   
     1735#if H_MV_HLS10_ADD_LAYERSETS
     1736  if( vps.getNumIndependentLayers() == 0 && m_numAddLayerSets > 0  )
     1737  {
     1738    fprintf( stderr, "\nWarning: Ignoring additional layer sets since NumIndependentLayers is equal to 0.\n");           
     1739  }
     1740  else
     1741  {
     1742    vps.setNumAddLayerSets( m_numAddLayerSets );
     1743    if ( m_highestLayerIdxPlus1.size() < vps.getNumAddLayerSets() )
     1744    {
     1745      fprintf(stderr, "\nError: Number of highestLayerIdxPlus1 parameters must be greater than or equal to NumAddLayerSets\n");
     1746      exit(EXIT_FAILURE);
     1747    }
     1748
     1749    for (Int i = 0; i < vps.getNumAddLayerSets(); i++)
     1750    {
     1751      if ( m_highestLayerIdxPlus1[ i ].size() < vps.getNumIndependentLayers() )
     1752      {
     1753        fprintf(stderr, "Error: Number of elements in highestLayerIdxPlus1[ %d ] parameters must be greater than or equal to NumIndependentLayers(= %d)\n", i, vps.getNumIndependentLayers());
     1754        exit(EXIT_FAILURE);
     1755      }
     1756
     1757      for (Int j = 1; j < vps.getNumIndependentLayers(); j++)
     1758      {
     1759        if ( m_highestLayerIdxPlus1[ i ][ j ]  < 0 || m_highestLayerIdxPlus1[ i ][ j ] > vps.getNumLayersInTreePartition( j ) )
     1760        {
     1761          fprintf(stderr, "Error: highestLayerIdxPlus1[ %d ][ %d ] shall be in the range of 0 to NumLayersInTreePartition[ %d ] (= %d ), inclusive. \n", i, j, j, vps.getNumLayersInTreePartition( j ) );
     1762          exit(EXIT_FAILURE);
     1763        }
     1764        vps.setHighestLayerIdxPlus1( i, j, m_highestLayerIdxPlus1[ i ][ j ] );
     1765      }
     1766      vps.deriveAddLayerSetLayerIdList( i );
     1767    }       
     1768  } 
     1769#else
    16121770  vps.setNumAddLayerSets            ( 0                             ); 
     1771#endif
    16131772  vps.setNumAddOlss                 ( numAddOuputLayerSets          );
    16141773  vps.initTargetLayerIdLists();
    16151774
     1775#if H_MV_HLS10_ADD_LAYERSETS
     1776  for (Int olsIdx = 0; olsIdx < vps.getNumLayerSets() + numAddOuputLayerSets; olsIdx++)
     1777  {
     1778    Int addOutLsIdx = olsIdx - vps.getNumLayerSets();     
     1779#else
    16161780  for (Int olsIdx = 0; olsIdx < m_vpsNumLayerSets + numAddOuputLayerSets; olsIdx++)
    16171781  {
    16181782    Int addOutLsIdx = olsIdx - m_vpsNumLayerSets;     
    1619    
     1783#endif   
    16201784    vps.setLayerSetIdxForOlsMinus1( olsIdx, ( ( addOutLsIdx < 0 ) ?  olsIdx  : m_outputLayerSetIdx[ addOutLsIdx ] ) - 1 );
    16211785
     1786#if H_MV_HLS10_ADD_LAYERSETS
     1787    Int lsIdx = vps.olsIdxToLsIdx( olsIdx );
     1788#else
    16221789    std::vector<Int>& layerIdList    = m_layerIdsInSets[ vps.olsIdxToLsIdx( olsIdx ) ];
    1623 
     1790#endif
    16241791    if (vps.getDefaultOutputLayerIdc() == 2 || addOutLsIdx >= 0 )
    16251792    {
     1793#if H_MV_HLS10_ADD_LAYERSETS
     1794      for ( Int i = 0; i < vps.getNumLayersInIdList( lsIdx ); i++)
     1795#else
    16261796      for ( Int i = 0; i < layerIdList.size(); i++)
     1797#endif
    16271798      {
    16281799        vps.setOutputLayerFlag( olsIdx, i, ( olsIdx == 0 && i == 0 ) ? vps.inferOutputLayerFlag(olsIdx, i ) : false ); // This is a software only fix for a bug in the spec. In spec outputLayerFlag neither present nor inferred for this case !
     
    16341805      for (Int j = 0; j < outLayerIdList.size(); j++)
    16351806      {   
     1807#if H_MV_HLS10_ADD_LAYERSETS
     1808        for ( Int i = 0; i < vps.getNumLayersInIdList( lsIdx ); i++)
     1809        {
     1810          if ( vps.getLayerSetLayerIdList( lsIdx, i ) == outLayerIdList[ j ] )
     1811#else
    16361812        for (Int i = 0; i < layerIdList.size(); i++ )
    16371813        {
    16381814          if ( layerIdList[ i ] == outLayerIdList[ j ] )
     1815#endif
    16391816          {
    16401817            vps.setOutputLayerFlag( olsIdx, i, true );       
     
    16431820          }
    16441821        }
    1645         assert( outputLayerInLayerSetFlag ); // The output layer is not not in the layer set.
     1822#if H_MV_HLS10_ADD_LAYERSETS
     1823        if ( !outputLayerInLayerSetFlag )
     1824        {
     1825          fprintf(stderr, "Error: Output layer %d in output layer set %d not in corresponding layer set %d \n", outLayerIdList[ j ], olsIdx , lsIdx );
     1826          exit(EXIT_FAILURE);
     1827        }
     1828#else
     1829        assert( outputLayerInLayerSetFlag ); // The output layer is not in the layer set.
     1830#endif
    16461831      }
    16471832    }
    16481833    else
    16491834    {
     1835#if H_MV_HLS10_ADD_LAYERSETS
     1836      for ( Int i = 0; i < vps.getNumLayersInIdList( lsIdx ); i++)
     1837#else
    16501838      for ( Int i = 0; i < layerIdList.size(); i++)
     1839#endif
    16511840      {
    16521841        vps.setOutputLayerFlag( olsIdx, i, vps.inferOutputLayerFlag( olsIdx, i ) );       
     
    16541843    }
    16551844
     1845#if H_MV_HLS10_NESSECARY_LAYER
     1846    vps.deriveNecessaryLayerFlags( olsIdx );
     1847#endif
    16561848    vps.deriveTargetLayerIdList(  olsIdx );
    16571849
     1850#if H_MV_HLS10_PTL
     1851    // SET profile_tier_level_index.
     1852    if ( olsIdx == 0 )
     1853    {   
     1854      vps.setProfileTierLevelIdx( 0, 0 , vps.getMaxLayersMinus1() > 0 ? 1 : 0 );
     1855    }
     1856    else
     1857    {
     1858      Int lsIdx = vps.olsIdxToLsIdx( olsIdx );
     1859      if( (Int) m_profileTierLevelIdx[ olsIdx ].size() < vps.getNumLayersInIdList( lsIdx ) )
     1860      {
     1861        fprintf( stderr, "Warning: Not enough profileTierLevelIdx values given for the %d-th OLS. Inferring default values.\n", olsIdx );
     1862      }
     1863      for (Int j = 0; j < vps.getNumLayersInIdList( lsIdx ); j++)
     1864      {
     1865        if( j < (Int) m_profileTierLevelIdx[ olsIdx ].size() )
     1866        {
     1867          vps.setProfileTierLevelIdx(olsIdx, j, m_profileTierLevelIdx[olsIdx][j] );
     1868        }
     1869        else
     1870        {
     1871          // setting default values
     1872          if ( j == 0 || vps.getVpsNumProfileTierLevelMinus1() < 1 )
     1873          {
     1874            // set base layer as default
     1875            vps.setProfileTierLevelIdx(olsIdx, j, 1 );
     1876          }
     1877          else
     1878          {
     1879            // set VpsProfileTierLevel[2] as default
     1880            vps.setProfileTierLevelIdx(olsIdx, j, 2 );
     1881          }
     1882        }
     1883      }
     1884    }
     1885#else
    16581886    if ( olsIdx > 0 )
    16591887    {
    16601888      vps.setProfileLevelTierIdx( olsIdx, m_profileLevelTierIdx[ olsIdx ] );
    16611889    }
     1890#endif
    16621891   
    16631892    if ( vps.getNumOutputLayersInOutputLayerSet( olsIdx ) == 1 &&
     
    16971926    if( pcVPSVUI->getBitRatePresentVpsFlag( )  ||  pcVPSVUI->getPicRatePresentVpsFlag( ) )
    16981927    {
     1928#if H_MV_HLS10_VPS_VUI
     1929      for( Int i = 0; i  <  vps.getNumLayerSets(); i++ )
     1930#else
    16991931      for( Int i = 0; i  <=  vps.getVpsNumLayerSetsMinus1(); i++ )
     1932#endif
    17001933      {
    17011934        for( Int j = 0; j  <=  vps.getMaxTLayers(); j++ )
     
    17461979        for( Int j = 0; j < vps.getNumDirectRefLayers( vps.getLayerIdInNuh( i ) ) ; j++ )
    17471980        { 
     1981#if H_MV_HLS10_REF_PRED_LAYERS
     1982          Int layerIdx = vps.getLayerIdInVps( vps.getIdDirectRefLayer(vps.getLayerIdInNuh( i ) , j  )); 
     1983#else
    17481984          Int layerIdx = vps.getLayerIdInVps( vps.getRefLayerId(vps.getLayerIdInNuh( i ) , j  )); 
     1985#endif
    17491986          if( pcVPSVUI->getTilesInUseFlag( i )  &&  pcVPSVUI->getTilesInUseFlag( layerIdx ) ) 
    17501987          {
     
    17642001      }
    17652002    }
     2003
     2004#if H_MV_HLS10_VPS_VUI
     2005  pcVPSVUI->setSingleLayerForNonIrapFlag( m_singleLayerForNonIrapFlag );
     2006  pcVPSVUI->setHigherLayerIrapSkipFlag( m_higherLayerIrapSkipFlag );
     2007#endif
    17662008
    17672009    pcVPSVUI->setIlpRestrictedRefLayersFlag( m_ilpRestrictedRefLayersFlag );
  • branches/HTM-12.0-dev1/source/App/TAppEncoder/TAppEncTop.h

    r976 r1054  
    132132  Void xSetLayerSets              ( TComVPS& vps );
    133133  Void xSetProfileTierLevel       ( TComVPS& vps );
     134
     135#if H_MV_HLS10_PTL
     136  Void xSetProfileTierLevel( TComVPS& vps, Int profileTierLevelIdx, Int subLayer,                             
     137                             Profile::Name profile, Level::Name level, Level::Tier tier,
     138                             Bool progressiveSourceFlag, Bool interlacedSourceFlag,
     139                             Bool nonPackedConstraintFlag, Bool frameOnlyConstraintFlag,
     140                             Bool inbldFlag )
     141  {
     142    TComPTL* ptlStruct = vps.getPTL( profileTierLevelIdx );   
     143    assert( ptlStruct != NULL );
     144
     145    ProfileTierLevel* ptl;
     146    if ( subLayer == -1 )
     147    {
     148      ptl = ptlStruct->getGeneralPTL();
     149    }
     150    else
     151    {
     152      ptl = ptlStruct->getSubLayerPTL(  subLayer );
     153    }
     154
     155    assert( ptl != NULL );
     156
     157
     158    ptl->setProfileIdc( profile );
     159    ptl->setTierFlag  ( tier    );
     160    ptl->setLevelIdc  ( level   );
     161    ptl->setProfileCompatibilityFlag( profile, true );
     162
     163    switch ( profile )
     164    {
     165    case Profile::MAIN:
     166      break;
     167    case Profile::MULTIVIEWMAIN:
     168#if H_3D
     169    case Profile::MAIN3D:
     170#endif
     171      ptl->setMax12bitConstraintFlag      ( true  );
     172      ptl->setMax12bitConstraintFlag      ( true  );
     173      ptl->setMax10bitConstraintFlag      ( true  );
     174      ptl->setMax8bitConstraintFlag       ( true  );
     175      ptl->setMax422chromaConstraintFlag  ( true  );
     176      ptl->setMax420chromaConstraintFlag  ( true  );
     177      ptl->setMaxMonochromeConstraintFlag ( false );
     178      ptl->setIntraConstraintFlag         ( false );
     179      ptl->setOnePictureOnlyConstraintFlag( false );
     180      ptl->setLowerBitRateConstraintFlag  ( true  );       
     181      break;
     182    default:
     183      assert( 0 ); // other profiles currently not supported
     184      break;
     185    }
     186  }
     187
     188
     189#endif
    134190  Void xSetRepFormat              ( TComVPS& vps );
    135191  Void xSetDpbSize                ( TComVPS& vps );
     
    137193  GOPEntry* xGetGopEntry( Int layerIdInVps, Int poc );
    138194  Int  xGetMax( std::vector<Int>& vec);
     195#if H_MV_HLS10_GEN_FIX
     196  Bool xLayerIdInTargetEncLayerIdList( Int nuhLayerId )
     197  {
     198    return  ( std::find(m_targetEncLayerIdList.begin(), m_targetEncLayerIdList.end(), nuhLayerId) != m_targetEncLayerIdList.end()) ;
     199  }
     200#endif
    139201#endif
    140202#if H_3D
Note: See TracChangeset for help on using the changeset viewer.