1f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org/* 2f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org * 4f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org * Use of this source code is governed by a BSD-style license 5f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org * that can be found in the LICENSE file in the root of the source 6f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org * tree. An additional intellectual property rights grant can be found 7f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org * in the file PATENTS. All contributing project authors may 8f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org */ 10f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org 11f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 12f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 13f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org 14f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#include "webrtc/system_wrappers/interface/clock.h" 15f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 16bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org#include "webrtc/video_engine/include/vie_base.h" 17f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org#include "webrtc/video_engine/overuse_frame_detector.h" 18f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org 19f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.orgnamespace webrtc { 209da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.orgnamespace { 219da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org const int kWidth = 640; 229da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org const int kHeight = 480; 239da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org const int kFrameInterval33ms = 33; 249da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org const int kProcessIntervalMs = 5000; 259da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org} // namespace 26f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org 27bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.orgclass MockCpuOveruseObserver : public CpuOveruseObserver { 28f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org public: 29bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org MockCpuOveruseObserver() {} 30bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org virtual ~MockCpuOveruseObserver() {} 31f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org 32f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org MOCK_METHOD0(OveruseDetected, void()); 33bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org MOCK_METHOD0(NormalUsage, void()); 34f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org}; 35f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org 369da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.orgclass CpuOveruseObserverImpl : public CpuOveruseObserver { 379da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org public: 389da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org CpuOveruseObserverImpl() : 399da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_(0), 409da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org normaluse_(0) {} 419da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org virtual ~CpuOveruseObserverImpl() {} 429da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 439da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org void OveruseDetected() { ++overuse_; } 449da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org void NormalUsage() { ++normaluse_; } 459da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 469da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org int overuse_; 479da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org int normaluse_; 489da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org}; 499da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 50f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.orgclass OveruseFrameDetectorTest : public ::testing::Test { 51f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org protected: 52f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org virtual void SetUp() { 53f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org clock_.reset(new SimulatedClock(1234)); 54bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org observer_.reset(new MockCpuOveruseObserver()); 559da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_.reset(new OveruseFrameDetector(clock_.get())); 569da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 579da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.low_capture_jitter_threshold_ms = 10.0f; 589da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.high_capture_jitter_threshold_ms = 15.0f; 599da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.min_process_count = 0; 609da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetOptions(options_); 61bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org overuse_detector_->SetObserver(observer_.get()); 62f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org } 63cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org 649da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org int InitialJitter() { 659da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org return ((options_.low_capture_jitter_threshold_ms + 669da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.high_capture_jitter_threshold_ms) / 2.0f) + 0.5; 679da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org } 689da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 69154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org int InitialEncodeUsage() { 70154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org return ((options_.low_encode_usage_threshold_percent + 71154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org options_.high_encode_usage_threshold_percent) / 2.0f) + 0.5; 72154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org } 73154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 74f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org int InitialEncodeRsd() { 75f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org return std::max( 76f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org ((options_.low_encode_time_rsd_threshold + 77f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.high_encode_time_rsd_threshold) / 2.0f) + 0.5f, 0.0f); 78f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org } 79f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 809da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org void InsertFramesWithInterval( 819da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org size_t num_frames, int interval_ms, int width, int height) { 82ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org while (num_frames-- > 0) { 83ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org clock_->AdvanceTimeMilliseconds(interval_ms); 849da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->FrameCaptured(width, height); 85cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org } 86cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org } 87cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org 88154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org void InsertAndEncodeFramesWithInterval( 89154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org int num_frames, int interval_ms, int width, int height, int encode_ms) { 90154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org while (num_frames-- > 0) { 91154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org overuse_detector_->FrameCaptured(width, height); 92154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org clock_->AdvanceTimeMilliseconds(encode_ms); 93154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org overuse_detector_->FrameEncoded(encode_ms); 94154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org clock_->AdvanceTimeMilliseconds(interval_ms - encode_ms); 95154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org } 96154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org } 97154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 989da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org void TriggerOveruse(int num_times) { 999da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org for (int i = 0; i < num_times; ++i) { 1009da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval(200, kFrameInterval33ms, kWidth, kHeight); 1019da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval(50, 110, kWidth, kHeight); 1029da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->Process(); 1039da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org } 104ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org } 105ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org 106ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org void TriggerNormalUsage() { 1079da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval(900, kFrameInterval33ms, kWidth, kHeight); 108ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org overuse_detector_->Process(); 109cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org } 110cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org 111154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org void TriggerOveruseWithEncodeUsage(int num_times) { 112154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org const int kEncodeTimeMs = 32; 113154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org for (int i = 0; i < num_times; ++i) { 114154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org InsertAndEncodeFramesWithInterval( 115154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 1000, kFrameInterval33ms, kWidth, kHeight, kEncodeTimeMs); 116154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org overuse_detector_->Process(); 117154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org } 118154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org } 119154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 120f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org void TriggerOveruseWithEncodeRsd(int num_times) { 121f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org const int kEncodeTimeMs1 = 10; 122f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org const int kEncodeTimeMs2 = 25; 123f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org for (int i = 0; i < num_times; ++i) { 124f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org InsertAndEncodeFramesWithInterval( 125f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 200, kFrameInterval33ms, kWidth, kHeight, kEncodeTimeMs1); 126f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org InsertAndEncodeFramesWithInterval( 127f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 10, kFrameInterval33ms, kWidth, kHeight, kEncodeTimeMs2); 128f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org overuse_detector_->Process(); 129f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org } 130f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org } 131f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 132f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org void TriggerNormalUsageWithEncodeTime() { 133c2ef523233552340785557abce1129a0f61537ebasapersson@webrtc.org const int kEncodeTimeMs1 = 5; 134c2ef523233552340785557abce1129a0f61537ebasapersson@webrtc.org const int kEncodeTimeMs2 = 6; 135154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org InsertAndEncodeFramesWithInterval( 136c2ef523233552340785557abce1129a0f61537ebasapersson@webrtc.org 1300, kFrameInterval33ms, kWidth, kHeight, kEncodeTimeMs1); 137c2ef523233552340785557abce1129a0f61537ebasapersson@webrtc.org InsertAndEncodeFramesWithInterval( 138c2ef523233552340785557abce1129a0f61537ebasapersson@webrtc.org 1, kFrameInterval33ms, kWidth, kHeight, kEncodeTimeMs2); 139154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org overuse_detector_->Process(); 140154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org } 141154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 1424e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org int CaptureJitterMs() { 1434e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org CpuOveruseMetrics metrics; 1444e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org overuse_detector_->GetCpuOveruseMetrics(&metrics); 1454e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org return metrics.capture_jitter_ms; 1464e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org } 1474e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org 1484e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org int AvgEncodeTimeMs() { 1494e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org CpuOveruseMetrics metrics; 1504e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org overuse_detector_->GetCpuOveruseMetrics(&metrics); 1514e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org return metrics.avg_encode_time_ms; 1524e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org } 1534e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org 1544e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org int EncodeUsagePercent() { 1554e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org CpuOveruseMetrics metrics; 1564e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org overuse_detector_->GetCpuOveruseMetrics(&metrics); 1574e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org return metrics.encode_usage_percent; 1584e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org } 1594e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org 160f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org int EncodeRsd() { 161f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org CpuOveruseMetrics metrics; 162f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org overuse_detector_->GetCpuOveruseMetrics(&metrics); 163f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org return metrics.encode_rsd; 164f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org } 165f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 1669da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org CpuOveruseOptions options_; 167f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org scoped_ptr<SimulatedClock> clock_; 168bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org scoped_ptr<MockCpuOveruseObserver> observer_; 169f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org scoped_ptr<OveruseFrameDetector> overuse_detector_; 170f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org}; 171f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org 172f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// enable_capture_jitter_method = true; 173f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// CaptureJitterMs() > high_capture_jitter_threshold_ms => overuse. 174f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// CaptureJitterMs() < low_capture_jitter_threshold_ms => underuse. 175f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.orgTEST_F(OveruseFrameDetectorTest, TriggerOveruse) { 176f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // capture_jitter > high => overuse 1779da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); 1789da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerOveruse(options_.high_threshold_consecutive_count); 179cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org} 180cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org 181cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.orgTEST_F(OveruseFrameDetectorTest, OveruseAndRecover) { 182f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // capture_jitter > high => overuse 1839da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); 1849da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerOveruse(options_.high_threshold_consecutive_count); 185f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // capture_jitter < low => underuse 1869da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(testing::AtLeast(1)); 1879da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerNormalUsage(); 1889da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org} 1899da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 190f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithNoObserver) { 1919da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetObserver(NULL); 1929da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0); 1939da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerOveruse(options_.high_threshold_consecutive_count); 1949da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); 1959da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerNormalUsage(); 1969da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org} 1979da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 198f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithMethodDisabled) { 1999da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.enable_capture_jitter_method = false; 200f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_encode_usage_method = false; 2019da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetOptions(options_); 2029da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0); 2039da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerOveruse(options_.high_threshold_consecutive_count); 2049da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); 205ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org TriggerNormalUsage(); 206cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org} 207cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org 208cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.orgTEST_F(OveruseFrameDetectorTest, DoubleOveruseAndRecover) { 2099da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(2); 2109da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerOveruse(options_.high_threshold_consecutive_count); 2119da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerOveruse(options_.high_threshold_consecutive_count); 2129da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(testing::AtLeast(1)); 213ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.org TriggerNormalUsage(); 214cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org} 215cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org 216995079666dd4be231e6af4b125c481d953d9b735asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, TriggerNormalUsageWithMinProcessCount) { 2179da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org CpuOveruseObserverImpl overuse_observer_; 2189da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetObserver(&overuse_observer_); 2199da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.min_process_count = 1; 2209da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetOptions(options_); 221c2ef523233552340785557abce1129a0f61537ebasapersson@webrtc.org InsertFramesWithInterval(1200, kFrameInterval33ms, kWidth, kHeight); 222995079666dd4be231e6af4b125c481d953d9b735asapersson@webrtc.org overuse_detector_->Process(); 2239da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_EQ(0, overuse_observer_.normaluse_); 2249da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org clock_->AdvanceTimeMilliseconds(kProcessIntervalMs); 225995079666dd4be231e6af4b125c481d953d9b735asapersson@webrtc.org overuse_detector_->Process(); 2269da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_EQ(1, overuse_observer_.normaluse_); 227995079666dd4be231e6af4b125c481d953d9b735asapersson@webrtc.org} 228995079666dd4be231e6af4b125c481d953d9b735asapersson@webrtc.org 229ce9de7102a55b923a38147a51f582371b6a45a44pbos@webrtc.orgTEST_F(OveruseFrameDetectorTest, ConstantOveruseGivesNoNormalUsage) { 230cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); 2319da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(64); 2329da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org for(size_t i = 0; i < 64; ++i) { 2339da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerOveruse(options_.high_threshold_consecutive_count); 2349da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org } 2359da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org} 2369da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 2379da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, ConsecutiveCountTriggersOveruse) { 2389da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); 2399da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.high_threshold_consecutive_count = 2; 2409da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetOptions(options_); 2419da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerOveruse(2); 2429da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org} 243cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org 2449da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, IncorrectConsecutiveCountTriggersNoOveruse) { 2459da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0); 2469da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.high_threshold_consecutive_count = 2; 2479da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetOptions(options_); 2489da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org TriggerOveruse(1); 249cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org} 250cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org 2514e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, GetCpuOveruseMetrics) { 2524e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org CpuOveruseMetrics metrics; 2534e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org overuse_detector_->GetCpuOveruseMetrics(&metrics); 2544e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_GT(metrics.capture_jitter_ms, 0); 2554e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_GT(metrics.avg_encode_time_ms, 0); 2564e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_GT(metrics.encode_usage_percent, 0); 2574e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_GE(metrics.capture_queue_delay_ms_per_s, 0); 258f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_GE(metrics.encode_rsd, 0); 2594e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org} 2604e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org 2619da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, CaptureJitter) { 2624e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialJitter(), CaptureJitterMs()); 2639da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval(1000, kFrameInterval33ms, kWidth, kHeight); 2644e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_NE(InitialJitter(), CaptureJitterMs()); 2659da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org} 2669da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 2679da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, CaptureJitterResetAfterResolutionChange) { 2684e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialJitter(), CaptureJitterMs()); 2699da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval(1000, kFrameInterval33ms, kWidth, kHeight); 2704e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_NE(InitialJitter(), CaptureJitterMs()); 2719da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org // Verify reset. 2729da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval(1, kFrameInterval33ms, kWidth, kHeight + 1); 2734e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialJitter(), CaptureJitterMs()); 2749da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org} 2759da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 2769da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, CaptureJitterResetAfterFrameTimeout) { 2774e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialJitter(), CaptureJitterMs()); 2789da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval(1000, kFrameInterval33ms, kWidth, kHeight); 2794e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_NE(InitialJitter(), CaptureJitterMs()); 2809da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval( 2819da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 1, options_.frame_timeout_interval_ms, kWidth, kHeight); 2824e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_NE(InitialJitter(), CaptureJitterMs()); 2839da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org // Verify reset. 2849da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval( 2859da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 1, options_.frame_timeout_interval_ms + 1, kWidth, kHeight); 2864e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialJitter(), CaptureJitterMs()); 2879da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org} 2889da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 2899da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, CaptureJitterResetAfterChangingThreshold) { 2904e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialJitter(), CaptureJitterMs()); 2919da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.high_capture_jitter_threshold_ms = 90.0f; 2929da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetOptions(options_); 2934e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialJitter(), CaptureJitterMs()); 2949da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.low_capture_jitter_threshold_ms = 30.0f; 2959da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetOptions(options_); 2964e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialJitter(), CaptureJitterMs()); 2979da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org} 2989da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 2999da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, MinFrameSamplesBeforeUpdatingCaptureJitter) { 3009da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org options_.min_frame_samples = 40; 3019da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->SetOptions(options_); 3029da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org InsertFramesWithInterval(40, kFrameInterval33ms, kWidth, kHeight); 3034e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialJitter(), CaptureJitterMs()); 3044747585bba09508c7475bf1e5f70a0b981175d9fasapersson@webrtc.org} 3054747585bba09508c7475bf1e5f70a0b981175d9fasapersson@webrtc.org 306f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, NoCaptureQueueDelay) { 307f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org EXPECT_EQ(overuse_detector_->CaptureQueueDelayMsPerS(), 0); 3089da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->FrameCaptured(kWidth, kHeight); 309f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org overuse_detector_->FrameProcessingStarted(); 310f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org EXPECT_EQ(overuse_detector_->CaptureQueueDelayMsPerS(), 0); 311f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org} 312f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org 313f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, CaptureQueueDelay) { 3149da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->FrameCaptured(kWidth, kHeight); 315f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org clock_->AdvanceTimeMilliseconds(100); 316f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org overuse_detector_->FrameProcessingStarted(); 317f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org EXPECT_EQ(overuse_detector_->CaptureQueueDelayMsPerS(), 100); 318f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org} 319f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org 320f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, CaptureQueueDelayMultipleFrames) { 3219da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->FrameCaptured(kWidth, kHeight); 322f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org clock_->AdvanceTimeMilliseconds(10); 3239da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->FrameCaptured(kWidth, kHeight); 324f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org clock_->AdvanceTimeMilliseconds(20); 325f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org 326f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org overuse_detector_->FrameProcessingStarted(); 327f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org EXPECT_EQ(overuse_detector_->CaptureQueueDelayMsPerS(), 30); 328f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org overuse_detector_->FrameProcessingStarted(); 329f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org EXPECT_EQ(overuse_detector_->CaptureQueueDelayMsPerS(), 20); 330f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org} 331f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org 332f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, CaptureQueueDelayResetAtResolutionSwitch) { 3339da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->FrameCaptured(kWidth, kHeight); 334f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org clock_->AdvanceTimeMilliseconds(10); 3359da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->FrameCaptured(kWidth, kHeight + 1); 336f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org clock_->AdvanceTimeMilliseconds(20); 337f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org 338f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org overuse_detector_->FrameProcessingStarted(); 339f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org EXPECT_EQ(overuse_detector_->CaptureQueueDelayMsPerS(), 20); 340f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org} 341f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org 342f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, CaptureQueueDelayNoMatchingCapturedFrame) { 3439da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org overuse_detector_->FrameCaptured(kWidth, kHeight); 344f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org clock_->AdvanceTimeMilliseconds(100); 345f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org overuse_detector_->FrameProcessingStarted(); 346f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org EXPECT_EQ(overuse_detector_->CaptureQueueDelayMsPerS(), 100); 347f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org // No new captured frame. The last delay should be reported. 348f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org overuse_detector_->FrameProcessingStarted(); 349f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org EXPECT_EQ(overuse_detector_->CaptureQueueDelayMsPerS(), 100); 350f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org} 351f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org 352dd4f8664a1759e8a3a0329e8aebe6e872d371f20asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, EncodedFrame) { 353dd4f8664a1759e8a3a0329e8aebe6e872d371f20asapersson@webrtc.org const int kInitialAvgEncodeTimeInMs = 5; 3544e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(kInitialAvgEncodeTimeInMs, AvgEncodeTimeMs()); 355f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org for (int i = 0; i < 30; i++) { 356f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org clock_->AdvanceTimeMilliseconds(33); 357dd4f8664a1759e8a3a0329e8aebe6e872d371f20asapersson@webrtc.org overuse_detector_->FrameEncoded(2); 358f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org } 3594e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(2, AvgEncodeTimeMs()); 360f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org} 361f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.org 362154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, InitialEncodeUsage) { 3634e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialEncodeUsage(), EncodeUsagePercent()); 364154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org} 365154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 366f1630b1f53156a9723ae5431f2fb1e54786593b9asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, EncodedUsage) { 367154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org const int kEncodeTimeMs = 5; 368154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org InsertAndEncodeFramesWithInterval( 369154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 1000, kFrameInterval33ms, kWidth, kHeight, kEncodeTimeMs); 370f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_EQ(kEncodeTimeMs * 100 / kFrameInterval33ms, EncodeUsagePercent()); 371dd4f8664a1759e8a3a0329e8aebe6e872d371f20asapersson@webrtc.org} 372154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 373154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, EncodeUsageResetAfterChangingThreshold) { 3744e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialEncodeUsage(), EncodeUsagePercent()); 375154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org options_.high_encode_usage_threshold_percent = 100; 376154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org overuse_detector_->SetOptions(options_); 3774e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialEncodeUsage(), EncodeUsagePercent()); 378154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org options_.low_encode_usage_threshold_percent = 20; 379154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org overuse_detector_->SetOptions(options_); 3804e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org EXPECT_EQ(InitialEncodeUsage(), EncodeUsagePercent()); 381154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org} 382154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 383f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// enable_encode_usage_method = true; 384f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// EncodeUsagePercent() > high_encode_usage_threshold_percent => overuse. 385f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// EncodeUsagePercent() < low_encode_usage_threshold_percent => underuse. 386154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, TriggerOveruseWithEncodeUsage) { 387154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org options_.enable_capture_jitter_method = false; 388154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org options_.enable_encode_usage_method = true; 389154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org overuse_detector_->SetOptions(options_); 390f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // usage > high => overuse 391154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); 392154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org TriggerOveruseWithEncodeUsage(options_.high_threshold_consecutive_count); 393154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org} 394154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org 395154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithEncodeUsage) { 396154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org options_.enable_capture_jitter_method = false; 397154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org options_.enable_encode_usage_method = true; 398154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org overuse_detector_->SetOptions(options_); 399f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // usage > high => overuse 400154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); 401154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org TriggerOveruseWithEncodeUsage(options_.high_threshold_consecutive_count); 402f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // usage < low => underuse 403f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(testing::AtLeast(1)); 404f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org TriggerNormalUsageWithEncodeTime(); 405f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org} 406f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 407f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, 408f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org OveruseAndRecoverWithEncodeUsageMethodDisabled) { 409f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_capture_jitter_method = false; 410f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_encode_usage_method = false; 411f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org overuse_detector_->SetOptions(options_); 412f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // usage > high => overuse 413f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(0); 414f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org TriggerOveruseWithEncodeUsage(options_.high_threshold_consecutive_count); 415f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // usage < low => underuse 416f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); 417f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org TriggerNormalUsageWithEncodeTime(); 418f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org} 419f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 420f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, EncodeRsdResetAfterChangingThreshold) { 421f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_EQ(InitialEncodeRsd(), EncodeRsd()); 422f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.high_encode_time_rsd_threshold = 100; 423f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org overuse_detector_->SetOptions(options_); 424f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_EQ(InitialEncodeRsd(), EncodeRsd()); 425f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.low_encode_time_rsd_threshold = 20; 426f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org overuse_detector_->SetOptions(options_); 427f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_EQ(InitialEncodeRsd(), EncodeRsd()); 428f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org} 429f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 430f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// enable_encode_usage_method = true; 431f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// low/high_encode_time_rsd_threshold >= 0 432f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// EncodeUsagePercent() > high_encode_usage_threshold_percent || 433f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// EncodeRsd() > high_encode_time_rsd_threshold => overuse. 434f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// EncodeUsagePercent() < low_encode_usage_threshold_percent && 435f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org// EncodeRsd() < low_encode_time_rsd_threshold => underuse. 436f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, TriggerOveruseWithEncodeRsd) { 437f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_capture_jitter_method = false; 438f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_encode_usage_method = true; 439f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.high_encode_time_rsd_threshold = 80; 440f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org overuse_detector_->SetOptions(options_); 441f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // rsd > high, usage < high => overuse 442f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); 443f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org TriggerOveruseWithEncodeRsd(options_.high_threshold_consecutive_count); 444f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_LT(EncodeUsagePercent(), options_.high_encode_usage_threshold_percent); 445f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org} 446f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 447f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithEncodeRsd) { 448f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_capture_jitter_method = false; 449f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_encode_usage_method = true; 450c2ef523233552340785557abce1129a0f61537ebasapersson@webrtc.org options_.low_encode_time_rsd_threshold = 25; 451f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.high_encode_time_rsd_threshold = 80; 452f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org overuse_detector_->SetOptions(options_); 453f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // rsd > high, usage < high => overuse 454f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), OveruseDetected()).Times(1); 455f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org TriggerOveruseWithEncodeRsd(options_.high_threshold_consecutive_count); 456f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_LT(EncodeUsagePercent(), options_.high_encode_usage_threshold_percent); 457f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // rsd < low, usage < low => underuse 458154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(testing::AtLeast(1)); 459f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org TriggerNormalUsageWithEncodeTime(); 460f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org} 461f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 462f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, NoUnderuseWithEncodeRsd_UsageGtLowThreshold) { 463f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_capture_jitter_method = false; 464f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_encode_usage_method = true; 465f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.low_encode_usage_threshold_percent = 1; 466c2ef523233552340785557abce1129a0f61537ebasapersson@webrtc.org options_.low_encode_time_rsd_threshold = 25; 467f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.high_encode_time_rsd_threshold = 90; 468f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org overuse_detector_->SetOptions(options_); 469f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // rsd < low, usage > low => no underuse 470f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); 471f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org TriggerNormalUsageWithEncodeTime(); 472f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_LT(EncodeRsd(), options_.low_encode_time_rsd_threshold); 473f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_GT(EncodeUsagePercent(), options_.low_encode_usage_threshold_percent); 474f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org} 475f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org 476f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.orgTEST_F(OveruseFrameDetectorTest, NoUnderuseWithEncodeRsd_RsdGtLowThreshold) { 477f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_capture_jitter_method = false; 478f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.enable_encode_usage_method = true; 479f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.low_encode_usage_threshold_percent = 20; 480f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.low_encode_time_rsd_threshold = 1; 481f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org options_.high_encode_time_rsd_threshold = 90; 482f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org overuse_detector_->SetOptions(options_); 483f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org // rsd > low, usage < low => no underuse 484f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_CALL(*(observer_.get()), NormalUsage()).Times(0); 485f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org TriggerNormalUsageWithEncodeTime(); 486f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_GT(EncodeRsd(), options_.low_encode_time_rsd_threshold); 487f6eaabf14c12d2fd16152332aadc8a01a98c1a25asapersson@webrtc.org EXPECT_LT(EncodeUsagePercent(), options_.low_encode_usage_threshold_percent); 488154951d862e0a35cb0158737247e901f78a3068fasapersson@webrtc.org} 489f8f91d6b9b69eaf2c73a63419a502034cdf371c1mflodman@webrtc.org} // namespace webrtc 490