blob: 7ca9b7d072beaf60fc3d6d202a191d5b3eb39136 [file] [log] [blame]
tereliusafaef8b2016-11-17 03:48:18 -08001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10#ifndef WEBRTC_MODULES_CONGESTION_CONTROLLER_TRENDLINE_ESTIMATOR_H_
11#define WEBRTC_MODULES_CONGESTION_CONTROLLER_TRENDLINE_ESTIMATOR_H_
12
tereliusb3564ad2016-12-15 08:20:25 -080013#include <stddef.h>
14#include <stdint.h>
15
tereliusafaef8b2016-11-17 03:48:18 -080016#include <list>
17#include <utility>
18
19#include "webrtc/base/constructormagic.h"
tereliusafaef8b2016-11-17 03:48:18 -080020
21namespace webrtc {
22
23class TrendlineEstimator {
24 public:
25 // |window_size| is the number of points required to compute a trend line.
26 // |smoothing_coef| controls how much we smooth out the delay before fitting
27 // the trend line. |threshold_gain| is used to scale the trendline slope for
28 // comparison to the old threshold. Once the old estimator has been removed
29 // (or the thresholds been merged into the estimators), we can just set the
30 // threshold instead of setting a gain.
31 TrendlineEstimator(size_t window_size,
32 double smoothing_coef,
33 double threshold_gain);
34 ~TrendlineEstimator();
35
36 // Update the estimator with a new sample. The deltas should represent deltas
37 // between timestamp groups as defined by the InterArrival class.
tereliusb3564ad2016-12-15 08:20:25 -080038 void Update(double recv_delta_ms,
39 double send_delta_ms,
40 int64_t arrival_time_ms);
tereliusafaef8b2016-11-17 03:48:18 -080041
42 // Returns the estimated trend k multiplied by some gain.
43 // 0 < k < 1 -> the delay increases, queues are filling up
44 // k == 0 -> the delay does not change
45 // k < 0 -> the delay decreases, queues are being emptied
46 double trendline_slope() const { return trendline_ * threshold_gain_; }
47
48 // Returns the number of deltas which the current estimator state is based on.
49 unsigned int num_of_deltas() const { return num_of_deltas_; }
50
51 private:
52 // Parameters.
53 const size_t window_size_;
54 const double smoothing_coef_;
55 const double threshold_gain_;
56 // Used by the existing threshold.
57 unsigned int num_of_deltas_;
tereliusb3564ad2016-12-15 08:20:25 -080058 // Keep the arrival times small by using the change from the first packet.
59 int64_t first_arrival_time_ms;
tereliusafaef8b2016-11-17 03:48:18 -080060 // Exponential backoff filtering.
61 double accumulated_delay_;
62 double smoothed_delay_;
63 // Linear least squares regression.
64 std::list<std::pair<double, double>> delay_hist_;
65 double trendline_;
66
67 RTC_DISALLOW_COPY_AND_ASSIGN(TrendlineEstimator);
68};
69} // namespace webrtc
70
71#endif // WEBRTC_MODULES_CONGESTION_CONTROLLER_TRENDLINE_ESTIMATOR_H_