• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_RTP_RTCP_SOURCE_OVERUSE_DETECTOR_H_
11 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_OVERUSE_DETECTOR_H_
12 
13 #include <list>
14 
15 #include "webrtc/modules/interface/module_common_types.h"
16 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
17 #include "webrtc/typedefs.h"
18 
19 namespace webrtc {
20 enum RateControlRegion;
21 
22 // This class is assumed to be protected by the owner if used by multiple
23 // threads.
24 class OveruseDetector {
25  public:
26   explicit OveruseDetector(const OverUseDetectorOptions& options);
27   ~OveruseDetector();
28   void Update(uint16_t packet_size,
29               int64_t timestamp_ms,
30               uint32_t rtp_timestamp,
31               int64_t arrival_time_ms);
32   BandwidthUsage State() const;
33   double NoiseVar() const;
34   void SetRateControlRegion(RateControlRegion region);
35 
36  private:
37   struct FrameSample {
FrameSampleFrameSample38     FrameSample()
39         : size(0),
40           complete_time_ms(-1),
41           timestamp(-1),
42           timestamp_ms(-1) {}
43 
44     uint32_t size;
45     int64_t complete_time_ms;
46     int64_t timestamp;
47     int64_t timestamp_ms;
48   };
49 
50   // Returns true if |timestamp| represent a time which is later than
51   // |prev_timestamp|.
52   static bool InOrderTimestamp(uint32_t timestamp, uint32_t prev_timestamp);
53 
54   bool PacketInOrder(uint32_t timestamp, int64_t timestamp_ms);
55 
56   // Prepares the overuse detector to start using timestamps in milliseconds
57   // instead of 90 kHz timestamps.
58   void SwitchTimeBase();
59 
60   void TimeDeltas(const FrameSample& current_frame,
61                   const FrameSample& prev_frame,
62                   int64_t* t_delta,
63                   double* ts_delta);
64   void UpdateKalman(int64_t t_delta,
65                     double ts_elta,
66                     uint32_t frame_size,
67                     uint32_t prev_frame_size);
68   double UpdateMinFramePeriod(double ts_delta);
69   void UpdateNoiseEstimate(double residual, double ts_delta, bool stable_state);
70   BandwidthUsage Detect(double ts_delta);
71   double CurrentDrift();
72 
73   OverUseDetectorOptions options_;  // Must be first member
74                                     // variable. Cannot be const
75                                     // because we need to be copyable.
76   FrameSample current_frame_;
77   FrameSample prev_frame_;
78   uint16_t num_of_deltas_;
79   double slope_;
80   double offset_;
81   double E_[2][2];
82   double process_noise_[2];
83   double avg_noise_;
84   double var_noise_;
85   double threshold_;
86   std::list<double> ts_delta_hist_;
87   double prev_offset_;
88   double time_over_using_;
89   uint16_t over_use_counter_;
90   BandwidthUsage hypothesis_;
91 };
92 }  // namespace webrtc
93 
94 #endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_OVERUSE_DETECTOR_H_
95