| Index: webrtc/modules/audio_coding/audio_network_adaptor/bitrate_controller_unittest.cc
|
| diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/bitrate_controller_unittest.cc b/webrtc/modules/audio_coding/audio_network_adaptor/bitrate_controller_unittest.cc
|
| index a4ebfc886024603b885f43f2e08822e7aa79d575..a90cb9a213bfbe987f3b1cabebf842dbd8132cba 100644
|
| --- a/webrtc/modules/audio_coding/audio_network_adaptor/bitrate_controller_unittest.cc
|
| +++ b/webrtc/modules/audio_coding/audio_network_adaptor/bitrate_controller_unittest.cc
|
| @@ -17,17 +17,31 @@ namespace audio_network_adaptor {
|
|
|
| namespace {
|
|
|
| +void UpdateNetworkMetrics(
|
| + BitrateController* controller,
|
| + const rtc::Optional<int>& target_audio_bitrate_bps,
|
| + const rtc::Optional<size_t>& overhead_bytes_per_packet) {
|
| + // 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 (target_audio_bitrate_bps) {
|
| + Controller::NetworkMetrics network_metrics;
|
| + network_metrics.target_audio_bitrate_bps = target_audio_bitrate_bps;
|
| + controller->UpdateNetworkMetrics(network_metrics);
|
| + }
|
| + if (overhead_bytes_per_packet) {
|
| + Controller::NetworkMetrics network_metrics;
|
| + network_metrics.overhead_bytes_per_packet = overhead_bytes_per_packet;
|
| + controller->UpdateNetworkMetrics(network_metrics);
|
| + }
|
| +}
|
| +
|
| void 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) {
|
| - Controller::NetworkMetrics metrics;
|
| - metrics.target_audio_bitrate_bps = target_audio_bitrate_bps;
|
| - metrics.overhead_bytes_per_packet = overhead_bytes_per_packet;
|
| AudioNetworkAdaptor::EncoderRuntimeConfig config;
|
| config.frame_length_ms = frame_length_ms;
|
| - controller->MakeDecision(metrics, &config);
|
| + controller->MakeDecision(&config);
|
| EXPECT_EQ(rtc::Optional<int>(expected_bitrate_bps), config.bitrate_bps);
|
| }
|
|
|
| @@ -43,9 +57,9 @@ TEST(AnaBitrateControllerTest, OutputInitValueWhenTargetBitrateUnknown) {
|
| constexpr size_t kOverheadBytesPerPacket = 64;
|
| BitrateController controller(
|
| BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs));
|
| - CheckDecision(&controller, rtc::Optional<int>(),
|
| - rtc::Optional<size_t>(kOverheadBytesPerPacket),
|
| - rtc::Optional<int>(kInitialFrameLengthMs * 2),
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(),
|
| + rtc::Optional<size_t>(kOverheadBytesPerPacket));
|
| + CheckDecision(&controller, rtc::Optional<int>(kInitialFrameLengthMs * 2),
|
| kInitialBitrateBps);
|
| }
|
|
|
| @@ -55,9 +69,9 @@ TEST(AnaBitrateControllerTest, OutputInitValueWhenOverheadUnknown) {
|
| constexpr int kTargetBitrateBps = 48000;
|
| BitrateController controller(
|
| BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs));
|
| - CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| - rtc::Optional<size_t>(),
|
| - rtc::Optional<int>(kInitialFrameLengthMs * 2),
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| + rtc::Optional<size_t>());
|
| + CheckDecision(&controller, rtc::Optional<int>(kInitialFrameLengthMs * 2),
|
| kInitialBitrateBps);
|
| }
|
|
|
| @@ -74,9 +88,38 @@ TEST(AnaBitrateControllerTest, ChangeBitrateOnTargetBitrateChanged) {
|
| kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
|
| // Frame length unchanged, bitrate changes in accordance with
|
| // |metrics.target_audio_bitrate_bps| and |metrics.overhead_bytes_per_packet|.
|
| - CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| - rtc::Optional<size_t>(kOverheadBytesPerPacket),
|
| - rtc::Optional<int>(kInitialFrameLengthMs), kBitrateBps);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| + rtc::Optional<size_t>(kOverheadBytesPerPacket));
|
| + CheckDecision(&controller, rtc::Optional<int>(kInitialFrameLengthMs),
|
| + kBitrateBps);
|
| +}
|
| +
|
| +TEST(AnaBitrateControllerTest, UpdateMultipleNetworkMetricsAtOnce) {
|
| + // This test is similar to ChangeBitrateOnTargetBitrateChanged. But instead of
|
| + // using ::UpdateNetworkMetrics(...), which calls
|
| + // BitrateController::UpdateNetworkMetrics(...) multiple times, we
|
| + // we call it only once. This is to verify that
|
| + // BitrateController::UpdateNetworkMetrics(...) can handle multiple
|
| + // network updates at once. This is, however, not a common use case in current
|
| + // audio_network_adaptor_impl.cc.
|
| + test::ScopedFieldTrials override_field_trials(
|
| + "WebRTC-SendSideBwe-WithOverhead/Enabled/");
|
| + constexpr int kInitialFrameLengthMs = 20;
|
| + BitrateController controller(
|
| + BitrateController::Config(32000, kInitialFrameLengthMs));
|
| + constexpr int kTargetBitrateBps = 48000;
|
| + constexpr size_t kOverheadBytesPerPacket = 64;
|
| + constexpr int kBitrateBps =
|
| + kTargetBitrateBps -
|
| + kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
|
| + Controller::NetworkMetrics network_metrics;
|
| + network_metrics.target_audio_bitrate_bps =
|
| + rtc::Optional<int>(kTargetBitrateBps);
|
| + network_metrics.overhead_bytes_per_packet =
|
| + rtc::Optional<size_t>(kOverheadBytesPerPacket);
|
| + controller.UpdateNetworkMetrics(network_metrics);
|
| + CheckDecision(&controller, rtc::Optional<int>(kInitialFrameLengthMs),
|
| + kBitrateBps);
|
| }
|
|
|
| TEST(AnaBitrateControllerTest, TreatUnknownFrameLengthAsFrameLengthUnchanged) {
|
| @@ -90,9 +133,9 @@ TEST(AnaBitrateControllerTest, TreatUnknownFrameLengthAsFrameLengthUnchanged) {
|
| constexpr int kBitrateBps =
|
| kTargetBitrateBps -
|
| kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
|
| - CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| - rtc::Optional<size_t>(kOverheadBytesPerPacket),
|
| - rtc::Optional<int>(), kBitrateBps);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| + rtc::Optional<size_t>(kOverheadBytesPerPacket));
|
| + CheckDecision(&controller, rtc::Optional<int>(), kBitrateBps);
|
| }
|
|
|
| TEST(AnaBitrateControllerTest, IncreaseBitrateOnFrameLengthIncreased) {
|
| @@ -107,17 +150,17 @@ TEST(AnaBitrateControllerTest, IncreaseBitrateOnFrameLengthIncreased) {
|
| constexpr int kBitrateBps =
|
| kTargetBitrateBps -
|
| kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
|
| - CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| - rtc::Optional<size_t>(kOverheadBytesPerPacket),
|
| - rtc::Optional<int>(), kBitrateBps);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| + rtc::Optional<size_t>(kOverheadBytesPerPacket));
|
| + CheckDecision(&controller, rtc::Optional<int>(), kBitrateBps);
|
|
|
| constexpr int kFrameLengthMs = 60;
|
| constexpr size_t kPacketOverheadRateDiff =
|
| kOverheadBytesPerPacket * 8 * 1000 / 20 -
|
| kOverheadBytesPerPacket * 8 * 1000 / 60;
|
| - CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| - rtc::Optional<size_t>(kOverheadBytesPerPacket),
|
| - rtc::Optional<int>(kFrameLengthMs),
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| + rtc::Optional<size_t>(kOverheadBytesPerPacket));
|
| + CheckDecision(&controller, rtc::Optional<int>(kFrameLengthMs),
|
| kBitrateBps + kPacketOverheadRateDiff);
|
| }
|
|
|
| @@ -133,17 +176,17 @@ TEST(AnaBitrateControllerTest, DecreaseBitrateOnFrameLengthDecreased) {
|
| constexpr int kBitrateBps =
|
| kTargetBitrateBps -
|
| kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
|
| - CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| - rtc::Optional<size_t>(kOverheadBytesPerPacket),
|
| - rtc::Optional<int>(), kBitrateBps);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| + rtc::Optional<size_t>(kOverheadBytesPerPacket));
|
| + CheckDecision(&controller, rtc::Optional<int>(), kBitrateBps);
|
|
|
| constexpr int kFrameLengthMs = 20;
|
| constexpr size_t kPacketOverheadRateDiff =
|
| kOverheadBytesPerPacket * 8 * 1000 / 20 -
|
| kOverheadBytesPerPacket * 8 * 1000 / 60;
|
| - CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| - rtc::Optional<size_t>(kOverheadBytesPerPacket),
|
| - rtc::Optional<int>(kFrameLengthMs),
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| + rtc::Optional<size_t>(kOverheadBytesPerPacket));
|
| + CheckDecision(&controller, rtc::Optional<int>(kFrameLengthMs),
|
| kBitrateBps - kPacketOverheadRateDiff);
|
| }
|
|
|
| @@ -156,9 +199,9 @@ TEST(AnaBitrateControllerTest, BitrateNeverBecomesNegative) {
|
| // Set a target rate smaller than overhead rate, the bitrate is bounded by 0.
|
| constexpr int kTargetBitrateBps =
|
| kOverheadBytesPerPacket * 8 * 1000 / kFrameLengthMs - 1;
|
| - CheckDecision(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| - rtc::Optional<size_t>(kOverheadBytesPerPacket),
|
| - rtc::Optional<int>(kFrameLengthMs), 0);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
|
| + rtc::Optional<size_t>(kOverheadBytesPerPacket));
|
| + CheckDecision(&controller, rtc::Optional<int>(kFrameLengthMs), 0);
|
| }
|
|
|
| TEST(AnaBitrateControllerTest, CheckBehaviorOnChangingCondition) {
|
| @@ -173,39 +216,44 @@ TEST(AnaBitrateControllerTest, CheckBehaviorOnChangingCondition) {
|
| int current_bitrate =
|
| overall_bitrate - overhead_bytes_per_packet * 8 * 1000 / frame_length_ms;
|
|
|
| - CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
|
| - rtc::Optional<size_t>(overhead_bytes_per_packet),
|
| - rtc::Optional<int>(frame_length_ms), current_bitrate);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
|
| + rtc::Optional<size_t>(overhead_bytes_per_packet));
|
| + CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
|
| + current_bitrate);
|
|
|
| // Next: increase overall bitrate.
|
| overall_bitrate += 100;
|
| current_bitrate += 100;
|
| - CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
|
| - rtc::Optional<size_t>(overhead_bytes_per_packet),
|
| - rtc::Optional<int>(frame_length_ms), current_bitrate);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
|
| + rtc::Optional<size_t>(overhead_bytes_per_packet));
|
| + CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
|
| + current_bitrate);
|
|
|
| // Next: change frame length.
|
| frame_length_ms = 60;
|
| current_bitrate += overhead_bytes_per_packet * 8 * 1000 / 20 -
|
| overhead_bytes_per_packet * 8 * 1000 / 60;
|
| - CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
|
| - rtc::Optional<size_t>(overhead_bytes_per_packet),
|
| - rtc::Optional<int>(frame_length_ms), current_bitrate);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
|
| + rtc::Optional<size_t>(overhead_bytes_per_packet));
|
| + CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
|
| + current_bitrate);
|
|
|
| // Next: change overhead.
|
| overhead_bytes_per_packet -= 30;
|
| current_bitrate += 30 * 8 * 1000 / frame_length_ms;
|
| - CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
|
| - rtc::Optional<size_t>(overhead_bytes_per_packet),
|
| - rtc::Optional<int>(frame_length_ms), current_bitrate);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
|
| + rtc::Optional<size_t>(overhead_bytes_per_packet));
|
| + CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
|
| + current_bitrate);
|
|
|
| // Next: change frame length.
|
| frame_length_ms = 20;
|
| current_bitrate -= overhead_bytes_per_packet * 8 * 1000 / 20 -
|
| overhead_bytes_per_packet * 8 * 1000 / 60;
|
| - CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
|
| - rtc::Optional<size_t>(overhead_bytes_per_packet),
|
| - rtc::Optional<int>(frame_length_ms), current_bitrate);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
|
| + rtc::Optional<size_t>(overhead_bytes_per_packet));
|
| + CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
|
| + current_bitrate);
|
|
|
| // Next: decrease overall bitrate and frame length.
|
| overall_bitrate -= 100;
|
| @@ -214,9 +262,10 @@ TEST(AnaBitrateControllerTest, CheckBehaviorOnChangingCondition) {
|
| current_bitrate += overhead_bytes_per_packet * 8 * 1000 / 20 -
|
| overhead_bytes_per_packet * 8 * 1000 / 60;
|
|
|
| - CheckDecision(&controller, rtc::Optional<int>(overall_bitrate),
|
| - rtc::Optional<size_t>(overhead_bytes_per_packet),
|
| - rtc::Optional<int>(frame_length_ms), current_bitrate);
|
| + UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
|
| + rtc::Optional<size_t>(overhead_bytes_per_packet));
|
| + CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
|
| + current_bitrate);
|
| }
|
|
|
| } // namespace audio_network_adaptor
|
|
|