/* * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "testing/gtest/include/gtest/gtest.h" #include #include #include "webrtc/modules/bitrate_controller/remb_suppressor.h" class TestSuppressor : public webrtc::RembSuppressor { public: explicit TestSuppressor(webrtc::Clock* clock) : RembSuppressor(clock) {} virtual ~TestSuppressor() {} virtual bool Enabled() OVERRIDE { return true; } }; class RembSuppressorTest : public ::testing::Test { protected: RembSuppressorTest() : clock_(0), suppressor_(&clock_) {} ~RembSuppressorTest() {} virtual void SetUp() {} virtual void TearDown() {} bool NewRemb(uint32_t bitrate_bps) { suppressor_.SetBitrateSent(bitrate_bps); bool suppress = suppressor_.SuppresNewRemb(bitrate_bps); // Default one REMB per second. clock_.AdvanceTimeMilliseconds(1000); return suppress; } webrtc::SimulatedClock clock_; TestSuppressor suppressor_; }; TEST_F(RembSuppressorTest, Basic) { // Never true on first sample. EXPECT_FALSE(NewRemb(50000)); // Some rampup. EXPECT_FALSE(NewRemb(55000)); EXPECT_FALSE(NewRemb(60500)); EXPECT_FALSE(NewRemb(66550)); EXPECT_FALSE(NewRemb(73250)); // Reached limit, some fluctuation ok. EXPECT_FALSE(NewRemb(72100)); EXPECT_FALSE(NewRemb(75500)); EXPECT_FALSE(NewRemb(69250)); EXPECT_FALSE(NewRemb(73250)); } TEST_F(RembSuppressorTest, RecoveryTooSlow) { // Never true on first sample. EXPECT_FALSE(NewRemb(50000)); // Large drop. EXPECT_TRUE(NewRemb(22499)); // No new estimate, still suppressing. EXPECT_TRUE(NewRemb(22499)); // Too little increase - stop suppressing. EXPECT_FALSE(NewRemb(22835)); } TEST_F(RembSuppressorTest, RembDownDurinSupression) { // Never true on first sample. EXPECT_FALSE(NewRemb(50000)); // Large drop. EXPECT_TRUE(NewRemb(22499)); // Remb is not allowed to fall. EXPECT_FALSE(NewRemb(22498)); } TEST_F(RembSuppressorTest, GlitchWithRecovery) { const uint32_t start_bitrate = 300000; uint32_t bitrate = start_bitrate; // Never true on first sample. EXPECT_FALSE(NewRemb(bitrate)); bitrate = static_cast(bitrate * 0.44); EXPECT_TRUE(NewRemb(bitrate)); while (bitrate < start_bitrate) { EXPECT_TRUE(NewRemb(bitrate)); bitrate = static_cast(bitrate * 1.10); } EXPECT_FALSE(NewRemb(bitrate)); } TEST_F(RembSuppressorTest, BitrateSent) { // Never true on first sample. EXPECT_FALSE(NewRemb(50000)); // Only suppress large drop, if we are not sending at full capacity. suppressor_.SetBitrateSent(37500); EXPECT_FALSE(suppressor_.SuppresNewRemb(22499)); }