From 38332cdcb1079486370bea8b5407cb3e52026598 Mon Sep 17 00:00:00 2001 From: Florent Castelli Date: Tue, 20 Nov 2018 14:08:06 +0100 Subject: [PATCH] Add RTCP and simulcast support for RTCRtpReceiver::getParameters() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:9989 Change-Id: I1235789cd485750937a427199f9d32ed6180145e Reviewed-on: https://webrtc-review.googlesource.com/c/110616 Reviewed-by: Erik Språng Reviewed-by: Steve Anton Commit-Queue: Florent Castelli Cr-Commit-Position: refs/heads/master@{#25714} --- media/base/fakemediaengine.h | 2 +- media/engine/webrtcvideoengine.cc | 26 ++++++++++---------------- media/engine/webrtcvideoengine.h | 2 -- pc/rtpsenderreceiver_unittest.cc | 27 +++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/media/base/fakemediaengine.h b/media/base/fakemediaengine.h index d7b44c598f..e3a0638715 100644 --- a/media/base/fakemediaengine.h +++ b/media/base/fakemediaengine.h @@ -124,7 +124,7 @@ class RtpHelper : public Base { } 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 e55e0e5ef6..a75db73697 100644 --- a/media/engine/webrtcvideoengine.cc +++ b/media/engine/webrtcvideoengine.cc @@ -2252,26 +2252,20 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::GetSources() { return stream_->GetSources(); } -absl::optional -WebRtcVideoChannel::WebRtcVideoReceiveStream::GetFirstPrimarySsrc() const { - std::vector 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 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 9ecf13f342..3b79ad40b8 100644 --- a/media/engine/webrtcvideoengine.h +++ b/media/engine/webrtcvideoengine.h @@ -420,8 +420,6 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { std::string GetCodecNameFromPayloadType(int payload_type); - absl::optional GetFirstPrimarySsrc() const; - webrtc::Call* const call_; const StreamParams stream_params_; diff --git a/pc/rtpsenderreceiver_unittest.cc b/pc/rtpsenderreceiver_unittest.cc index b5a513bd6a..3be69bafc9 100644 --- a/pc/rtpsenderreceiver_unittest.cc +++ b/pc/rtpsenderreceiver_unittest.cc @@ -230,6 +230,24 @@ class RtpSenderReceiverTest : public testing::Test, VerifyVideoChannelOutput(); } + void CreateVideoRtpReceiverWithSimulcast( + std::vector> streams = {}, + int num_layers = kVideoSimulcastLayerCount) { + std::vector 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 @@ TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) { 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) {