aboutsummaryrefslogtreecommitdiff
path: root/media
diff options
context:
space:
mode:
authorRasmus Brandt <brandtr@webrtc.org>2020-04-01 17:14:32 +0200
committerCommit Bot <commit-bot@chromium.org>2020-04-02 09:05:43 +0000
commitd335426a39d34389a00f8f7ae652d535f0fa2073 (patch)
treea9006fa0e0545430b2de38d6b463ecc2a879e4ca /media
parent08d1806e5432bed24e0ccb8e6eed7559949b403e (diff)
downloadwebrtc-d335426a39d34389a00f8f7ae652d535f0fa2073.tar.gz
Let WebRtcVideoChannel::ResetUnsignaledRecvStream delete all default streams.
This CL changes WebRtcVideoChannel::ResetUnsignaledRecvStream so that it deletes all default streams created by WebRtcVideoChannel::AddRecvStream. This is needed for the case that there are lingering default streams, whose SSRCs are different from the SSRCs that were subsequently signaled. This can happen when there are multiple "m= sections" and the early media is sent to an "m= section" that is later not supposed to be the sink for that particular SSRC. Default streams whose SSRC match the subsequently signaled SSRC is already handled here: https://source.chromium.org/chromium/chromium/src/+/master:third_party/webrtc/media/engine/webrtc_video_engine.cc;l=1386;drc=22387b44ff173d263b434889d394cea90368ab06?originalUrl=https:%2F%2Fcs.chromium.org%2F Bug: webrtc:11477 Change-Id: I96ed7e35b4904fb0757fe5824f8afa6f1b9a565e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/172622 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Magnus Flodman <mflodman@webrtc.org> Commit-Queue: Rasmus Brandt <brandtr@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30971}
Diffstat (limited to 'media')
-rw-r--r--media/engine/webrtc_video_engine.cc15
-rw-r--r--media/engine/webrtc_video_engine_unittest.cc32
2 files changed, 46 insertions, 1 deletions
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc
index 22856b0589..a19d444579 100644
--- a/media/engine/webrtc_video_engine.cc
+++ b/media/engine/webrtc_video_engine.cc
@@ -1482,6 +1482,21 @@ void WebRtcVideoChannel::ResetUnsignaledRecvStream() {
RTC_DCHECK_RUN_ON(&thread_checker_);
RTC_LOG(LS_INFO) << "ResetUnsignaledRecvStream.";
unsignaled_stream_params_ = StreamParams();
+
+ // Delete any created default streams.
+ auto it = receive_streams_.begin();
+ while (it != receive_streams_.end()) {
+ auto delete_it = receive_streams_.end();
+ if (it->second->IsDefaultStream()) {
+ delete_it = it;
+ }
+ ++it;
+ if (delete_it != receive_streams_.end()) {
+ DeleteReceiveStream(delete_it->second);
+ // |it| is not invalidated by this erase.
+ receive_streams_.erase(delete_it->first);
+ }
+ }
}
bool WebRtcVideoChannel::SetSink(
diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc
index 395d38ac1a..27206db199 100644
--- a/media/engine/webrtc_video_engine_unittest.cc
+++ b/media/engine/webrtc_video_engine_unittest.cc
@@ -5836,7 +5836,6 @@ TEST_F(WebRtcVideoChannelTest, RecvUnsignaledSsrcWithSignaledStreamId) {
// Reset the unsignaled stream to clear the cache. This time when
// a default video receive stream is created it won't have a sync_group.
channel_->ResetUnsignaledRecvStream();
- ASSERT_TRUE(channel_->RemoveRecvStream(kIncomingUnsignalledSsrc));
EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
channel_->OnPacketReceived(packet, /* packet_time_us */ -1);
@@ -5845,6 +5844,37 @@ TEST_F(WebRtcVideoChannelTest, RecvUnsignaledSsrcWithSignaledStreamId) {
fake_call_->GetVideoReceiveStreams()[0]->GetConfig().sync_group.empty());
}
+TEST_F(WebRtcVideoChannelTest,
+ ResetUnsignaledRecvStreamDeletesAllDefaultStreams) {
+ // No receive streams to start with.
+ EXPECT_TRUE(fake_call_->GetVideoReceiveStreams().empty());
+
+ // Packet with unsignaled SSRC is received.
+ const size_t kDataLength = 12;
+ uint8_t data[kDataLength];
+ memset(data, 0, sizeof(data));
+ rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc);
+ rtc::CopyOnWriteBuffer packet(data, kDataLength);
+ channel_->OnPacketReceived(packet, /* packet_time_us */ -1);
+
+ // Default receive stream created.
+ const auto& receivers1 = fake_call_->GetVideoReceiveStreams();
+ ASSERT_EQ(receivers1.size(), 1u);
+ EXPECT_EQ(receivers1[0]->GetConfig().rtp.remote_ssrc,
+ kIncomingUnsignalledSsrc);
+
+ // Stream with another SSRC gets signaled.
+ channel_->ResetUnsignaledRecvStream();
+ constexpr uint32_t kIncomingSignalledSsrc = kIncomingUnsignalledSsrc + 1;
+ ASSERT_TRUE(channel_->AddRecvStream(
+ cricket::StreamParams::CreateLegacy(kIncomingSignalledSsrc)));
+
+ // New receiver is for the signaled stream.
+ const auto& receivers2 = fake_call_->GetVideoReceiveStreams();
+ ASSERT_EQ(receivers2.size(), 1u);
+ EXPECT_EQ(receivers2[0]->GetConfig().rtp.remote_ssrc, kIncomingSignalledSsrc);
+}
+
// Test BaseMinimumPlayoutDelayMs on receive streams.
TEST_F(WebRtcVideoChannelTest, BaseMinimumPlayoutDelayMs) {
// Test that set won't work for non-existing receive streams.