Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(284)

Unified Diff: webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_unittest.cc

Issue 2672933003: Introduce FecControllerRplrBased (Closed)
Patch Set: Merged Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based_unittest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_unittest.cc
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_unittest.cc b/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_unittest.cc
deleted file mode 100644
index 8fd62dfbd41bff3c861104b2df455d62b6f82e98..0000000000000000000000000000000000000000
--- a/webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_unittest.cc
+++ /dev/null
@@ -1,367 +0,0 @@
-/*
- * Copyright (c) 2016 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 <utility>
-
-#include "webrtc/common_audio/mocks/mock_smoothing_filter.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/fec_controller.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-using ::testing::NiceMock;
-using ::testing::Return;
-using ::testing::_;
-
-namespace {
-
-// The test uses the following settings:
-//
-// packet-loss ^ | |
-// | A| C| FEC
-// | \ \ ON
-// | FEC \ D\_______
-// | OFF B\_________
-// |-----------------> bandwidth
-//
-// A : (kDisablingBandwidthLow, kDisablingPacketLossAtLowBw)
-// B : (kDisablingBandwidthHigh, kDisablingPacketLossAtHighBw)
-// C : (kEnablingBandwidthLow, kEnablingPacketLossAtLowBw)
-// D : (kEnablingBandwidthHigh, kEnablingPacketLossAtHighBw)
-
-constexpr int kDisablingBandwidthLow = 15000;
-constexpr float kDisablingPacketLossAtLowBw = 0.08f;
-constexpr int kDisablingBandwidthHigh = 64000;
-constexpr float kDisablingPacketLossAtHighBw = 0.01f;
-constexpr int kEnablingBandwidthLow = 17000;
-constexpr float kEnablingPacketLossAtLowBw = 0.1f;
-constexpr int kEnablingBandwidthHigh = 64000;
-constexpr float kEnablingPacketLossAtHighBw = 0.05f;
-
-struct FecControllerStates {
- std::unique_ptr<FecController> controller;
- MockSmoothingFilter* packet_loss_smoother;
-};
-
-FecControllerStates CreateFecController(bool initial_fec_enabled) {
- FecControllerStates states;
- std::unique_ptr<MockSmoothingFilter> mock_smoothing_filter(
- new NiceMock<MockSmoothingFilter>());
- states.packet_loss_smoother = mock_smoothing_filter.get();
- using Threshold = FecController::Config::Threshold;
- states.controller.reset(new FecController(
- FecController::Config(
- initial_fec_enabled,
- Threshold(kEnablingBandwidthLow, kEnablingPacketLossAtLowBw,
- kEnablingBandwidthHigh, kEnablingPacketLossAtHighBw),
- Threshold(kDisablingBandwidthLow, kDisablingPacketLossAtLowBw,
- kDisablingBandwidthHigh, kDisablingPacketLossAtHighBw),
- 0, nullptr),
- std::move(mock_smoothing_filter)));
- return states;
-}
-
-void UpdateNetworkMetrics(FecControllerStates* states,
- const rtc::Optional<int>& uplink_bandwidth_bps,
- const rtc::Optional<float>& uplink_packet_loss) {
- // UpdateNetworkMetrics can accept multiple network metric updates at once.
- // However, currently, the most used case is to update one metric at a time.
- // To reflect this fact, we separate the calls.
- if (uplink_bandwidth_bps) {
- Controller::NetworkMetrics network_metrics;
- network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
- states->controller->UpdateNetworkMetrics(network_metrics);
- }
- if (uplink_packet_loss) {
- Controller::NetworkMetrics network_metrics;
- network_metrics.uplink_packet_loss_fraction = uplink_packet_loss;
- EXPECT_CALL(*states->packet_loss_smoother, AddSample(*uplink_packet_loss));
- states->controller->UpdateNetworkMetrics(network_metrics);
- // This is called during CheckDecision().
- EXPECT_CALL(*states->packet_loss_smoother, GetAverage())
- .WillOnce(Return(rtc::Optional<float>(*uplink_packet_loss)));
- }
-}
-
-// Checks that the FEC decision and |uplink_packet_loss_fraction| given by
-// |states->controller->MakeDecision| matches |expected_enable_fec| and
-// |expected_uplink_packet_loss_fraction|, respectively.
-void CheckDecision(FecControllerStates* states,
- bool expected_enable_fec,
- float expected_uplink_packet_loss_fraction) {
- AudioNetworkAdaptor::EncoderRuntimeConfig config;
- states->controller->MakeDecision(&config);
- EXPECT_EQ(rtc::Optional<bool>(expected_enable_fec), config.enable_fec);
- EXPECT_EQ(rtc::Optional<float>(expected_uplink_packet_loss_fraction),
- config.uplink_packet_loss_fraction);
-}
-
-} // namespace
-
-TEST(FecControllerTest, OutputInitValueWhenUplinkBandwidthUnknown) {
- constexpr bool kInitialFecEnabled = true;
- auto states = CreateFecController(kInitialFecEnabled);
- // Let uplink packet loss fraction be so low that would cause FEC to turn off
- // if uplink bandwidth was known.
- UpdateNetworkMetrics(&states, rtc::Optional<int>(),
- rtc::Optional<float>(kDisablingPacketLossAtHighBw));
- CheckDecision(&states, kInitialFecEnabled, kDisablingPacketLossAtHighBw);
-}
-
-TEST(FecControllerTest, OutputInitValueWhenUplinkPacketLossFractionUnknown) {
- constexpr bool kInitialFecEnabled = true;
- auto states = CreateFecController(kInitialFecEnabled);
- // Let uplink bandwidth be so low that would cause FEC to turn off if uplink
- // bandwidth packet loss fraction was known.
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kDisablingBandwidthLow - 1),
- rtc::Optional<float>());
- CheckDecision(&states, kInitialFecEnabled, 0.0);
-}
-
-TEST(FecControllerTest, EnableFecForHighBandwidth) {
- auto states = CreateFecController(false);
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kEnablingBandwidthHigh),
- rtc::Optional<float>(kEnablingPacketLossAtHighBw));
- CheckDecision(&states, true, kEnablingPacketLossAtHighBw);
-}
-
-TEST(FecControllerTest, UpdateMultipleNetworkMetricsAtOnce) {
- // This test is similar to EnableFecForHighBandwidth. But instead of
- // using ::UpdateNetworkMetrics(...), which calls
- // FecController::UpdateNetworkMetrics(...) multiple times, we
- // we call it only once. This is to verify that
- // FecController::UpdateNetworkMetrics(...) can handle multiple
- // network updates at once. This is, however, not a common use case in current
- // audio_network_adaptor_impl.cc.
- auto states = CreateFecController(false);
- Controller::NetworkMetrics network_metrics;
- network_metrics.uplink_bandwidth_bps =
- rtc::Optional<int>(kEnablingBandwidthHigh);
- network_metrics.uplink_packet_loss_fraction =
- rtc::Optional<float>(kEnablingPacketLossAtHighBw);
- EXPECT_CALL(*states.packet_loss_smoother, GetAverage())
- .WillOnce(Return(rtc::Optional<float>(kEnablingPacketLossAtHighBw)));
- states.controller->UpdateNetworkMetrics(network_metrics);
- CheckDecision(&states, true, kEnablingPacketLossAtHighBw);
-}
-
-TEST(FecControllerTest, MaintainFecOffForHighBandwidth) {
- auto states = CreateFecController(false);
- constexpr float kPacketLoss = kEnablingPacketLossAtHighBw * 0.99f;
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kEnablingBandwidthHigh),
- rtc::Optional<float>(kPacketLoss));
- CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerTest, EnableFecForMediumBandwidth) {
- auto states = CreateFecController(false);
- constexpr float kPacketLoss =
- (kEnablingPacketLossAtLowBw + kEnablingPacketLossAtHighBw) / 2.0;
- UpdateNetworkMetrics(
- &states,
- rtc::Optional<int>((kEnablingBandwidthHigh + kEnablingBandwidthLow) / 2),
- rtc::Optional<float>(kPacketLoss));
- CheckDecision(&states, true, kPacketLoss);
-}
-
-TEST(FecControllerTest, MaintainFecOffForMediumBandwidth) {
- auto states = CreateFecController(false);
- constexpr float kPacketLoss =
- kEnablingPacketLossAtLowBw * 0.49f + kEnablingPacketLossAtHighBw * 0.51f;
- UpdateNetworkMetrics(
- &states,
- rtc::Optional<int>((kEnablingBandwidthHigh + kEnablingBandwidthLow) / 2),
- rtc::Optional<float>(kPacketLoss));
- CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerTest, EnableFecForLowBandwidth) {
- auto states = CreateFecController(false);
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kEnablingBandwidthLow),
- rtc::Optional<float>(kEnablingPacketLossAtLowBw));
- CheckDecision(&states, true, kEnablingPacketLossAtLowBw);
-}
-
-TEST(FecControllerTest, MaintainFecOffForLowBandwidth) {
- auto states = CreateFecController(false);
- constexpr float kPacketLoss = kEnablingPacketLossAtLowBw * 0.99f;
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kEnablingBandwidthLow),
- rtc::Optional<float>(kPacketLoss));
- CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerTest, MaintainFecOffForVeryLowBandwidth) {
- auto states = CreateFecController(false);
- // Below |kEnablingBandwidthLow|, no packet loss fraction can cause FEC to
- // turn on.
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kEnablingBandwidthLow - 1),
- rtc::Optional<float>(1.0));
- CheckDecision(&states, false, 1.0);
-}
-
-TEST(FecControllerTest, DisableFecForHighBandwidth) {
- auto states = CreateFecController(true);
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kDisablingBandwidthHigh),
- rtc::Optional<float>(kDisablingPacketLossAtHighBw));
- CheckDecision(&states, false, kDisablingPacketLossAtHighBw);
-}
-
-TEST(FecControllerTest, MaintainFecOnForHighBandwidth) {
- auto states = CreateFecController(true);
- constexpr float kPacketLoss = kDisablingPacketLossAtHighBw * 1.01f;
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kDisablingBandwidthHigh),
- rtc::Optional<float>(kPacketLoss));
- CheckDecision(&states, true, kPacketLoss);
-}
-
-TEST(FecControllerTest, DisableFecOnMediumBandwidth) {
- auto states = CreateFecController(true);
- constexpr float kPacketLoss =
- (kDisablingPacketLossAtLowBw + kDisablingPacketLossAtHighBw) / 2.0f;
- UpdateNetworkMetrics(
- &states, rtc::Optional<int>(
- (kDisablingBandwidthHigh + kDisablingBandwidthLow) / 2),
- rtc::Optional<float>(kPacketLoss));
- CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerTest, MaintainFecOnForMediumBandwidth) {
- auto states = CreateFecController(true);
- constexpr float kPacketLoss = kDisablingPacketLossAtLowBw * 0.51f +
- kDisablingPacketLossAtHighBw * 0.49f;
- UpdateNetworkMetrics(
- &states,
- rtc::Optional<int>((kEnablingBandwidthHigh + kDisablingBandwidthLow) / 2),
- rtc::Optional<float>(kPacketLoss));
- CheckDecision(&states, true, kPacketLoss);
-}
-
-TEST(FecControllerTest, DisableFecForLowBandwidth) {
- auto states = CreateFecController(true);
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kDisablingBandwidthLow),
- rtc::Optional<float>(kDisablingPacketLossAtLowBw));
- CheckDecision(&states, false, kDisablingPacketLossAtLowBw);
-}
-
-TEST(FecControllerTest, DisableFecForVeryLowBandwidth) {
- auto states = CreateFecController(true);
- // Below |kEnablingBandwidthLow|, any packet loss fraction can cause FEC to
- // turn off.
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kDisablingBandwidthLow - 1),
- rtc::Optional<float>(1.0));
- CheckDecision(&states, false, 1.0);
-}
-
-TEST(FecControllerTest, CheckBehaviorOnChangingNetworkMetrics) {
- // In this test, we let the network metrics to traverse from 1 to 5.
- // packet-loss ^ 1 | |
- // | | 2|
- // | \ \ 3
- // | \4 \_______
- // | \_________
- // |---------5-------> bandwidth
-
- auto states = CreateFecController(true);
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kDisablingBandwidthLow - 1),
- rtc::Optional<float>(1.0));
- CheckDecision(&states, false, 1.0);
-
- UpdateNetworkMetrics(
- &states, rtc::Optional<int>(kEnablingBandwidthLow),
- rtc::Optional<float>(kEnablingPacketLossAtLowBw * 0.99f));
- CheckDecision(&states, false, kEnablingPacketLossAtLowBw * 0.99f);
-
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kEnablingBandwidthHigh),
- rtc::Optional<float>(kEnablingPacketLossAtHighBw));
- CheckDecision(&states, true, kEnablingPacketLossAtHighBw);
-
- UpdateNetworkMetrics(
- &states, rtc::Optional<int>(kDisablingBandwidthHigh),
- rtc::Optional<float>(kDisablingPacketLossAtHighBw * 1.01f));
- CheckDecision(&states, true, kDisablingPacketLossAtHighBw * 1.01f);
-
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kDisablingBandwidthHigh + 1),
- rtc::Optional<float>(0.0));
- CheckDecision(&states, false, 0.0);
-}
-
-TEST(FecControllerTest, CheckBehaviorOnSpecialCurves) {
- // We test a special configuration, where the points to define the FEC
- // enabling/disabling curves are placed like the following, otherwise the test
- // is the same as CheckBehaviorOnChangingNetworkMetrics.
- //
- // packet-loss ^ | |
- // | | C|
- // | | |
- // | | D|_______
- // | A|___B______
- // |-----------------> bandwidth
-
- constexpr int kEnablingBandwidthHigh = kEnablingBandwidthLow;
- constexpr float kDisablingPacketLossAtLowBw = kDisablingPacketLossAtHighBw;
- FecControllerStates states;
- std::unique_ptr<MockSmoothingFilter> mock_smoothing_filter(
- new NiceMock<MockSmoothingFilter>());
- states.packet_loss_smoother = mock_smoothing_filter.get();
- using Threshold = FecController::Config::Threshold;
- states.controller.reset(new FecController(
- FecController::Config(
- true, Threshold(kEnablingBandwidthLow, kEnablingPacketLossAtLowBw,
- kEnablingBandwidthHigh, kEnablingPacketLossAtHighBw),
- Threshold(kDisablingBandwidthLow, kDisablingPacketLossAtLowBw,
- kDisablingBandwidthHigh, kDisablingPacketLossAtHighBw),
- 0, nullptr),
- std::move(mock_smoothing_filter)));
-
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kDisablingBandwidthLow - 1),
- rtc::Optional<float>(1.0));
- CheckDecision(&states, false, 1.0);
-
- UpdateNetworkMetrics(
- &states, rtc::Optional<int>(kEnablingBandwidthLow),
- rtc::Optional<float>(kEnablingPacketLossAtHighBw * 0.99f));
- CheckDecision(&states, false, kEnablingPacketLossAtHighBw * 0.99f);
-
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kEnablingBandwidthHigh),
- rtc::Optional<float>(kEnablingPacketLossAtHighBw));
- CheckDecision(&states, true, kEnablingPacketLossAtHighBw);
-
- UpdateNetworkMetrics(
- &states, rtc::Optional<int>(kDisablingBandwidthHigh),
- rtc::Optional<float>(kDisablingPacketLossAtHighBw * 1.01f));
- CheckDecision(&states, true, kDisablingPacketLossAtHighBw * 1.01f);
-
- UpdateNetworkMetrics(&states, rtc::Optional<int>(kDisablingBandwidthHigh + 1),
- rtc::Optional<float>(0.0));
- CheckDecision(&states, false, 0.0);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(FecControllerDeathTest, InvalidConfig) {
- FecControllerStates states;
- std::unique_ptr<MockSmoothingFilter> mock_smoothing_filter(
- new NiceMock<MockSmoothingFilter>());
- states.packet_loss_smoother = mock_smoothing_filter.get();
- using Threshold = FecController::Config::Threshold;
- EXPECT_DEATH(
- states.controller.reset(new FecController(
- FecController::Config(
- true,
- Threshold(kDisablingBandwidthLow - 1, kEnablingPacketLossAtLowBw,
- kEnablingBandwidthHigh, kEnablingPacketLossAtHighBw),
- Threshold(kDisablingBandwidthLow, kDisablingPacketLossAtLowBw,
- kDisablingBandwidthHigh, kDisablingPacketLossAtHighBw),
- 0, nullptr),
- std::move(mock_smoothing_filter))),
- "Check failed");
-}
-#endif
-
-} // namespace webrtc
« no previous file with comments | « webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698