Index: webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc |
diff --git a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc |
index 2d256d49fc1f44d76fb56335b2ab6b179085645e..90e4094cb38e3eb4651a7396ce567ea40b1a10b3 100644 |
--- a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc |
+++ b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc |
@@ -389,7 +389,8 @@ JitterFilter::JitterFilter(PacketProcessorListener* listener, int flow_id) |
: PacketProcessor(listener, flow_id, kRegular), |
random_(0x89674523), |
stddev_jitter_us_(0), |
- last_send_time_us_(0) { |
+ last_send_time_us_(0), |
+ reordering_(false) { |
} |
JitterFilter::JitterFilter(PacketProcessorListener* listener, |
@@ -397,27 +398,62 @@ JitterFilter::JitterFilter(PacketProcessorListener* listener, |
: PacketProcessor(listener, flow_ids, kRegular), |
random_(0x89674523), |
stddev_jitter_us_(0), |
- last_send_time_us_(0) { |
+ last_send_time_us_(0), |
+ reordering_(false) { |
} |
-void JitterFilter::SetJitter(int64_t stddev_jitter_ms) { |
+const int kN = 3; // Truncated N sigma gaussian. |
+ |
+void JitterFilter::SetMaxJitter(int64_t max_jitter_ms) { |
BWE_TEST_LOGGING_ENABLE(false); |
- BWE_TEST_LOGGING_LOG1("Jitter", "%d ms", |
- static_cast<int>(stddev_jitter_ms)); |
- assert(stddev_jitter_ms >= 0); |
- stddev_jitter_us_ = stddev_jitter_ms * 1000; |
+ BWE_TEST_LOGGING_LOG1("Max Jitter", "%d ms", static_cast<int>(max_jitter_ms)); |
+ assert(max_jitter_ms >= 0); |
+ // Truncated gaussian, Max jitter = kN*sigma. |
+ stddev_jitter_us_ = (max_jitter_ms * 1000 + kN / 2) / kN; |
+} |
+ |
+namespace { |
+inline int64_t TruncatedNSigmaGaussian(Random* const random, |
+ int64_t mean, |
+ int64_t std_dev) { |
+ int64_t gaussian_random = random->Gaussian(mean, std_dev); |
+ return std::max(std::min(gaussian_random, kN * std_dev), -kN * std_dev); |
+} |
} |
void JitterFilter::RunFor(int64_t /*time_ms*/, Packets* in_out) { |
assert(in_out); |
for (Packet* packet : *in_out) { |
- int64_t new_send_time_us = packet->send_time_us(); |
- new_send_time_us += random_.Gaussian(0, stddev_jitter_us_); |
- last_send_time_us_ = std::max(last_send_time_us_, new_send_time_us); |
- packet->set_send_time_us(last_send_time_us_); |
+ int64_t jitter_us = |
+ std::abs(TruncatedNSigmaGaussian(&random_, 0, stddev_jitter_us_)); |
+ int64_t new_send_time_us = packet->send_time_us() + jitter_us; |
+ |
+ if (!reordering_) { |
+ new_send_time_us = std::max(last_send_time_us_, new_send_time_us); |
+ } |
+ |
+ // Receiver timestamp cannot be lower than sender timestamp. |
+ assert(new_send_time_us >= packet->sender_timestamp_us()); |
+ |
+ packet->set_send_time_us(new_send_time_us); |
+ last_send_time_us_ = new_send_time_us; |
} |
} |
+// Computes the expected value for a right sided (abs) truncated gaussian. |
+// Does not take into account possible reoerdering updates. |
+int64_t JitterFilter::MeanUs() { |
+ const double kPi = 3.1415926535897932; |
+ double max_jitter_us = static_cast<double>(kN * stddev_jitter_us_); |
+ double right_sided_mean_us = |
+ static_cast<double>(stddev_jitter_us_) / sqrt(kPi / 2.0); |
+ double truncated_mean_us = |
+ right_sided_mean_us * |
+ (1.0 - exp(-pow(static_cast<double>(kN), 2.0) / 2.0)) + |
+ max_jitter_us * erfc(static_cast<double>(kN)); |
+ return static_cast<int64_t>(truncated_mean_us + 0.5); |
+} |
+ |
ReorderFilter::ReorderFilter(PacketProcessorListener* listener, int flow_id) |
: PacketProcessor(listener, flow_id, kRegular), |
random_(0x27452389), |