/* * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef MODULES_CONGESTION_CONTROLLER_GOOG_CC_MEDIAN_SLOPE_ESTIMATOR_H_ #define MODULES_CONGESTION_CONTROLLER_GOOG_CC_MEDIAN_SLOPE_ESTIMATOR_H_ #include #include #include #include #include "rtc_base/constructormagic.h" #include "rtc_base/numerics/percentile_filter.h" namespace webrtc { namespace webrtc_cc { class MedianSlopeEstimator { public: // |window_size| is the number of points required to compute a trend line. // |threshold_gain| is used to scale the trendline slope for comparison to // the old threshold. Once the old estimator has been removed (or the // thresholds been merged into the estimators), we can just set the // threshold instead of setting a gain. MedianSlopeEstimator(size_t window_size, double threshold_gain); ~MedianSlopeEstimator(); // Update the estimator with a new sample. The deltas should represent deltas // between timestamp groups as defined by the InterArrival class. void Update(double recv_delta_ms, double send_delta_ms, int64_t arrival_time_ms); // Returns the estimated trend k multiplied by some gain. // 0 < k < 1 -> the delay increases, queues are filling up // k == 0 -> the delay does not change // k < 0 -> the delay decreases, queues are being emptied double trendline_slope() const { return trendline_ * threshold_gain_; } // Returns the number of deltas which the current estimator state is based on. unsigned int num_of_deltas() const { return num_of_deltas_; } private: struct DelayInfo { DelayInfo(int64_t time, double delay, size_t slope_count); ~DelayInfo(); int64_t time; double delay; std::vector slopes; }; // Parameters. const size_t window_size_; const double threshold_gain_; // Used by the existing threshold. unsigned int num_of_deltas_; // Theil-Sen robust line fitting double accumulated_delay_; std::deque delay_hist_; PercentileFilter median_filter_; double trendline_; RTC_DISALLOW_COPY_AND_ASSIGN(MedianSlopeEstimator); }; } // namespace webrtc_cc } // namespace webrtc #endif // MODULES_CONGESTION_CONTROLLER_GOOG_CC_MEDIAN_SLOPE_ESTIMATOR_H_