• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 MODULES_CONGESTION_CONTROLLER_GOOG_CC_TRENDLINE_ESTIMATOR_H_
11 #define MODULES_CONGESTION_CONTROLLER_GOOG_CC_TRENDLINE_ESTIMATOR_H_
12 
13 #include <stddef.h>
14 #include <stdint.h>
15 
16 #include <deque>
17 #include <memory>
18 #include <utility>
19 
20 #include "api/field_trials_view.h"
21 #include "api/network_state_predictor.h"
22 #include "modules/congestion_controller/goog_cc/delay_increase_detector_interface.h"
23 #include "rtc_base/experiments/struct_parameters_parser.h"
24 
25 namespace webrtc {
26 
27 struct TrendlineEstimatorSettings {
28   static constexpr char kKey[] = "WebRTC-Bwe-TrendlineEstimatorSettings";
29   static constexpr unsigned kDefaultTrendlineWindowSize = 20;
30 
31   TrendlineEstimatorSettings() = delete;
32   explicit TrendlineEstimatorSettings(const FieldTrialsView* key_value_config);
33 
34   // Sort the packets in the window. Should be redundant,
35   // but then almost no cost.
36   bool enable_sort = false;
37 
38   // Cap the trendline slope based on the minimum delay seen
39   // in the beginning_packets and end_packets respectively.
40   bool enable_cap = false;
41   unsigned beginning_packets = 7;
42   unsigned end_packets = 7;
43   double cap_uncertainty = 0.0;
44 
45   // Size (in packets) of the window.
46   unsigned window_size = kDefaultTrendlineWindowSize;
47 
48   std::unique_ptr<StructParametersParser> Parser();
49 };
50 
51 class TrendlineEstimator : public DelayIncreaseDetectorInterface {
52  public:
53   TrendlineEstimator(const FieldTrialsView* key_value_config,
54                      NetworkStatePredictor* network_state_predictor);
55 
56   ~TrendlineEstimator() override;
57 
58   TrendlineEstimator(const TrendlineEstimator&) = delete;
59   TrendlineEstimator& operator=(const TrendlineEstimator&) = delete;
60 
61   // Update the estimator with a new sample. The deltas should represent deltas
62   // between timestamp groups as defined by the InterArrival class.
63   void Update(double recv_delta_ms,
64               double send_delta_ms,
65               int64_t send_time_ms,
66               int64_t arrival_time_ms,
67               size_t packet_size,
68               bool calculated_deltas) override;
69 
70   void UpdateTrendline(double recv_delta_ms,
71                        double send_delta_ms,
72                        int64_t send_time_ms,
73                        int64_t arrival_time_ms,
74                        size_t packet_size);
75 
76   BandwidthUsage State() const override;
77 
78   struct PacketTiming {
PacketTimingPacketTiming79     PacketTiming(double arrival_time_ms,
80                  double smoothed_delay_ms,
81                  double raw_delay_ms)
82         : arrival_time_ms(arrival_time_ms),
83           smoothed_delay_ms(smoothed_delay_ms),
84           raw_delay_ms(raw_delay_ms) {}
85     double arrival_time_ms;
86     double smoothed_delay_ms;
87     double raw_delay_ms;
88   };
89 
90  private:
91   friend class GoogCcStatePrinter;
92   void Detect(double trend, double ts_delta, int64_t now_ms);
93 
94   void UpdateThreshold(double modified_offset, int64_t now_ms);
95 
96   // Parameters.
97   TrendlineEstimatorSettings settings_;
98   const double smoothing_coef_;
99   const double threshold_gain_;
100   // Used by the existing threshold.
101   int num_of_deltas_;
102   // Keep the arrival times small by using the change from the first packet.
103   int64_t first_arrival_time_ms_;
104   // Exponential backoff filtering.
105   double accumulated_delay_;
106   double smoothed_delay_;
107   // Linear least squares regression.
108   std::deque<PacketTiming> delay_hist_;
109 
110   const double k_up_;
111   const double k_down_;
112   double overusing_time_threshold_;
113   double threshold_;
114   double prev_modified_trend_;
115   int64_t last_update_ms_;
116   double prev_trend_;
117   double time_over_using_;
118   int overuse_counter_;
119   BandwidthUsage hypothesis_;
120   BandwidthUsage hypothesis_predicted_;
121   NetworkStatePredictor* network_state_predictor_;
122 };
123 }  // namespace webrtc
124 
125 #endif  // MODULES_CONGESTION_CONTROLLER_GOOG_CC_TRENDLINE_ESTIMATOR_H_
126