tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 421f45990dc339b3c92565d2ec408a604d5884ce
parent 7c26f26cfd211a37d3c63461e234fc78abdbabf7
Author: Dan Baker <dbaker@mozilla.com>
Date:   Wed, 19 Nov 2025 17:55:53 -0700

Bug 2000941 - Vendor libwebrtc from 3f6f3decfc

Upstream commit: https://webrtc.googlesource.com/src/+/3f6f3decfcf874544fd2afff11e0c26bdf9b6fdb
    Use SimulatedClock in OveruseFrameDetectorTests

    Also converts to TimeDeltas over ints.

    Bug: webrtc:42223992, webrtc:42223979
    Change-Id: I59a696bf47f631ccfaced47098b05751685fc4ab
    Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/407020
    Reviewed-by: Henrik Boström <hbos@webrtc.org>
    Auto-Submit: Evan Shrubsole <eshr@webrtc.org>
    Commit-Queue: Henrik Boström <hbos@webrtc.org>
    Cr-Commit-Position: refs/heads/main@{#45528}

Diffstat:
Mthird_party/libwebrtc/README.mozilla.last-vendor | 4++--
Mthird_party/libwebrtc/video/adaptation/BUILD.gn | 2++
Mthird_party/libwebrtc/video/adaptation/overuse_frame_detector_unittest.cc | 411+++++++++++++++++++++++++++++++++++++++----------------------------------------
3 files changed, 207 insertions(+), 210 deletions(-)

diff --git a/third_party/libwebrtc/README.mozilla.last-vendor b/third_party/libwebrtc/README.mozilla.last-vendor @@ -1,4 +1,4 @@ # ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc -libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-11-20T00:50:57.036807+00:00. +libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-11-20T00:55:28.135414+00:00. # base of lastest vendoring -fce8a266f5 +3f6f3decfc diff --git a/third_party/libwebrtc/video/adaptation/BUILD.gn b/third_party/libwebrtc/video/adaptation/BUILD.gn @@ -117,6 +117,8 @@ if (rtc_include_tests) { "../../rtc_base:task_queue_for_test", "../../rtc_base:threading", "../../rtc_base:timeutils", + "../../system_wrappers", + "../../test:create_test_environment", "../../test:rtc_expect_death", "../../test:test_support", "../../test/time_controller", diff --git a/third_party/libwebrtc/video/adaptation/overuse_frame_detector_unittest.cc b/third_party/libwebrtc/video/adaptation/overuse_frame_detector_unittest.cc @@ -17,31 +17,29 @@ #include "api/array_view.h" #include "api/environment/environment.h" -#include "api/environment/environment_factory.h" #include "api/units/time_delta.h" +#include "api/units/timestamp.h" #include "api/video/i420_buffer.h" #include "api/video/video_rotation.h" #include "rtc_base/event.h" -#include "rtc_base/fake_clock.h" #include "rtc_base/random.h" #include "rtc_base/task_queue_for_test.h" -#include "rtc_base/time_utils.h" +#include "system_wrappers/include/clock.h" +#include "test/create_test_environment.h" #include "test/gmock.h" #include "test/gtest.h" #include "video/video_stream_encoder_observer.h" namespace webrtc { +namespace { -using ::testing::_; using ::testing::InvokeWithoutArgs; -namespace { constexpr int kWidth = 640; constexpr int kHeight = 480; // Corresponds to load of 15% -constexpr int kFrameIntervalUs = 33 * kNumMicrosecsPerMillisec; -constexpr int kProcessTimeUs = 5 * kNumMicrosecsPerMillisec; -} // namespace +constexpr TimeDelta kFrameInterval = TimeDelta::Millis(33); +constexpr TimeDelta kProcessTime = TimeDelta::Millis(5); class MockCpuOveruseObserver : public OveruseFrameDetectorObserverInterface { public: @@ -83,7 +81,7 @@ class OveruseFrameDetectorTest : public ::testing::Test, observer_ = &mock_observer_; options_.min_process_count = 0; overuse_detector_ = std::make_unique<OveruseFrameDetectorUnderTest>( - CreateEnvironment(), this); + CreateTestEnvironment({.time = &clock_}), this); // Unfortunately, we can't call SetOptions here, since that would break // single-threading requirements in the RunOnTqNormalUsage test. } @@ -101,10 +99,10 @@ class OveruseFrameDetectorTest : public ::testing::Test, } virtual void InsertAndSendFramesWithInterval(int num_frames, - int interval_us, + TimeDelta interval_us, int width, int height, - int delay_us) { + TimeDelta delay_us) { VideoFrame frame = VideoFrame::Builder() .set_video_frame_buffer(I420Buffer::Create(width, height)) @@ -114,23 +112,23 @@ class OveruseFrameDetectorTest : public ::testing::Test, uint32_t timestamp = 0; while (num_frames-- > 0) { frame.set_rtp_timestamp(timestamp); - int64_t capture_time_us = TimeMicros(); + int64_t capture_time_us = clock_.TimeInMicroseconds(); overuse_detector_->FrameCaptured(frame, capture_time_us); - clock_.AdvanceTime(TimeDelta::Micros(delay_us)); - overuse_detector_->FrameSent(timestamp, TimeMicros(), capture_time_us, - delay_us); - clock_.AdvanceTime(TimeDelta::Micros(interval_us - delay_us)); - timestamp += interval_us * 90 / 1000; + clock_.AdvanceTime(delay_us); + overuse_detector_->FrameSent(timestamp, clock_.TimeInMicroseconds(), + capture_time_us, delay_us.us()); + clock_.AdvanceTime(interval_us - delay_us); + timestamp += interval_us.us() * 90 / 1000; } } virtual void InsertAndSendSimulcastFramesWithInterval( int num_frames, - int interval_us, + TimeDelta interval, int width, int height, // One element per layer - ArrayView<const int> delays_us) { + ArrayView<const TimeDelta> delays_us) { VideoFrame frame = VideoFrame::Builder() .set_video_frame_buffer(I420Buffer::Create(width, height)) @@ -140,30 +138,30 @@ class OveruseFrameDetectorTest : public ::testing::Test, uint32_t timestamp = 0; while (num_frames-- > 0) { frame.set_rtp_timestamp(timestamp); - int64_t capture_time_us = TimeMicros(); + int64_t capture_time_us = clock_.TimeInMicroseconds(); overuse_detector_->FrameCaptured(frame, capture_time_us); - int max_delay_us = 0; - for (int delay_us : delays_us) { - if (delay_us > max_delay_us) { - clock_.AdvanceTime(TimeDelta::Micros(delay_us - max_delay_us)); - max_delay_us = delay_us; + TimeDelta max_delay = TimeDelta::Zero(); + for (TimeDelta delay : delays_us) { + if (delay > max_delay) { + clock_.AdvanceTime(delay - max_delay); + max_delay = delay; } - overuse_detector_->FrameSent(timestamp, TimeMicros(), capture_time_us, - delay_us); + overuse_detector_->FrameSent(timestamp, clock_.TimeInMicroseconds(), + capture_time_us, delay.us()); } overuse_detector_->CheckForOveruse(observer_); - clock_.AdvanceTime(TimeDelta::Micros(interval_us - max_delay_us)); - timestamp += interval_us * 90 / 1000; + clock_.AdvanceTime(interval - max_delay); + timestamp += interval.us() * 90 / 1000; } } virtual void InsertAndSendFramesWithRandomInterval(int num_frames, - int min_interval_us, - int max_interval_us, + TimeDelta min_interval_us, + TimeDelta max_interval_us, int width, int height, - int delay_us) { + TimeDelta delay_us) { Random random(17); VideoFrame frame = @@ -175,19 +173,19 @@ class OveruseFrameDetectorTest : public ::testing::Test, uint32_t timestamp = 0; while (num_frames-- > 0) { frame.set_rtp_timestamp(timestamp); - int interval_us = random.Rand(min_interval_us, max_interval_us); - int64_t capture_time_us = TimeMicros(); + TimeDelta interval_us = TimeDelta::Micros(random.Rand( + min_interval_us.us<uint32_t>(), max_interval_us.us<uint32_t>())); + int64_t capture_time_us = clock_.TimeInMicroseconds(); overuse_detector_->FrameCaptured(frame, capture_time_us); - clock_.AdvanceTime(TimeDelta::Micros(delay_us)); - overuse_detector_->FrameSent(timestamp, TimeMicros(), capture_time_us, - std::optional<int>(delay_us)); + clock_.AdvanceTime(delay_us); + overuse_detector_->FrameSent(timestamp, clock_.TimeInMicroseconds(), + capture_time_us, delay_us.us()); overuse_detector_->CheckForOveruse(observer_); // Avoid turning clock backwards. if (interval_us > delay_us) - clock_.AdvanceTime(TimeDelta::Micros(interval_us - delay_us)); - - timestamp += interval_us * 90 / 1000; + clock_.AdvanceTime(interval_us - delay_us); + timestamp += interval_us.us() * 90 / 1000; } } @@ -196,46 +194,46 @@ class OveruseFrameDetectorTest : public ::testing::Test, // the usage. From the tests where these are used, adding another sample // doesn't affect the expected outcome (this is mainly to check initial // values and whether the overuse detector has been reset or not). - InsertAndSendFramesWithInterval(2, kNumMicrosecsPerSec, width, height, - kFrameIntervalUs); + InsertAndSendFramesWithInterval(2, TimeDelta::Seconds(1), width, height, + kFrameInterval); } void TriggerOveruse(int num_times) { - const int kDelayUs = 32 * kNumMicrosecsPerMillisec; + const TimeDelta kDelay = TimeDelta::Millis(32); for (int i = 0; i < num_times; ++i) { - InsertAndSendFramesWithInterval(1000, kFrameIntervalUs, kWidth, kHeight, - kDelayUs); + InsertAndSendFramesWithInterval(1000, kFrameInterval, kWidth, kHeight, + kDelay); overuse_detector_->CheckForOveruse(observer_); } } void TriggerUnderuse() { - const int kDelayUs1 = 5000; - const int kDelayUs2 = 6000; - InsertAndSendFramesWithInterval(1300, kFrameIntervalUs, kWidth, kHeight, + const TimeDelta kDelayUs1 = TimeDelta::Micros(5000); + const TimeDelta kDelayUs2 = TimeDelta::Micros(6000); + InsertAndSendFramesWithInterval(1300, kFrameInterval, kWidth, kHeight, kDelayUs1); - InsertAndSendFramesWithInterval(1, kFrameIntervalUs, kWidth, kHeight, + InsertAndSendFramesWithInterval(1, kFrameInterval, kWidth, kHeight, kDelayUs2); overuse_detector_->CheckForOveruse(observer_); } int UsagePercent() { return encode_usage_percent_; } - int64_t OveruseProcessingTimeLimitForFramerate(int fps) const { - int64_t frame_interval = kNumMicrosecsPerSec / fps; - int64_t max_processing_time_us = + TimeDelta OveruseProcessingTimeLimitForFramerate(int fps) const { + TimeDelta frame_interval = TimeDelta::Seconds(1) / fps; + TimeDelta max_processing_time_us = (frame_interval * options_.high_encode_usage_threshold_percent) / 100; return max_processing_time_us; } - int64_t UnderuseProcessingTimeLimitForFramerate(int fps) const { - int64_t frame_interval = kNumMicrosecsPerSec / fps; - int64_t max_processing_time_us = + TimeDelta UnderuseProcessingTimeLimitForFramerate(int fps) const { + TimeDelta frame_interval = TimeDelta::Seconds(1) / fps; + TimeDelta max_processing_time_us = (frame_interval * options_.low_encode_usage_threshold_percent) / 100; return max_processing_time_us; } CpuOveruseOptions options_; - ScopedFakeClock clock_; + SimulatedClock clock_{Timestamp::Millis(12345)}; MockCpuOveruseObserver mock_observer_; OveruseFrameDetectorObserverInterface* observer_; std::unique_ptr<OveruseFrameDetectorUnderTest> overuse_detector_; @@ -271,16 +269,16 @@ TEST_F(OveruseFrameDetectorTest, DoubleOveruseAndRecover) { } TEST_F(OveruseFrameDetectorTest, TriggerUnderuseWithMinProcessCount) { - const int kProcessIntervalUs = 5 * kNumMicrosecsPerSec; + const TimeDelta kProcessInterval = TimeDelta::Seconds(5); options_.min_process_count = 1; CpuOveruseObserverImpl overuse_observer; observer_ = nullptr; overuse_detector_->SetOptions(options_); - InsertAndSendFramesWithInterval(1200, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(1200, kFrameInterval, kWidth, kHeight, + kProcessTime); overuse_detector_->CheckForOveruse(&overuse_observer); EXPECT_EQ(0, overuse_observer.normaluse_); - clock_.AdvanceTime(TimeDelta::Micros(kProcessIntervalUs)); + clock_.AdvanceTime(kProcessInterval); overuse_detector_->CheckForOveruse(&overuse_observer); EXPECT_EQ(1, overuse_observer.normaluse_); } @@ -312,17 +310,18 @@ TEST_F(OveruseFrameDetectorTest, IncorrectConsecutiveCountTriggersNoOveruse) { TEST_F(OveruseFrameDetectorTest, ProcessingUsage) { overuse_detector_->SetOptions(options_); - InsertAndSendFramesWithInterval(1000, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); - EXPECT_EQ(kProcessTimeUs * 100 / kFrameIntervalUs, UsagePercent()); + InsertAndSendFramesWithInterval(1000, kFrameInterval, kWidth, kHeight, + kProcessTime); + EXPECT_EQ(static_cast<int>(kProcessTime * 100 / kFrameInterval), + UsagePercent()); } TEST_F(OveruseFrameDetectorTest, ResetAfterResolutionChange) { overuse_detector_->SetOptions(options_); ForceUpdate(kWidth, kHeight); EXPECT_EQ(InitialUsage(), UsagePercent()); - InsertAndSendFramesWithInterval(1000, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(1000, kFrameInterval, kWidth, kHeight, + kProcessTime); EXPECT_NE(InitialUsage(), UsagePercent()); // Verify reset (with new width/height). ForceUpdate(kWidth, kHeight + 1); @@ -333,17 +332,17 @@ TEST_F(OveruseFrameDetectorTest, ResetAfterFrameTimeout) { overuse_detector_->SetOptions(options_); ForceUpdate(kWidth, kHeight); EXPECT_EQ(InitialUsage(), UsagePercent()); - InsertAndSendFramesWithInterval(1000, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(1000, kFrameInterval, kWidth, kHeight, + kProcessTime); EXPECT_NE(InitialUsage(), UsagePercent()); InsertAndSendFramesWithInterval( - 2, options_.frame_timeout_interval_ms * kNumMicrosecsPerMillisec, kWidth, - kHeight, kProcessTimeUs); + 2, TimeDelta::Millis(options_.frame_timeout_interval_ms), kWidth, kHeight, + kProcessTime); EXPECT_NE(InitialUsage(), UsagePercent()); // Verify reset. InsertAndSendFramesWithInterval( - 2, (options_.frame_timeout_interval_ms + 1) * kNumMicrosecsPerMillisec, - kWidth, kHeight, kProcessTimeUs); + 2, TimeDelta::Millis(options_.frame_timeout_interval_ms + 1), kWidth, + kHeight, kProcessTime); ForceUpdate(kWidth, kHeight); EXPECT_EQ(InitialUsage(), UsagePercent()); } @@ -351,20 +350,20 @@ TEST_F(OveruseFrameDetectorTest, ResetAfterFrameTimeout) { TEST_F(OveruseFrameDetectorTest, MinFrameSamplesBeforeUpdating) { options_.min_frame_samples = 40; overuse_detector_->SetOptions(options_); - InsertAndSendFramesWithInterval(40, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(40, kFrameInterval, kWidth, kHeight, + kProcessTime); EXPECT_EQ(InitialUsage(), UsagePercent()); // Pass time far enough to digest all previous samples. clock_.AdvanceTime(TimeDelta::Seconds(1)); - InsertAndSendFramesWithInterval(1, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(1, kFrameInterval, kWidth, kHeight, + kProcessTime); // The last sample has not been processed here. EXPECT_EQ(InitialUsage(), UsagePercent()); // Pass time far enough to digest all previous samples, 41 in total. clock_.AdvanceTime(TimeDelta::Seconds(1)); - InsertAndSendFramesWithInterval(1, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(1, kFrameInterval, kWidth, kHeight, + kProcessTime); EXPECT_NE(InitialUsage(), UsagePercent()); } @@ -377,7 +376,7 @@ TEST_F(OveruseFrameDetectorTest, InitialProcessingUsage) { TEST_F(OveruseFrameDetectorTest, MeasuresMultipleConcurrentSamples) { overuse_detector_->SetOptions(options_); EXPECT_CALL(mock_observer_, AdaptDown()).Times(::testing::AtLeast(1)); - static const int kIntervalUs = 33 * kNumMicrosecsPerMillisec; + static TimeDelta kInterval = TimeDelta::Millis(33); static const size_t kNumFramesEncodingDelay = 3; VideoFrame frame = VideoFrame::Builder() @@ -388,13 +387,13 @@ TEST_F(OveruseFrameDetectorTest, MeasuresMultipleConcurrentSamples) { for (size_t i = 0; i < 1000; ++i) { // Unique timestamps. frame.set_rtp_timestamp(static_cast<uint32_t>(i)); - int64_t capture_time_us = TimeMicros(); + int64_t capture_time_us = clock_.TimeInMicroseconds(); overuse_detector_->FrameCaptured(frame, capture_time_us); - clock_.AdvanceTime(TimeDelta::Micros(kIntervalUs)); + clock_.AdvanceTime(kInterval); if (i > kNumFramesEncodingDelay) { overuse_detector_->FrameSent( - static_cast<uint32_t>(i - kNumFramesEncodingDelay), TimeMicros(), - capture_time_us, kIntervalUs); + static_cast<uint32_t>(i - kNumFramesEncodingDelay), + clock_.TimeInMicroseconds(), capture_time_us, kInterval.us()); } overuse_detector_->CheckForOveruse(observer_); } @@ -404,8 +403,8 @@ TEST_F(OveruseFrameDetectorTest, UpdatesExistingSamples) { // >85% encoding time should trigger overuse. overuse_detector_->SetOptions(options_); EXPECT_CALL(mock_observer_, AdaptDown()).Times(::testing::AtLeast(1)); - static const int kIntervalUs = 33 * kNumMicrosecsPerMillisec; - static const int kDelayUs = 30 * kNumMicrosecsPerMillisec; + static const TimeDelta kInterval = TimeDelta::Millis(33); + static const TimeDelta kDelay = TimeDelta::Millis(30); VideoFrame frame = VideoFrame::Builder() .set_video_frame_buffer(I420Buffer::Create(kWidth, kHeight)) @@ -415,18 +414,18 @@ TEST_F(OveruseFrameDetectorTest, UpdatesExistingSamples) { uint32_t timestamp = 0; for (size_t i = 0; i < 1000; ++i) { frame.set_rtp_timestamp(timestamp); - int64_t capture_time_us = TimeMicros(); + int64_t capture_time_us = clock_.TimeInMicroseconds(); overuse_detector_->FrameCaptured(frame, capture_time_us); // Encode and send first parts almost instantly. clock_.AdvanceTime(TimeDelta::Millis(1)); - overuse_detector_->FrameSent(timestamp, TimeMicros(), capture_time_us, - kNumMicrosecsPerMillisec); + overuse_detector_->FrameSent(timestamp, clock_.TimeInMicroseconds(), + capture_time_us, TimeDelta::Millis(1).us()); // Encode heavier part, resulting in >85% usage total. - clock_.AdvanceTime(TimeDelta::Micros(kDelayUs) - TimeDelta::Millis(1)); - overuse_detector_->FrameSent(timestamp, TimeMicros(), capture_time_us, - kDelayUs); - clock_.AdvanceTime(TimeDelta::Micros(kIntervalUs - kDelayUs)); - timestamp += kIntervalUs * 90 / 1000; + clock_.AdvanceTime(kDelay - TimeDelta::Millis(1)); + overuse_detector_->FrameSent(timestamp, clock_.TimeInMicroseconds(), + capture_time_us, kDelay.us()); + clock_.AdvanceTime(kInterval - kDelay); + timestamp += kInterval.us() * 90 / 1000; overuse_detector_->CheckForOveruse(observer_); } } @@ -448,11 +447,11 @@ TEST_F(OveruseFrameDetectorTest, RunOnTqNormalUsage) { })); queue.PostTask([this] { - const int kDelayUs1 = 5 * kNumMicrosecsPerMillisec; - const int kDelayUs2 = 6 * kNumMicrosecsPerMillisec; - InsertAndSendFramesWithInterval(1300, kFrameIntervalUs, kWidth, kHeight, + const TimeDelta kDelayUs1 = TimeDelta::Millis(5); + const TimeDelta kDelayUs2 = TimeDelta::Millis(6); + InsertAndSendFramesWithInterval(1300, kFrameInterval, kWidth, kHeight, kDelayUs1); - InsertAndSendFramesWithInterval(1, kFrameIntervalUs, kWidth, kHeight, + InsertAndSendFramesWithInterval(1, kFrameInterval, kWidth, kHeight, kDelayUs2); }); @@ -467,9 +466,9 @@ TEST_F(OveruseFrameDetectorTest, MaxIntervalScalesWithFramerate) { overuse_detector_->SetOptions(options_); // Trigger overuse. - int64_t frame_interval_us = kNumMicrosecsPerSec / kCapturerMaxFrameRate; + TimeDelta frame_interval_us = TimeDelta::Seconds(1) / kCapturerMaxFrameRate; // Processing time just below over use limit given kEncodeMaxFrameRate. - int64_t processing_time_us = + TimeDelta processing_time_us = (98 * OveruseProcessingTimeLimitForFramerate(kEncodeMaxFrameRate)) / 100; EXPECT_CALL(mock_observer_, AdaptDown()).Times(1); for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) { @@ -479,7 +478,7 @@ TEST_F(OveruseFrameDetectorTest, MaxIntervalScalesWithFramerate) { } // Simulate frame rate reduction and normal usage. - frame_interval_us = kNumMicrosecsPerSec / kEncodeMaxFrameRate; + frame_interval_us = TimeDelta::Seconds(1) / kEncodeMaxFrameRate; overuse_detector_->OnTargetFramerateUpdated(kEncodeMaxFrameRate); EXPECT_CALL(mock_observer_, AdaptDown()).Times(0); for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) { @@ -504,9 +503,9 @@ TEST_F(OveruseFrameDetectorTest, RespectsMinFramerate) { overuse_detector_->OnTargetFramerateUpdated(kMinFrameRate); // Normal usage just at the limit. - int64_t frame_interval_us = kNumMicrosecsPerSec / kMinFrameRate; + TimeDelta frame_interval_us = TimeDelta::Seconds(1) / kMinFrameRate; // Processing time just below over use limit given kEncodeMaxFrameRate. - int64_t processing_time_us = + TimeDelta processing_time_us = (98 * OveruseProcessingTimeLimitForFramerate(kMinFrameRate)) / 100; EXPECT_CALL(mock_observer_, AdaptDown()).Times(0); for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) { @@ -539,17 +538,17 @@ TEST_F(OveruseFrameDetectorTest, LimitsMaxFrameInterval) { const int kMaxFrameRate = 20; overuse_detector_->SetOptions(options_); overuse_detector_->OnTargetFramerateUpdated(kMaxFrameRate); - int64_t frame_interval_us = kNumMicrosecsPerSec / kMaxFrameRate; + TimeDelta frame_interval_us = TimeDelta::Seconds(1) / kMaxFrameRate; // Maximum frame interval allowed is 35% above ideal. - int64_t max_frame_interval_us = (135 * frame_interval_us) / 100; + TimeDelta max_frame_interval_us = (135 * frame_interval_us) / 100; // Maximum processing time, without triggering overuse, allowed with the above // frame interval. - int64_t max_processing_time_us = + TimeDelta max_processing_time_us = (max_frame_interval_us * options_.high_encode_usage_threshold_percent) / 100; // Processing time just below overuse limit given kMaxFrameRate. - int64_t processing_time_us = (98 * max_processing_time_us) / 100; + TimeDelta processing_time_us = (98 * max_processing_time_us) / 100; EXPECT_CALL(mock_observer_, AdaptDown()).Times(0); for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) { InsertAndSendFramesWithInterval(1200, max_frame_interval_us, kWidth, @@ -567,7 +566,7 @@ TEST_F(OveruseFrameDetectorTest, LimitsMaxFrameInterval) { } // Increase frame interval, should still trigger overuse. - max_frame_interval_us *= 2; + max_frame_interval_us = max_frame_interval_us * 2; EXPECT_CALL(mock_observer_, AdaptDown()).Times(1); for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) { InsertAndSendFramesWithInterval(1200, max_frame_interval_us, kWidth, @@ -589,18 +588,16 @@ TEST_F(OveruseFrameDetectorTest, NoOveruseForLargeRandomFrameInterval) { overuse_detector_->SetOptions(options_); const int kNumFrames = 500; - const int kEncodeTimeUs = 100 * kNumMicrosecsPerMillisec; - - const int kMinIntervalUs = 30 * kNumMicrosecsPerMillisec; - const int kMaxIntervalUs = 1000 * kNumMicrosecsPerMillisec; + const TimeDelta kEncodeTime = TimeDelta::Micros(100); + const TimeDelta kMinInterval = TimeDelta::Micros(30); + const TimeDelta kMaxInterval = TimeDelta::Micros(1000); const int kTargetFramerate = 5; overuse_detector_->OnTargetFramerateUpdated(kTargetFramerate); - InsertAndSendFramesWithRandomInterval(kNumFrames, kMinIntervalUs, - kMaxIntervalUs, kWidth, kHeight, - kEncodeTimeUs); + InsertAndSendFramesWithRandomInterval(kNumFrames, kMinInterval, kMaxInterval, + kWidth, kHeight, kEncodeTime); // Average usage 19%. Check that estimate is in the right ball park. // EXPECT_NEAR(UsagePercent(), 20, 10); EXPECT_NEAR(UsagePercent(), 20, 35); @@ -617,18 +614,16 @@ TEST_F(OveruseFrameDetectorTest, NoOveruseForRandomFrameIntervalWithReset) { // .Times(::testing::AtLeast(1)); const int kNumFrames = 500; - const int kEncodeTimeUs = 100 * kNumMicrosecsPerMillisec; - - const int kMinIntervalUs = 30 * kNumMicrosecsPerMillisec; - const int kMaxIntervalUs = 3000 * kNumMicrosecsPerMillisec; + const TimeDelta kEncodeTime = TimeDelta::Millis(100); + const TimeDelta kMinInterval = TimeDelta::Millis(30); + const TimeDelta kMaxInterval = TimeDelta::Millis(3000); const int kTargetFramerate = 5; overuse_detector_->OnTargetFramerateUpdated(kTargetFramerate); - InsertAndSendFramesWithRandomInterval(kNumFrames, kMinIntervalUs, - kMaxIntervalUs, kWidth, kHeight, - kEncodeTimeUs); + InsertAndSendFramesWithRandomInterval(kNumFrames, kMinInterval, kMaxInterval, + kWidth, kHeight, kEncodeTime); // Average usage 6.6%, but since the frame_timeout_interval_ms is // only 1500 ms, we often reset the estimate to the initial value. @@ -644,15 +639,15 @@ TEST_F(OveruseFrameDetectorTest, NoOveruseForSimulcast) { EXPECT_CALL(mock_observer_, AdaptDown()).Times(0); constexpr int kNumFrames = 500; - constexpr int kEncodeTimesUs[] = { - 10 * kNumMicrosecsPerMillisec, - 8 * kNumMicrosecsPerMillisec, - 12 * kNumMicrosecsPerMillisec, + constexpr TimeDelta kEncodeTimes[] = { + TimeDelta::Millis(10), + TimeDelta::Millis(8), + TimeDelta::Millis(12), }; - constexpr int kIntervalUs = 30 * kNumMicrosecsPerMillisec; + constexpr TimeDelta kInterval = TimeDelta::Millis(30); - InsertAndSendSimulcastFramesWithInterval(kNumFrames, kIntervalUs, kWidth, - kHeight, kEncodeTimesUs); + InsertAndSendSimulcastFramesWithInterval(kNumFrames, kInterval, kWidth, + kHeight, kEncodeTimes); // Average usage 40%. 12 ms / 30 ms. EXPECT_GE(UsagePercent(), 35); @@ -663,15 +658,15 @@ TEST_F(OveruseFrameDetectorTest, NoOveruseForSimulcast) { class OveruseFrameDetectorTest2 : public OveruseFrameDetectorTest { protected: void SetUp() override { - options_.filter_time_ms = 5 * kNumMillisecsPerSec; + options_.filter_time_ms = TimeDelta::Seconds(5).ms(); OveruseFrameDetectorTest::SetUp(); } void InsertAndSendFramesWithInterval(int num_frames, - int interval_us, + TimeDelta interval_us, int width, int height, - int delay_us) override { + TimeDelta delay_us) override { VideoFrame frame = VideoFrame::Builder() .set_video_frame_buffer(I420Buffer::Create(width, height)) @@ -679,21 +674,21 @@ class OveruseFrameDetectorTest2 : public OveruseFrameDetectorTest { .set_timestamp_us(0) .build(); while (num_frames-- > 0) { - int64_t capture_time_us = TimeMicros(); + int64_t capture_time_us = clock_.TimeInMicroseconds(); overuse_detector_->FrameCaptured(frame, capture_time_us /* ignored */); overuse_detector_->FrameSent(0 /* ignored timestamp */, 0 /* ignored send_time_us */, - capture_time_us, delay_us); - clock_.AdvanceTime(TimeDelta::Micros(interval_us)); + capture_time_us, delay_us.us()); + clock_.AdvanceTime(interval_us); } } void InsertAndSendFramesWithRandomInterval(int num_frames, - int min_interval_us, - int max_interval_us, + TimeDelta min_interval_us, + TimeDelta max_interval_us, int width, int height, - int delay_us) override { + TimeDelta delay_us) override { Random random(17); VideoFrame frame = @@ -703,23 +698,24 @@ class OveruseFrameDetectorTest2 : public OveruseFrameDetectorTest { .set_timestamp_us(0) .build(); for (int i = 0; i < num_frames; i++) { - int interval_us = random.Rand(min_interval_us, max_interval_us); - int64_t capture_time_us = TimeMicros(); + TimeDelta interval_us = TimeDelta::Micros(random.Rand( + min_interval_us.us<uint32_t>(), max_interval_us.us<uint32_t>())); + int64_t capture_time_us = clock_.TimeInMicroseconds(); overuse_detector_->FrameCaptured(frame, capture_time_us); overuse_detector_->FrameSent(0 /* ignored timestamp */, 0 /* ignored send_time_us */, - capture_time_us, delay_us); + capture_time_us, delay_us.us()); overuse_detector_->CheckForOveruse(observer_); - clock_.AdvanceTime(TimeDelta::Micros(interval_us)); + clock_.AdvanceTime(interval_us); } } void ForceUpdate(int width, int height) override { // This is mainly to check initial values and whether the overuse // detector has been reset or not. - InsertAndSendFramesWithInterval(1, kNumMicrosecsPerSec, width, height, - kFrameIntervalUs); + InsertAndSendFramesWithInterval(1, TimeDelta::Seconds(1), width, height, + kFrameInterval); } }; @@ -752,16 +748,16 @@ TEST_F(OveruseFrameDetectorTest2, DoubleOveruseAndRecover) { } TEST_F(OveruseFrameDetectorTest2, TriggerUnderuseWithMinProcessCount) { - const int kProcessIntervalUs = 5 * kNumMicrosecsPerSec; + const TimeDelta kProcessInterval = TimeDelta::Seconds(5); options_.min_process_count = 1; CpuOveruseObserverImpl overuse_observer; observer_ = nullptr; overuse_detector_->SetOptions(options_); - InsertAndSendFramesWithInterval(1200, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(1200, kFrameInterval, kWidth, kHeight, + kProcessTime); overuse_detector_->CheckForOveruse(&overuse_observer); EXPECT_EQ(0, overuse_observer.normaluse_); - clock_.AdvanceTime(TimeDelta::Micros(kProcessIntervalUs)); + clock_.AdvanceTime(kProcessInterval); overuse_detector_->CheckForOveruse(&overuse_observer); EXPECT_EQ(1, overuse_observer.normaluse_); } @@ -791,17 +787,18 @@ TEST_F(OveruseFrameDetectorTest2, IncorrectConsecutiveCountTriggersNoOveruse) { TEST_F(OveruseFrameDetectorTest2, ProcessingUsage) { overuse_detector_->SetOptions(options_); - InsertAndSendFramesWithInterval(1000, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); - EXPECT_EQ(kProcessTimeUs * 100 / kFrameIntervalUs, UsagePercent()); + InsertAndSendFramesWithInterval(1000, kFrameInterval, kWidth, kHeight, + kProcessTime); + EXPECT_EQ(static_cast<int>(kProcessTime * 100 / kFrameInterval), + UsagePercent()); } TEST_F(OveruseFrameDetectorTest2, ResetAfterResolutionChange) { overuse_detector_->SetOptions(options_); ForceUpdate(kWidth, kHeight); EXPECT_EQ(InitialUsage(), UsagePercent()); - InsertAndSendFramesWithInterval(1000, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(1000, kFrameInterval, kWidth, kHeight, + kProcessTime); EXPECT_NE(InitialUsage(), UsagePercent()); // Verify reset (with new width/height). ForceUpdate(kWidth, kHeight + 1); @@ -812,40 +809,40 @@ TEST_F(OveruseFrameDetectorTest2, ResetAfterFrameTimeout) { overuse_detector_->SetOptions(options_); ForceUpdate(kWidth, kHeight); EXPECT_EQ(InitialUsage(), UsagePercent()); - InsertAndSendFramesWithInterval(1000, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(1000, kFrameInterval, kWidth, kHeight, + kProcessTime); EXPECT_NE(InitialUsage(), UsagePercent()); InsertAndSendFramesWithInterval( - 2, options_.frame_timeout_interval_ms * kNumMicrosecsPerMillisec, kWidth, - kHeight, kProcessTimeUs); + 2, TimeDelta::Millis(options_.frame_timeout_interval_ms), kWidth, kHeight, + kProcessTime); EXPECT_NE(InitialUsage(), UsagePercent()); // Verify reset. InsertAndSendFramesWithInterval( - 2, (options_.frame_timeout_interval_ms + 1) * kNumMicrosecsPerMillisec, - kWidth, kHeight, kProcessTimeUs); + 2, TimeDelta::Millis(options_.frame_timeout_interval_ms + 1), kWidth, + kHeight, kProcessTime); ForceUpdate(kWidth, kHeight); EXPECT_EQ(InitialUsage(), UsagePercent()); } TEST_F(OveruseFrameDetectorTest2, ConvergesSlowly) { overuse_detector_->SetOptions(options_); - InsertAndSendFramesWithInterval(1, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(1, kFrameInterval, kWidth, kHeight, + kProcessTime); // No update for the first sample. EXPECT_EQ(InitialUsage(), UsagePercent()); // Total time approximately 40 * 33ms = 1.3s, significantly less // than the 5s time constant. - InsertAndSendFramesWithInterval(40, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(40, kFrameInterval, kWidth, kHeight, + kProcessTime); // Should have started to approach correct load of 15%, but not very far. EXPECT_LT(UsagePercent(), InitialUsage()); EXPECT_GT(UsagePercent(), (InitialUsage() * 3 + 8) / 4); // Run for roughly 10s more, should now be closer. - InsertAndSendFramesWithInterval(300, kFrameIntervalUs, kWidth, kHeight, - kProcessTimeUs); + InsertAndSendFramesWithInterval(300, kFrameInterval, kWidth, kHeight, + kProcessTime); EXPECT_NEAR(UsagePercent(), 20, 5); } @@ -858,7 +855,7 @@ TEST_F(OveruseFrameDetectorTest2, InitialProcessingUsage) { TEST_F(OveruseFrameDetectorTest2, MeasuresMultipleConcurrentSamples) { overuse_detector_->SetOptions(options_); EXPECT_CALL(mock_observer_, AdaptDown()).Times(::testing::AtLeast(1)); - static const int kIntervalUs = 33 * kNumMicrosecsPerMillisec; + static const TimeDelta kInterval = TimeDelta::Millis(33); static const size_t kNumFramesEncodingDelay = 3; VideoFrame frame = VideoFrame::Builder() @@ -869,13 +866,13 @@ TEST_F(OveruseFrameDetectorTest2, MeasuresMultipleConcurrentSamples) { for (size_t i = 0; i < 1000; ++i) { // Unique timestamps. frame.set_rtp_timestamp(static_cast<uint32_t>(i)); - int64_t capture_time_us = TimeMicros(); + int64_t capture_time_us = clock_.TimeInMicroseconds(); overuse_detector_->FrameCaptured(frame, capture_time_us); - clock_.AdvanceTime(TimeDelta::Micros(kIntervalUs)); + clock_.AdvanceTime(kInterval); if (i > kNumFramesEncodingDelay) { overuse_detector_->FrameSent( - static_cast<uint32_t>(i - kNumFramesEncodingDelay), TimeMicros(), - capture_time_us, kIntervalUs); + static_cast<uint32_t>(i - kNumFramesEncodingDelay), + clock_.TimeInMicroseconds(), capture_time_us, kInterval.us()); } overuse_detector_->CheckForOveruse(observer_); } @@ -885,8 +882,8 @@ TEST_F(OveruseFrameDetectorTest2, UpdatesExistingSamples) { // >85% encoding time should trigger overuse. overuse_detector_->SetOptions(options_); EXPECT_CALL(mock_observer_, AdaptDown()).Times(::testing::AtLeast(1)); - static const int kIntervalUs = 33 * kNumMicrosecsPerMillisec; - static const int kDelayUs = 30 * kNumMicrosecsPerMillisec; + static const TimeDelta kInterval = TimeDelta::Millis(33); + static const TimeDelta kDelay = TimeDelta::Millis(30); VideoFrame frame = VideoFrame::Builder() .set_video_frame_buffer(I420Buffer::Create(kWidth, kHeight)) @@ -896,18 +893,18 @@ TEST_F(OveruseFrameDetectorTest2, UpdatesExistingSamples) { uint32_t timestamp = 0; for (size_t i = 0; i < 1000; ++i) { frame.set_rtp_timestamp(timestamp); - int64_t capture_time_us = TimeMicros(); + int64_t capture_time_us = clock_.TimeInMicroseconds(); overuse_detector_->FrameCaptured(frame, capture_time_us); // Encode and send first parts almost instantly. clock_.AdvanceTime(TimeDelta::Millis(1)); - overuse_detector_->FrameSent(timestamp, TimeMicros(), capture_time_us, - kNumMicrosecsPerMillisec); + overuse_detector_->FrameSent(timestamp, clock_.TimeInMicroseconds(), + capture_time_us, TimeDelta::Millis(1).us()); // Encode heavier part, resulting in >85% usage total. - clock_.AdvanceTime(TimeDelta::Micros(kDelayUs) - TimeDelta::Millis(1)); - overuse_detector_->FrameSent(timestamp, TimeMicros(), capture_time_us, - kDelayUs); - clock_.AdvanceTime(TimeDelta::Micros(kIntervalUs - kDelayUs)); - timestamp += kIntervalUs * 90 / 1000; + clock_.AdvanceTime(kDelay - TimeDelta::Millis(1)); + overuse_detector_->FrameSent(timestamp, clock_.TimeInMicroseconds(), + capture_time_us, kDelay.us()); + clock_.AdvanceTime(kInterval - kDelay); + timestamp += kInterval.us() * 90 / 1000; overuse_detector_->CheckForOveruse(observer_); } } @@ -929,11 +926,11 @@ TEST_F(OveruseFrameDetectorTest2, RunOnTqNormalUsage) { })); queue.PostTask([this] { - const int kDelayUs1 = 5 * kNumMicrosecsPerMillisec; - const int kDelayUs2 = 6 * kNumMicrosecsPerMillisec; - InsertAndSendFramesWithInterval(1300, kFrameIntervalUs, kWidth, kHeight, + const TimeDelta kDelayUs1 = TimeDelta::Millis(5); + const TimeDelta kDelayUs2 = TimeDelta::Millis(6); + InsertAndSendFramesWithInterval(1300, kFrameInterval, kWidth, kHeight, kDelayUs1); - InsertAndSendFramesWithInterval(1, kFrameIntervalUs, kWidth, kHeight, + InsertAndSendFramesWithInterval(1, kFrameInterval, kWidth, kHeight, kDelayUs2); }); @@ -948,14 +945,12 @@ TEST_F(OveruseFrameDetectorTest2, NoOveruseForLargeRandomFrameInterval) { EXPECT_CALL(mock_observer_, AdaptUp()).Times(::testing::AtLeast(1)); const int kNumFrames = 500; - const int kEncodeTimeUs = 100 * kNumMicrosecsPerMillisec; - - const int kMinIntervalUs = 30 * kNumMicrosecsPerMillisec; - const int kMaxIntervalUs = 1000 * kNumMicrosecsPerMillisec; + const TimeDelta kEncodeTime = TimeDelta::Millis(100); + const TimeDelta kMinInterval = TimeDelta::Millis(30); + const TimeDelta kMaxInterval = TimeDelta::Millis(1000); - InsertAndSendFramesWithRandomInterval(kNumFrames, kMinIntervalUs, - kMaxIntervalUs, kWidth, kHeight, - kEncodeTimeUs); + InsertAndSendFramesWithRandomInterval(kNumFrames, kMinInterval, kMaxInterval, + kWidth, kHeight, kEncodeTime); // Average usage 19%. Check that estimate is in the right ball park. EXPECT_NEAR(UsagePercent(), 20, 10); } @@ -968,14 +963,12 @@ TEST_F(OveruseFrameDetectorTest2, NoOveruseForRandomFrameIntervalWithReset) { EXPECT_CALL(mock_observer_, AdaptUp()).Times(::testing::AtLeast(1)); const int kNumFrames = 500; - const int kEncodeTimeUs = 100 * kNumMicrosecsPerMillisec; + const TimeDelta kEncodeTime = TimeDelta::Millis(100); + const TimeDelta kMinInterval = TimeDelta::Millis(30); + const TimeDelta kMaxInterval = TimeDelta::Millis(3000); - const int kMinIntervalUs = 30 * kNumMicrosecsPerMillisec; - const int kMaxIntervalUs = 3000 * kNumMicrosecsPerMillisec; - - InsertAndSendFramesWithRandomInterval(kNumFrames, kMinIntervalUs, - kMaxIntervalUs, kWidth, kHeight, - kEncodeTimeUs); + InsertAndSendFramesWithRandomInterval(kNumFrames, kMinInterval, kMaxInterval, + kWidth, kHeight, kEncodeTime); // Average usage 6.6%, but since the frame_timeout_interval_ms is // only 1500 ms, we often reset the estimate to the initial value. @@ -989,12 +982,13 @@ TEST_F(OveruseFrameDetectorTest2, ToleratesOutOfOrderFrames) { // Represents a cpu utilization close to 100%. First input frame results in // three encoded frames, and the last of those isn't finished until after the // first encoded frame corresponding to the next input frame. - const int kEncodeTimeUs = 30 * kNumMicrosecsPerMillisec; - const int kCaptureTimesMs[] = {33, 33, 66, 33}; + const TimeDelta kEncodeTime = TimeDelta::Millis(30); + const Timestamp kCaptureTimes[] = { + Timestamp::Millis(33), Timestamp::Millis(33), Timestamp::Millis(66), + Timestamp::Millis(33)}; - for (int capture_time_ms : kCaptureTimesMs) { - overuse_detector_->FrameSent( - 0, 0, capture_time_ms * kNumMicrosecsPerMillisec, kEncodeTimeUs); + for (Timestamp capture_time : kCaptureTimes) { + overuse_detector_->FrameSent(0, 0, capture_time.ms(), kEncodeTime.us()); } EXPECT_GE(UsagePercent(), InitialUsage()); } @@ -1006,19 +1000,20 @@ TEST_F(OveruseFrameDetectorTest2, NoOveruseForSimulcast) { EXPECT_CALL(mock_observer_, AdaptDown()).Times(0); constexpr int kNumFrames = 500; - constexpr int kEncodeTimesUs[] = { - 10 * kNumMicrosecsPerMillisec, - 8 * kNumMicrosecsPerMillisec, - 12 * kNumMicrosecsPerMillisec, + constexpr TimeDelta kEncodeTimes[] = { + TimeDelta::Millis(10), + TimeDelta::Millis(8), + TimeDelta::Millis(12), }; - constexpr int kIntervalUs = 30 * kNumMicrosecsPerMillisec; + constexpr TimeDelta kInterval = TimeDelta::Millis(30); - InsertAndSendSimulcastFramesWithInterval(kNumFrames, kIntervalUs, kWidth, - kHeight, kEncodeTimesUs); + InsertAndSendSimulcastFramesWithInterval(kNumFrames, kInterval, kWidth, + kHeight, kEncodeTimes); // Average usage 40%. 12 ms / 30 ms. EXPECT_GE(UsagePercent(), 35); EXPECT_LE(UsagePercent(), 45); } +} // namespace } // namespace webrtc