Reland of Add received audio/video call duration metrics based on packets.
Original issue:
https://codereview.webrtc.org/2957073002/
Reason for reland:
Failed Android unit tests and failed Windows compile.
The tests seemed related at the time, but not after more consideration.
Tracks time between first and last audio and packets to successfully pass through Call object's DeliverRtp method, timed with packet timestamps.
BUG=webrtc:7882
TBR=stefan@webrtc.org
Review-Url: https://codereview.webrtc.org/2970793003
Cr-Commit-Position: refs/heads/master@{#18886}
diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc
index 5c6f427..1caf0d2 100644
--- a/webrtc/call/call.cc
+++ b/webrtc/call/call.cc
@@ -325,6 +325,10 @@
RateCounter received_audio_bytes_per_second_counter_;
RateCounter received_video_bytes_per_second_counter_;
RateCounter received_rtcp_bytes_per_second_counter_;
+ rtc::Optional<int64_t> first_received_rtp_audio_ms_;
+ rtc::Optional<int64_t> last_received_rtp_audio_ms_;
+ rtc::Optional<int64_t> first_received_rtp_video_ms_;
+ rtc::Optional<int64_t> last_received_rtp_video_ms_;
// TODO(holmer): Remove this lock once BitrateController no longer calls
// OnNetworkChanged from multiple threads.
@@ -530,6 +534,16 @@
}
void Call::UpdateReceiveHistograms() {
+ if (first_received_rtp_audio_ms_) {
+ RTC_HISTOGRAM_COUNTS_100000(
+ "WebRTC.Call.TimeReceivingAudioRtpPacketsInSeconds",
+ (*last_received_rtp_audio_ms_ - *first_received_rtp_audio_ms_) / 1000);
+ }
+ if (first_received_rtp_video_ms_) {
+ RTC_HISTOGRAM_COUNTS_100000(
+ "WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds",
+ (*last_received_rtp_video_ms_ - *first_received_rtp_video_ms_) / 1000);
+ }
const int kMinRequiredPeriodicSamples = 5;
AggregatedStats video_bytes_per_sec =
received_video_bytes_per_second_counter_.GetStats();
@@ -1317,6 +1331,11 @@
received_bytes_per_second_counter_.Add(static_cast<int>(length));
received_audio_bytes_per_second_counter_.Add(static_cast<int>(length));
event_log_->LogRtpHeader(kIncomingPacket, packet, length);
+ const int64_t arrival_time_ms = parsed_packet->arrival_time_ms();
+ if (!first_received_rtp_audio_ms_) {
+ first_received_rtp_audio_ms_.emplace(arrival_time_ms);
+ }
+ last_received_rtp_audio_ms_.emplace(arrival_time_ms);
return DELIVERY_OK;
}
} else if (media_type == MediaType::VIDEO) {
@@ -1324,6 +1343,11 @@
received_bytes_per_second_counter_.Add(static_cast<int>(length));
received_video_bytes_per_second_counter_.Add(static_cast<int>(length));
event_log_->LogRtpHeader(kIncomingPacket, packet, length);
+ const int64_t arrival_time_ms = parsed_packet->arrival_time_ms();
+ if (!first_received_rtp_video_ms_) {
+ first_received_rtp_video_ms_.emplace(arrival_time_ms);
+ }
+ last_received_rtp_video_ms_.emplace(arrival_time_ms);
return DELIVERY_OK;
}
}
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc
index f51f483..f876621 100644
--- a/webrtc/video/end_to_end_tests.cc
+++ b/webrtc/video/end_to_end_tests.cc
@@ -2644,6 +2644,8 @@
// Verify that stats have been updated once.
EXPECT_EQ(2, metrics::NumSamples("WebRTC.Call.LifetimeInSeconds"));
+ EXPECT_EQ(1, metrics::NumSamples(
+ "WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds"));
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.VideoBitrateReceivedInKbps"));
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.RtcpBitrateReceivedInBps"));
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.BitrateReceivedInKbps"));