blob: bf740bc97198c401334de2481a7fbab76ad98839 [file] [log] [blame]
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +00001/*
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#ifndef MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
14#define MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000015
Yves Gerey988cc082018-10-23 12:03:01 +020016#include <stdint.h>
andresp@webrtc.org44caf012014-03-26 21:00:21 +000017#include <deque>
jbauchf91e6d02016-01-24 23:05:21 -080018#include <utility>
19#include <vector>
andresp@webrtc.org44caf012014-03-26 21:00:21 +000020
Sebastian Jansson7c1744d2018-10-08 11:00:50 +020021#include "absl/types/optional.h"
Yves Gerey988cc082018-10-23 12:03:01 +020022#include "api/transport/network_types.h"
23#include "api/units/data_rate.h"
24#include "api/units/time_delta.h"
25#include "api/units/timestamp.h"
Christoffer Rodbro3a837482018-11-19 15:30:23 +010026#include "modules/bitrate_controller/loss_based_bandwidth_estimation.h"
27#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
Sebastian Jansson2e068e82018-10-08 12:49:53 +020028#include "rtc_base/experiments/field_trial_parser.h"
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000029
30namespace webrtc {
terelius006d93d2015-11-05 12:02:15 -080031
32class RtcEventLog;
33
Sebastian Jansson57f3ad02018-11-23 14:49:18 +010034class LinkCapacityTracker {
35 public:
36 LinkCapacityTracker();
37 ~LinkCapacityTracker();
38 void OnOveruse(DataRate acknowledged_rate, Timestamp at_time);
39 void OnStartingRate(DataRate start_rate);
40 void OnRateUpdate(DataRate acknowledged, Timestamp at_time);
41 void OnRttBackoff(DataRate backoff_rate, Timestamp at_time);
42 DataRate estimate() const;
43
44 private:
45 FieldTrialParameter<TimeDelta> tracking_rate;
46 double capacity_estimate_bps_ = 0;
47 Timestamp last_link_capacity_update_ = Timestamp::MinusInfinity();
48};
49
Sebastian Jansson24643482018-11-14 14:19:45 +010050class RttBasedBackoff {
51 public:
52 RttBasedBackoff();
53 ~RttBasedBackoff();
54 void OnRouteChange();
55 void UpdatePropagationRtt(Timestamp at_time, TimeDelta propagation_rtt);
Christoffer Rodbro5f6abcf2019-02-08 11:00:10 +010056 TimeDelta CorrectedRtt(Timestamp at_time) const;
Sebastian Jansson24643482018-11-14 14:19:45 +010057
58 FieldTrialParameter<TimeDelta> rtt_limit_;
59 FieldTrialParameter<double> drop_fraction_;
60 FieldTrialParameter<TimeDelta> drop_interval_;
61 FieldTrialFlag persist_on_route_change_;
Christoffer Rodbro5f6abcf2019-02-08 11:00:10 +010062 FieldTrialParameter<bool> safe_timeout_;
Christoffer Rodbro8ea02382019-02-28 15:15:35 +010063 FieldTrialParameter<DataRate> bandwidth_floor_;
Sebastian Jansson24643482018-11-14 14:19:45 +010064
65 public:
66 Timestamp last_propagation_rtt_update_;
67 TimeDelta last_propagation_rtt_;
Christoffer Rodbro5f6abcf2019-02-08 11:00:10 +010068 Timestamp last_packet_sent_;
Sebastian Jansson2e068e82018-10-08 12:49:53 +020069};
70
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000071class SendSideBandwidthEstimation {
72 public:
ivoc14d5dbe2016-07-04 07:06:55 -070073 SendSideBandwidthEstimation() = delete;
74 explicit SendSideBandwidthEstimation(RtcEventLog* event_log);
Sebastian Jansson2e068e82018-10-08 12:49:53 +020075 ~SendSideBandwidthEstimation();
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000076
Sebastian Jansson24643482018-11-14 14:19:45 +010077 void OnRouteChange();
Stefan Holmere5904162015-03-26 11:11:06 +010078 void CurrentEstimate(int* bitrate, uint8_t* loss, int64_t* rtt) const;
Sebastian Jansson57f3ad02018-11-23 14:49:18 +010079 DataRate GetEstimatedLinkCapacity() const;
andresp@webrtc.org44caf012014-03-26 21:00:21 +000080 // Call periodically to update estimate.
Sebastian Jansson7c1744d2018-10-08 11:00:50 +020081 void UpdateEstimate(Timestamp at_time);
Christoffer Rodbro5f6abcf2019-02-08 11:00:10 +010082 void OnSentPacket(const SentPacket& sent_packet);
Sebastian Jansson24643482018-11-14 14:19:45 +010083 void UpdatePropagationRtt(Timestamp at_time, TimeDelta propagation_rtt);
andresp@webrtc.org44caf012014-03-26 21:00:21 +000084
andresp@webrtc.org07bc7342014-03-21 16:51:01 +000085 // Call when we receive a RTCP message with TMMBR or REMB.
Sebastian Jansson7c1744d2018-10-08 11:00:50 +020086 void UpdateReceiverEstimate(Timestamp at_time, DataRate bandwidth);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +000087
stefan32f81542016-01-20 07:13:58 -080088 // Call when a new delay-based estimate is available.
Sebastian Jansson7c1744d2018-10-08 11:00:50 +020089 void UpdateDelayBasedEstimate(Timestamp at_time, DataRate bitrate);
stefan32f81542016-01-20 07:13:58 -080090
andresp@webrtc.org07bc7342014-03-21 16:51:01 +000091 // Call when we receive a RTCP message with a ReceiveBlock.
92 void UpdateReceiverBlock(uint8_t fraction_loss,
Sebastian Jansson7c1744d2018-10-08 11:00:50 +020093 TimeDelta rtt_ms,
andresp@webrtc.org07bc7342014-03-21 16:51:01 +000094 int number_of_packets,
Sebastian Jansson7c1744d2018-10-08 11:00:50 +020095 Timestamp at_time);
andresp@webrtc.org07bc7342014-03-21 16:51:01 +000096
Sebastian Jansson439f0bc2018-02-20 10:46:39 +010097 // Call when we receive a RTCP message with a ReceiveBlock.
98 void UpdatePacketsLost(int packets_lost,
99 int number_of_packets,
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200100 Timestamp at_time);
Sebastian Jansson439f0bc2018-02-20 10:46:39 +0100101
102 // Call when we receive a RTCP message with a ReceiveBlock.
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200103 void UpdateRtt(TimeDelta rtt, Timestamp at_time);
Sebastian Jansson439f0bc2018-02-20 10:46:39 +0100104
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200105 void SetBitrates(absl::optional<DataRate> send_bitrate,
106 DataRate min_bitrate,
107 DataRate max_bitrate,
108 Timestamp at_time);
109 void SetSendBitrate(DataRate bitrate, Timestamp at_time);
110 void SetMinMaxBitrate(DataRate min_bitrate, DataRate max_bitrate);
Stefan Holmere5904162015-03-26 11:11:06 +0100111 int GetMinBitrate() const;
Sebastian Jansson57f3ad02018-11-23 14:49:18 +0100112 void SetAcknowledgedRate(absl::optional<DataRate> acknowledged_rate,
113 Timestamp at_time);
114 void IncomingPacketFeedbackVector(const TransportPacketsFeedback& report);
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000115
116 private:
stefan@webrtc.orgdb262472014-11-04 19:32:10 +0000117 enum UmaState { kNoUpdate, kFirstDone, kDone };
118
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200119 bool IsInStartPhase(Timestamp at_time) const;
stefan@webrtc.org548b2282014-11-03 14:42:43 +0000120
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200121 void UpdateUmaStatsPacketsLost(Timestamp at_time, int packets_lost);
stefan@webrtc.orgdb262472014-11-04 19:32:10 +0000122
andresp@webrtc.org44caf012014-03-26 21:00:21 +0000123 // Updates history of min bitrates.
124 // After this method returns min_bitrate_history_.front().second contains the
125 // min bitrate used during last kBweIncreaseIntervalMs.
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200126 void UpdateMinHistory(Timestamp at_time);
andresp@webrtc.org44caf012014-03-26 21:00:21 +0000127
Christoffer Rodbro3a837482018-11-19 15:30:23 +0100128 DataRate MaybeRampupOrBackoff(DataRate new_bitrate, Timestamp at_time);
129
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200130 // Cap |bitrate| to [min_bitrate_configured_, max_bitrate_configured_] and
131 // set |current_bitrate_| to the capped value and updates the event log.
132 void CapBitrateToThresholds(Timestamp at_time, DataRate bitrate);
philipel1b965312017-04-18 06:55:32 -0700133
Sebastian Jansson24643482018-11-14 14:19:45 +0100134 RttBasedBackoff rtt_backoff_;
Sebastian Jansson57f3ad02018-11-23 14:49:18 +0100135 LinkCapacityTracker link_capacity_;
Sebastian Jansson2e068e82018-10-08 12:49:53 +0200136
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200137 std::deque<std::pair<Timestamp, DataRate> > min_bitrate_history_;
andresp@webrtc.org44caf012014-03-26 21:00:21 +0000138
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000139 // incoming filters
Sebastian Jansson439f0bc2018-02-20 10:46:39 +0100140 int lost_packets_since_last_loss_update_;
pbosb7edb882015-10-22 08:52:20 -0700141 int expected_packets_since_last_loss_update_;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000142
Sebastian Jansson57f3ad02018-11-23 14:49:18 +0100143 absl::optional<DataRate> acknowledged_rate_;
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200144 DataRate current_bitrate_;
145 DataRate min_bitrate_configured_;
146 DataRate max_bitrate_configured_;
147 Timestamp last_low_bitrate_log_;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000148
pbosb7edb882015-10-22 08:52:20 -0700149 bool has_decreased_since_last_fraction_loss_;
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200150 Timestamp last_loss_feedback_;
151 Timestamp last_loss_packet_report_;
152 Timestamp last_timeout_;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000153 uint8_t last_fraction_loss_;
stefan3821ff82016-09-04 05:07:26 -0700154 uint8_t last_logged_fraction_loss_;
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200155 TimeDelta last_round_trip_time_;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000156
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200157 DataRate bwe_incoming_;
158 DataRate delay_based_bitrate_;
159 Timestamp time_last_decrease_;
160 Timestamp first_report_time_;
stefan@webrtc.org548b2282014-11-03 14:42:43 +0000161 int initially_lost_packets_;
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200162 DataRate bitrate_at_2_seconds_;
stefan@webrtc.orgdb262472014-11-04 19:32:10 +0000163 UmaState uma_update_state_;
Sebastian Jansson439f0bc2018-02-20 10:46:39 +0100164 UmaState uma_rtt_state_;
stefan@webrtc.org474e36e2015-01-19 15:44:47 +0000165 std::vector<bool> rampup_uma_stats_updated_;
terelius006d93d2015-11-05 12:02:15 -0800166 RtcEventLog* event_log_;
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200167 Timestamp last_rtc_event_log_;
Stefan Holmer52200d02016-09-20 14:14:23 +0200168 bool in_timeout_experiment_;
Stefan Holmer9c79ed92017-03-31 15:53:27 +0200169 float low_loss_threshold_;
170 float high_loss_threshold_;
Sebastian Jansson7c1744d2018-10-08 11:00:50 +0200171 DataRate bitrate_threshold_;
Christoffer Rodbro3a837482018-11-19 15:30:23 +0100172 LossBasedBandwidthEstimation loss_based_bandwidth_estimation_;
pwestin@webrtc.org1cd11622012-04-19 12:13:52 +0000173};
174} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200175#endif // MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_