OLD | NEW |
(Empty) | |
| 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 "testing/gtest/include/gtest/gtest.h" |
| 12 #include "webrtc/modules/audio_coding/audio_network_adaptor/bitrate_controller.h
" |
| 13 |
| 14 namespace webrtc { |
| 15 namespace audio_network_adaptor { |
| 16 |
| 17 namespace { |
| 18 |
| 19 // L2(14B) + IPv4(20B) + UDP(8B) + RTP(12B) + SRTP_AUTH(10B) = 64B = 512 bits |
| 20 constexpr int kPacketOverheadBits = 512; |
| 21 |
| 22 void CheckDecision(BitrateController* controller, |
| 23 const rtc::Optional<int>& target_audio_bitrate_bps, |
| 24 const rtc::Optional<int>& frame_length_ms, |
| 25 int expected_bitrate_bps) { |
| 26 Controller::NetworkMetrics metrics; |
| 27 metrics.target_audio_bitrate_bps = target_audio_bitrate_bps; |
| 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 |
| 40 TEST(AnaBitrateControllerTest, OutputInitValueWhenTargetBitrateUnknown) { |
| 41 constexpr int kInitialBitrateBps = 32000; |
| 42 constexpr int kInitialFrameLengthMs = 20; |
| 43 BitrateController controller( |
| 44 BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs)); |
| 45 CheckDecision(&controller, rtc::Optional<int>(), |
| 46 rtc::Optional<int>(kInitialFrameLengthMs * 2), |
| 47 kInitialBitrateBps); |
| 48 } |
| 49 |
| 50 TEST(AnaBitrateControllerTest, ChangeBitrateOnTargetBitrateChanged) { |
| 51 constexpr int kInitialBitrateBps = 32000; |
| 52 constexpr int kInitialFrameLengthMs = 20; |
| 53 BitrateController controller( |
| 54 BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs)); |
| 55 constexpr int kTargetBitrateBps = 48000; |
| 56 // Frame length unchanged, bitrate changes in accordance with |
| 57 // |metrics.target_audio_bitrate_bps| |
| 58 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps), |
| 59 rtc::Optional<int>(kInitialFrameLengthMs), kTargetBitrateBps); |
| 60 } |
| 61 |
| 62 TEST(AnaBitrateControllerTest, TreatUnknownFrameLengthAsFrameLengthUnchanged) { |
| 63 constexpr int kInitialBitrateBps = 32000; |
| 64 constexpr int kInitialFrameLengthMs = 20; |
| 65 BitrateController controller( |
| 66 BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs)); |
| 67 constexpr int kTargetBitrateBps = 48000; |
| 68 CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps), |
| 69 rtc::Optional<int>(), kTargetBitrateBps); |
| 70 } |
| 71 |
| 72 TEST(AnaBitrateControllerTest, IncreaseBitrateOnFrameLengthIncreased) { |
| 73 constexpr int kInitialBitrateBps = 32000; |
| 74 constexpr int kInitialFrameLengthMs = 20; |
| 75 BitrateController controller( |
| 76 BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs)); |
| 77 constexpr int kFrameLengthMs = 60; |
| 78 constexpr int kPacketOverheadRateDiff = |
| 79 kPacketOverheadBits * 1000 / kInitialFrameLengthMs - |
| 80 kPacketOverheadBits * 1000 / kFrameLengthMs; |
| 81 CheckDecision(&controller, rtc::Optional<int>(kInitialBitrateBps), |
| 82 rtc::Optional<int>(kFrameLengthMs), |
| 83 kInitialBitrateBps + kPacketOverheadRateDiff); |
| 84 } |
| 85 |
| 86 TEST(AnaBitrateControllerTest, DecreaseBitrateOnFrameLengthDecreased) { |
| 87 constexpr int kInitialBitrateBps = 32000; |
| 88 constexpr int kInitialFrameLengthMs = 60; |
| 89 BitrateController controller( |
| 90 BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs)); |
| 91 constexpr int kFrameLengthMs = 20; |
| 92 constexpr int kPacketOverheadRateDiff = |
| 93 kPacketOverheadBits * 1000 / kInitialFrameLengthMs - |
| 94 kPacketOverheadBits * 1000 / kFrameLengthMs; |
| 95 CheckDecision(&controller, rtc::Optional<int>(kInitialBitrateBps), |
| 96 rtc::Optional<int>(kFrameLengthMs), |
| 97 kInitialBitrateBps + kPacketOverheadRateDiff); |
| 98 } |
| 99 |
| 100 TEST(AnaBitrateControllerTest, CheckBehaviorOnChangingCondition) { |
| 101 constexpr int kInitialBitrateBps = 32000; |
| 102 constexpr int kInitialFrameLengthMs = 20; |
| 103 BitrateController controller( |
| 104 BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs)); |
| 105 |
| 106 int last_overhead_bitrate = |
| 107 kPacketOverheadBits * 1000 / kInitialFrameLengthMs; |
| 108 int current_overhead_bitrate = kPacketOverheadBits * 1000 / 20; |
| 109 // Start from an arbitrary overall bitrate. |
| 110 int overall_bitrate = 34567; |
| 111 CheckDecision( |
| 112 &controller, rtc::Optional<int>(overall_bitrate - last_overhead_bitrate), |
| 113 rtc::Optional<int>(20), overall_bitrate - current_overhead_bitrate); |
| 114 |
| 115 // Next: increase overall bitrate. |
| 116 overall_bitrate += 100; |
| 117 CheckDecision( |
| 118 &controller, rtc::Optional<int>(overall_bitrate - last_overhead_bitrate), |
| 119 rtc::Optional<int>(20), overall_bitrate - current_overhead_bitrate); |
| 120 |
| 121 // Next: change frame length. |
| 122 current_overhead_bitrate = kPacketOverheadBits * 1000 / 60; |
| 123 CheckDecision( |
| 124 &controller, rtc::Optional<int>(overall_bitrate - last_overhead_bitrate), |
| 125 rtc::Optional<int>(60), overall_bitrate - current_overhead_bitrate); |
| 126 last_overhead_bitrate = current_overhead_bitrate; |
| 127 |
| 128 // Next: change frame length. |
| 129 current_overhead_bitrate = kPacketOverheadBits * 1000 / 20; |
| 130 CheckDecision( |
| 131 &controller, rtc::Optional<int>(overall_bitrate - last_overhead_bitrate), |
| 132 rtc::Optional<int>(20), overall_bitrate - current_overhead_bitrate); |
| 133 last_overhead_bitrate = current_overhead_bitrate; |
| 134 |
| 135 // Next: decrease overall bitrate and frame length. |
| 136 overall_bitrate -= 100; |
| 137 current_overhead_bitrate = kPacketOverheadBits * 1000 / 60; |
| 138 CheckDecision( |
| 139 &controller, rtc::Optional<int>(overall_bitrate - last_overhead_bitrate), |
| 140 rtc::Optional<int>(60), overall_bitrate - current_overhead_bitrate); |
| 141 } |
| 142 |
| 143 } // namespace audio_network_adaptor |
| 144 } // namespace webrtc |
OLD | NEW |