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}
This commit is contained in:
Florent Castelli 2018-11-20 14:08:06 +01:00 committed by Commit Bot
parent 4bc60452f7
commit 38332cdcb1
4 changed files with 38 additions and 19 deletions

View File

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

View File

@ -2252,26 +2252,20 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::GetSources() {
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;
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[0].ssrc = GetFirstPrimarySsrc();
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;
}

View File

@ -420,8 +420,6 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
std::string GetCodecNameFromPayloadType(int payload_type);
absl::optional<uint32_t> GetFirstPrimarySsrc() const;
webrtc::Call* const call_;
const StreamParams stream_params_;

View File

@ -230,6 +230,24 @@ class RtpSenderReceiverTest : public testing::Test,
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 @@ 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) {