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); |
} |