1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "modules/audio_coding/audio_network_adaptor/dtx_controller.h"
12
13 #include <memory>
14
15 #include "test/gtest.h"
16
17 namespace webrtc {
18
19 namespace {
20
21 constexpr int kDtxEnablingBandwidthBps = 55000;
22 constexpr int kDtxDisablingBandwidthBps = 65000;
23 constexpr int kMediumBandwidthBps =
24 (kDtxEnablingBandwidthBps + kDtxDisablingBandwidthBps) / 2;
25
CreateController(int initial_dtx_enabled)26 std::unique_ptr<DtxController> CreateController(int initial_dtx_enabled) {
27 std::unique_ptr<DtxController> controller(new DtxController(
28 DtxController::Config(initial_dtx_enabled, kDtxEnablingBandwidthBps,
29 kDtxDisablingBandwidthBps)));
30 return controller;
31 }
32
CheckDecision(DtxController * controller,const absl::optional<int> & uplink_bandwidth_bps,bool expected_dtx_enabled)33 void CheckDecision(DtxController* controller,
34 const absl::optional<int>& uplink_bandwidth_bps,
35 bool expected_dtx_enabled) {
36 if (uplink_bandwidth_bps) {
37 Controller::NetworkMetrics network_metrics;
38 network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
39 controller->UpdateNetworkMetrics(network_metrics);
40 }
41 AudioEncoderRuntimeConfig config;
42 controller->MakeDecision(&config);
43 EXPECT_EQ(expected_dtx_enabled, config.enable_dtx);
44 }
45
46 } // namespace
47
TEST(DtxControllerTest,OutputInitValueWhenUplinkBandwidthUnknown)48 TEST(DtxControllerTest, OutputInitValueWhenUplinkBandwidthUnknown) {
49 constexpr bool kInitialDtxEnabled = true;
50 auto controller = CreateController(kInitialDtxEnabled);
51 CheckDecision(controller.get(), absl::nullopt, kInitialDtxEnabled);
52 }
53
TEST(DtxControllerTest,TurnOnDtxForLowUplinkBandwidth)54 TEST(DtxControllerTest, TurnOnDtxForLowUplinkBandwidth) {
55 auto controller = CreateController(false);
56 CheckDecision(controller.get(), kDtxEnablingBandwidthBps, true);
57 }
58
TEST(DtxControllerTest,TurnOffDtxForHighUplinkBandwidth)59 TEST(DtxControllerTest, TurnOffDtxForHighUplinkBandwidth) {
60 auto controller = CreateController(true);
61 CheckDecision(controller.get(), kDtxDisablingBandwidthBps, false);
62 }
63
TEST(DtxControllerTest,MaintainDtxOffForMediumUplinkBandwidth)64 TEST(DtxControllerTest, MaintainDtxOffForMediumUplinkBandwidth) {
65 auto controller = CreateController(false);
66 CheckDecision(controller.get(), kMediumBandwidthBps, false);
67 }
68
TEST(DtxControllerTest,MaintainDtxOnForMediumUplinkBandwidth)69 TEST(DtxControllerTest, MaintainDtxOnForMediumUplinkBandwidth) {
70 auto controller = CreateController(true);
71 CheckDecision(controller.get(), kMediumBandwidthBps, true);
72 }
73
TEST(DtxControllerTest,CheckBehaviorOnChangingUplinkBandwidth)74 TEST(DtxControllerTest, CheckBehaviorOnChangingUplinkBandwidth) {
75 auto controller = CreateController(false);
76 CheckDecision(controller.get(), kMediumBandwidthBps, false);
77 CheckDecision(controller.get(), kDtxEnablingBandwidthBps, true);
78 CheckDecision(controller.get(), kMediumBandwidthBps, true);
79 CheckDecision(controller.get(), kDtxDisablingBandwidthBps, false);
80 }
81
82 } // namespace webrtc
83