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) {