From 1069cac518d1accb782bcc15c9f0c797b69f0ebb Mon Sep 17 00:00:00 2001 From: stefan Date: Thu, 10 Mar 2016 05:13:21 -0800 Subject: [PATCH] Tune BWE to be a bit less sensitive to spurious delay events. Also fixes a bug where the over-use detector threshold can increase to its max if there has been a long time between two packets. BUG=webrtc:5646 Review URL: https://codereview.webrtc.org/1782003003 Cr-Commit-Position: refs/heads/master@{#11942} --- webrtc/common_types.h | 2 +- .../overuse_detector.cc | 4 +- .../overuse_detector_unittest.cc | 80 +++++++++---------- ...itrate_estimator_abs_send_time_unittest.cc | 6 +- ...itrate_estimator_single_stream_unittest.cc | 8 +- ...emote_bitrate_estimator_unittest_helper.cc | 2 +- 6 files changed, 52 insertions(+), 50 deletions(-) diff --git a/webrtc/common_types.h b/webrtc/common_types.h index 191d9aa6e0..e171e1bd8a 100644 --- a/webrtc/common_types.h +++ b/webrtc/common_types.h @@ -713,7 +713,7 @@ struct OverUseDetectorOptions { initial_e[1][1] = 1e-1; initial_e[0][1] = initial_e[1][0] = 0; initial_process_noise[0] = 1e-13; - initial_process_noise[1] = 1e-2; + initial_process_noise[1] = 1e-3; } double initial_slope; double initial_offset; diff --git a/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc b/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc index 042fe9aa2a..2f1ce36c30 100644 --- a/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc +++ b/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc @@ -142,8 +142,10 @@ void OveruseDetector::UpdateThreshold(double modified_offset, int64_t now_ms) { } const double k = fabs(modified_offset) < threshold_ ? k_down_ : k_up_; + const int64_t kMaxTimeDeltaMs = 100; + int64_t time_delta_ms = std::min(now_ms - last_update_ms_, kMaxTimeDeltaMs); threshold_ += - k * (fabs(modified_offset) - threshold_) * (now_ms - last_update_ms_); + k * (fabs(modified_offset) - threshold_) * time_delta_ms; const double kMinThreshold = 6; const double kMaxThreshold = 600; diff --git a/webrtc/modules/remote_bitrate_estimator/overuse_detector_unittest.cc b/webrtc/modules/remote_bitrate_estimator/overuse_detector_unittest.cc index dabc6551a0..d4e4edb29a 100644 --- a/webrtc/modules/remote_bitrate_estimator/overuse_detector_unittest.cc +++ b/webrtc/modules/remote_bitrate_estimator/overuse_detector_unittest.cc @@ -195,7 +195,7 @@ TEST_F(OveruseDetectorTest, SimpleOveruse2000Kbit30fps) { EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(5, frames_until_overuse); + EXPECT_EQ(7, frames_until_overuse); } TEST_F(OveruseDetectorTest, SimpleOveruse100kbit10fps) { @@ -210,7 +210,7 @@ TEST_F(OveruseDetectorTest, SimpleOveruse100kbit10fps) { EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(5, frames_until_overuse); + EXPECT_EQ(7, frames_until_overuse); } TEST_F(OveruseDetectorTest, DISABLED_OveruseWithHighVariance100Kbit10fps) { @@ -331,10 +331,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance30Kbit3fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(56, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(430, frames_until_overuse); + EXPECT_EQ(21, frames_until_overuse); } TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift30Kbit3fps) { @@ -345,7 +345,7 @@ TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift30Kbit3fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(56, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); EXPECT_EQ(4, frames_until_overuse); @@ -359,10 +359,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVariance30Kbit3fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(77, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(430, frames_until_overuse); + EXPECT_EQ(44, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift30Kbit3fps) { @@ -373,7 +373,7 @@ TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift30Kbit3fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(77, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); EXPECT_EQ(4, frames_until_overuse); @@ -393,10 +393,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance100Kbit5fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(45, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(32, frames_until_overuse); + EXPECT_EQ(21, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -413,10 +413,10 @@ TEST_F(OveruseDetectorTest, MAYBE_HighGaussianVariance100Kbit5fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(70, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(32, frames_until_overuse); + EXPECT_EQ(44, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -433,10 +433,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance100Kbit10fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(33, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(13, frames_until_overuse); + EXPECT_EQ(21, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -453,10 +453,10 @@ TEST_F(OveruseDetectorTest, MAYBE_HighGaussianVariance100Kbit10fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(45, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(31, frames_until_overuse); + EXPECT_EQ(44, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -473,10 +473,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance300Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(25, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(13, frames_until_overuse); + EXPECT_EQ(19, frames_until_overuse); } TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift300Kbit30fps) { @@ -487,10 +487,10 @@ TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift300Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(25, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(4, frames_until_overuse); + EXPECT_EQ(5, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVariance300Kbit30fps) { @@ -501,10 +501,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVariance300Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(46, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(31, frames_until_overuse); + EXPECT_EQ(44, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift300Kbit30fps) { @@ -515,10 +515,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift300Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(46, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(6, frames_until_overuse); + EXPECT_EQ(10, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -535,10 +535,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance1000Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(25, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(13, frames_until_overuse); + EXPECT_EQ(19, frames_until_overuse); } TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift1000Kbit30fps) { @@ -549,10 +549,10 @@ TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift1000Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(25, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(4, frames_until_overuse); + EXPECT_EQ(5, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVariance1000Kbit30fps) { @@ -563,10 +563,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVariance1000Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(45, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(31, frames_until_overuse); + EXPECT_EQ(44, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift1000Kbit30fps) { @@ -577,10 +577,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift1000Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(45, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(6, frames_until_overuse); + EXPECT_EQ(10, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -597,10 +597,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance2000Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(25, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(13, frames_until_overuse); + EXPECT_EQ(19, frames_until_overuse); } TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift2000Kbit30fps) { @@ -611,10 +611,10 @@ TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift2000Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(25, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(4, frames_until_overuse); + EXPECT_EQ(5, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVariance2000Kbit30fps) { @@ -625,10 +625,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVariance2000Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(45, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(31, frames_until_overuse); + EXPECT_EQ(44, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift2000Kbit30fps) { @@ -639,10 +639,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift2000Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(45, unique_overuse); + EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(6, frames_until_overuse); + EXPECT_EQ(10, frames_until_overuse); } class OveruseDetectorExperimentTest : public OveruseDetectorTest { diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc index 7d39b03666..e8026a5764 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc @@ -39,11 +39,11 @@ TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, RateIncreaseRtpTimestamps) { } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropOneStream) { - CapacityDropTestHelper(1, false, 700); + CapacityDropTestHelper(1, false, 633); } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropOneStreamWrap) { - CapacityDropTestHelper(1, true, 700); + CapacityDropTestHelper(1, true, 633); } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropTwoStreamsWrap) { @@ -55,7 +55,7 @@ TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropThreeStreamsWrap) { } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropThirteenStreamsWrap) { - CapacityDropTestHelper(13, true, 700); + CapacityDropTestHelper(13, true, 667); } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropNineteenStreamsWrap) { diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc index 4bf4267f73..6fd0ad11b5 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc @@ -39,11 +39,11 @@ TEST_F(RemoteBitrateEstimatorSingleTest, RateIncreaseRtpTimestamps) { } TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropOneStream) { - CapacityDropTestHelper(1, false, 600); + CapacityDropTestHelper(1, false, 633); } TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropOneStreamWrap) { - CapacityDropTestHelper(1, true, 600); + CapacityDropTestHelper(1, true, 633); } TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropTwoStreamsWrap) { @@ -55,7 +55,7 @@ TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropThreeStreamsWrap) { } TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropThirteenStreamsWrap) { - CapacityDropTestHelper(13, true, 700); + CapacityDropTestHelper(13, true, 733); } TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropNineteenStreamsWrap) { @@ -63,7 +63,7 @@ TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropNineteenStreamsWrap) { } TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropThirtyStreamsWrap) { - CapacityDropTestHelper(30, true, 700); + CapacityDropTestHelper(30, true, 733); } TEST_F(RemoteBitrateEstimatorSingleTest, TestTimestampGrouping) { diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc index 41576516db..8bfb8ed0fd 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc @@ -583,7 +583,7 @@ void RemoteBitrateEstimatorTest::TestWrappingHelper( absolute_send_time = AddAbsSendTime(absolute_send_time, AbsSendTime(silence_time_s, 1)); bitrate_estimator_->Process(); - for (size_t i = 0; i < 100; ++i) { + for (size_t i = 0; i < 10; ++i) { IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp, absolute_send_time, true); timestamp += kFrameIntervalMs;