Add RTCP and simulcast support for RTCRtpReceiver::getParameters()

Bug: webrtc:9989
Change-Id: I1235789cd485750937a427199f9d32ed6180145e
Reviewed-on: https://webrtc-review.googlesource.com/c/110616
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25714}
diff --git a/media/base/fakemediaengine.h b/media/base/fakemediaengine.h
index d7b44c5..e3a0638 100644
--- a/media/base/fakemediaengine.h
+++ b/media/base/fakemediaengine.h
@@ -124,7 +124,7 @@
     }
     receive_streams_.push_back(sp);
     rtp_receive_parameters_[sp.first_ssrc()] =
-        CreateRtpParametersWithOneEncoding();
+        CreateRtpParametersWithEncodings(sp);
     return true;
   }
   virtual bool RemoveRecvStream(uint32_t ssrc) {
diff --git a/media/engine/webrtcvideoengine.cc b/media/engine/webrtcvideoengine.cc
index e55e0e5..a75db73 100644
--- a/media/engine/webrtcvideoengine.cc
+++ b/media/engine/webrtcvideoengine.cc
@@ -2252,26 +2252,20 @@
   return stream_->GetSources();
 }
 
-absl::optional<uint32_t>
-WebRtcVideoChannel::WebRtcVideoReceiveStream::GetFirstPrimarySsrc() const {
-  std::vector<uint32_t> primary_ssrcs;
-  stream_params_.GetPrimarySsrcs(&primary_ssrcs);
-
-  if (primary_ssrcs.empty()) {
-    RTC_LOG(LS_WARNING)
-        << "Empty primary ssrcs vector, returning empty optional";
-    return absl::nullopt;
-  } else {
-    return primary_ssrcs[0];
-  }
-}
-
 webrtc::RtpParameters
 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetRtpParameters() const {
   webrtc::RtpParameters rtp_parameters;
-  rtp_parameters.encodings.emplace_back();
-  rtp_parameters.encodings[0].ssrc = GetFirstPrimarySsrc();
+
+  std::vector<uint32_t> primary_ssrcs;
+  stream_params_.GetPrimarySsrcs(&primary_ssrcs);
+  for (uint32_t ssrc : primary_ssrcs) {
+    rtp_parameters.encodings.emplace_back();
+    rtp_parameters.encodings.back().ssrc = ssrc;
+  }
+
   rtp_parameters.header_extensions = config_.rtp.extensions;
+  rtp_parameters.rtcp.reduced_size =
+      config_.rtp.rtcp_mode == webrtc::RtcpMode::kReducedSize;
 
   return rtp_parameters;
 }
diff --git a/media/engine/webrtcvideoengine.h b/media/engine/webrtcvideoengine.h
index 9ecf13f..3b79ad4 100644
--- a/media/engine/webrtcvideoengine.h
+++ b/media/engine/webrtcvideoengine.h
@@ -420,8 +420,6 @@
 
     std::string GetCodecNameFromPayloadType(int payload_type);
 
-    absl::optional<uint32_t> GetFirstPrimarySsrc() const;
-
     webrtc::Call* const call_;
     const StreamParams stream_params_;
 
diff --git a/pc/rtpsenderreceiver_unittest.cc b/pc/rtpsenderreceiver_unittest.cc
index b5a513b..3be69ba 100644
--- a/pc/rtpsenderreceiver_unittest.cc
+++ b/pc/rtpsenderreceiver_unittest.cc
@@ -230,6 +230,24 @@
     VerifyVideoChannelOutput();
   }
 
+  void CreateVideoRtpReceiverWithSimulcast(
+      std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
+      int num_layers = kVideoSimulcastLayerCount) {
+    std::vector<uint32_t> ssrcs;
+    for (int i = 0; i < num_layers; ++i)
+      ssrcs.push_back(kVideoSsrcSimulcast + i);
+    cricket::StreamParams stream_params =
+        cricket::CreateSimStreamParams("cname", ssrcs);
+    video_media_channel_->AddRecvStream(stream_params);
+    uint32_t primary_ssrc = stream_params.first_ssrc();
+
+    video_rtp_receiver_ = new VideoRtpReceiver(
+        rtc::Thread::Current(), kVideoTrackId, std::move(streams));
+    video_rtp_receiver_->SetMediaChannel(video_media_channel_);
+    video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
+    video_track_ = video_rtp_receiver_->video_track();
+  }
+
   void DestroyAudioRtpReceiver() {
     audio_rtp_receiver_ = nullptr;
     VerifyVoiceChannelNoOutput();
@@ -1263,6 +1281,15 @@
   DestroyVideoRtpReceiver();
 }
 
+TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
+  CreateVideoRtpReceiverWithSimulcast({}, 2);
+
+  RtpParameters params = video_rtp_receiver_->GetParameters();
+  EXPECT_EQ(2u, params.encodings.size());
+
+  DestroyVideoRtpReceiver();
+}
+
 // Test that makes sure that a video track content hint translates to the proper
 // value for sources that are not screencast.
 TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {