1 /*
2  *  Copyright (c) 2012 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_REMOTE_BITRATE_ESTIMATOR_OVERUSE_DETECTOR_H_
11 #define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_OVERUSE_DETECTOR_H_
12 
13 #include <list>
14 
15 #include "webrtc/base/constructormagic.h"
16 #include "webrtc/modules/include/module_common_types.h"
17 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
18 #include "webrtc/typedefs.h"
19 
20 namespace webrtc {
21 enum RateControlRegion;
22 
23 bool AdaptiveThresholdExperimentIsEnabled();
24 
25 class OveruseDetector {
26  public:
27   explicit OveruseDetector(const OverUseDetectorOptions& options);
28   virtual ~OveruseDetector();
29 
30   // Update the detection state based on the estimated inter-arrival time delta
31   // offset. |timestamp_delta| is the delta between the last timestamp which the
32   // estimated offset is based on and the last timestamp on which the last
33   // offset was based on, representing the time between detector updates.
34   // |num_of_deltas| is the number of deltas the offset estimate is based on.
35   // Returns the state after the detection update.
36   BandwidthUsage Detect(double offset,
37                         double timestamp_delta,
38                         int num_of_deltas,
39                         int64_t now_ms);
40 
41   // Returns the current detector state.
42   BandwidthUsage State() const;
43 
44  private:
45   void UpdateThreshold(double modified_offset, int64_t now_ms);
46   void InitializeExperiment();
47 
48   const bool in_experiment_;
49   double k_up_;
50   double k_down_;
51   double overusing_time_threshold_;
52   // Must be first member variable. Cannot be const because we need to be
53   // copyable.
54   webrtc::OverUseDetectorOptions options_;
55   double threshold_;
56   int64_t last_update_ms_;
57   double prev_offset_;
58   double time_over_using_;
59   int overuse_counter_;
60   BandwidthUsage hypothesis_;
61 
62   RTC_DISALLOW_COPY_AND_ASSIGN(OveruseDetector);
63 };
64 }  // namespace webrtc
65 
66 #endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_OVERUSE_DETECTOR_H_
67