diff --git a/call/video_send_stream.h b/call/video_send_stream.h index 5daec19449..8f550daa9c 100644 --- a/call/video_send_stream.h +++ b/call/video_send_stream.h @@ -68,6 +68,8 @@ class VideoSendStream { int avg_encode_time_ms = 0; int encode_usage_percent = 0; uint32_t frames_encoded = 0; + // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalencodetime + uint64_t total_encode_time_ms = 0; uint32_t frames_dropped_by_capturer = 0; uint32_t frames_dropped_by_encoder_queue = 0; uint32_t frames_dropped_by_rate_limiter = 0; diff --git a/video/end_to_end_tests/stats_tests.cc b/video/end_to_end_tests/stats_tests.cc index 3717c7663b..3201e19bb2 100644 --- a/video/end_to_end_tests/stats_tests.cc +++ b/video/end_to_end_tests/stats_tests.cc @@ -161,7 +161,8 @@ TEST_F(StatsEndToEndTest, GetStats) { stats.substreams.size() == expected_num_streams; send_stats_filled_["CpuOveruseMetrics"] |= - stats.avg_encode_time_ms != 0 && stats.encode_usage_percent != 0; + stats.avg_encode_time_ms != 0 && stats.encode_usage_percent != 0 && + stats.total_encode_time_ms != 0; send_stats_filled_["EncoderImplementationName"] |= stats.encoder_implementation_name == diff --git a/video/send_statistics_proxy.cc b/video/send_statistics_proxy.cc index 20e54496f9..0b165374e9 100644 --- a/video/send_statistics_proxy.cc +++ b/video/send_statistics_proxy.cc @@ -674,10 +674,12 @@ void SendStatisticsProxy::OnEncoderReconfigured( void SendStatisticsProxy::OnEncodedFrameTimeMeasured(int encode_time_ms, int encode_usage_percent) { + RTC_DCHECK_GE(encode_time_ms, 0); rtc::CritScope lock(&crit_); uma_container_->encode_time_counter_.Add(encode_time_ms); encode_time_.Apply(1.0f, encode_time_ms); stats_.avg_encode_time_ms = round(encode_time_.filtered()); + stats_.total_encode_time_ms += encode_time_ms; stats_.encode_usage_percent = encode_usage_percent; } diff --git a/video/send_statistics_proxy_unittest.cc b/video/send_statistics_proxy_unittest.cc index 1e367957be..ded7fedc5e 100644 --- a/video/send_statistics_proxy_unittest.cc +++ b/video/send_statistics_proxy_unittest.cc @@ -318,6 +318,15 @@ TEST_F(SendStatisticsProxyTest, OnEncodedFrameTimeMeasured) { EXPECT_EQ(encode_usage_percent, stats.encode_usage_percent); } +TEST_F(SendStatisticsProxyTest, TotalEncodeTimeIncreasesPerFrameMeasured) { + const int kEncodeUsagePercent = 0; // Don't care for this test. + EXPECT_EQ(0u, statistics_proxy_->GetStats().total_encode_time_ms); + statistics_proxy_->OnEncodedFrameTimeMeasured(10, kEncodeUsagePercent); + EXPECT_EQ(10u, statistics_proxy_->GetStats().total_encode_time_ms); + statistics_proxy_->OnEncodedFrameTimeMeasured(20, kEncodeUsagePercent); + EXPECT_EQ(30u, statistics_proxy_->GetStats().total_encode_time_ms); +} + TEST_F(SendStatisticsProxyTest, OnSendEncodedImageIncreasesFramesEncoded) { EncodedImage encoded_image; CodecSpecificInfo codec_info;