| /* | |
| * Copyright (c) 2015 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 "webrtc/base/scoped_ptr.h" | |
| #include "webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h" | |
| namespace webrtc { | |
| class AudioEncoderOpusTest : public ::testing::Test { | |
| protected: | |
| // The constructor simply creates an Opus encoder with default configuration. | |
| AudioEncoderOpusTest() | |
| : opus_(new AudioEncoderOpus(AudioEncoderOpus::Config())) {} | |
| // Repeatedly sets packet loss rates in the range [from, to], increasing by | |
| // 0.01 in each step. The function verifies that the actual loss rate is | |
| // |expected_return|. | |
| void TestSetPacketLossRate(double from, double to, double expected_return) { | |
| ASSERT_TRUE(opus_); | |
| for (double loss = from; loss <= to; | |
| (to >= from) ? loss += 0.01 : loss -= 0.01) { | |
| opus_->SetProjectedPacketLossRate(loss); | |
| EXPECT_DOUBLE_EQ(expected_return, opus_->packet_loss_rate()); | |
| } | |
| } | |
| rtc::scoped_ptr<AudioEncoderOpus> opus_; | |
| }; | |
| namespace { | |
| // These constants correspond to those used in | |
| // AudioEncoderOpus::SetProjectedPacketLossRate. | |
| const double kPacketLossRate20 = 0.20; | |
| const double kPacketLossRate10 = 0.10; | |
| const double kPacketLossRate5 = 0.05; | |
| const double kPacketLossRate1 = 0.01; | |
| const double kLossRate20Margin = 0.02; | |
| const double kLossRate10Margin = 0.01; | |
| const double kLossRate5Margin = 0.01; | |
| } // namespace | |
| TEST_F(AudioEncoderOpusTest, PacketLossRateOptimized) { | |
| // Note that the order of the following calls is critical. | |
| TestSetPacketLossRate(0.0, 0.0, 0.0); | |
| TestSetPacketLossRate(kPacketLossRate1, | |
| kPacketLossRate5 + kLossRate5Margin - 0.01, | |
| kPacketLossRate1); | |
| TestSetPacketLossRate(kPacketLossRate5 + kLossRate5Margin, | |
| kPacketLossRate10 + kLossRate10Margin - 0.01, | |
| kPacketLossRate5); | |
| TestSetPacketLossRate(kPacketLossRate10 + kLossRate10Margin, | |
| kPacketLossRate20 + kLossRate20Margin - 0.01, | |
| kPacketLossRate10); | |
| TestSetPacketLossRate(kPacketLossRate20 + kLossRate20Margin, | |
| 1.0, | |
| kPacketLossRate20); | |
| TestSetPacketLossRate(kPacketLossRate20 + kLossRate20Margin, | |
| kPacketLossRate20 - kLossRate20Margin, | |
| kPacketLossRate20); | |
| TestSetPacketLossRate(kPacketLossRate20 - kLossRate20Margin - 0.01, | |
| kPacketLossRate10 - kLossRate10Margin, | |
| kPacketLossRate10); | |
| TestSetPacketLossRate(kPacketLossRate10 - kLossRate10Margin - 0.01, | |
| kPacketLossRate5 - kLossRate5Margin, | |
| kPacketLossRate5); | |
| TestSetPacketLossRate(kPacketLossRate5 - kLossRate5Margin - 0.01, | |
| kPacketLossRate1, | |
| kPacketLossRate1); | |
| TestSetPacketLossRate(0.0, 0.0, 0.0); | |
| } | |
| } // namespace webrtc |