diff --git a/pc/rtp_sender.cc b/pc/rtp_sender.cc index 1bbca3c41a..fe3b3b1aa5 100644 --- a/pc/rtp_sender.cc +++ b/pc/rtp_sender.cc @@ -383,6 +383,14 @@ void RtpSenderBase::SetParametersAsync(const RtpParameters& parameters, false); } +void RtpSenderBase::set_stream_ids(const std::vector& stream_ids) { + stream_ids_.clear(); + absl::c_copy_if(stream_ids, std::back_inserter(stream_ids_), + [this](const std::string& stream_id) { + return !absl::c_linear_search(stream_ids_, stream_id); + }); +} + void RtpSenderBase::SetStreams(const std::vector& stream_ids) { set_stream_ids(stream_ids); if (set_streams_observer_) diff --git a/pc/rtp_sender.h b/pc/rtp_sender.h index 29e5f16cfe..fdeedd5e5a 100644 --- a/pc/rtp_sender.h +++ b/pc/rtp_sender.h @@ -164,9 +164,9 @@ class RtpSenderBase : public RtpSenderInternal, public ObserverInterface { RTC_DCHECK_RUN_ON(signaling_thread_); return stream_ids_; } - void set_stream_ids(const std::vector& stream_ids) override { - stream_ids_ = stream_ids; - } + + // Set stream ids, eliminating duplicates in the process. + void set_stream_ids(const std::vector& stream_ids) override; void SetStreams(const std::vector& stream_ids) override; std::string id() const override { return id_; } diff --git a/pc/rtp_sender_receiver_unittest.cc b/pc/rtp_sender_receiver_unittest.cc index e51b058210..04043437a7 100644 --- a/pc/rtp_sender_receiver_unittest.cc +++ b/pc/rtp_sender_receiver_unittest.cc @@ -1888,6 +1888,15 @@ TEST_F(RtpSenderReceiverTest, EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok()); } +// Checks that the senders SetStreams eliminates duplicate stream ids. +TEST_F(RtpSenderReceiverTest, SenderSetStreamsEliminatesDuplicateIds) { + AddVideoTrack(); + video_rtp_sender_ = + VideoRtpSender::Create(worker_thread_, video_track_->id(), nullptr); + video_rtp_sender_->SetStreams({"1", "2", "1"}); + EXPECT_EQ(video_rtp_sender_->stream_ids().size(), 2u); +} + // Helper method for syntactic sugar for accepting a vector with '{}' notation. std::pair CreatePairOfRidVectors( const std::vector& first, diff --git a/test/pc/e2e/media/media_helper.cc b/test/pc/e2e/media/media_helper.cc index 3f6d069429..e945bd4dae 100644 --- a/test/pc/e2e/media/media_helper.cc +++ b/test/pc/e2e/media/media_helper.cc @@ -36,7 +36,7 @@ void MediaHelper::MaybeAddAudio(TestPeer* peer) { source.get()); std::string sync_group = audio_config.sync_group ? audio_config.sync_group.value() - : audio_config.stream_label.value(); + : audio_config.stream_label.value() + "-sync"; peer->AddTrack(track, {sync_group, *audio_config.stream_label}); } @@ -71,7 +71,7 @@ MediaHelper::MaybeAddVideo(TestPeer* peer) { } std::string sync_group = video_config.sync_group ? video_config.sync_group.value() - : video_config.stream_label.value(); + : video_config.stream_label.value() + "-sync"; RTCErrorOr> sender = peer->AddTrack(track, {sync_group, *video_config.stream_label}); RTC_CHECK(sender.ok());