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}
This commit is contained in:
Rasmus Brandt 2020-04-01 17:14:32 +02:00 committed by Commit Bot
parent 08d1806e54
commit d335426a39
2 changed files with 46 additions and 1 deletions

View File

@ -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(

View File

@ -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.