| Index: webrtc/call/call_perf_tests.cc
|
| diff --git a/webrtc/call/call_perf_tests.cc b/webrtc/call/call_perf_tests.cc
|
| index 0bbb7d49efa0490c55abe1cc7bb0ba26f478783d..a31cb23922e4aecd82a96a7f71a0b2c971de0238 100644
|
| --- a/webrtc/call/call_perf_tests.cc
|
| +++ b/webrtc/call/call_perf_tests.cc
|
| @@ -30,6 +30,7 @@
|
| #include "webrtc/test/fake_audio_device.h"
|
| #include "webrtc/test/fake_decoder.h"
|
| #include "webrtc/test/fake_encoder.h"
|
| +#include "webrtc/test/field_trial.h"
|
| #include "webrtc/test/frame_generator.h"
|
| #include "webrtc/test/frame_generator_capturer.h"
|
| #include "webrtc/test/gtest.h"
|
| @@ -477,13 +478,15 @@ TEST_F(CallPerfTest, CaptureNtpTimeWithNetworkJitter) {
|
| }
|
|
|
| TEST_F(CallPerfTest, ReceivesCpuOveruseAndUnderuse) {
|
| + // Minimal normal usage at the start, then 30s overuse to allow filter to
|
| + // settle, and then 80s underuse to allow plenty of time for rampup again.
|
| + test::ScopedFieldTrials fake_overuse_settings(
|
| + "WebRTC-ForceSimulatedOveruseIntervalMs/1-30000-80000/");
|
| +
|
| class LoadObserver : public test::SendTest,
|
| public test::FrameGeneratorCapturer::SinkWantsObserver {
|
| public:
|
| - LoadObserver()
|
| - : SendTest(kLongTimeoutMs),
|
| - expect_lower_resolution_wants_(true),
|
| - encoder_(Clock::GetRealTimeClock(), 60 /* delay_ms */) {}
|
| + LoadObserver() : SendTest(kLongTimeoutMs), test_phase_(TestPhase::kStart) {}
|
|
|
| void OnFrameGeneratorCapturerCreated(
|
| test::FrameGeneratorCapturer* frame_generator_capturer) override {
|
| @@ -494,24 +497,43 @@ TEST_F(CallPerfTest, ReceivesCpuOveruseAndUnderuse) {
|
|
|
| // OnSinkWantsChanged is called when FrameGeneratorCapturer::AddOrUpdateSink
|
| // is called.
|
| + // TODO(sprang): Add integration test for maintain-framerate mode?
|
| void OnSinkWantsChanged(rtc::VideoSinkInterface<VideoFrame>* sink,
|
| const rtc::VideoSinkWants& wants) override {
|
| // First expect CPU overuse. Then expect CPU underuse when the encoder
|
| // delay has been decreased.
|
| - if (wants.target_pixel_count &&
|
| - *wants.target_pixel_count <
|
| - wants.max_pixel_count.value_or(std::numeric_limits<int>::max())) {
|
| - // On adapting up, ViEEncoder::VideoSourceProxy will set the target
|
| - // pixel count to a step up from the current and the max value to
|
| - // something higher than the target.
|
| - EXPECT_FALSE(expect_lower_resolution_wants_);
|
| - observation_complete_.Set();
|
| - } else if (wants.max_pixel_count) {
|
| - // On adapting down, ViEEncoder::VideoSourceProxy will set only the max
|
| - // pixel count, leaving the target unset.
|
| - EXPECT_TRUE(expect_lower_resolution_wants_);
|
| - expect_lower_resolution_wants_ = false;
|
| - encoder_.SetDelay(2);
|
| + switch (test_phase_) {
|
| + case TestPhase::kStart:
|
| + if (wants.max_pixel_count < std::numeric_limits<int>::max()) {
|
| + // On adapting down, ViEEncoder::VideoSourceProxy will set only the
|
| + // max pixel count, leaving the target unset.
|
| + test_phase_ = TestPhase::kAdaptedDown;
|
| + } else {
|
| + ADD_FAILURE() << "Got unexpected adaptation request, max res = "
|
| + << wants.max_pixel_count << ", target res = "
|
| + << wants.target_pixel_count.value_or(-1)
|
| + << ", max fps = " << wants.max_framerate_fps;
|
| + }
|
| + break;
|
| + case TestPhase::kAdaptedDown:
|
| + // On adapting up, the adaptation counter will again be at zero, and
|
| + // so all constraints will be reset.
|
| + if (wants.max_pixel_count == std::numeric_limits<int>::max() &&
|
| + !wants.target_pixel_count) {
|
| + test_phase_ = TestPhase::kAdaptedUp;
|
| + observation_complete_.Set();
|
| + } else {
|
| + ADD_FAILURE() << "Got unexpected adaptation request, max res = "
|
| + << wants.max_pixel_count << ", target res = "
|
| + << wants.target_pixel_count.value_or(-1)
|
| + << ", max fps = " << wants.max_framerate_fps;
|
| + }
|
| + break;
|
| + case TestPhase::kAdaptedUp:
|
| + ADD_FAILURE() << "Got unexpected adaptation request, max res = "
|
| + << wants.max_pixel_count << ", target res = "
|
| + << wants.target_pixel_count.value_or(-1)
|
| + << ", max fps = " << wants.max_framerate_fps;
|
| }
|
| }
|
|
|
| @@ -519,15 +541,13 @@ TEST_F(CallPerfTest, ReceivesCpuOveruseAndUnderuse) {
|
| VideoSendStream::Config* send_config,
|
| std::vector<VideoReceiveStream::Config>* receive_configs,
|
| VideoEncoderConfig* encoder_config) override {
|
| - send_config->encoder_settings.encoder = &encoder_;
|
| }
|
|
|
| void PerformTest() override {
|
| EXPECT_TRUE(Wait()) << "Timed out before receiving an overuse callback.";
|
| }
|
|
|
| - bool expect_lower_resolution_wants_;
|
| - test::DelayedEncoder encoder_;
|
| + enum class TestPhase { kStart, kAdaptedDown, kAdaptedUp } test_phase_;
|
| } test;
|
|
|
| RunBaseTest(&test);
|
|
|