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

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: 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..28ed0bdd631de601d8ea18e47245ab37a884f115 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,6 +45,7 @@ std::unique_ptr<FrameLengthController> CreateController(
std::unique_ptr<FrameLengthController> controller(
new FrameLengthController(FrameLengthController::Config(
encoder_frame_lengths_ms, initial_frame_length_ms,
+ kMinEncoderBitrateBps, kPreventOveruseMarginBps,
kFlIncreasingPacketLossFraction, kFlDecreasingPacketLossFraction,
frame_length_change_criteria)));
@@ -68,7 +77,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 +92,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 +114,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 +124,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,10 +153,20 @@ 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);
}
+TEST(FrameLengthControllerTest, Maintain60MsOnVeryLowUplinkBandwidth) {
+ auto controller =
+ CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
+ UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(20)),
+ rtc::Optional<float>(kFlDecreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
+ CheckDecision(controller.get(), rtc::Optional<bool>(true), 60);
+}
+
TEST(FrameLengthControllerTest, IncreaseTo60MsOnMultipleConditions) {
// Increase to 60ms frame length if
// 1. |uplink_bandwidth_bps| is known to be smaller than a threshold AND
@@ -151,7 +177,8 @@ 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);
}
@@ -182,7 +209,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 +219,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 +231,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,16 +243,28 @@ 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);
}
+TEST(FrameLengthControllerTest,
+ From20MsTo60MsOnHighUplinkPacketLossFractionAndVeryLowUplinkBandwidth) {
minyue-webrtc 2017/02/21 10:41:24 I think we can remove move the test closer to "Inc
michaelt 2017/02/21 15:56:41 Done.
+ auto controller =
+ CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
+ 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, Maintain60MsWhenNo120msCriteriaIsSet) {
auto controller =
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 +272,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 +288,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 +306,28 @@ TEST(FrameLengthControllerTest, From120MsTo20MsWhenFecIsOn) {
CheckDecision(controller.get(), rtc::Optional<bool>(true), 20);
}
+TEST(FrameLengthControllerTest,
+ From120MsTo60MsWhenFecIsOnAndVeryLowUplinkBandwidth) {
minyue-webrtc 2017/02/21 10:41:24 this is somehow missleading, since very low bitrat
michaelt 2017/02/21 15:56:41 Changed according to offline discussion.
+ auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
+ {20, 60, 120}, 120);
+ UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(20)),
+ rtc::Optional<float>(kFlDecreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
+ CheckDecision(controller.get(), rtc::Optional<bool>(true), 60);
+ CheckDecision(controller.get(), rtc::Optional<bool>(true), 60);
+}
+
+TEST(FrameLengthControllerTest,
+ From20MsTo60MsWhenFecIsOnAndVeryLowUplinkBandwidth) {
minyue-webrtc 2017/02/21 10:41:24 This is sort of tested, hasn't it. I think we wou
michaelt 2017/02/21 15:56:41 Changed according to offline discussion.
+ auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
+ {20, 60, 120}, 20);
+ UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(20)),
+ rtc::Optional<float>(kFlDecreasingPacketLossFraction),
+ rtc::Optional<size_t>(kOverheadBytesPerPacket));
+ CheckDecision(controller.get(), rtc::Optional<bool>(true), 60);
+ CheckDecision(controller.get(), rtc::Optional<bool>(true), 60);
+}
+
TEST(FrameLengthControllerTest, From20MsTo120MsOnMultipleConditions) {
// Increase to 120ms frame length if
// 1. |uplink_bandwidth_bps| is known to be smaller than a threshold AND
@@ -273,11 +339,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 +354,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 +369,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