Index: webrtc/video/overuse_frame_detector_unittest.cc |
diff --git a/webrtc/video/overuse_frame_detector_unittest.cc b/webrtc/video/overuse_frame_detector_unittest.cc |
index 67d05325e3f473a1b7ae8e661156dded69244f17..d6700e248d9a6a252be5d8bb500a476483c75a89 100644 |
--- a/webrtc/video/overuse_frame_detector_unittest.cc |
+++ b/webrtc/video/overuse_frame_detector_unittest.cc |
@@ -15,10 +15,14 @@ |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "webrtc/base/event.h" |
#include "webrtc/system_wrappers/include/clock.h" |
#include "webrtc/video_frame.h" |
namespace webrtc { |
+ |
+using ::testing::Invoke; |
+ |
namespace { |
const int kWidth = 640; |
const int kHeight = 480; |
@@ -50,6 +54,23 @@ class CpuOveruseObserverImpl : public CpuOveruseObserver { |
int normaluse_; |
}; |
+class OveruseFrameDetectorUnderTest : public OveruseFrameDetector { |
+ public: |
+ OveruseFrameDetectorUnderTest(Clock* clock, |
+ const CpuOveruseOptions& options, |
+ CpuOveruseObserver* overuse_observer, |
+ EncodedFrameObserver* encoder_timing, |
+ CpuOveruseMetricsObserver* metrics_observer) |
+ : OveruseFrameDetector(clock, |
+ options, |
+ overuse_observer, |
+ encoder_timing, |
+ metrics_observer) {} |
+ ~OveruseFrameDetectorUnderTest() {} |
+ |
+ using OveruseFrameDetector::CheckForOveruse; |
+}; |
+ |
class OveruseFrameDetectorTest : public ::testing::Test, |
public CpuOveruseMetricsObserver { |
protected: |
@@ -61,7 +82,7 @@ class OveruseFrameDetectorTest : public ::testing::Test, |
} |
void ReinitializeOveruseDetector() { |
- overuse_detector_.reset(new OveruseFrameDetector( |
+ overuse_detector_.reset(new OveruseFrameDetectorUnderTest( |
clock_.get(), options_, observer_.get(), nullptr, this)); |
} |
@@ -85,9 +106,9 @@ class OveruseFrameDetectorTest : public ::testing::Test, |
uint32_t timestamp = 0; |
while (num_frames-- > 0) { |
frame.set_timestamp(timestamp); |
- overuse_detector_->FrameCaptured(frame); |
+ overuse_detector_->FrameCaptured(frame, clock_->TimeInMilliseconds()); |
clock_->AdvanceTimeMilliseconds(delay_ms); |
- overuse_detector_->FrameSent(timestamp); |
+ overuse_detector_->FrameSent(timestamp, clock_->TimeInMilliseconds()); |
clock_->AdvanceTimeMilliseconds(interval_ms - delay_ms); |
timestamp += interval_ms * 90; |
} |
@@ -105,7 +126,7 @@ class OveruseFrameDetectorTest : public ::testing::Test, |
for (int i = 0; i < num_times; ++i) { |
InsertAndSendFramesWithInterval( |
1000, kFrameInterval33ms, kWidth, kHeight, kDelayMs); |
- overuse_detector_->Process(); |
+ overuse_detector_->CheckForOveruse(); |
} |
} |
@@ -116,7 +137,7 @@ class OveruseFrameDetectorTest : public ::testing::Test, |
1300, kFrameInterval33ms, kWidth, kHeight, kDelayMs1); |
InsertAndSendFramesWithInterval( |
1, kFrameInterval33ms, kWidth, kHeight, kDelayMs2); |
- overuse_detector_->Process(); |
+ overuse_detector_->CheckForOveruse(); |
} |
int UsagePercent() { return metrics_.encode_usage_percent; } |
@@ -124,7 +145,7 @@ class OveruseFrameDetectorTest : public ::testing::Test, |
CpuOveruseOptions options_; |
std::unique_ptr<SimulatedClock> clock_; |
std::unique_ptr<MockCpuOveruseObserver> observer_; |
- std::unique_ptr<OveruseFrameDetector> overuse_detector_; |
+ std::unique_ptr<OveruseFrameDetectorUnderTest> overuse_detector_; |
CpuOveruseMetrics metrics_; |
}; |
@@ -147,8 +168,8 @@ TEST_F(OveruseFrameDetectorTest, OveruseAndRecover) { |
} |
TEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithNoObserver) { |
- overuse_detector_.reset( |
- new OveruseFrameDetector(clock_.get(), options_, nullptr, nullptr, this)); |
+ overuse_detector_.reset(new OveruseFrameDetectorUnderTest( |
+ clock_.get(), options_, nullptr, nullptr, this)); |
EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0); |
TriggerOveruse(options_.high_threshold_consecutive_count); |
EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); |
@@ -166,14 +187,14 @@ TEST_F(OveruseFrameDetectorTest, DoubleOveruseAndRecover) { |
TEST_F(OveruseFrameDetectorTest, TriggerUnderuseWithMinProcessCount) { |
options_.min_process_count = 1; |
CpuOveruseObserverImpl overuse_observer; |
- overuse_detector_.reset(new OveruseFrameDetector( |
+ overuse_detector_.reset(new OveruseFrameDetectorUnderTest( |
clock_.get(), options_, &overuse_observer, nullptr, this)); |
InsertAndSendFramesWithInterval( |
1200, kFrameInterval33ms, kWidth, kHeight, kProcessTime5ms); |
- overuse_detector_->Process(); |
+ overuse_detector_->CheckForOveruse(); |
EXPECT_EQ(0, overuse_observer.normaluse_); |
clock_->AdvanceTimeMilliseconds(kProcessIntervalMs); |
- overuse_detector_->Process(); |
+ overuse_detector_->CheckForOveruse(); |
EXPECT_EQ(1, overuse_observer.normaluse_); |
} |
@@ -267,13 +288,14 @@ TEST_F(OveruseFrameDetectorTest, MeasuresMultipleConcurrentSamples) { |
for (size_t i = 0; i < 1000; ++i) { |
// Unique timestamps. |
frame.set_timestamp(static_cast<uint32_t>(i)); |
- overuse_detector_->FrameCaptured(frame); |
+ overuse_detector_->FrameCaptured(frame, clock_->TimeInMilliseconds()); |
clock_->AdvanceTimeMilliseconds(kIntervalMs); |
if (i > kNumFramesEncodingDelay) { |
overuse_detector_->FrameSent( |
- static_cast<uint32_t>(i - kNumFramesEncodingDelay)); |
+ static_cast<uint32_t>(i - kNumFramesEncodingDelay), |
+ clock_->TimeInMilliseconds()); |
} |
- overuse_detector_->Process(); |
+ overuse_detector_->CheckForOveruse(); |
} |
} |
@@ -287,17 +309,47 @@ TEST_F(OveruseFrameDetectorTest, UpdatesExistingSamples) { |
uint32_t timestamp = 0; |
for (size_t i = 0; i < 1000; ++i) { |
frame.set_timestamp(timestamp); |
- overuse_detector_->FrameCaptured(frame); |
+ overuse_detector_->FrameCaptured(frame, clock_->TimeInMilliseconds()); |
// Encode and send first parts almost instantly. |
clock_->AdvanceTimeMilliseconds(1); |
- overuse_detector_->FrameSent(timestamp); |
+ overuse_detector_->FrameSent(timestamp, clock_->TimeInMilliseconds()); |
// Encode heavier part, resulting in >85% usage total. |
clock_->AdvanceTimeMilliseconds(kDelayMs - 1); |
- overuse_detector_->FrameSent(timestamp); |
+ overuse_detector_->FrameSent(timestamp, clock_->TimeInMilliseconds()); |
clock_->AdvanceTimeMilliseconds(kIntervalMs - kDelayMs); |
timestamp += kIntervalMs * 90; |
- overuse_detector_->Process(); |
+ overuse_detector_->CheckForOveruse(); |
} |
} |
+TEST_F(OveruseFrameDetectorTest, RunOnTqNormalUsage) { |
+ rtc::TaskQueue queue("OveruseFrameDetectorTestQueue"); |
+ |
+ rtc::Event event(false, false); |
+ queue.PostTask([this, &event] { |
+ overuse_detector_->StartCheckForOveruse(); |
+ event.Set(); |
+ }); |
+ event.Wait(rtc::Event::kForever); |
+ |
+ // Expect NormalUsage(). When called, stop the |overuse_detector_| and then |
+ // set |event| to end the test. |
+ EXPECT_CALL(*(observer_.get()), NormalUsage()) |
+ .WillOnce(Invoke([this, &event] { |
+ overuse_detector_->StopCheckForOveruse(); |
+ event.Set(); |
+ })); |
+ |
+ queue.PostTask([this, &event] { |
+ const int kDelayMs1 = 5; |
+ const int kDelayMs2 = 6; |
+ InsertAndSendFramesWithInterval(1300, kFrameInterval33ms, kWidth, kHeight, |
+ kDelayMs1); |
+ InsertAndSendFramesWithInterval(1, kFrameInterval33ms, kWidth, kHeight, |
+ kDelayMs2); |
+ }); |
+ |
+ EXPECT_TRUE(event.Wait(10000)); |
+} |
+ |
} // namespace webrtc |