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