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:
parent
08d1806e54
commit
d335426a39
@ -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(
|
||||
|
||||
@ -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.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user