diff --git a/media/engine/webrtcvoiceengine.cc b/media/engine/webrtcvoiceengine.cc index 1ebbb0fe2b..061a16b442 100644 --- a/media/engine/webrtcvoiceengine.cc +++ b/media/engine/webrtcvoiceengine.cc @@ -2307,9 +2307,11 @@ void WebRtcVoiceMediaChannel::SetRawAudioSink( std::vector WebRtcVoiceMediaChannel::GetSources( uint32_t ssrc) const { auto it = recv_streams_.find(ssrc); - RTC_DCHECK(it != recv_streams_.end()) - << "Attempting to get contributing sources for SSRC:" << ssrc - << " which doesn't exist."; + if (it == recv_streams_.end()) { + RTC_LOG(LS_ERROR) << "Attempting to get contributing sources for SSRC:" + << ssrc << " which doesn't exist."; + return std::vector(); + } return it->second->GetSources(); } diff --git a/media/engine/webrtcvoiceengine_unittest.cc b/media/engine/webrtcvoiceengine_unittest.cc index 5546f1b490..4fd087ac1a 100644 --- a/media/engine/webrtcvoiceengine_unittest.cc +++ b/media/engine/webrtcvoiceengine_unittest.cc @@ -3300,6 +3300,18 @@ TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) { EXPECT_TRUE(GetRecvStream(kSsrcX).started()); } +// Tests when GetSources is called with non-existing ssrc, it will return an +// empty list of RtpSource without crashing. +TEST_F(WebRtcVoiceEngineTestFake, GetSourcesWithNonExistingSsrc) { + // Setup an recv stream with |kSsrcX|. + SetupRecvStream(); + cricket::WebRtcVoiceMediaChannel* media_channel = + static_cast(channel_); + // Call GetSources with |kSsrcY| which doesn't exist. + std::vector sources = media_channel->GetSources(kSsrcY); + EXPECT_EQ(0u, sources.size()); +} + // Tests that the library initializes and shuts down properly. TEST(WebRtcVoiceEngineTest, StartupShutdown) { // If the VoiceEngine wants to gather available codecs early, that's fine but