diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc index 5c6f427e3b..1caf0d2376 100644 --- a/webrtc/call/call.cc +++ b/webrtc/call/call.cc @@ -325,6 +325,10 @@ class Call : public webrtc::Call, RateCounter received_audio_bytes_per_second_counter_; RateCounter received_video_bytes_per_second_counter_; RateCounter received_rtcp_bytes_per_second_counter_; + rtc::Optional first_received_rtp_audio_ms_; + rtc::Optional last_received_rtp_audio_ms_; + rtc::Optional first_received_rtp_video_ms_; + rtc::Optional 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::UpdateSendHistograms(int64_t first_sent_packet_ms) { } 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 @@ PacketReceiver::DeliveryStatus Call::DeliverRtp(MediaType media_type, received_bytes_per_second_counter_.Add(static_cast(length)); received_audio_bytes_per_second_counter_.Add(static_cast(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 @@ PacketReceiver::DeliveryStatus Call::DeliverRtp(MediaType media_type, received_bytes_per_second_counter_.Add(static_cast(length)); received_video_bytes_per_second_counter_.Add(static_cast(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 f51f483f05..f876621fd3 100644 --- a/webrtc/video/end_to_end_tests.cc +++ b/webrtc/video/end_to_end_tests.cc @@ -2644,6 +2644,8 @@ void EndToEndTest::VerifyHistogramStats(bool use_rtx, // 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"));