diff --git a/webrtc/pc/statscollector.cc b/webrtc/pc/statscollector.cc index f4db313b44..c932583159 100644 --- a/webrtc/pc/statscollector.cc +++ b/webrtc/pc/statscollector.cc @@ -782,10 +782,9 @@ void StatsCollector::ExtractBweInfo() { bwe_info.bucket_delay = call_stats.pacer_delay_ms; // Fill in target encoder bitrate, actual encoder bitrate, rtx bitrate, etc. // TODO(holmer): Also fill this in for audio. - if (!pc_->session()->video_channel()) { - return; + if (pc_->session()->video_channel()) { + pc_->session()->video_channel()->FillBitrateInfo(&bwe_info); } - pc_->session()->video_channel()->FillBitrateInfo(&bwe_info); StatsReport::Id report_id(StatsReport::NewBandwidthEstimationId()); StatsReport* report = reports_.FindOrAddNew(report_id); ExtractStats(bwe_info, stats_gathering_started_, report); diff --git a/webrtc/pc/statscollector_unittest.cc b/webrtc/pc/statscollector_unittest.cc index e9a2c5c9d5..165457c9c8 100644 --- a/webrtc/pc/statscollector_unittest.cc +++ b/webrtc/pc/statscollector_unittest.cc @@ -900,8 +900,75 @@ TEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { EXPECT_EQ(kBytesSentString, result); } -// Test that BWE information is reported via stats. -TEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { +// Test that audio BWE information is reported via stats. +TEST_F(StatsCollectorTest, AudioBandwidthEstimationInfoIsReported) { + StatsCollectorForTest stats(&pc_); + + EXPECT_CALL(session_, GetLocalCertificate(_, _)) + .WillRepeatedly(Return(false)); + EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_)) + .WillRepeatedly(Return(nullptr)); + + const char kAudioChannelName[] = "audio"; + + InitSessionStats(kAudioChannelName); + EXPECT_CALL(session_, GetStats(_)) + .WillRepeatedly(Invoke([this](const ChannelNamePairs&) { + return std::unique_ptr(new SessionStats(session_stats_)); + })); + + MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); + cricket::VoiceChannel voice_channel( + worker_thread_, network_thread_, nullptr, nullptr, media_channel, + kAudioChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired); + + StatsReports reports; // returned values. + cricket::VoiceSenderInfo voice_sender_info; + cricket::VoiceMediaInfo stats_read; + // Set up an SSRC just to test that we get both kinds of stats back: SSRC and + // BWE. + const int64_t kBytesSent = 12345678901234LL; + const std::string kBytesSentString("12345678901234"); + + AddOutgoingAudioTrackStats(); + stats.AddStream(stream_); + + // Construct a stats value to read. + voice_sender_info.add_ssrc(1234); + voice_sender_info.bytes_sent = kBytesSent; + stats_read.senders.push_back(voice_sender_info); + + webrtc::Call::Stats call_stats; + const int kSendBandwidth = 1234567; + const int kRecvBandwidth = 12345678; + const int kPacerDelay = 123; + call_stats.send_bandwidth_bps = kSendBandwidth; + call_stats.recv_bandwidth_bps = kRecvBandwidth; + call_stats.pacer_delay_ms = kPacerDelay; + EXPECT_CALL(session_, GetCallStats()).WillRepeatedly(Return(call_stats)); + EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); + EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); + EXPECT_CALL(*media_channel, GetStats(_)) + .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true))); + + stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); + stats.GetStats(NULL, &reports); + std::string result = + ExtractSsrcStatsValue(reports, StatsReport::kStatsValueNameBytesSent); + EXPECT_EQ(kBytesSentString, result); + result = ExtractBweStatsValue( + reports, StatsReport::kStatsValueNameAvailableSendBandwidth); + EXPECT_EQ(rtc::ToString(kSendBandwidth), result); + result = ExtractBweStatsValue( + reports, StatsReport::kStatsValueNameAvailableReceiveBandwidth); + EXPECT_EQ(rtc::ToString(kRecvBandwidth), result); + result = + ExtractBweStatsValue(reports, StatsReport::kStatsValueNameBucketDelay); + EXPECT_EQ(rtc::ToString(kPacerDelay), result); +} + +// Test that video BWE information is reported via stats. +TEST_F(StatsCollectorTest, VideoBandwidthEstimationInfoIsReported) { StatsCollectorForTest stats(&pc_); EXPECT_CALL(session_, GetLocalCertificate(_, _))