Don't crash when sender info has been discarded by lower layers.

This happens when pc.close() is called.
As a stopgap measure, we return zeroes instead, leading to stats
being omitted.

Bug: chromium:807174
Change-Id: I36f342adcd038822afb75d8593de808591eb9c4b
Reviewed-on: https://webrtc-review.googlesource.com/46161
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21813}
This commit is contained in:
Harald Alvestrand 2018-01-30 14:43:29 +01:00 committed by Commit Bot
parent 0a3593c25d
commit 76d295231a
2 changed files with 42 additions and 9 deletions

View File

@ -521,12 +521,19 @@ void ProduceSenderMediaTrackStats(
// to see from a sender whether it's connected or not.
// Related to https://crbug.com/8694 (using ssrc 0 to indicate "none")
if (sender->ssrc()) {
voice_sender_info =
// When pc.close is called, sender info is discarded, so
// we generate zeroes instead. Bug: It should be retained.
// https://crbug.com/807174
auto sender_info =
track_media_info_map.GetVoiceSenderInfoBySsrc(sender->ssrc());
if (sender_info) {
voice_sender_info = sender_info;
} else {
RTC_LOG(LS_INFO)
<< "RTCStatsCollector: No voice sender info for sender with ssrc "
<< sender->ssrc();
}
}
RTC_CHECK(voice_sender_info)
<< "No voice sender info for sender with ssrc " << sender->ssrc();
std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats =
ProduceMediaStreamTrackStatsFromVoiceSenderInfo(
timestamp_us, *track, *voice_sender_info, sender->AttachmentId());
@ -539,12 +546,21 @@ void ProduceSenderMediaTrackStats(
cricket::VideoSenderInfo null_sender_info;
const cricket::VideoSenderInfo* video_sender_info = &null_sender_info;
// TODO(hta): Check on state not ssrc when state is available
// Related to https://crbug.com/8694 (using ssrc 0 to indicate "none")
if (sender->ssrc())
video_sender_info =
// Related to https://bugs.webrtc.org/8694 (using ssrc 0 to indicate
// "none")
if (sender->ssrc()) {
// When pc.close is called, sender info is discarded, so
// we generate zeroes instead. Bug: It should be retained.
// https://crbug.com/807174
auto sender_info =
track_media_info_map.GetVideoSenderInfoBySsrc(sender->ssrc());
RTC_CHECK(video_sender_info)
<< "No video sender info for sender with ssrc " << sender->ssrc();
if (sender_info) {
video_sender_info = sender_info;
} else {
RTC_LOG(LS_INFO) << "No video sender info for sender with ssrc "
<< sender->ssrc();
}
}
std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats =
ProduceMediaStreamTrackStatsFromVideoSenderInfo(
timestamp_us, *track, *video_sender_info, sender->AttachmentId());

View File

@ -2413,6 +2413,23 @@ TEST_F(RTCStatsCollectorTest, StatsReportedOnZeroSsrc) {
EXPECT_EQ(0, rtp_stream_stats.size());
}
TEST_F(RTCStatsCollectorTest, DoNotCrashOnSsrcChange) {
rtc::scoped_refptr<MediaStreamTrackInterface> track =
CreateFakeTrack(cricket::MEDIA_TYPE_AUDIO, "audioTrack",
MediaStreamTrackInterface::kLive);
rtc::scoped_refptr<MockRtpSender> sender =
CreateMockSender(track, 4711, 49, {});
EXPECT_CALL(test_->pc(), GetSenders())
.WillRepeatedly(
Return(std::vector<rtc::scoped_refptr<RtpSenderInterface>>(
{rtc::scoped_refptr<RtpSenderInterface>(sender.get())})));
// We do not generate any matching voice_sender_info stats.
rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
std::vector<const RTCMediaStreamTrackStats*> track_stats =
report->GetStatsOfType<RTCMediaStreamTrackStats>();
EXPECT_EQ(1, track_stats.size());
}
class RTCStatsCollectorTestWithFakeCollector : public testing::Test {
public:
RTCStatsCollectorTestWithFakeCollector()