send_side_bandwidth_estimation.h revision 006d93d3c679ffd15223c327d649066a72400639
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 *  FEC and NACK added bitrate is handled outside class
11 */
12
13#ifndef WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
14#define WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
15
16#include <deque>
17
18#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
19#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
20
21namespace webrtc {
22
23class RtcEventLog;
24
25class SendSideBandwidthEstimation {
26 public:
27  SendSideBandwidthEstimation();
28  virtual ~SendSideBandwidthEstimation();
29
30  void CurrentEstimate(int* bitrate, uint8_t* loss, int64_t* rtt) const;
31
32  // Call periodically to update estimate.
33  void UpdateEstimate(int64_t now_ms);
34
35  // Call when we receive a RTCP message with TMMBR or REMB.
36  void UpdateReceiverEstimate(int64_t now_ms, uint32_t bandwidth);
37
38  // Call when we receive a RTCP message with a ReceiveBlock.
39  void UpdateReceiverBlock(uint8_t fraction_loss,
40                           int64_t rtt,
41                           int number_of_packets,
42                           int64_t now_ms);
43
44  void SetSendBitrate(int bitrate);
45  void SetMinMaxBitrate(int min_bitrate, int max_bitrate);
46  int GetMinBitrate() const;
47
48  void SetEventLog(RtcEventLog* event_log);
49
50 private:
51  enum UmaState { kNoUpdate, kFirstDone, kDone };
52
53  bool IsInStartPhase(int64_t now_ms) const;
54
55  void UpdateUmaStats(int64_t now_ms, int64_t rtt, int lost_packets);
56
57  // Returns the input bitrate capped to the thresholds defined by the max,
58  // min and incoming bandwidth.
59  uint32_t CapBitrateToThresholds(int64_t now_ms, uint32_t bitrate);
60
61  // Updates history of min bitrates.
62  // After this method returns min_bitrate_history_.front().second contains the
63  // min bitrate used during last kBweIncreaseIntervalMs.
64  void UpdateMinHistory(int64_t now_ms);
65
66  std::deque<std::pair<int64_t, uint32_t> > min_bitrate_history_;
67
68  // incoming filters
69  int lost_packets_since_last_loss_update_Q8_;
70  int expected_packets_since_last_loss_update_;
71
72  uint32_t bitrate_;
73  uint32_t min_bitrate_configured_;
74  uint32_t max_bitrate_configured_;
75  int64_t last_low_bitrate_log_ms_;
76
77  bool has_decreased_since_last_fraction_loss_;
78  int64_t time_last_receiver_block_ms_;
79  uint8_t last_fraction_loss_;
80  int64_t last_round_trip_time_ms_;
81
82  uint32_t bwe_incoming_;
83  int64_t time_last_decrease_ms_;
84  int64_t first_report_time_ms_;
85  int initially_lost_packets_;
86  int bitrate_at_2_seconds_kbps_;
87  UmaState uma_update_state_;
88  std::vector<bool> rampup_uma_stats_updated_;
89  RtcEventLog* event_log_;
90};
91}  // namespace webrtc
92#endif  // WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
93