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