Index: branches/HTM-10.0-dev0/source/Lib/TLibEncoder/SEIwrite.cpp
===================================================================
--- branches/HTM-10.0-dev0/source/Lib/TLibEncoder/SEIwrite.cpp	(revision 858)
+++ branches/HTM-10.0-dev0/source/Lib/TLibEncoder/SEIwrite.cpp	(revision 862)
@@ -93,4 +93,9 @@
     fprintf( g_hTrace, "=========== Scalable Nesting SEI message ===========\n");
     break;
+#if H_MV_HLS_7_SEI_P0204_26
+    case SEI::SUB_BITSTREAM_PROPERTY:
+    fprintf( g_hTrace, "=========== Sub-bitstream property SEI message ===========\n");
+    break;
+#endif
   default:
     fprintf( g_hTrace, "=========== Unknown SEI message ===========\n");
@@ -146,4 +151,9 @@
     xWriteSEIScalableNesting(bs, *static_cast<const SEIScalableNesting*>(&sei), sps);
     break;
+#if H_MV_HLS_7_SEI_P0204_26
+   case SEI::SUB_BITSTREAM_PROPERTY:
+   xWriteSEISubBitstreamProperty(*static_cast<const SEISubBitstreamProperty*>(&sei));
+   break;
+#endif
   default:
     assert(!"Unhandled SEI message");
@@ -579,4 +589,23 @@
 }
 
+#if H_MV_HLS_7_SEI_P0204_26
+Void SEIWriter::xWriteSEISubBitstreamProperty(const SEISubBitstreamProperty &sei)
+{
+  WRITE_CODE( sei.m_activeVpsId, 4, "active_vps_id" );
+  assert( sei.m_numAdditionalSubStreams >= 1 );
+  WRITE_UVLC( sei.m_numAdditionalSubStreams - 1, "num_additional_sub_streams_minus1" );
+
+  for( Int i = 0; i < sei.m_numAdditionalSubStreams; i++ )
+  {
+    WRITE_CODE( sei.m_subBitstreamMode[i],       2, "sub_bitstream_mode[i]"           );
+    WRITE_UVLC( sei.m_outputLayerSetIdxToVps[i],    "output_layer_set_idx_to_vps[i]"  );
+    WRITE_CODE( sei.m_highestSublayerId[i],      3, "highest_sub_layer_id[i]"         );
+    WRITE_CODE( sei.m_avgBitRate[i],            16, "avg_bit_rate[i]"                 );
+    WRITE_CODE( sei.m_maxBitRate[i],            16, "max_bit_rate[i]"                 );
+  }
+  xWriteByteAlign();
+}
+#endif
+
 Void SEIWriter::xWriteByteAlign()
 {
Index: branches/HTM-10.0-dev0/source/Lib/TLibEncoder/SEIwrite.h
===================================================================
--- branches/HTM-10.0-dev0/source/Lib/TLibEncoder/SEIwrite.h	(revision 858)
+++ branches/HTM-10.0-dev0/source/Lib/TLibEncoder/SEIwrite.h	(revision 862)
@@ -66,4 +66,7 @@
   Void xWriteSEISOPDescription(const SEISOPDescription& sei);
   Void xWriteSEIScalableNesting(TComBitIf& bs, const SEIScalableNesting& sei, TComSPS *sps);
+#if H_MV_HLS_7_SEI_P0204_26
+  Void xWriteSEISubBitstreamProperty(const SEISubBitstreamProperty &sei);
+#endif
   Void xWriteByteAlign();
 };
Index: branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncCfg.h
===================================================================
--- branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncCfg.h	(revision 858)
+++ branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncCfg.h	(revision 862)
@@ -347,4 +347,13 @@
 
   Bool      m_useStrongIntraSmoothing;                        ///< enable the use of strong intra smoothing (bi_linear interpolation) for 32x32 blocks when reference samples are flat.
+#if H_MV_HLS_7_SEI_P0204_26
+  Bool              m_subBistreamPropSEIEnabled;
+  Int               m_numAdditionalSubStreams;
+  std::vector<Int>  m_subBitstreamMode;
+  std::vector<Int>  m_outputLayerSetIdxToVps;
+  std::vector<Int>  m_highestSublayerId;
+  std::vector<Int>  m_avgBitRate;
+  std::vector<Int>  m_maxBitRate;
+#endif
 
 #if H_MV
@@ -779,4 +788,33 @@
   Void  setScalableNestingSEIEnabled(Int b)                { m_scalableNestingSEIEnabled = b; }
   Int   getScalableNestingSEIEnabled()                     { return m_scalableNestingSEIEnabled; }
+
+#if H_MV_HLS_7_SEI_P0204_26
+  Bool   getSubBitstreamPropSEIEnabled()        { return m_subBistreamPropSEIEnabled;}
+  Void   setSubBitstreamPropSEIEnabled(Bool x)  { m_subBistreamPropSEIEnabled = x;}
+
+  Int    getNumAdditionalSubStreams()           { return m_numAdditionalSubStreams;}
+  Void   setNumAdditionalSubStreams(Int x)      { m_numAdditionalSubStreams = x;}
+
+  std::vector<Int> const &getSubBitstreamMode()  { return m_subBitstreamMode;}
+  Int   getSubBitstreamMode(Int idx)  { return m_subBitstreamMode[idx];}
+  Void  setSubBitstreamMode(std::vector<Int> &x)  { m_subBitstreamMode = x;}
+
+  std::vector<Int> const &getOutputLayerSetIdxToVps()  { return m_outputLayerSetIdxToVps;}
+  Int   getOutputLayerSetIdxToVps(Int idx)  { return m_outputLayerSetIdxToVps[idx];}
+  Void  setOutputLayerSetIdxToVps(std::vector<Int> &x)  { m_outputLayerSetIdxToVps = x;}
+
+  std::vector<Int> const &getHighestSublayerId()  { return m_highestSublayerId;}
+  Int   getHighestSublayerId(Int idx)  { return m_highestSublayerId[idx];}
+  Void  setHighestSublayerId(std::vector<Int> &x)  { m_highestSublayerId = x;}
+
+  std::vector<Int> const &getAvgBitRate()  { return m_avgBitRate;}
+  Int   getAvgBitRate(Int idx)  { return m_avgBitRate[idx];}
+  Void  setAvgBitRate(std::vector<Int> &x)  { m_avgBitRate = x;}
+
+  std::vector<Int> const &getMaxBitRate()  { return m_maxBitRate;}
+  Int   getMaxBitRate(Int idx)  { return m_maxBitRate[idx];}
+  Void  setMaxBitRate(std::vector<Int> &x)  { m_maxBitRate = x;}
+
+#endif
   Void      setUseWP               ( Bool b )    { m_useWeightedPred   = b;    }
   Void      setWPBiPred            ( Bool b )    { m_useWeightedBiPred = b;    }
Index: branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncGOP.cpp
===================================================================
--- branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncGOP.cpp	(revision 858)
+++ branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncGOP.cpp	(revision 862)
@@ -296,4 +296,23 @@
 }
 
+#if H_MV_HLS_7_SEI_P0204_26
+SEISubBitstreamProperty *TEncGOP::xCreateSEISubBitstreamProperty( TComSPS *sps)
+{
+  SEISubBitstreamProperty *seiSubBitstreamProperty = new SEISubBitstreamProperty();
+
+  seiSubBitstreamProperty->m_activeVpsId = sps->getVPSId();
+  /* These values can be determined by the encoder; for now we will use the input parameter */
+  TEncTop *encTop = this->m_pcEncTop;
+  seiSubBitstreamProperty->m_numAdditionalSubStreams = encTop->getNumAdditionalSubStreams();
+  seiSubBitstreamProperty->m_subBitstreamMode        = encTop->getSubBitstreamMode();
+  seiSubBitstreamProperty->m_outputLayerSetIdxToVps  = encTop->getOutputLayerSetIdxToVps();
+  seiSubBitstreamProperty->m_highestSublayerId       = encTop->getHighestSublayerId();
+  seiSubBitstreamProperty->m_avgBitRate              = encTop->getAvgBitRate();
+  seiSubBitstreamProperty->m_maxBitRate              = encTop->getMaxBitRate();
+
+  return seiSubBitstreamProperty;
+}
+#endif
+
 Void TEncGOP::xCreateLeadingSEIMessages (/*SEIMessages seiMessages,*/ AccessUnit &accessUnit, TComSPS *sps)
 {
@@ -346,4 +365,17 @@
     delete sei;
   }
+#if H_MV_HLS_7_SEI_P0204_26
+  if( m_pcCfg->getSubBitstreamPropSEIEnabled() )
+  {
+    SEISubBitstreamProperty *sei = xCreateSEISubBitstreamProperty ( sps );
+
+    nalu = NALUnit(NAL_UNIT_PREFIX_SEI); 
+    m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream);
+    m_seiWriter.writeSEImessage(nalu.m_Bitstream, *sei, sps); 
+    writeRBSPTrailingBits(nalu.m_Bitstream);
+    accessUnit.push_back(new NALUnitEBSP(nalu));
+    delete sei;
+  }
+#endif
 }
 
Index: branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncGOP.h
===================================================================
--- branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncGOP.h	(revision 858)
+++ branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncGOP.h	(revision 862)
@@ -212,4 +212,7 @@
 
   SEIToneMappingInfo*     xCreateSEIToneMappingInfo();
+#if H_MV_HLS_7_SEI_P0204_26
+  SEISubBitstreamProperty *xCreateSEISubBitstreamProperty( TComSPS *sps);
+#endif
 
   Void xCreateLeadingSEIMessages (/*SEIMessages seiMessages,*/ AccessUnit &accessUnit, TComSPS *sps);
