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:
parent
0a3593c25d
commit
76d295231a
@ -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());
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user