blob: 64747fa6845f01aedb3686a95cad98bf11d5334b [file] [log] [blame]
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
kwiberg27f982b2016-03-01 11:52:33 -080011#include <memory>
12
perkjd52063f2016-09-07 06:32:18 -070013#include "webrtc/base/event.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010014#include "webrtc/system_wrappers/include/clock.h"
kwibergac9f8762016-09-30 22:29:43 -070015#include "webrtc/test/gmock.h"
16#include "webrtc/test/gtest.h"
17#include "webrtc/video/overuse_frame_detector.h"
Peter Boströme4499152016-02-05 11:13:28 +010018#include "webrtc/video_frame.h"
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000019
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000020namespace webrtc {
perkjd52063f2016-09-07 06:32:18 -070021
22using ::testing::Invoke;
23
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +000024namespace {
25 const int kWidth = 640;
26 const int kHeight = 480;
27 const int kFrameInterval33ms = 33;
28 const int kProcessIntervalMs = 5000;
Åsa Persson746210f2015-09-08 10:52:42 +020029 const int kProcessTime5ms = 5;
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +000030} // namespace
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000031
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000032class MockCpuOveruseObserver : public CpuOveruseObserver {
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000033 public:
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000034 MockCpuOveruseObserver() {}
35 virtual ~MockCpuOveruseObserver() {}
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000036
37 MOCK_METHOD0(OveruseDetected, void());
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000038 MOCK_METHOD0(NormalUsage, void());
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000039};
40
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +000041class CpuOveruseObserverImpl : public CpuOveruseObserver {
42 public:
43 CpuOveruseObserverImpl() :
44 overuse_(0),
45 normaluse_(0) {}
46 virtual ~CpuOveruseObserverImpl() {}
47
48 void OveruseDetected() { ++overuse_; }
49 void NormalUsage() { ++normaluse_; }
50
51 int overuse_;
52 int normaluse_;
53};
54
perkjd52063f2016-09-07 06:32:18 -070055class OveruseFrameDetectorUnderTest : public OveruseFrameDetector {
56 public:
57 OveruseFrameDetectorUnderTest(Clock* clock,
58 const CpuOveruseOptions& options,
59 CpuOveruseObserver* overuse_observer,
60 EncodedFrameObserver* encoder_timing,
61 CpuOveruseMetricsObserver* metrics_observer)
62 : OveruseFrameDetector(clock,
63 options,
64 overuse_observer,
65 encoder_timing,
66 metrics_observer) {}
67 ~OveruseFrameDetectorUnderTest() {}
68
69 using OveruseFrameDetector::CheckForOveruse;
70};
71
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +000072class OveruseFrameDetectorTest : public ::testing::Test,
73 public CpuOveruseMetricsObserver {
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000074 protected:
nisseef8b61e2016-04-29 06:09:15 -070075 void SetUp() override {
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000076 clock_.reset(new SimulatedClock(1234));
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000077 observer_.reset(new MockCpuOveruseObserver());
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +000078 options_.min_process_count = 0;
Peter Boström4b91bd02015-06-26 06:58:16 +020079 ReinitializeOveruseDetector();
80 }
81
82 void ReinitializeOveruseDetector() {
perkjd52063f2016-09-07 06:32:18 -070083 overuse_detector_.reset(new OveruseFrameDetectorUnderTest(
Peter Boströme4499152016-02-05 11:13:28 +010084 clock_.get(), options_, observer_.get(), nullptr, this));
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +000085 }
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +000086
Peter Boströme4499152016-02-05 11:13:28 +010087 void OnEncodedFrameTimeMeasured(int encode_time_ms,
88 const CpuOveruseMetrics& metrics) override {
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +000089 metrics_ = metrics;
90 }
91
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +000092 int InitialUsage() {
asapersson@webrtc.orgce12f1f2014-03-24 21:59:16 +000093 return ((options_.low_encode_usage_threshold_percent +
94 options_.high_encode_usage_threshold_percent) / 2.0f) + 0.5;
95 }
96
Peter Boströme4499152016-02-05 11:13:28 +010097 void InsertAndSendFramesWithInterval(int num_frames,
98 int interval_ms,
99 int width,
100 int height,
101 int delay_ms) {
102 VideoFrame frame;
103 frame.CreateEmptyFrame(width, height, width, width / 2, width / 2);
104 uint32_t timestamp = 0;
asapersson@webrtc.orgce12f1f2014-03-24 21:59:16 +0000105 while (num_frames-- > 0) {
Peter Boströme4499152016-02-05 11:13:28 +0100106 frame.set_timestamp(timestamp);
perkjd52063f2016-09-07 06:32:18 -0700107 overuse_detector_->FrameCaptured(frame, clock_->TimeInMilliseconds());
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000108 clock_->AdvanceTimeMilliseconds(delay_ms);
perkjd52063f2016-09-07 06:32:18 -0700109 overuse_detector_->FrameSent(timestamp, clock_->TimeInMilliseconds());
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000110 clock_->AdvanceTimeMilliseconds(interval_ms - delay_ms);
Peter Boströme4499152016-02-05 11:13:28 +0100111 timestamp += interval_ms * 90;
asapersson@webrtc.orgce12f1f2014-03-24 21:59:16 +0000112 }
113 }
114
Peter Boströme4499152016-02-05 11:13:28 +0100115 void ForceUpdate(int width, int height) {
116 // Insert one frame, wait a second and then put in another to force update
117 // the usage. From the tests where these are used, adding another sample
118 // doesn't affect the expected outcome (this is mainly to check initial
119 // values and whether the overuse detector has been reset or not).
120 InsertAndSendFramesWithInterval(2, 1000, width, height, kFrameInterval33ms);
121 }
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000122 void TriggerOveruse(int num_times) {
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000123 const int kDelayMs = 32;
asapersson@webrtc.orgce12f1f2014-03-24 21:59:16 +0000124 for (int i = 0; i < num_times; ++i) {
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000125 InsertAndSendFramesWithInterval(
126 1000, kFrameInterval33ms, kWidth, kHeight, kDelayMs);
perkjd52063f2016-09-07 06:32:18 -0700127 overuse_detector_->CheckForOveruse();
asapersson@webrtc.orgce12f1f2014-03-24 21:59:16 +0000128 }
129 }
130
Åsa Persson746210f2015-09-08 10:52:42 +0200131 void TriggerUnderuse() {
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000132 const int kDelayMs1 = 5;
133 const int kDelayMs2 = 6;
134 InsertAndSendFramesWithInterval(
135 1300, kFrameInterval33ms, kWidth, kHeight, kDelayMs1);
136 InsertAndSendFramesWithInterval(
137 1, kFrameInterval33ms, kWidth, kHeight, kDelayMs2);
perkjd52063f2016-09-07 06:32:18 -0700138 overuse_detector_->CheckForOveruse();
asapersson@webrtc.orgce12f1f2014-03-24 21:59:16 +0000139 }
140
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +0000141 int UsagePercent() { return metrics_.encode_usage_percent; }
asapersson@webrtc.orgab6bf4f2014-05-27 07:43:15 +0000142
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000143 CpuOveruseOptions options_;
kwiberg27f982b2016-03-01 11:52:33 -0800144 std::unique_ptr<SimulatedClock> clock_;
145 std::unique_ptr<MockCpuOveruseObserver> observer_;
perkjd52063f2016-09-07 06:32:18 -0700146 std::unique_ptr<OveruseFrameDetectorUnderTest> overuse_detector_;
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +0000147 CpuOveruseMetrics metrics_;
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000148};
149
Åsa Persson746210f2015-09-08 10:52:42 +0200150
Åsa Persson746210f2015-09-08 10:52:42 +0200151// UsagePercent() > high_encode_usage_threshold_percent => overuse.
152// UsagePercent() < low_encode_usage_threshold_percent => underuse.
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000153TEST_F(OveruseFrameDetectorTest, TriggerOveruse) {
Åsa Persson746210f2015-09-08 10:52:42 +0200154 // usage > high => overuse
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000155 EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
156 TriggerOveruse(options_.high_threshold_consecutive_count);
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +0000157}
158
159TEST_F(OveruseFrameDetectorTest, OveruseAndRecover) {
Åsa Persson746210f2015-09-08 10:52:42 +0200160 // usage > high => overuse
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000161 EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
162 TriggerOveruse(options_.high_threshold_consecutive_count);
Åsa Persson746210f2015-09-08 10:52:42 +0200163 // usage < low => underuse
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000164 EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(testing::AtLeast(1));
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000165 TriggerUnderuse();
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000166}
167
asapersson@webrtc.org2881ab12014-06-12 08:46:46 +0000168TEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithNoObserver) {
perkjd52063f2016-09-07 06:32:18 -0700169 overuse_detector_.reset(new OveruseFrameDetectorUnderTest(
170 clock_.get(), options_, nullptr, nullptr, this));
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000171 EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0);
172 TriggerOveruse(options_.high_threshold_consecutive_count);
173 EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0);
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000174 TriggerUnderuse();
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000175}
176
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +0000177TEST_F(OveruseFrameDetectorTest, DoubleOveruseAndRecover) {
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000178 EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(2);
179 TriggerOveruse(options_.high_threshold_consecutive_count);
180 TriggerOveruse(options_.high_threshold_consecutive_count);
181 EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(testing::AtLeast(1));
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000182 TriggerUnderuse();
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000183}
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +0000184
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000185TEST_F(OveruseFrameDetectorTest, TriggerUnderuseWithMinProcessCount) {
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000186 options_.min_process_count = 1;
Peter Boström4b91bd02015-06-26 06:58:16 +0200187 CpuOveruseObserverImpl overuse_observer;
perkjd52063f2016-09-07 06:32:18 -0700188 overuse_detector_.reset(new OveruseFrameDetectorUnderTest(
Peter Boströme4499152016-02-05 11:13:28 +0100189 clock_.get(), options_, &overuse_observer, nullptr, this));
Åsa Persson746210f2015-09-08 10:52:42 +0200190 InsertAndSendFramesWithInterval(
191 1200, kFrameInterval33ms, kWidth, kHeight, kProcessTime5ms);
perkjd52063f2016-09-07 06:32:18 -0700192 overuse_detector_->CheckForOveruse();
Peter Boström4b91bd02015-06-26 06:58:16 +0200193 EXPECT_EQ(0, overuse_observer.normaluse_);
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000194 clock_->AdvanceTimeMilliseconds(kProcessIntervalMs);
perkjd52063f2016-09-07 06:32:18 -0700195 overuse_detector_->CheckForOveruse();
Peter Boström4b91bd02015-06-26 06:58:16 +0200196 EXPECT_EQ(1, overuse_observer.normaluse_);
asapersson@webrtc.orgb60346e2014-02-17 19:02:15 +0000197}
198
pbos@webrtc.orga9575702013-08-30 17:16:32 +0000199TEST_F(OveruseFrameDetectorTest, ConstantOveruseGivesNoNormalUsage) {
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +0000200 EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0);
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000201 EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(64);
kjellander@webrtc.org0fcaf992015-11-26 15:24:52 +0100202 for (size_t i = 0; i < 64; ++i) {
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000203 TriggerOveruse(options_.high_threshold_consecutive_count);
204 }
mflodman@webrtc.orgd4412fe2013-07-31 16:42:21 +0000205}
206
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000207TEST_F(OveruseFrameDetectorTest, ConsecutiveCountTriggersOveruse) {
Peter Boström4b91bd02015-06-26 06:58:16 +0200208 EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1);
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000209 options_.high_threshold_consecutive_count = 2;
Peter Boström4b91bd02015-06-26 06:58:16 +0200210 ReinitializeOveruseDetector();
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000211 TriggerOveruse(2);
212}
213
214TEST_F(OveruseFrameDetectorTest, IncorrectConsecutiveCountTriggersNoOveruse) {
Peter Boström4b91bd02015-06-26 06:58:16 +0200215 EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0);
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000216 options_.high_threshold_consecutive_count = 2;
Peter Boström4b91bd02015-06-26 06:58:16 +0200217 ReinitializeOveruseDetector();
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000218 TriggerOveruse(1);
219}
220
Åsa Persson746210f2015-09-08 10:52:42 +0200221TEST_F(OveruseFrameDetectorTest, ProcessingUsage) {
222 InsertAndSendFramesWithInterval(
223 1000, kFrameInterval33ms, kWidth, kHeight, kProcessTime5ms);
224 EXPECT_EQ(kProcessTime5ms * 100 / kFrameInterval33ms, UsagePercent());
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000225}
226
Åsa Persson746210f2015-09-08 10:52:42 +0200227TEST_F(OveruseFrameDetectorTest, ResetAfterResolutionChange) {
Peter Boströme4499152016-02-05 11:13:28 +0100228 ForceUpdate(kWidth, kHeight);
Åsa Persson746210f2015-09-08 10:52:42 +0200229 EXPECT_EQ(InitialUsage(), UsagePercent());
230 InsertAndSendFramesWithInterval(
231 1000, kFrameInterval33ms, kWidth, kHeight, kProcessTime5ms);
232 EXPECT_NE(InitialUsage(), UsagePercent());
Peter Boströme4499152016-02-05 11:13:28 +0100233 // Verify reset (with new width/height).
234 ForceUpdate(kWidth, kHeight + 1);
Åsa Persson746210f2015-09-08 10:52:42 +0200235 EXPECT_EQ(InitialUsage(), UsagePercent());
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000236}
237
Åsa Persson746210f2015-09-08 10:52:42 +0200238TEST_F(OveruseFrameDetectorTest, ResetAfterFrameTimeout) {
Peter Boströme4499152016-02-05 11:13:28 +0100239 ForceUpdate(kWidth, kHeight);
Åsa Persson746210f2015-09-08 10:52:42 +0200240 EXPECT_EQ(InitialUsage(), UsagePercent());
241 InsertAndSendFramesWithInterval(
242 1000, kFrameInterval33ms, kWidth, kHeight, kProcessTime5ms);
243 EXPECT_NE(InitialUsage(), UsagePercent());
244 InsertAndSendFramesWithInterval(
245 2, options_.frame_timeout_interval_ms, kWidth, kHeight, kProcessTime5ms);
246 EXPECT_NE(InitialUsage(), UsagePercent());
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000247 // Verify reset.
Åsa Persson746210f2015-09-08 10:52:42 +0200248 InsertAndSendFramesWithInterval(
249 2, options_.frame_timeout_interval_ms + 1, kWidth, kHeight,
250 kProcessTime5ms);
Peter Boströme4499152016-02-05 11:13:28 +0100251 ForceUpdate(kWidth, kHeight);
Åsa Persson746210f2015-09-08 10:52:42 +0200252 EXPECT_EQ(InitialUsage(), UsagePercent());
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000253}
254
Åsa Persson746210f2015-09-08 10:52:42 +0200255TEST_F(OveruseFrameDetectorTest, MinFrameSamplesBeforeUpdating) {
asapersson@webrtc.org8a8c3ef2014-03-20 13:15:01 +0000256 options_.min_frame_samples = 40;
Peter Boström4b91bd02015-06-26 06:58:16 +0200257 ReinitializeOveruseDetector();
Åsa Persson746210f2015-09-08 10:52:42 +0200258 InsertAndSendFramesWithInterval(
259 40, kFrameInterval33ms, kWidth, kHeight, kProcessTime5ms);
260 EXPECT_EQ(InitialUsage(), UsagePercent());
Peter Boströme4499152016-02-05 11:13:28 +0100261 // Pass time far enough to digest all previous samples.
262 clock_->AdvanceTimeMilliseconds(1000);
263 InsertAndSendFramesWithInterval(1, kFrameInterval33ms, kWidth, kHeight,
264 kProcessTime5ms);
265 // The last sample has not been processed here.
266 EXPECT_EQ(InitialUsage(), UsagePercent());
267
268 // Pass time far enough to digest all previous samples, 41 in total.
269 clock_->AdvanceTimeMilliseconds(1000);
Åsa Persson746210f2015-09-08 10:52:42 +0200270 InsertAndSendFramesWithInterval(
271 1, kFrameInterval33ms, kWidth, kHeight, kProcessTime5ms);
272 EXPECT_NE(InitialUsage(), UsagePercent());
273}
274
275TEST_F(OveruseFrameDetectorTest, InitialProcessingUsage) {
Peter Boströme4499152016-02-05 11:13:28 +0100276 ForceUpdate(kWidth, kHeight);
Åsa Persson746210f2015-09-08 10:52:42 +0200277 EXPECT_EQ(InitialUsage(), UsagePercent());
asapersson@webrtc.orgb24d3352013-11-20 13:51:40 +0000278}
279
Peter Boströme4499152016-02-05 11:13:28 +0100280TEST_F(OveruseFrameDetectorTest, MeasuresMultipleConcurrentSamples) {
281 EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(testing::AtLeast(1));
282 static const int kIntervalMs = 33;
283 static const size_t kNumFramesEncodingDelay = 3;
284 VideoFrame frame;
285 frame.CreateEmptyFrame(kWidth, kHeight, kWidth, kWidth / 2, kWidth / 2);
286 for (size_t i = 0; i < 1000; ++i) {
287 // Unique timestamps.
288 frame.set_timestamp(static_cast<uint32_t>(i));
perkjd52063f2016-09-07 06:32:18 -0700289 overuse_detector_->FrameCaptured(frame, clock_->TimeInMilliseconds());
Peter Boströme4499152016-02-05 11:13:28 +0100290 clock_->AdvanceTimeMilliseconds(kIntervalMs);
291 if (i > kNumFramesEncodingDelay) {
292 overuse_detector_->FrameSent(
perkjd52063f2016-09-07 06:32:18 -0700293 static_cast<uint32_t>(i - kNumFramesEncodingDelay),
294 clock_->TimeInMilliseconds());
Peter Boströme4499152016-02-05 11:13:28 +0100295 }
perkjd52063f2016-09-07 06:32:18 -0700296 overuse_detector_->CheckForOveruse();
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000297 }
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000298}
299
Peter Boströme4499152016-02-05 11:13:28 +0100300TEST_F(OveruseFrameDetectorTest, UpdatesExistingSamples) {
301 // >85% encoding time should trigger overuse.
302 EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(testing::AtLeast(1));
303 static const int kIntervalMs = 33;
304 static const int kDelayMs = 30;
305 VideoFrame frame;
306 frame.CreateEmptyFrame(kWidth, kHeight, kWidth, kWidth / 2, kWidth / 2);
307 uint32_t timestamp = 0;
308 for (size_t i = 0; i < 1000; ++i) {
309 frame.set_timestamp(timestamp);
perkjd52063f2016-09-07 06:32:18 -0700310 overuse_detector_->FrameCaptured(frame, clock_->TimeInMilliseconds());
Peter Boströme4499152016-02-05 11:13:28 +0100311 // Encode and send first parts almost instantly.
312 clock_->AdvanceTimeMilliseconds(1);
perkjd52063f2016-09-07 06:32:18 -0700313 overuse_detector_->FrameSent(timestamp, clock_->TimeInMilliseconds());
Peter Boströme4499152016-02-05 11:13:28 +0100314 // Encode heavier part, resulting in >85% usage total.
315 clock_->AdvanceTimeMilliseconds(kDelayMs - 1);
perkjd52063f2016-09-07 06:32:18 -0700316 overuse_detector_->FrameSent(timestamp, clock_->TimeInMilliseconds());
Peter Boströme4499152016-02-05 11:13:28 +0100317 clock_->AdvanceTimeMilliseconds(kIntervalMs - kDelayMs);
318 timestamp += kIntervalMs * 90;
perkjd52063f2016-09-07 06:32:18 -0700319 overuse_detector_->CheckForOveruse();
Peter Boströme4499152016-02-05 11:13:28 +0100320 }
asapersson@webrtc.org9aed0022014-10-16 06:57:12 +0000321}
322
perkjd52063f2016-09-07 06:32:18 -0700323TEST_F(OveruseFrameDetectorTest, RunOnTqNormalUsage) {
324 rtc::TaskQueue queue("OveruseFrameDetectorTestQueue");
325
326 rtc::Event event(false, false);
327 queue.PostTask([this, &event] {
328 overuse_detector_->StartCheckForOveruse();
329 event.Set();
330 });
331 event.Wait(rtc::Event::kForever);
332
333 // Expect NormalUsage(). When called, stop the |overuse_detector_| and then
334 // set |event| to end the test.
335 EXPECT_CALL(*(observer_.get()), NormalUsage())
336 .WillOnce(Invoke([this, &event] {
337 overuse_detector_->StopCheckForOveruse();
338 event.Set();
339 }));
340
341 queue.PostTask([this, &event] {
342 const int kDelayMs1 = 5;
343 const int kDelayMs2 = 6;
344 InsertAndSendFramesWithInterval(1300, kFrameInterval33ms, kWidth, kHeight,
345 kDelayMs1);
346 InsertAndSendFramesWithInterval(1, kFrameInterval33ms, kWidth, kHeight,
347 kDelayMs2);
348 });
349
350 EXPECT_TRUE(event.Wait(10000));
351}
352
mflodman@webrtc.orge6168f52013-06-26 11:23:01 +0000353} // namespace webrtc