Add experimental simulcast screen content mode

BUG=webrtc:4172

Review-Url: https://codereview.webrtc.org/2636443002
Cr-Commit-Position: refs/heads/master@{#16135}
diff --git a/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.cc b/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.cc
index feb8da9..aca4514 100644
--- a/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.cc
+++ b/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.cc
@@ -30,6 +30,8 @@
 const double ScreenshareLayers::kMaxTL0FpsReduction = 2.5;
 const double ScreenshareLayers::kAcceptableTargetOvershoot = 2.0;
 
+constexpr int ScreenshareLayers::kMaxNumTemporalLayers;
+
 // Since this is TL0 we only allow updating and predicting from the LAST
 // reference frame.
 const int ScreenshareLayers::kTl0Flags =
@@ -55,8 +57,14 @@
     int simulcast_id,
     int num_temporal_layers,
     uint8_t initial_tl0_pic_idx) const {
-  webrtc::TemporalLayers* tl = new webrtc::ScreenshareLayers(
-      num_temporal_layers, rand(), webrtc::Clock::GetRealTimeClock());
+  webrtc::TemporalLayers* tl;
+  if (simulcast_id == 0) {
+    tl = new webrtc::ScreenshareLayers(num_temporal_layers, rand(),
+                                       webrtc::Clock::GetRealTimeClock());
+  } else {
+    RealTimeTemporalLayersFactory rt_tl_factory;
+    tl = rt_tl_factory.Create(simulcast_id, num_temporal_layers, rand());
+  }
   if (listener_)
     listener_->OnTemporalLayersCreated(simulcast_id, tl);
   return tl;
@@ -66,7 +74,8 @@
                                      uint8_t initial_tl0_pic_idx,
                                      Clock* clock)
     : clock_(clock),
-      number_of_temporal_layers_(num_temporal_layers),
+      number_of_temporal_layers_(
+          std::min(kMaxNumTemporalLayers, num_temporal_layers)),
       last_base_layer_sync_(false),
       tl0_pic_idx_(initial_tl0_pic_idx),
       active_layer_(-1),
@@ -78,8 +87,8 @@
       max_debt_bytes_(0),
       encode_framerate_(1000.0f, 1000.0f),  // 1 second window, second scale.
       bitrate_updated_(false) {
-  RTC_CHECK_GT(num_temporal_layers, 0);
-  RTC_CHECK_LE(num_temporal_layers, 2);
+  RTC_CHECK_GT(number_of_temporal_layers_, 0);
+  RTC_CHECK_LE(number_of_temporal_layers_, kMaxNumTemporalLayers);
 }
 
 ScreenshareLayers::~ScreenshareLayers() {
diff --git a/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h b/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h
index de7665c..53818a2 100644
--- a/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h
+++ b/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h
@@ -84,7 +84,7 @@
   RateStatistics encode_framerate_;
   bool bitrate_updated_;
 
-  static const int kMaxNumTemporalLayers = 2;
+  static constexpr int kMaxNumTemporalLayers = 2;
   struct TemporalLayer {
     TemporalLayer()
         : state(State::kNormal),
diff --git a/webrtc/modules/video_coding/video_codec_initializer.cc b/webrtc/modules/video_coding/video_codec_initializer.cc
index dbdede0..9d15952 100644
--- a/webrtc/modules/video_coding/video_codec_initializer.cc
+++ b/webrtc/modules/video_coding/video_codec_initializer.cc
@@ -38,8 +38,8 @@
     case kVideoCodecVP8: {
       if (!codec->VP8()->tl_factory) {
         if (codec->mode == kScreensharing &&
-            codec->numberOfSimulcastStreams == 1 &&
-            codec->VP8()->numberOfTemporalLayers == 2) {
+            codec->numberOfSimulcastStreams >= 1 &&
+            codec->VP8()->numberOfTemporalLayers >= 1) {
           // Conference mode temporal layering for screen content.
           tl_factory.reset(new ScreenshareTemporalLayersFactory());
         } else {