From 9d04a78f731b88887c3816d7dc00bb11356fc587 Mon Sep 17 00:00:00 2001 From: Markus Handell Date: Thu, 12 May 2022 18:38:57 +0200 Subject: [PATCH] ZeroHertz: expose time to first frame statistic. Bug: chromium:1324120 Change-Id: Ie609da309427ca5d2ff8585a8dc730586553c725 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/262247 Auto-Submit: Markus Handell Commit-Queue: Markus Handell Reviewed-by: Ilya Nikolaevskiy Commit-Queue: Ilya Nikolaevskiy Cr-Commit-Position: refs/heads/main@{#36867} --- video/BUILD.gn | 1 + video/frame_cadence_adapter.cc | 16 ++++++++++++++++ video/frame_cadence_adapter_unittest.cc | 16 ++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/video/BUILD.gn b/video/BUILD.gn index 51e846c677..71f4fc9742 100644 --- a/video/BUILD.gn +++ b/video/BUILD.gn @@ -305,6 +305,7 @@ rtc_library("frame_cadence_adapter") { "../api:sequence_checker", "../api/task_queue", "../api/units:time_delta", + "../api/units:timestamp", "../api/video:video_frame", "../rtc_base:checks", "../rtc_base:logging", diff --git a/video/frame_cadence_adapter.cc b/video/frame_cadence_adapter.cc index 7fc7939fdf..879cff71a1 100644 --- a/video/frame_cadence_adapter.cc +++ b/video/frame_cadence_adapter.cc @@ -21,6 +21,7 @@ #include "api/sequence_checker.h" #include "api/task_queue/task_queue_base.h" #include "api/units/time_delta.h" +#include "api/units/timestamp.h" #include "api/video/video_frame.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" @@ -184,6 +185,7 @@ class ZeroHertzAdapterMode : public AdapterMode { TaskQueueBase* const queue_; Clock* const clock_; FrameCadenceAdapterInterface::Callback* const callback_; + // The configured max_fps. // TODO(crbug.com/1255737): support max_fps updates. const double max_fps_; @@ -264,6 +266,10 @@ class FrameCadenceAdapterImpl : public FrameCadenceAdapterInterface { // Cache for the current adapter mode. AdapterMode* current_adapter_mode_ = nullptr; + // Timestamp for statistics reporting. + absl::optional zero_hertz_adapter_created_timestamp_ + RTC_GUARDED_BY(queue_); + // Set up during Initialize. Callback* callback_ = nullptr; @@ -619,6 +625,15 @@ void FrameCadenceAdapterImpl::OnFrame(const VideoFrame& frame) { frames_scheduled_for_processing_.fetch_add(1, std::memory_order_relaxed); queue_->PostTask(ToQueuedTask(safety_.flag(), [this, post_time, frame] { RTC_DCHECK_RUN_ON(queue_); + if (zero_hertz_adapter_created_timestamp_.has_value()) { + TimeDelta time_until_first_frame = + clock_->CurrentTime() - *zero_hertz_adapter_created_timestamp_; + zero_hertz_adapter_created_timestamp_ = absl::nullopt; + RTC_HISTOGRAM_COUNTS_10000( + "WebRTC.Screenshare.ZeroHz.TimeUntilFirstFrameMs", + time_until_first_frame.ms()); + } + const int frames_scheduled_for_processing = frames_scheduled_for_processing_.fetch_sub(1, std::memory_order_relaxed); @@ -673,6 +688,7 @@ void FrameCadenceAdapterImpl::MaybeReconfigureAdapters( should_request_refresh_frame_ = false; callback_->RequestRefreshFrame(); } + zero_hertz_adapter_created_timestamp_ = clock_->CurrentTime(); } zero_hertz_adapter_->ReconfigureParameters(zero_hertz_params_.value()); current_adapter_mode_ = &zero_hertz_adapter_.value(); diff --git a/video/frame_cadence_adapter_unittest.cc b/video/frame_cadence_adapter_unittest.cc index 4770f051b7..823c1a2a6b 100644 --- a/video/frame_cadence_adapter_unittest.cc +++ b/video/frame_cadence_adapter_unittest.cc @@ -902,6 +902,22 @@ TEST_F(FrameCadenceAdapterMetricsTest, RecordsMinLtMaxConstraintIfSetOnFrame) { ElementsAre(Pair(60 * 4.0 + 5.0 - 1, 1))); } +TEST_F(FrameCadenceAdapterMetricsTest, RecordsTimeUntilFirstFrame) { + MockCallback callback; + test::ScopedKeyValueConfig no_field_trials; + auto adapter = CreateAdapter(no_field_trials, time_controller_.GetClock()); + adapter->Initialize(&callback); + adapter->SetZeroHertzModeEnabled( + FrameCadenceAdapterInterface::ZeroHertzModeParams{}); + adapter->OnConstraintsChanged(VideoTrackSourceConstraints{0, 5.0}); + time_controller_.AdvanceTime(TimeDelta::Millis(666)); + adapter->OnFrame(CreateFrame()); + DepleteTaskQueues(); + EXPECT_THAT( + metrics::Samples("WebRTC.Screenshare.ZeroHz.TimeUntilFirstFrameMs"), + ElementsAre(Pair(666, 1))); +} + TEST(FrameCadenceAdapterRealTimeTest, TimestampsDoNotDrift) { // This regression test must be performed in realtime because of limitations // in GlobalSimulatedTimeController.