Index: /branches/SHM-dev/cfg/layers.cfg
===================================================================
--- /branches/SHM-dev/cfg/layers.cfg	(revision 860)
+++ /branches/SHM-dev/cfg/layers.cfg	(revision 861)
@@ -43,7 +43,12 @@
 
 
-NumLayerSets                  : 1
-NumLayerInIdList0             : 2
-LayerSetLayerIdList0          : 0 1
+NumLayerSets                  : 2			# Include default layer set, value of 0 not allowed
+NumLayerInIdList1             : 2			# 0-th layer set is default, need not specify LayerSetLayerIdList0 or NumLayerInIdList0
+LayerSetLayerIdList1          : 0 1
 
 NumAddLayerSets               : 0
+NumOutputLayerSets	      : 2			# Include defualt OLS, value of 0 not allowed
+DefaultTargetOutputLayerIdc   : 1
+NumLayersInOutputLayerSet     : 1			# The number of layers in the 0-th OLS should not be specified, 
+							# ListOfOutputLayers0 need not be specified
+ListOfOutputLayers1	      : 1			
Index: /branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.cpp
===================================================================
--- /branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.cpp	(revision 860)
+++ /branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.cpp	(revision 861)
@@ -72,4 +72,8 @@
 , m_scalingListFile()
 , m_elRapSliceBEnabled(0)
+#if OUTPUT_LAYER_SETS_CONFIG
+, m_defaultTargetOutputLayerIdc (-1)
+, m_numOutputLayerSets          (-1)
+#endif
 {
   for(UInt layer=0; layer<MAX_LAYERS; layer++)
@@ -580,4 +584,9 @@
   }
 #endif
+#if OUTPUT_LAYER_SETS_CONFIG
+  string* cfg_numLayersInOutputLayerSet = new string;
+  string* cfg_listOfOutputLayers     = new string[MAX_VPS_OUTPUT_LAYER_SETS_PLUS1];
+  string* cfg_outputLayerSetIdx      = new string;
+#endif
 #if AVC_BASE
   string  cfg_BLInputFile;
@@ -636,5 +645,9 @@
   ("NumLayers",               m_numLayers, 1, "Number of layers to code")
 #if Q0078_ADD_LAYER_SETS
+#if OUTPUT_LAYER_SETS_CONFIG
+  ("NumLayerSets",            m_numLayerSets, 1, "Number of layer sets")
+#else
   ("NumLayerSets",            m_numLayerSets, 0, "Number of layer sets")
+#endif
   ("NumLayerInIdList%d",      cfg_numLayerInIdList, 0, MAX_VPS_LAYER_ID_PLUS1, "Number of layers in the set")
   ("LayerSetLayerIdList%d",   cfg_layerSetLayerIdListPtr, string(""), MAX_VPS_LAYER_ID_PLUS1, "Layer IDs for the set")
@@ -642,4 +655,11 @@
   ("NumHighestLayerIdx%d",    cfg_numHighestLayerIdx, 0, MAX_VPS_LAYER_ID_PLUS1, "Number of highest layer idx")
   ("HighestLayerIdx%d",       cfg_highestLayerIdxPtr, string(""), MAX_VPS_LAYER_ID_PLUS1, "Highest layer idx for an additional layer set")
+#endif
+#if OUTPUT_LAYER_SETS_CONFIG
+  ("DefaultTargetOutputLayerIdc",    m_defaultTargetOutputLayerIdc, 1, "Default target output layers. 0: All layers are output layer, 1: Only highest layer is output layer, 2 or 3: No default output layers")
+  ("NumOutputLayerSets",            m_numOutputLayerSets, 1, "Number of output layer sets excluding the 0-th output layer set")
+  ("NumLayersInOutputLayerSet",   cfg_numLayersInOutputLayerSet, string(""), 1 , "List containing number of output layers in the output layer sets")
+  ("ListOfOutputLayers%d",          cfg_listOfOutputLayers, string(""), MAX_VPS_LAYER_ID_PLUS1, "Layer IDs for the set, in terms of layer ID in the output layer set Range: [0..NumLayersInOutputLayerSet-1]")
+  ("OutputLayerSetIdx",            cfg_outputLayerSetIdx, string(""), 1, "Corresponding layer set index, only for non-default output layer sets")
 #endif
 #if AUXILIARY_PICTURES
@@ -1701,4 +1721,10 @@
 #endif
 #if Q0078_ADD_LAYER_SETS
+#if OUTPUT_LAYER_SETS_CONFIG
+  for (Int layerSet = 1; layerSet < m_numLayerSets; layerSet++)
+  {
+    // Simplifying the code in the #else section, and allowing 0-th layer set t
+    assert( scanStringToArray( cfg_layerSetLayerIdList[layerSet], m_numLayerInIdList[layerSet], "NumLayerInIdList", m_layerSetLayerIdList[layerSet] ) );
+#else
   for (Int layerSet = 0; layerSet < m_numLayerSets; layerSet++)
   {
@@ -1726,7 +1752,12 @@
       }
     }
+#endif
   }
   for (Int addLayerSet = 0; addLayerSet < m_numAddLayerSets; addLayerSet++)
   {
+#if OUTPUT_LAYER_SETS_CONFIG
+    // Simplifying the code in the #else section
+    assert( scanStringToArray( cfg_layerSetLayerIdList[addLayerSet], m_numLayerInIdList[addLayerSet], "NumLayerInIdList",  m_highestLayerIdx[addLayerSet] ) );
+#else
     if (m_numHighestLayerIdx[addLayerSet] > 0)
     {
@@ -1752,5 +1783,56 @@
       }
     }
-  }
+#endif
+  }
+#endif
+#if OUTPUT_LAYER_SETS_CONFIG
+  if( m_defaultTargetOutputLayerIdc != -1 )
+  {
+    assert( m_defaultTargetOutputLayerIdc >= 0 && m_defaultTargetOutputLayerIdc <= 3 );
+  }
+  assert( m_numOutputLayerSets != 0 );
+  assert( m_numOutputLayerSets >= m_numLayerSets + m_numAddLayerSets ); // Number of output layer sets must be at least as many as layer sets.
+
+  Int *tempArray = NULL;
+  
+  // If output layer Set Idx is specified, only specify it for the non-default output layer sets
+  Int numNonDefaultOls = m_numOutputLayerSets - (m_numLayerSets + m_numAddLayerSets);
+  if( numNonDefaultOls )
+  {
+    assert( scanStringToArray( *cfg_outputLayerSetIdx, numNonDefaultOls, "OutputLayerSetIdx", m_outputLayerSetIdx ) ); 
+    for(Int i = 0; i < numNonDefaultOls; i++)
+    {
+      assert( m_outputLayerSetIdx[i] >= 0 && m_outputLayerSetIdx[i] < (m_numLayerSets + m_numAddLayerSets) );
+    }
+  }
+
+  // Number of output layers in output layer sets
+  Bool readStringFlag = scanStringToArray( *cfg_numLayersInOutputLayerSet, m_numOutputLayerSets - 1, "NumLayersInOutputLayerSets", m_numLayersInOutputLayerSet );
+  m_numLayersInOutputLayerSet.insert(m_numLayersInOutputLayerSet.begin(), 1);
+  // Layers in the output layer set
+  m_listOfOutputLayers.resize(m_numOutputLayerSets);
+  Int startOlsCtr = 1;
+  if( m_defaultTargetOutputLayerIdc == 0 || m_defaultTargetOutputLayerIdc == 1 )
+  {
+    // Default output layer sets defined
+    startOlsCtr = m_numLayerSets + m_numAddLayerSets;
+  }
+  for( Int olsCtr = 1; olsCtr < m_numOutputLayerSets; olsCtr++ )
+  {
+    if( olsCtr < startOlsCtr )
+    {
+      if(scanStringToArray( cfg_listOfOutputLayers[olsCtr], m_numLayersInOutputLayerSet[olsCtr], "ListOfOutputLayers", m_listOfOutputLayers[olsCtr] ) )
+      {
+        std::cout << "Default OLS defined. Ignoring ListOfOutputLayers" << olsCtr << endl;
+      }
+    }
+    else
+    {
+      assert( scanStringToArray( cfg_listOfOutputLayers[olsCtr], m_numLayersInOutputLayerSet[olsCtr], "ListOfOutputLayers", m_listOfOutputLayers[olsCtr] ) );
+    }
+  }
+  delete cfg_numLayersInOutputLayerSet;
+  delete [] cfg_listOfOutputLayers;
+  delete cfg_outputLayerSetIdx;
 #endif
 #endif //SVC_EXTENSION
@@ -3670,5 +3752,9 @@
 
 #if SVC_EXTENSION
+#if OUTPUT_LAYER_SETS_CONFIG
+Void TAppEncCfg::cfgStringToArray(Int **arr, string const cfgString, Int const numEntries, const char* logString)
+#else
 Void TAppEncCfg::cfgStringToArray(Int **arr, string cfgString, Int numEntries, const char* logString)
+#endif
 {
   Char *tempChar = cfgString.empty() ? NULL : strdup(cfgString.c_str());
@@ -3679,5 +3765,16 @@
     *arr = new Int[numEntries];
 
+#if OUTPUT_LAYER_SETS_CONFIG
+    if( tempChar == NULL )
+    {
+      arrayEntry = NULL;
+    }
+    else
+    {
+      arrayEntry = strtok( tempChar, " ,");
+    }
+#else
     arrayEntry = strtok( tempChar, " ,");
+#endif
     while(arrayEntry != NULL)
     {
@@ -3709,4 +3806,39 @@
 }
 
+#if OUTPUT_LAYER_SETS_CONFIG
+Bool TAppEncCfg::scanStringToArray(string const cfgString, Int const numEntries, const char* logString, Int * const returnArray)
+{
+  Int *tempArray = NULL;
+  // For all layer sets
+  cfgStringToArray( &tempArray, cfgString, numEntries, logString );
+  if(tempArray)
+  {
+    for(Int i = 0; i < numEntries; i++)
+    {
+      returnArray[i] = tempArray[i];
+    }
+    delete [] tempArray; tempArray = NULL;
+    return true;
+  }
+  return false;
+}
+Bool TAppEncCfg::scanStringToArray(string const cfgString, Int const numEntries, const char* logString, std::vector<Int> & returnVector)
+{
+  Int *tempArray = NULL;
+  // For all layer sets
+  cfgStringToArray( &tempArray, cfgString, numEntries, logString );
+  if(tempArray)
+  {
+    returnVector.empty();
+    for(Int i = 0; i < numEntries; i++)
+    {
+      returnVector.push_back(tempArray[i]);
+    }
+    delete [] tempArray; tempArray = NULL;
+    return true;
+  }
+  return false;
+}
+#endif
 #endif //SVC_EXTENSION
 //! \}
Index: /branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.h
===================================================================
--- /branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.h	(revision 860)
+++ /branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.h	(revision 861)
@@ -79,4 +79,11 @@
   Int       m_numHighestLayerIdx[MAX_VPS_LAYER_SETS_PLUS1];
   Int       m_highestLayerIdx[MAX_VPS_LAYER_SETS_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
+#endif
+#if OUTPUT_LAYER_SETS_CONFIG
+  std::vector<Int>                m_outputLayerSetIdx;
+  Int       m_defaultTargetOutputLayerIdc;
+  Int       m_numOutputLayerSets;
+  std::vector<Int>                m_numLayersInOutputLayerSet;
+  std::vector< std::vector<Int> > m_listOfOutputLayers;
 #endif
 #else
@@ -488,5 +495,11 @@
   Int  getWaveFrontSynchro()        { return m_iWaveFrontSynchro; }
   Void getDirFilename(string& filename, string& dir, const string path);
+#if OUTPUT_LAYER_SETS_CONFIG
+  Bool scanStringToArray(string const cfgString, Int const numEntries, const char* logString, Int * const returnArray);
+  Bool scanStringToArray(string const cfgString, Int const numEntries, const char* logString, std::vector<Int> &  returnVector);
+  Void cfgStringToArray(Int **arr, string const cfgString, Int const numEntries, const char* logString);
+#else
   Void cfgStringToArray(Int **arr, string cfgString, Int numEntries, const char* logString);
+#endif
 #if REPN_FORMAT_IN_VPS
   RepFormatCfg* getRepFormatCfg(Int i)  { return &m_repFormatCfg[i]; }
Index: /branches/SHM-dev/source/App/TAppEncoder/TAppEncTop.cpp
===================================================================
--- /branches/SHM-dev/source/App/TAppEncoder/TAppEncTop.cpp	(revision 860)
+++ /branches/SHM-dev/source/App/TAppEncoder/TAppEncTop.cpp	(revision 861)
@@ -1142,7 +1142,13 @@
 
 #if Q0078_ADD_LAYER_SETS
+#if OUTPUT_LAYER_SETS_CONFIG
+  if (m_numLayerSets > 1)
+  {
+    vps->setNumLayerSets(m_numLayerSets);
+#else
   if (m_numLayerSets > 0)
   {
     vps->setNumLayerSets(m_numLayerSets+1);
+#endif
     for (Int setId = 1; setId < vps->getNumLayerSets(); setId++)
     {
@@ -1154,8 +1160,13 @@
     for (Int setId = 1; setId < vps->getNumLayerSets(); setId++)
     {
+#if OUTPUT_LAYER_SETS_CONFIG
+      for (Int i = 0; i < m_numLayerInIdList[setId]; i++)
+      {
+        Int layerId = m_layerSetLayerIdList[setId][i];
+#else
       for (Int i = 0; i < m_numLayerInIdList[setId-1]; i++)
       {
         Int layerId = m_layerSetLayerIdList[setId-1][i];
-
+#endif
 #if O0194_DIFFERENT_BITDEPTH_EL_BL
         //4
@@ -1403,7 +1414,34 @@
 #endif
 #endif
+#if OUTPUT_LAYER_SETS_CONFIG
+
+  vps->setDefaultTargetOutputLayerIdc( m_defaultTargetOutputLayerIdc ); // As per configuration file
+
+  if( m_numOutputLayerSets == -1 )  // # of output layer sets not specified in the configuration file
+  {
+    vps->setNumOutputLayerSets(vps->getNumLayerSets());
+
+    for(i = 1; i < vps->getNumLayerSets(); i++)
+    {
+        vps->setOutputLayerSetIdx(i, i);
+    }
+  }
+  else
+  {
+    vps->setNumOutputLayerSets( m_numOutputLayerSets );
+    for( Int olsCtr = 0; olsCtr < vps->getNumLayerSets(); olsCtr ++ ) // Default output layer sets
+    {
+      vps->setOutputLayerSetIdx(i, i);
+    }
+    for( Int olsCtr = vps->getNumLayerSets(); olsCtr < vps->getNumOutputLayerSets(); olsCtr ++ )  // Non-default output layer sets
+    {
+      vps->setOutputLayerSetIdx(i, m_outputLayerSetIdx[olsCtr - vps->getNumLayerSets()]);
+    }
+  }
+#endif
   // Target output layer
   vps->setNumOutputLayerSets(vps->getNumLayerSets());
   vps->setNumProfileTierLevel(vps->getNumLayerSets());
+#if !OUTPUT_LAYER_SETS_CONFIG // Taken care by configuration file parameter
 #if P0295_DEFAULT_OUT_LAYER_IDC
   vps->setDefaultTargetOutputLayerIdc(1);
@@ -1415,8 +1453,11 @@
 #endif
 #endif
+#endif
   for(i = 1; i < vps->getNumLayerSets(); i++)
   {
     vps->setProfileLevelTierIdx(i, i);
+#if !OUTPUT_LAYER_SETS_CONFIG
     vps->setOutputLayerSetIdx(i, i);
+#endif
   }  
 #endif
@@ -1433,5 +1474,7 @@
 
   // derive OutputLayerFlag[i][j] 
+#if !OUTPUT_LAYER_SETS_CONFIG
   if( vps->getDefaultTargetOutputLayerIdc() == 1 )
+#endif
   {
     // default_output_layer_idc equal to 1 specifies that only the layer with the highest value of nuh_layer_id such that nuh_layer_id equal to nuhLayerIdA and 
@@ -1446,10 +1489,33 @@
         if( vps->getLayerIdIncludedFlag(lsIdx, layer) )      
 #endif
-        {        
+        {
+#if OUTPUT_LAYER_SETS_CONFIG
+          switch(vps->getDefaultTargetOutputLayerIdc())
+          {
+            case 0: vps->setOutputLayerFlag( lsIdx, layer, 1 );
+              break;
+            case 1: vps->setOutputLayerFlag( lsIdx, layer, layer == vps->getNumLayersInIdList(lsIdx) - 1 );
+              break;
+            case 2:
+            case 3: vps->setOutputLayerFlag( lsIdx, layer, std::find( m_listOfOutputLayers[lsIdx].begin(), m_listOfOutputLayers[lsIdx].end(), layer) != m_listOfOutputLayers[lsIdx].end() );
+              break;
+          }
+#else
           vps->setOutputLayerFlag( lsIdx, layer, layer == vps->getNumLayersInIdList(lsIdx) - 1 );
+#endif
         }
       }
     }
-  }
+#if OUTPUT_LAYER_SETS_CONFIG
+    for( Int olsIdx = vps->getNumLayerSets(); olsIdx < vps->getNumOutputLayerSets(); olsIdx++ )
+    {
+      for( UInt layer = 0; layer < vps->getNumLayersInIdList(vps->getOutputLayerSetIdx(olsIdx)); layer++ )
+      {
+        vps->setOutputLayerFlag( olsIdx, layer, std::find( m_listOfOutputLayers[olsIdx].begin(), m_listOfOutputLayers[olsIdx].end(), layer) != m_listOfOutputLayers[olsIdx].end());
+      }
+    }
+#endif
+  }
+#if !OUTPUT_LAYER_SETS_CONFIG
   else
   {
@@ -1457,4 +1523,5 @@
     assert(!"default_output_layer_idc not equal to 1 is not yet supported");
   }
+#endif
 
   // Initialize dpb_size_table() for all ouput layer sets in the VPS extension
Index: /branches/SHM-dev/source/Lib/TLibCommon/TypeDef.h
===================================================================
--- /branches/SHM-dev/source/Lib/TLibCommon/TypeDef.h	(revision 860)
+++ /branches/SHM-dev/source/Lib/TLibCommon/TypeDef.h	(revision 861)
@@ -51,4 +51,5 @@
 #define POC_RESET_RESTRICTIONS           1      ///< Restrictions on semantics of POC reset-related syntax elements, including one item from R0223
 #define POC_RESET_VALUE_RESTRICTION      1      ///< R0223: Restriction on the value of full_poc_reset_flag
+#define OUTPUT_LAYER_SETS_CONFIG         1
 #define O0137_MAX_LAYERID                1      ///< JCTVC-O0137, JCTVC-O0200, JCTVC-O0223: restrict nuh_layer_id and vps_max_layers_minus1
 
@@ -323,4 +324,5 @@
 #define MAX_VPS_OP_LAYER_SETS_PLUS1               (MAX_LAYERS+1)
 #define MAX_VPS_LAYER_SETS_PLUS1                  1024
+#define MAX_VPS_OUTPUT_LAYER_SETS_PLUS1           1024
 #define MAX_VPS_LAYER_ID_PLUS1                    MAX_LAYERS
 #else
