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 "webrtc/modules/audio_coding/audio_network_adaptor/bitrate_controller.h"
12 #include "webrtc/test/field_trial.h"
13 #include "webrtc/test/gtest.h"
14
15 namespace webrtc {
16 namespace audio_network_adaptor {
17
18 namespace {
19
CheckDecision(BitrateController * controller,const rtc::Optional<int> & target_audio_bitrate_bps,const rtc::Optional<size_t> & overhead_bytes_per_packet,const rtc::Optional<int> & frame_length_ms,int expected_bitrate_bps)20 void CheckDecision(BitrateController* controller,
21 const rtc::Optional<int>& target_audio_bitrate_bps,
22 const rtc::Optional<size_t>& overhead_bytes_per_packet,
23 const rtc::Optional<int>& frame_length_ms,
24 int expected_bitrate_bps) {
25 Controller::NetworkMetrics metrics;
26 metrics.target_audio_bitrate_bps = target_audio_bitrate_bps;
27 metrics.overhead_bytes_per_packet = overhead_bytes_per_packet;
28 AudioNetworkAdaptor::EncoderRuntimeConfig config;
29 config.frame_length_ms = frame_length_ms;
30 controller->MakeDecision(metrics, &config);
31 EXPECT_EQ(rtc::Optional<int>(expected_bitrate_bps), config.bitrate_bps);
32 }
33
34 } // namespace
35
36 // These tests are named AnaBitrateControllerTest to distinguish from
37 // BitrateControllerTest in
38 // modules/bitrate_controller/bitrate_controller_unittest.cc.
39
TEST(AnaBitrateControllerTest,OutputInitValueWhenTargetBitrateUnknown)40 TEST(AnaBitrateControllerTest, OutputInitValueWhenTargetBitrateUnknown) {
41 constexpr int kInitialBitrateBps = 32000;
42 constexpr int kInitialFrameLengthMs = 20;
43 constexpr size_t kOverheadBytesPerPacket = 64;
44 BitrateController controller(
45 BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs));
46 CheckDecision(&controller, rtc::Optional<int>(),
47 rtc::Optional<size_t>(kOverheadBytesPerPacket),
48 rtc::Optional<int>(kInitialFrameLengthMs * 2),
49 kInitialBitrateBps);
50 }
51
TEST(AnaBitrateControllerTest,OutputInitValueWhenOverheadUnknown)52 TEST(AnaBitrateControllerTest, OutputInitValueWhenOverheadUnknown) {
53 constexpr int kInitialBitrateBps = 32000;
54 constexpr int kInitialFrameLengthMs = 20;
55 constexpr int kTargetBitrateBps = 48000;
56 BitrateController controller(
57 BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs));
58 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
59 rtc::Optional<size_t>(),
60 rtc::Optional<int>(kInitialFrameLengthMs * 2),
61 kInitialBitrateBps);
62 }
63
TEST(AnaBitrateControllerTest,ChangeBitrateOnTargetBitrateChanged)64 TEST(AnaBitrateControllerTest, ChangeBitrateOnTargetBitrateChanged) {
65 test::ScopedFieldTrials override_field_trials(
66 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
67 constexpr int kInitialFrameLengthMs = 20;
68 BitrateController controller(
69 BitrateController::Config(32000, kInitialFrameLengthMs));
70 constexpr int kTargetBitrateBps = 48000;
71 constexpr size_t kOverheadBytesPerPacket = 64;
72 constexpr int kBitrateBps =
73 kTargetBitrateBps -
74 kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
75 // Frame length unchanged, bitrate changes in accordance with
76 // |metrics.target_audio_bitrate_bps| and |metrics.overhead_bytes_per_packet|.
77 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
78 rtc::Optional<size_t>(kOverheadBytesPerPacket),
79 rtc::Optional<int>(kInitialFrameLengthMs), kBitrateBps);
80 }
81
TEST(AnaBitrateControllerTest,TreatUnknownFrameLengthAsFrameLengthUnchanged)82 TEST(AnaBitrateControllerTest, TreatUnknownFrameLengthAsFrameLengthUnchanged) {
83 test::ScopedFieldTrials override_field_trials(
84 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
85 constexpr int kInitialFrameLengthMs = 20;
86 BitrateController controller(
87 BitrateController::Config(32000, kInitialFrameLengthMs));
88 constexpr int kTargetBitrateBps = 48000;
89 constexpr size_t kOverheadBytesPerPacket = 64;
90 constexpr int kBitrateBps =
91 kTargetBitrateBps -
92 kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
93 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
94 rtc::Optional<size_t>(kOverheadBytesPerPacket),
95 rtc::Optional<int>(), kBitrateBps);
96 }
97
TEST(AnaBitrateControllerTest,IncreaseBitrateOnFrameLengthIncreased)98 TEST(AnaBitrateControllerTest, IncreaseBitrateOnFrameLengthIncreased) {
99 test::ScopedFieldTrials override_field_trials(
100 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
101 constexpr int kInitialFrameLengthMs = 20;
102 BitrateController controller(
103 BitrateController::Config(32000, kInitialFrameLengthMs));
104
105 constexpr int kTargetBitrateBps = 48000;
106 constexpr size_t kOverheadBytesPerPacket = 64;
107 constexpr int kBitrateBps =
108 kTargetBitrateBps -
109 kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
110 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
111 rtc::Optional<size_t>(kOverheadBytesPerPacket),
112 rtc::Optional<int>(), kBitrateBps);
113
114 constexpr int kFrameLengthMs = 60;
115 constexpr size_t kPacketOverheadRateDiff =
116 kOverheadBytesPerPacket * 8 * 1000 / 20 -
117 kOverheadBytesPerPacket * 8 * 1000 / 60;
118 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
119 rtc::Optional<size_t>(kOverheadBytesPerPacket),
120 rtc::Optional<int>(kFrameLengthMs),
121 kBitrateBps + kPacketOverheadRateDiff);
122 }
123
TEST(AnaBitrateControllerTest,DecreaseBitrateOnFrameLengthDecreased)124 TEST(AnaBitrateControllerTest, DecreaseBitrateOnFrameLengthDecreased) {
125 test::ScopedFieldTrials override_field_trials(
126 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
127 constexpr int kInitialFrameLengthMs = 60;
128 BitrateController controller(
129 BitrateController::Config(32000, kInitialFrameLengthMs));
130
131 constexpr int kTargetBitrateBps = 48000;
132 constexpr size_t kOverheadBytesPerPacket = 64;
133 constexpr int kBitrateBps =
134 kTargetBitrateBps -
135 kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
136 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
137 rtc::Optional<size_t>(kOverheadBytesPerPacket),
138 rtc::Optional<int>(), kBitrateBps);
139
140 constexpr int kFrameLengthMs = 20;
141 constexpr size_t kPacketOverheadRateDiff =
142 kOverheadBytesPerPacket * 8 * 1000 / 20 -
143 kOverheadBytesPerPacket * 8 * 1000 / 60;
144 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
145 rtc::Optional<size_t>(kOverheadBytesPerPacket),
146 rtc::Optional<int>(kFrameLengthMs),
147 kBitrateBps - kPacketOverheadRateDiff);
148 }
149
TEST(AnaBitrateControllerTest,BitrateNeverBecomesNegative)150 TEST(AnaBitrateControllerTest, BitrateNeverBecomesNegative) {
151 test::ScopedFieldTrials override_field_trials(
152 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
153 BitrateController controller(BitrateController::Config(32000, 20));
154 constexpr size_t kOverheadBytesPerPacket = 64;
155 constexpr int kFrameLengthMs = 60;
156 // Set a target rate smaller than overhead rate, the bitrate is bounded by 0.
157 constexpr int kTargetBitrateBps =
158 kOverheadBytesPerPacket * 8 * 1000 / kFrameLengthMs - 1;
159 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
160 rtc::Optional<size_t>(kOverheadBytesPerPacket),
161 rtc::Optional<int>(kFrameLengthMs), 0);
162 }
163
TEST(AnaBitrateControllerTest,CheckBehaviorOnChangingCondition)164 TEST(AnaBitrateControllerTest, CheckBehaviorOnChangingCondition) {
165 test::ScopedFieldTrials override_field_trials(
166 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
167 BitrateController controller(BitrateController::Config(32000, 20));
168
169 // Start from an arbitrary overall bitrate.
170 int overall_bitrate = 34567;
171 size_t overhead_bytes_per_packet = 64;
172 int frame_length_ms = 20;
173 int current_bitrate =
174 overall_bitrate - overhead_bytes_per_packet * 8 * 1000 / frame_length_ms;
175
176 CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
177 rtc::Optional<size_t>(overhead_bytes_per_packet),
178 rtc::Optional<int>(frame_length_ms), current_bitrate);
179
180 // Next: increase overall bitrate.
181 overall_bitrate += 100;
182 current_bitrate += 100;
183 CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
184 rtc::Optional<size_t>(overhead_bytes_per_packet),
185 rtc::Optional<int>(frame_length_ms), current_bitrate);
186
187 // Next: change frame length.
188 frame_length_ms = 60;
189 current_bitrate += overhead_bytes_per_packet * 8 * 1000 / 20 -
190 overhead_bytes_per_packet * 8 * 1000 / 60;
191 CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
192 rtc::Optional<size_t>(overhead_bytes_per_packet),
193 rtc::Optional<int>(frame_length_ms), current_bitrate);
194
195 // Next: change overhead.
196 overhead_bytes_per_packet -= 30;
197 current_bitrate += 30 * 8 * 1000 / frame_length_ms;
198 CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
199 rtc::Optional<size_t>(overhead_bytes_per_packet),
200 rtc::Optional<int>(frame_length_ms), current_bitrate);
201
202 // Next: change frame length.
203 frame_length_ms = 20;
204 current_bitrate -= overhead_bytes_per_packet * 8 * 1000 / 20 -
205 overhead_bytes_per_packet * 8 * 1000 / 60;
206 CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
207 rtc::Optional<size_t>(overhead_bytes_per_packet),
208 rtc::Optional<int>(frame_length_ms), current_bitrate);
209
210 // Next: decrease overall bitrate and frame length.
211 overall_bitrate -= 100;
212 current_bitrate -= 100;
213 frame_length_ms = 60;
214 current_bitrate += overhead_bytes_per_packet * 8 * 1000 / 20 -
215 overhead_bytes_per_packet * 8 * 1000 / 60;
216
217 CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
218 rtc::Optional<size_t>(overhead_bytes_per_packet),
219 rtc::Optional<int>(frame_length_ms), current_bitrate);
220 }
221
222 } // namespace audio_network_adaptor
223 } // namespace webrtc
224