Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(651)

Unified Diff: webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc

Issue 2703353002: Change frame length on very low bandwidth. (Closed)
Patch Set: Responsd to comments. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc
index 97ff4b4ac22e4de8a1aa0137cf8b1317517d0321..ac888b6c6ec7678ba3995b1bac0bb3514d917f5f 100644
--- a/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc
@@ -20,6 +20,9 @@ namespace {
constexpr float kFlIncreasingPacketLossFraction = 0.04f;
constexpr float kFlDecreasingPacketLossFraction = 0.05f;
+constexpr int kMinEncoderBitrateBps = 6000;
+constexpr int kPreventOveruseMarginBps = 5000;
+constexpr size_t kOverheadBytesPerPacket = 20;
constexpr int kFl20msTo60msBandwidthBps = 40000;
constexpr int kFl60msTo20msBandwidthBps = 50000;
constexpr int kFl60msTo120msBandwidthBps = 30000;
@@ -29,6 +32,11 @@ constexpr int kMediumBandwidthBps =
constexpr float kMediumPacketLossFraction =
(kFlDecreasingPacketLossFraction + kFlIncreasingPacketLossFraction) / 2;
+int VeryLowBitrate(int frame_length_ms) {
+ return kMinEncoderBitrateBps + kPreventOveruseMarginBps +
+ (kOverheadBytesPerPacket * 8 * 1000 / frame_length_ms);
+}
+
std::unique_ptr<FrameLengthController> CreateController(
const std::map<FrameLengthController::Config::FrameLengthChange, int>&
frame_length_change_criteria,
@@ -37,8 +45,8 @@ std::unique_ptr<FrameLengthController> CreateController(
std::unique_ptr<FrameLengthController> controller(
new FrameLengthController(FrameLengthController::Config(
encoder_frame_lengths_ms, initial_frame_length_ms,
- kFlIncreasingPacketLossFraction, kFlDecreasingPacketLossFraction,
- frame_length_change_criteria)));
+ kMinEncoderBitrateBps, kFlIncreasingPacketLossFraction,
+ kFlDecreasingPacketLossFraction, frame_length_change_criteria)));
return controller;
}
@@ -68,7 +76,8 @@ CreateChangeCriteriaFor20ms60msAnd120ms() {
void UpdateNetworkMetrics(
FrameLengthController* controller,
const rtc::Optional<int>& uplink_bandwidth_bps,
- const rtc::Optional<float>& uplink_packet_loss_fraction) {
+ const rtc::Optional<float>& uplink_packet_loss_fraction,
+ 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.
@@ -82,6 +91,11 @@ void UpdateNetworkMetrics(
network_metrics.uplink_packet_loss_fraction = uplink_packet_loss_fraction;
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(FrameLengthController* controller,
@@ -99,9 +113,9 @@ void CheckDecision(FrameLengthController* controller,
TEST(FrameLengthControllerTest, DecreaseTo20MsOnHighUplinkBandwidth) {
auto controller =
CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
- UpdateNetworkMetrics(controller.get(),
- rtc::Optional<int>(kFl60msTo20msBandwidthBps),
- rtc::Optional<float>());
+ UpdateNetworkMetrics(
+ controller.get(), rtc::Optional<int>(kFl60msTo20msBandwidthBps),
+ rtc::Optional<float>(), rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
}
@@ -109,7 +123,8 @@ TEST(FrameLengthControllerTest, DecreaseTo20MsOnHighUplinkPacketLossFraction) {
auto controller =
CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(),
- rtc::Optional<float>(kFlDecreasingPacketLossFraction));
+ rtc::Optional<float>(kFlDecreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
}
@@ -137,7 +152,8 @@ TEST(FrameLengthControllerTest, Maintain60MsOnMultipleConditions) {
CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kMediumBandwidthBps),
- rtc::Optional<float>(kMediumPacketLossFraction));
+ rtc::Optional<float>(kMediumPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
}
@@ -151,10 +167,35 @@ TEST(FrameLengthControllerTest, IncreaseTo60MsOnMultipleConditions) {
CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl20msTo60msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
}
+TEST(FrameLengthControllerTest, IncreaseTo60MsOnVeryLowUplinkBandwidth) {
+ auto controller =
+ CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
+ // We set packet loss fraction to kFlDecreasingPacketLossFraction, and FEC on,
+ // both of which should have prevented frame length to increase, if the uplink
+ // bandwidth was not this low.
+ UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(20)),
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
+ CheckDecision(controller.get(), rtc::Optional<bool>(true), 60);
+}
+
+TEST(FrameLengthControllerTest, Maintain60MsOnVeryLowUplinkBandwidth) {
+ auto controller =
+ CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
+ // We set packet loss fraction to FlDecreasingPacketLossFraction, and FEC on,
+ // both of which should have caused the frame length to decrease, if the
+ // uplink bandwidth was not this low.
+ UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(20)),
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
+ CheckDecision(controller.get(), rtc::Optional<bool>(true), 60);
+}
+
TEST(FrameLengthControllerTest, UpdateMultipleNetworkMetricsAtOnce) {
// This test is similar to IncreaseTo60MsOnMultipleConditions. But instead of
// using ::UpdateNetworkMetrics(...), which calls
@@ -182,7 +223,8 @@ TEST(FrameLengthControllerTest,
// cause frame length to increase if receiver frame length included 60ms.
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl20msTo60msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
}
@@ -191,7 +233,8 @@ TEST(FrameLengthControllerTest, Maintain20MsOnMediumUplinkBandwidth) {
CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kMediumBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
}
@@ -202,7 +245,8 @@ TEST(FrameLengthControllerTest, Maintain20MsOnMediumUplinkPacketLossFraction) {
// uplink packet loss fraction was low.
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl20msTo60msBandwidthBps),
- rtc::Optional<float>(kMediumPacketLossFraction));
+ rtc::Optional<float>(kMediumPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
}
@@ -213,7 +257,8 @@ TEST(FrameLengthControllerTest, Maintain20MsWhenFecIsOn) {
// cause frame length to increase if FEC was not ON.
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl20msTo60msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kMediumPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(true), 20);
}
@@ -222,7 +267,8 @@ TEST(FrameLengthControllerTest, Maintain60MsWhenNo120msCriteriaIsSet) {
CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60, 120}, 60);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl60msTo120msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
}
@@ -230,14 +276,14 @@ TEST(FrameLengthControllerTest, From120MsTo20MsOnHighUplinkBandwidth) {
auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
{20, 60, 120}, 120);
// It takes two steps for frame length to go from 120ms to 20ms.
- UpdateNetworkMetrics(controller.get(),
- rtc::Optional<int>(kFl60msTo20msBandwidthBps),
- rtc::Optional<float>());
+ UpdateNetworkMetrics(
+ controller.get(), rtc::Optional<int>(kFl60msTo20msBandwidthBps),
+ rtc::Optional<float>(), rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
- UpdateNetworkMetrics(controller.get(),
- rtc::Optional<int>(kFl60msTo20msBandwidthBps),
- rtc::Optional<float>());
+ UpdateNetworkMetrics(
+ controller.get(), rtc::Optional<int>(kFl60msTo20msBandwidthBps),
+ rtc::Optional<float>(), rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
}
@@ -246,11 +292,13 @@ TEST(FrameLengthControllerTest, From120MsTo20MsOnHighUplinkPacketLossFraction) {
{20, 60, 120}, 120);
// It takes two steps for frame length to go from 120ms to 20ms.
UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(),
- rtc::Optional<float>(kFlDecreasingPacketLossFraction));
+ rtc::Optional<float>(kFlDecreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(),
- rtc::Optional<float>(kFlDecreasingPacketLossFraction));
+ rtc::Optional<float>(kFlDecreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
}
@@ -262,6 +310,30 @@ TEST(FrameLengthControllerTest, From120MsTo20MsWhenFecIsOn) {
CheckDecision(controller.get(), rtc::Optional<bool>(true), 20);
}
+TEST(FrameLengthControllerTest, Maintain120MsOnVeryLowUplinkBandwidth) {
+ auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
+ {20, 60, 120}, 120);
+ // We set packet loss fraction to FlDecreasingPacketLossFraction, and FEC on,
+ // both of which should have caused the frame length to decrease, if the
+ // uplink bandwidth was not this low.
+ UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(60)),
+ rtc::Optional<float>(kFlDecreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
+ CheckDecision(controller.get(), rtc::Optional<bool>(true), 120);
+}
+
+TEST(FrameLengthControllerTest, From60MsTo120MsOnVeryLowUplinkBandwidth) {
+ auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
+ {20, 60, 120}, 60);
+ // We set packet loss fraction to FlDecreasingPacketLossFraction, and FEC on,
+ // both of which should have prevented frame length to increase, if the uplink
+ // bandwidth was not this low.
+ UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(60)),
+ rtc::Optional<float>(kFlDecreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
+ CheckDecision(controller.get(), rtc::Optional<bool>(true), 120);
+}
+
TEST(FrameLengthControllerTest, From20MsTo120MsOnMultipleConditions) {
// Increase to 120ms frame length if
// 1. |uplink_bandwidth_bps| is known to be smaller than a threshold AND
@@ -273,11 +345,13 @@ TEST(FrameLengthControllerTest, From20MsTo120MsOnMultipleConditions) {
// It takes two steps for frame length to go from 20ms to 120ms.
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl60msTo120msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl60msTo120msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 120);
}
@@ -286,11 +360,13 @@ TEST(FrameLengthControllerTest, Stall60MsIf120MsNotInReceiverFrameLengthRange) {
CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(), {20, 60}, 20);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl60msTo120msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl60msTo120msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
}
@@ -299,32 +375,38 @@ TEST(FrameLengthControllerTest, CheckBehaviorOnChangingNetworkMetrics) {
{20, 60, 120}, 20);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kMediumBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl20msTo60msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl60msTo120msBandwidthBps),
- rtc::Optional<float>(kMediumPacketLossFraction));
+ rtc::Optional<float>(kMediumPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl60msTo120msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 120);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kFl120msTo60msBandwidthBps),
- rtc::Optional<float>(kFlIncreasingPacketLossFraction));
+ rtc::Optional<float>(kFlIncreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 60);
UpdateNetworkMetrics(controller.get(),
rtc::Optional<int>(kMediumBandwidthBps),
- rtc::Optional<float>(kFlDecreasingPacketLossFraction));
+ rtc::Optional<float>(kFlDecreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
CheckDecision(controller.get(), rtc::Optional<bool>(), 20);
}

Powered by Google App Engine
This is Rietveld 408576698