Changeset 778 in SHVCSoftware for branches


Ignore:
Timestamp:
28 May 2014, 13:26:07 (11 years ago)
Author:
nokia
Message:

JCTVC-Q0078/R0042: Additional layer sets and independent non-base layer rewriting tool (utils/BLRewrite)

Location:
branches/SHM-6-dev
Files:
3 added
19 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-6-dev/cfg/layers.cfg

    r706 r778  
    4141InitialQP1                    : 0           # Rate control: initial QP for layer 1
    4242RCForceIntraQP1               : 0           # Rate control: force intra QP to be equal to initial QP for layer 1
     43
     44
     45NumLayerSets                  : 1
     46NumLayerInIdList0             : 2
     47LayerSetLayerIdList0          : 0 1
     48
     49NumAddLayerSets               : 0
  • branches/SHM-6-dev/source/App/TAppEncoder/TAppEncCfg.cpp

    r776 r778  
    492492#endif
    493493  }
     494#if Q0078_ADD_LAYER_SETS
     495  Int* cfg_numLayerInIdList[MAX_VPS_LAYER_SETS_PLUS1];
     496  string cfg_layerSetLayerIdList[MAX_VPS_LAYER_SETS_PLUS1];
     497  string* cfg_layerSetLayerIdListPtr[MAX_VPS_LAYER_SETS_PLUS1];
     498  Int* cfg_numHighestLayerIdx[MAX_VPS_LAYER_SETS_PLUS1];
     499  string cfg_highestLayerIdx[MAX_VPS_LAYER_SETS_PLUS1];
     500  string* cfg_highestLayerIdxPtr[MAX_VPS_LAYER_SETS_PLUS1];
     501  for (UInt i = 0; i < MAX_VPS_LAYER_SETS_PLUS1; i++)
     502  {
     503    cfg_numLayerInIdList[i] = &m_numLayerInIdList[i];
     504    cfg_layerSetLayerIdListPtr[i] = &cfg_layerSetLayerIdList[i];
     505    cfg_highestLayerIdxPtr[i] = &cfg_highestLayerIdx[i];
     506    cfg_numHighestLayerIdx[i] = &m_numHighestLayerIdx[i];
     507  }
     508#endif
    494509#if AVC_BASE
    495510  string  cfg_BLInputFile;
     
    546561#endif
    547562  ("NumLayers",               m_numLayers, 1, "Number of layers to code")
     563#if Q0078_ADD_LAYER_SETS
     564  ("NumLayerSets",            m_numLayerSets, 0, "Number of layer sets")
     565  ("NumLayerInIdList%d",      cfg_numLayerInIdList, 0, MAX_VPS_LAYER_ID_PLUS1, "Number of layers in the set")
     566  ("LayerSetLayerIdList%d",   cfg_layerSetLayerIdListPtr, string(""), MAX_VPS_LAYER_ID_PLUS1, "Layer IDs for the set")
     567  ("NumAddLayerSets",         m_numAddLayerSets, 0, "Number of additional layer sets")
     568  ("NumHighestLayerIdx%d",    cfg_numHighestLayerIdx, 0, MAX_VPS_LAYER_ID_PLUS1, "Number of highest layer idx")
     569  ("HighestLayerIdx%d",       cfg_highestLayerIdxPtr, string(""), MAX_VPS_LAYER_ID_PLUS1, "Highest layer idx for an additional layer set")
     570#endif
    548571#if AUXILIARY_PICTURES
    549572  ("InputChromaFormat%d",     cfg_tmpInputChromaFormat,  420, MAX_LAYERS, "InputChromaFormatIDC for layer %d")
     
    13211344  }
    13221345#endif
     1346#if Q0078_ADD_LAYER_SETS
     1347  for (Int layerSet = 0; layerSet < m_numLayerSets; layerSet++)
     1348  {
     1349    if (m_numLayerInIdList[layerSet] > 0)
     1350    {
     1351      Char* layerSetLayerIdListDup = cfg_layerSetLayerIdList[layerSet].empty() ? NULL : strdup(cfg_layerSetLayerIdList[layerSet].c_str());
     1352      Int  i = 0;
     1353      char *layerId = strtok(layerSetLayerIdListDup, " ,-");
     1354      while (layerId != NULL)
     1355      {
     1356        if (i >= m_numLayerInIdList[layerSet])
     1357        {
     1358          printf("NumLayerInIdList%d: The number of layers in the set is larger than the allowed number of layers.\n", layerSet);
     1359          exit(EXIT_FAILURE);
     1360        }
     1361        m_layerSetLayerIdList[layerSet][i] = atoi(layerId);
     1362        layerId = strtok(NULL, " ,-");
     1363        i++;
     1364      }
     1365    }
     1366  }
     1367  for (Int addLayerSet = 0; addLayerSet < m_numAddLayerSets; addLayerSet++)
     1368  {
     1369    if (m_numHighestLayerIdx[addLayerSet] > 0)
     1370    {
     1371      Char* highestLayrIdxListDup = cfg_highestLayerIdx[addLayerSet].empty() ? NULL : strdup(cfg_highestLayerIdx[addLayerSet].c_str());
     1372      Int  i = 0;
     1373      char *layerIdx = strtok(highestLayrIdxListDup, " ,-");
     1374      while (layerIdx != NULL)
     1375      {
     1376        if (i >= m_numLayerInIdList[addLayerSet])
     1377        {
     1378          printf("NumLayerInIdList%d: The number of layer idx's in the highest layer idx list is larger than the allowed number of idx's.\n", addLayerSet);
     1379          exit(EXIT_FAILURE);
     1380        }
     1381        m_highestLayerIdx[addLayerSet][i] = atoi(layerIdx);
     1382        layerIdx = strtok(NULL, " ,-");
     1383        i++;
     1384      }
     1385    }
     1386  }
     1387#endif
    13231388#endif //SVC_EXTENSION
    13241389  m_scalingListFile = cfg_ScalingListFile.empty() ? NULL : strdup(cfg_ScalingListFile.c_str());
  • branches/SHM-6-dev/source/App/TAppEncoder/TAppEncCfg.h

    r776 r778  
    7474#endif
    7575  Bool      m_maxTidRefPresentFlag;
     76#if Q0078_ADD_LAYER_SETS
     77  Int       m_numLayerSets;
     78  Int       m_numLayerInIdList[MAX_VPS_LAYER_SETS_PLUS1];
     79  Int       m_layerSetLayerIdList[MAX_VPS_LAYER_SETS_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
     80  Int       m_numAddLayerSets;
     81  Int       m_numHighestLayerIdx[MAX_VPS_LAYER_SETS_PLUS1];
     82  Int       m_highestLayerIdx[MAX_VPS_LAYER_SETS_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
     83#endif
    7684#else
    7785  Char*     m_pchInputFile;                                   ///< source file name
  • branches/SHM-6-dev/source/App/TAppEncoder/TAppEncTop.cpp

    r776 r778  
    632632    m_acTEncTop[layer].setCGSMaxYPartNumLog2( m_nCGSMaxYPartNumLog2 );
    633633    m_acTEncTop[layer].setCGSLUTBit( m_nCGSLUTBit );
     634#endif
     635#if Q0078_ADD_LAYER_SETS
     636    m_acTEncTop[layer].setNumAddLayerSets( m_numAddLayerSets );
    634637#endif
    635638  }
     
    10361039  vps->setVpsExtensionFlag( m_numLayers > 1 ? true : false );
    10371040
    1038   vps->setNumLayerSets(m_numLayers);
    1039   for(Int setId = 1; setId < vps->getNumLayerSets(); setId++)
    1040   {
    1041     for(Int layerId = 0; layerId <= vps->getMaxLayerId(); layerId++)
    1042     {
     1041#if Q0078_ADD_LAYER_SETS
     1042  if (m_numLayerSets > 0)
     1043  {
     1044    vps->setNumLayerSets(m_numLayerSets+1);
     1045    for (Int setId = 1; setId < vps->getNumLayerSets(); setId++)
     1046    {
     1047      for (Int layerId = 0; layerId <= vps->getMaxLayerId(); layerId++)
     1048      {
     1049        vps->setLayerIdIncludedFlag(false, setId, layerId);
     1050      }
     1051    }
     1052    for (Int setId = 1; setId < vps->getNumLayerSets(); setId++)
     1053    {
     1054      for (Int i = 0; i < m_numLayerInIdList[setId-1]; i++)
     1055      {
     1056        Int layerId = m_layerSetLayerIdList[setId-1][i];
     1057
    10431058#if O0194_DIFFERENT_BITDEPTH_EL_BL
    1044       //4
    1045       g_bitDepthY = m_acLayerCfg[layerId].m_internalBitDepthY;
    1046       g_bitDepthC = m_acLayerCfg[layerId].m_internalBitDepthC;
    1047 
    1048       g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerId].m_inputBitDepthY : m_acLayerCfg[layerId].m_internalBitDepthY;
    1049       g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerId].m_inputBitDepthC : m_acLayerCfg[layerId].m_internalBitDepthC;
    1050 #endif
    1051       if( layerId <= setId )
    1052       {
     1059        //4
     1060        g_bitDepthY = m_acLayerCfg[layerId].m_internalBitDepthY;
     1061        g_bitDepthC = m_acLayerCfg[layerId].m_internalBitDepthC;
     1062
     1063        g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerId].m_inputBitDepthY : m_acLayerCfg[layerId].m_internalBitDepthY;
     1064        g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerId].m_inputBitDepthC : m_acLayerCfg[layerId].m_internalBitDepthC;
     1065#endif
     1066
    10531067        vps->setLayerIdIncludedFlag(true, setId, layerId);
    10541068      }
    1055       else
    1056       {
    1057         vps->setLayerIdIncludedFlag(false, setId, layerId);
    1058       }
    1059     }
    1060   }
     1069    }
     1070  }
     1071  else
     1072  {
     1073    // Default layer sets
     1074#endif
     1075    vps->setNumLayerSets(m_numLayers);
     1076    for (Int setId = 1; setId < vps->getNumLayerSets(); setId++)
     1077    {
     1078      for (Int layerId = 0; layerId <= vps->getMaxLayerId(); layerId++)
     1079      {
     1080#if O0194_DIFFERENT_BITDEPTH_EL_BL
     1081        //4
     1082        g_bitDepthY = m_acLayerCfg[layerId].m_internalBitDepthY;
     1083        g_bitDepthC = m_acLayerCfg[layerId].m_internalBitDepthC;
     1084
     1085        g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerId].m_inputBitDepthY : m_acLayerCfg[layerId].m_internalBitDepthY;
     1086        g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_acLayerCfg[layerId].m_inputBitDepthC : m_acLayerCfg[layerId].m_internalBitDepthC;
     1087#endif
     1088        if (layerId <= setId)
     1089        {
     1090          vps->setLayerIdIncludedFlag(true, setId, layerId);
     1091        }
     1092        else
     1093        {
     1094          vps->setLayerIdIncludedFlag(false, setId, layerId);
     1095        }
     1096      }
     1097    }
     1098#if Q0078_ADD_LAYER_SETS
     1099  }
     1100#endif
     1101#if Q0078_ADD_LAYER_SETS
     1102  vps->setNumAddLayerSets(m_numAddLayerSets);
     1103  if (m_numAddLayerSets > 0)
     1104  {
     1105    for (Int setId = 0; setId < m_numAddLayerSets; setId++)
     1106    {
     1107      for (Int j = 0; j < m_numHighestLayerIdx[setId]; j++)
     1108      {
     1109        vps->setHighestLayerIdxPlus1(setId, j + 1, m_highestLayerIdx[setId][j] + 1);
     1110      }
     1111    }
     1112  }
     1113#endif
    10611114#if VPS_EXTN_MASK_AND_DIM_INFO
    10621115  UInt i = 0, dimIdLen = 0;
     
    13471400  }
    13481401#endif
     1402#if Q0078_ADD_LAYER_SETS
     1403  vps->setPredictedLayerIds();
     1404  vps->setTreePartitionLayerIdList();
     1405#endif
    13491406#endif
    13501407    vps->setMaxOneActiveRefLayerFlag(maxDirectRefLayers > 1 ? false : true);
     
    13541411      if( vps->getNumDirectRefLayers( vps->getLayerIdInNuh(i) ) == 0  )
    13551412      {
     1413#if Q0078_ADD_LAYER_SETS
     1414        vps->setPocLsbNotPresentFlag(i, true); // make independedent layers base-layer compliant
     1415#else
    13561416        vps->setPocLsbNotPresentFlag(i, false);
     1417#endif
    13571418      }
    13581419    }
  • branches/SHM-6-dev/source/Lib/TLibCommon/SEI.h

    r776 r778  
    3737#include <cstring>
    3838
     39#if Q0078_ADD_LAYER_SETS
     40#include "TLibCommon/NAL.h"
     41#endif
     42
    3943//! \ingroup TLibCommon
    4044//! \{
     
    9498#if Q0074_SEI_COLOR_MAPPING
    9599    COLOR_MAPPING_INFO                   = 143,
     100#endif
     101#if Q0078_ADD_LAYER_SETS
     102    OUTPUT_LAYER_SET_NESTING             = 144,
     103    VPS_REWRITING                        = 145,
    96104#endif
    97105  };
     
    606614};
    607615
     616#if Q0078_ADD_LAYER_SETS
     617class SEIOutputLayerSetNesting : public SEI
     618{
     619public:
     620  PayloadType payloadType() const { return OUTPUT_LAYER_SET_NESTING; }
     621
     622  SEIOutputLayerSetNesting() {}
     623  virtual ~SEIOutputLayerSetNesting()
     624  {
     625    if (!m_callerOwnsSEIs)
     626    {
     627      deleteSEIs(m_nestedSEIs);
     628    }
     629  }
     630
     631  Bool m_olsFlag;
     632  UInt m_numOlsIndicesMinus1;
     633  UInt m_olsIdx[1024];
     634  Bool  m_callerOwnsSEIs;
     635  SEIMessages m_nestedSEIs;
     636};
     637
     638class SEIVPSRewriting : public SEI
     639{
     640public:
     641  PayloadType payloadType() const { return VPS_REWRITING; }
     642
     643  SEIVPSRewriting() {}
     644  virtual ~SEIVPSRewriting() {}
     645
     646  NALUnit* nalu;
     647};
     648#endif
     649
    608650//! \}
  • branches/SHM-6-dev/source/Lib/TLibCommon/TComRom.h

    r644 r778  
    159159
    160160#ifndef ENC_DEC_TRACE
    161 # define ENC_DEC_TRACE 0
     161# define ENC_DEC_TRACE 1
    162162#endif
    163163
  • branches/SHM-6-dev/source/Lib/TLibCommon/TComSlice.cpp

    r767 r778  
    25482548    }
    25492549  }
     2550}
     2551#endif
     2552
     2553#if Q0078_ADD_LAYER_SETS
     2554Void TComVPS::setPredictedLayerIds()
     2555{
     2556  for (UInt i = 0; i < getMaxLayers() - 1; i++)
     2557  {
     2558    UInt iNuhLId = getLayerIdInNuh(i);
     2559    UInt predIdx = 0;
     2560    for (UInt j = iNuhLId + 1; j < 63; j++)
     2561    {
     2562      if (getRecursiveRefLayerFlag(j, iNuhLId))
     2563      {
     2564        setPredictedLayerId(i, predIdx, j);
     2565        predIdx++;
     2566      }
     2567    }
     2568    setNumPredictedLayers(iNuhLId, predIdx);
     2569  }
     2570}
     2571
     2572Void TComVPS::setTreePartitionLayerIdList()
     2573{
     2574  Bool countedLayerIdxFlag[MAX_NUM_LAYER_IDS];
     2575
     2576  for (UInt i = 0; i <= getMaxLayers() - 1; i++)
     2577  {
     2578    countedLayerIdxFlag[i] = false;
     2579  }
     2580
     2581  Int numIndependentLayers = 0;
     2582
     2583  for (UInt i = 0; i <= getMaxLayers() - 1; i++)
     2584  {
     2585    UInt iNuhLId = getLayerIdInNuh(i);
     2586    if (getNumDirectRefLayers(iNuhLId) == 0)
     2587    {
     2588      setTreePartitionLayerId(numIndependentLayers, 0, iNuhLId);
     2589      setNumLayersInTreePartition(numIndependentLayers, 1);
     2590      for (UInt j = 0; j < getNumPredictedLayers(iNuhLId); j++)
     2591      {
     2592        if (!countedLayerIdxFlag[getLayerIdInVps(iNuhLId)])
     2593        {
     2594          setTreePartitionLayerId(numIndependentLayers, getNumLayersInTreePartition(numIndependentLayers), getPredictedLayerId(iNuhLId, j));
     2595          setNumLayersInTreePartition(numIndependentLayers, getNumLayersInTreePartition(numIndependentLayers) + 1);
     2596          countedLayerIdxFlag[getLayerIdInVps(getPredictedLayerId(iNuhLId, j))] = true;
     2597        }
     2598      }
     2599      numIndependentLayers++;
     2600    }
     2601  }
     2602
     2603  setNumIndependentLayers(numIndependentLayers);
    25502604}
    25512605#endif
  • branches/SHM-6-dev/source/Lib/TLibCommon/TComSlice.h

    r774 r778  
    140140 
    141141  Void  create  (Int numberOfEntries);
    142   Void  destroy ();
     142#if Q0078_ADD_LAYER_SETS
     143  Void  copy(TComRPSList& a);
     144#endif
     145  Void  destroy();
    143146
    144147
     
    495498  UInt        m_maxLayerId;
    496499  UInt        m_numLayerSets;
     500#if Q0078_ADD_LAYER_SETS
     501  Bool        m_layerIdIncludedFlag[2*MAX_VPS_LAYER_SETS_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
     502#else
    497503  Bool        m_layerIdIncludedFlag[MAX_VPS_LAYER_SETS_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
     504#endif
    498505#endif
    499506
     
    661668  Bool       m_recursiveRefLayerFlag[MAX_NUM_LAYER_IDS][MAX_NUM_LAYER_IDS];  // flag to indicate if j-th layer is a direct or indirect reference layer of i-th layer
    662669#endif
     670#if Q0078_ADD_LAYER_SETS
     671  Int        m_numAddLayerSets;
     672  UInt       m_highestLayerIdxPlus1[MAX_VPS_LAYER_SETS_PLUS1][MAX_NUM_LAYER_IDS];
     673  UInt       m_predictedLayerId[MAX_NUM_LAYER_IDS][64];
     674  UInt       m_numPredictedLayers[MAX_NUM_LAYER_IDS];
     675  Int        m_numIndependentLayers;
     676  Int        m_numLayersInTreePartition[MAX_NUM_LAYER_IDS];
     677  UInt       m_treePartitionLayerIdList[MAX_NUM_LAYER_IDS][MAX_NUM_LAYER_IDS];
     678#endif
    663679#if SPS_DPB_PARAMS
    664680  Int        m_TolsIdx;
     
    804820  Int     getNumRefLayers(Int currLayerId)                                       { return m_numberRefLayers[currLayerId];                  }
    805821  Void    setNumRefLayers();
     822#endif
     823#if Q0078_ADD_LAYER_SETS
     824  UInt    getNumAddLayerSets()                                                   { return m_numAddLayerSets; }
     825  Void    setNumAddLayerSets(UInt x)                                             { m_numAddLayerSets = x; }
     826  UInt    getHighestLayerIdxPlus1(UInt set, UInt idx)                             { return m_highestLayerIdxPlus1[set][idx]; }
     827  Void    setHighestLayerIdxPlus1(UInt set, UInt idx, UInt layerIdx)              { m_highestLayerIdxPlus1[set][idx] = layerIdx; }
     828  Void    setPredictedLayerIds();
     829  UInt    getPredictedLayerId(UInt layerIdx, UInt predIdx)                       { return m_predictedLayerId[layerIdx][predIdx]; }
     830  Void    setPredictedLayerId(UInt layerIdx, UInt predIdx, UInt x)               { m_predictedLayerId[layerIdx][predIdx] = x; }
     831  UInt    getNumPredictedLayers(UInt layerId)                                    { return m_numPredictedLayers[layerId]; }
     832  Void    setNumPredictedLayers(UInt layerId, UInt x)                            { m_numPredictedLayers[layerId] = x; }
     833  Void    setTreePartitionLayerIdList();
     834  Int     getNumIndependentLayers()                                              { return m_numIndependentLayers; }
     835  Void    setNumIndependentLayers(Int x)                                         { m_numIndependentLayers = x; }
     836  Int     getNumLayersInTreePartition(Int idx)                                   { return m_numLayersInTreePartition[idx]; }
     837  Void    setNumLayersInTreePartition(Int idx, Int x)                            { m_numLayersInTreePartition[idx] = x; }
     838  UInt    getTreePartitionLayerId(Int idx, Int layerIdx)                         { return m_treePartitionLayerIdList[idx][layerIdx]; }
     839  Void    setTreePartitionLayerId(Int idx, Int layerIdx, UInt layerId)           { m_treePartitionLayerIdList[idx][layerIdx] = layerId; }
    806840#endif
    807841#if VPS_RENAME
     
    24812515  }
    24822516
     2517#if Q0078_ADD_LAYER_SETS
     2518  Void removePS(Int psId)
     2519  {
     2520    assert(psId < m_maxId);
     2521    if (m_paramsetMap.find(psId) != m_paramsetMap.end())
     2522    {
     2523      m_paramsetMap.erase(psId);
     2524    }
     2525  }
     2526#endif
     2527
     2528
    24832529private:
    24842530  std::map<Int,T *> m_paramsetMap;
     
    25032549  TComSPS* getSPS(Int spsId)  { return m_spsMap.getPS(spsId); };
    25042550  TComSPS* getFirstSPS()      { return m_spsMap.getFirstPS(); };
     2551#if Q0078_ADD_LAYER_SETS
     2552  Void     removeSPS(Int spsId) { m_spsMap.removePS(spsId); };
     2553#endif
    25052554
    25062555  //! store picture parameter set and take ownership of it
     
    25092558  TComPPS* getPPS(Int ppsId)  { return m_ppsMap.getPS(ppsId); };
    25102559  TComPPS* getFirstPPS()      { return m_ppsMap.getFirstPS(); };
     2560#if Q0078_ADD_LAYER_SETS
     2561  Void     removePPS(Int ppsId) { m_ppsMap.removePS(ppsId); };
     2562#endif
    25112563
    25122564  //! activate a SPS from a active parameter sets SEI message
  • branches/SHM-6-dev/source/Lib/TLibCommon/TypeDef.h

    r777 r778  
    246246#define Q0165_OUTPUT_LAYER_SET           1      ///< JCTVC-Q0165: add a constraint to disallow an empty output layer set
    247247#define Q0165_NUM_ADD_OUTPUT_LAYER_SETS  1      ///< JCTVC-Q0165: signal num_add_output_layer_set and default_target_output_layer_idc when vps_num_layer_sets_minus1 is greater than 0
     248
     249#define Q0078_ADD_LAYER_SETS             1      ///< JCTVC-Q0078: additional layer sets and layer set config
    248250
    249251#define VPS_DPB_SIZE_TABLE               1      ///< JCTVC-O0217: DPB operations: signaling DPB-related parameters
  • branches/SHM-6-dev/source/Lib/TLibDecoder/SEIread.cpp

    r776 r778  
    136136    break;
    137137#endif
     138#if Q0078_ADD_LAYER_SETS
     139  case SEI::OUTPUT_LAYER_SET_NESTING:
     140    fprintf(g_hTrace, "=========== Output layer set nesting SEI message ===========\n");
     141    break;
     142  case SEI::VPS_REWRITING:
     143    fprintf(g_hTrace, "=========== VPS rewriting SEI message ===========\n");
     144    break;
     145#endif
    138146#endif //SVC_EXTENSION
    139147  default:
     
    356364     sei = new SEIBspHrd;
    357365     xParseSEIBspHrd((SEIBspHrd&) *sei, sps, *nestingSei);
     366     break;
     367#endif
     368#if Q0078_ADD_LAYER_SETS
     369   case SEI::OUTPUT_LAYER_SET_NESTING:
     370     sei = new SEIOutputLayerSetNesting;
     371#if LAYERS_NOT_PRESENT_SEI
     372     xParseSEIOutputLayerSetNesting((SEIOutputLayerSetNesting&)*sei, nalUnitType, vps, sps);
     373#else
     374     xParseSEIOutputLayerSetNesting((SEIOutputLayerSetNesting&)*sei, nalUnitType, sps);
     375#endif
     376     break;
     377   case SEI::VPS_REWRITING:
     378     sei = new SEIVPSRewriting;
     379     xParseSEIVPSRewriting((SEIVPSRewriting&)*sei);
    358380     break;
    359381#endif
     
    13931415#endif
    13941416
     1417#if Q0078_ADD_LAYER_SETS
     1418
     1419#if LAYERS_NOT_PRESENT_SEI
     1420Void SEIReader::xParseSEIOutputLayerSetNesting(SEIOutputLayerSetNesting& sei, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps)
     1421#else
     1422Void SEIReader::xParseSEIOutputLayerSetNesting(SEIOutputLayerSetNesting& sei, const NalUnitType nalUnitType, TComSPS *sps)
     1423#endif
     1424{
     1425  UInt uiCode;
     1426  SEIMessages seis;
     1427
     1428  READ_FLAG(uiCode, "ols_flag"); sei.m_olsFlag = uiCode;
     1429  READ_UVLC(uiCode, "num_ols_indices_minus1"); sei.m_numOlsIndicesMinus1 = uiCode;
     1430
     1431  for (Int i = 0; i <= sei.m_numOlsIndicesMinus1; i++)
     1432  {
     1433    READ_UVLC(uiCode, "ols_idx[i]"); sei.m_olsIdx[i] = uiCode;
     1434  }
     1435
     1436  // byte alignment
     1437  while (m_pcBitstream->getNumBitsRead() % 8 != 0)
     1438  {
     1439    UInt code;
     1440    READ_FLAG(code, "ols_nesting_zero_bit");
     1441  }
     1442
     1443  sei.m_callerOwnsSEIs = false;
     1444
     1445  // read nested SEI messages
     1446  do {
     1447#if O0164_MULTI_LAYER_HRD
     1448#if LAYERS_NOT_PRESENT_SEI
     1449    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps);
     1450#else
     1451    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps);
     1452#endif
     1453#else
     1454#if LAYERS_NOT_PRESENT_SEI
     1455    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, vps, sps);
     1456#else
     1457    xReadSEImessage(sei.m_nestedSEIs, nalUnitType, sps);
     1458#endif
     1459#endif
     1460  } while (m_pcBitstream->getNumBitsLeft() > 8);
     1461
     1462}
     1463
     1464Void SEIReader::xParseSEIVPSRewriting(SEIVPSRewriting &sei)
     1465{
     1466}
     1467
     1468#endif
     1469
    13951470#endif //SVC_EXTENSION
    13961471
  • branches/SHM-6-dev/source/Lib/TLibDecoder/SEIread.h

    r776 r778  
    119119  Void xParseHrdParameters(TComHRD *hrd, Bool commonInfPresentFlag, UInt maxNumSubLayersMinus1);
    120120#endif
     121#if Q0078_ADD_LAYER_SETS
     122#if LAYERS_NOT_PRESENT_SEI
     123  Void xParseSEIOutputLayerSetNesting(SEIOutputLayerSetNesting& sei, const NalUnitType nalUnitType, TComVPS *vps, TComSPS *sps);
     124#else
     125  Void xParseSEIOutputLayerSetNesting(SEIOutputLayerSetNesting& sei, const NalUnitType nalUnitType, TComSPS *sps);
     126#endif
     127  Void xParseSEIVPSRewriting(SEIVPSRewriting &sei);
     128#endif
    121129  Void xParseByteAlign();
    122130};
  • branches/SHM-6-dev/source/Lib/TLibDecoder/TDecCAVLC.cpp

    r777 r778  
    11871187  }
    11881188#endif
     1189#if Q0078_ADD_LAYER_SETS
     1190#if O0092_0094_DEPENDENCY_CONSTRAINT // Moved here
     1191  vps->setNumRefLayers();
     1192
     1193  if (vps->getMaxLayers() > MAX_REF_LAYERS)
     1194  {
     1195    for (i = 1; i < vps->getMaxLayers(); i++)
     1196    {
     1197      assert(vps->getNumRefLayers(vps->getLayerIdInNuh(i)) <= MAX_REF_LAYERS);
     1198    }
     1199  }
     1200#endif
     1201  vps->setPredictedLayerIds();
     1202  vps->setTreePartitionLayerIdList();
     1203#endif
    11891204#if VPS_TSLAYERS
    11901205  READ_FLAG( uiCode, "vps_sub_layers_max_minus1_present_flag"); vps->setMaxTSLayersPresentFlag(uiCode ? true : false);
     
    12741289#endif
    12751290
     1291#if Q0078_ADD_LAYER_SETS
     1292  if (vps->getNumIndependentLayers() > 1)
     1293  {
     1294    READ_UVLC(uiCode, "num_add_layer_sets"); vps->setNumAddLayerSets(uiCode);
     1295    for (Int i = 0; i < vps->getNumAddLayerSets(); i++)
     1296    {
     1297      for (Int j = 1; j < vps->getNumIndependentLayers(); j++)
     1298      {
     1299        int len = 1;
     1300        while ((1 << len) < (vps->getNumLayersInTreePartition(j) + 1))
     1301        {
     1302          len++;
     1303        }
     1304        READ_CODE(len, uiCode, "highest_layer_idx_plus1[i][j]"); vps->setHighestLayerIdxPlus1(i, j, uiCode);
     1305      }
     1306    }
     1307
     1308    for (Int i = 0; i < vps->getNumAddLayerSets(); i++)
     1309    {
     1310      for (Int j = 1; j < vps->getNumIndependentLayers(); j++)
     1311      {
     1312        Int layerNum = 0;
     1313        Int lsIdx = vps->getNumLayerSets() + i;
     1314        for (Int layerId = 0; layerId <= 62; layerId++)
     1315        {
     1316          vps->setLayerIdIncludedFlag(false, lsIdx, layerId);
     1317          for (Int treeIdx = 1; treeIdx < vps->getNumIndependentLayers(); treeIdx++)
     1318          {
     1319            for (Int layerCnt = 0; layerCnt < vps->getHighestLayerIdxPlus1(i, j); layerCnt++)
     1320            {
     1321              vps->setLayerSetLayerIdList(lsIdx, layerNum, vps->getTreePartitionLayerId(treeIdx, layerCnt));
     1322              vps->setLayerIdIncludedFlag(true, lsIdx, vps->getTreePartitionLayerId(treeIdx, layerCnt));
     1323              layerNum++;
     1324            }
     1325          }
     1326        }
     1327        vps->setNumLayersInIdList(lsIdx, layerNum);
     1328      }
     1329    }
     1330  }
     1331#endif
     1332
    12761333#if !VPS_EXTN_UEV_CODING
    12771334  READ_FLAG( uiCode, "more_output_layer_sets_than_default_flag" ); vps->setMoreOutputLayerSetsThanDefaultFlag( uiCode ? true : false );
     
    16761733  }
    16771734#endif
    1678 #if O0092_0094_DEPENDENCY_CONSTRAINT
     1735#if !Q0078_ADD_LAYER_SETS
     1736#if O0092_0094_DEPENDENCY_CONSTRAINT // Moved up
    16791737  vps->setNumRefLayers();
    16801738
     
    16861744    }
    16871745  }
     1746#endif
    16881747#endif
    16891748
  • branches/SHM-6-dev/source/Lib/TLibDecoder/TDecTop.cpp

    r765 r778  
    107107TDecTop::~TDecTop()
    108108{
     109#if Q0078_ADD_LAYER_SETS
     110  for (Int psId = 0; psId < MAX_NUM_SPS; psId++)
     111  {
     112    TComSPS* sps = m_parameterSetManagerDecoder.getSPS(psId);
     113    if (sps != NULL)
     114    {
     115      // Remove parameter set from other layers to prevent multiple deletes of the same object
     116      for (Int lId = 0; lId < m_numLayer; lId++)
     117      {
     118        if (m_ppcTDecTop[lId] != this)
     119        {
     120          m_parameterSetManagerDecoder.removeSPS(psId);
     121        }
     122      }
     123    }
     124  }
     125  for (Int psId = 0; psId < MAX_NUM_PPS; psId++)
     126  {
     127    TComPPS* pps = m_parameterSetManagerDecoder.getPPS(psId);
     128    if (pps != NULL)
     129    {
     130      // Remove parameter set from other layers to prevent multiple deletes of the same object
     131      for (Int lId = 0; lId < m_numLayer; lId++)
     132      {
     133        if (m_ppcTDecTop[lId] != this)
     134        {
     135          m_parameterSetManagerDecoder.removePPS(psId);
     136        }
     137      }
     138    }
     139  }
     140#endif
    109141#if ENC_DEC_TRACE
    110142  fclose( g_hTrace );
     
    18861918#endif
    18871919  m_parameterSetManagerDecoder.storePrefetchedSPS(sps);
     1920#if Q0078_ADD_LAYER_SETS
     1921  // Store SPS for all layers
     1922  for (Int lId = 0; lId < m_numLayer; lId++)
     1923  {
     1924    if (m_ppcTDecTop[lId] != this)
     1925    {
     1926      m_ppcTDecTop[lId]->getParameterSetManager()->storePrefetchedSPS(sps);
     1927    }
     1928  }
     1929#endif
    18881930#if !REPN_FORMAT_IN_VPS   // ILRP can only be initialized at activation 
    18891931  if(m_numLayer>0)
     
    19161958    );
    19171959  m_parameterSetManagerDecoder.storePrefetchedPPS( pps );
     1960#if Q0078_ADD_LAYER_SETS
     1961  // Store PPS for all layers
     1962  for (Int lId = 0; lId < m_numLayer; lId++)
     1963  {
     1964    if (m_ppcTDecTop[lId] != this)
     1965    {
     1966      m_ppcTDecTop[lId]->getParameterSetManager()->storePrefetchedPPS(pps);
     1967    }
     1968  }
     1969#endif
    19181970
    19191971  if( pps->getDependentSliceSegmentsEnabledFlag() )
  • branches/SHM-6-dev/source/Lib/TLibEncoder/SEIwrite.cpp

    r776 r778  
    130130    break;
    131131#endif
     132#if Q0078_ADD_LAYER_SETS
     133  case SEI::OUTPUT_LAYER_SET_NESTING:
     134    fprintf(g_hTrace, "=========== Output layer set nesting SEI message ===========\n");
     135    break;
     136  case SEI::VPS_REWRITING:
     137    fprintf(g_hTrace, "=========== VPS rewriting SEI message ===========\n");
     138    break;
     139#endif
    132140#endif //SVC_EXTENSION
    133141  default:
     
    227235   case SEI::BSP_HRD:
    228236     xWriteSEIBspHrd(*static_cast<const SEIBspHrd*>(&sei), sps, nestingSei);
     237     break;
     238#endif
     239#if Q0078_ADD_LAYER_SETS
     240   case SEI::OUTPUT_LAYER_SET_NESTING:
     241     xWriteSEIOutputLayerSetNesting(bs, *static_cast<const SEIOutputLayerSetNesting*>(&sei), vps, sps);
     242     break;
     243   case SEI::VPS_REWRITING:
     244     xWriteSEIVPSRewriting(*static_cast<const SEIVPSRewriting*>(&sei));
    229245     break;
    230246#endif
     
    10351051#endif
    10361052
     1053#if Q0078_ADD_LAYER_SETS
     1054
     1055Void SEIWriter::xWriteSEIOutputLayerSetNesting(TComBitIf& bs, const SEIOutputLayerSetNesting &sei, TComVPS *vps, TComSPS *sps)
     1056{
     1057  WRITE_FLAG(sei.m_olsFlag, "ols_flag");
     1058  WRITE_UVLC(sei.m_numOlsIndicesMinus1, "num_ols_indices_minus1");
     1059
     1060  for (Int i = 0; i <= sei.m_numOlsIndicesMinus1; i++)
     1061  {
     1062    WRITE_UVLC(sei.m_olsIdx[i], "ols_idx[i]");
     1063  }
     1064
     1065  while (m_pcBitIf->getNumberOfWrittenBits() % 8 != 0)
     1066  {
     1067    WRITE_FLAG(0, "ols_nesting_zero_bit");
     1068  }
     1069
     1070  // write nested SEI messages
     1071  for (SEIMessages::const_iterator it = sei.m_nestedSEIs.begin(); it != sei.m_nestedSEIs.end(); it++)
     1072  {
     1073    writeSEImessage(bs, *(*it), vps, sps);
     1074  }
     1075}
     1076
     1077Void SEIWriter::xWriteSEIVPSRewriting(const SEIVPSRewriting &sei)
     1078{
     1079  //sei.nalu->
     1080}
     1081
     1082#endif
     1083
    10371084#endif //SVC_EXTENSION
    10381085
  • branches/SHM-6-dev/source/Lib/TLibEncoder/SEIwrite.h

    r776 r778  
    101101  Void xCodeHrdParameters( TComHRD *hrd, Bool commonInfPresentFlag, UInt maxNumSubLayersMinus1 );
    102102#endif
     103#if Q0078_ADD_LAYER_SETS
     104  Void xWriteSEIOutputLayerSetNesting(TComBitIf& bs, const SEIOutputLayerSetNesting &sei, TComVPS *vps, TComSPS *sps);
     105  Void xWriteSEIVPSRewriting(const SEIVPSRewriting &sei);
     106#endif
    103107#endif //SVC_EXTENSION
    104108};
  • branches/SHM-6-dev/source/Lib/TLibEncoder/TEncCavlc.cpp

    r763 r778  
    10001000#endif
    10011001
     1002#if Q0078_ADD_LAYER_SETS
     1003  if (vps->getNumIndependentLayers() > 1)
     1004  {
     1005    WRITE_UVLC( vps->getNumAddLayerSets(), "num_add_layer_sets" );
     1006    for (Int i = 0; i < vps->getNumAddLayerSets(); i++)
     1007    {
     1008      for (Int j = 1; j < vps->getNumIndependentLayers(); j++)
     1009      {
     1010        int len = 1;
     1011        while ((1 << len) < (vps->getNumLayersInTreePartition(j) + 1))
     1012        {
     1013          len++;
     1014        }
     1015        WRITE_CODE(vps->getHighestLayerIdxPlus1(i, j), len, "highest_layer_idx_plus1[i][j]");
     1016      }
     1017    }
     1018  }
     1019#endif
     1020
    10021021#if !VPS_EXTN_UEV_CODING
    10031022  Int numOutputLayerSets = vps->getNumOutputLayerSets() ;
  • branches/SHM-6-dev/source/Lib/TLibEncoder/TEncGOP.cpp

    r776 r778  
    21702170      nalu = NALUnit(NAL_UNIT_SPS);
    21712171#endif
     2172#if Q0078_ADD_LAYER_SETS
     2173      if (m_pcEncTop->getVPS()->getNumDirectRefLayers(m_layerId) == 0 && m_pcEncTop->getVPS()->getNumAddLayerSets() > 0)
     2174      {
     2175        nalu.m_layerId = 0; // For independent base layer rewriting
     2176      }
     2177#endif
    21722178      m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream);
    21732179      if (m_bSeqFirst)
     
    22072213#else
    22082214      nalu = NALUnit(NAL_UNIT_PPS);
     2215#endif
     2216#if Q0078_ADD_LAYER_SETS
     2217      if (m_pcEncTop->getVPS()->getNumDirectRefLayers(m_layerId) == 0 && m_pcEncTop->getVPS()->getNumAddLayerSets() > 0)
     2218      {
     2219        nalu.m_layerId = 0; // For independent base layer rewriting
     2220      }
    22092221#endif
    22102222      m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream);
  • branches/SHM-6-dev/source/Lib/TLibEncoder/TEncTop.cpp

    r762 r778  
    912912{
    913913#if SVC_EXTENSION
     914#if Q0078_ADD_LAYER_SETS
     915  if (getNumDirectRefLayers() == 0 && getNumAddLayerSets() > 0)
     916  {
     917    m_cSPS.setLayerId(0); // layer ID 0 for independent layers
     918  }
     919  else
     920  {
     921    m_cSPS.setLayerId(m_layerId);
     922  }
     923#else
    914924  m_cSPS.setLayerId(m_layerId);
     925#endif
    915926  m_cSPS.setNumScaledRefLayerOffsets(m_numScaledRefLayerOffsets);
    916927  for(Int i = 0; i < m_cSPS.getNumScaledRefLayerOffsets(); i++)
     
    11711182#endif
    11721183
     1184#if Q0078_ADD_LAYER_SETS
     1185  if (getNumDirectRefLayers() == 0 && getNumAddLayerSets() > 0)
     1186  {
     1187    m_cPPS.setLayerId(0); // layer ID 0 for independent layers
     1188  }
     1189#endif
     1190
    11731191  if( m_layerId > 0 )
    11741192  {
  • branches/SHM-6-dev/source/Lib/TLibEncoder/TEncTop.h

    r652 r778  
    154154  Bool                    m_interLayerWeightedPredFlag;
    155155#endif
     156#if Q0078_ADD_LAYER_SETS
     157  int                     m_numAddLayerSets;
     158#endif
    156159#endif //SVC_EXTENSION
    157160protected:
     
    268271  Void setNoOutputOfPriorPicsFlags(Bool x)   { m_noOutputOfPriorPicsFlags = x;   }
    269272#endif
     273#if Q0078_ADD_LAYER_SETS
     274  Void setNumAddLayerSets(Int x)             { m_numAddLayerSets = x; }
     275  Int  getNumAddLayerSets()                  { return m_numAddLayerSets; }
     276#endif
    270277#else //SVC_EXTENSION
    271278  Void encode( Bool bEos, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut,
Note: See TracChangeset for help on using the changeset viewer.