blob: 6aab54918cb09829b46c42b41c30929c8dca0757 [file] [log] [blame]
philipel863a8262016-06-17 09:21:34 -07001/*
2 * Copyright (c) 2016 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
11#ifndef WEBRTC_MODULES_CONGESTION_CONTROLLER_DELAY_BASED_BWE_H_
12#define WEBRTC_MODULES_CONGESTION_CONTROLLER_DELAY_BASED_BWE_H_
13
philipel863a8262016-06-17 09:21:34 -070014#include <memory>
Stefan Holmer492ee282016-10-27 17:19:20 +020015#include <utility>
philipel863a8262016-06-17 09:21:34 -070016#include <vector>
17
18#include "webrtc/base/checks.h"
19#include "webrtc/base/constructormagic.h"
philipel863a8262016-06-17 09:21:34 -070020#include "webrtc/base/rate_statistics.h"
21#include "webrtc/base/thread_checker.h"
philipel7522a282016-08-16 10:59:36 +020022#include "webrtc/modules/congestion_controller/probe_bitrate_estimator.h"
philipel863a8262016-06-17 09:21:34 -070023#include "webrtc/modules/remote_bitrate_estimator/aimd_rate_control.h"
24#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
25#include "webrtc/modules/remote_bitrate_estimator/inter_arrival.h"
26#include "webrtc/modules/remote_bitrate_estimator/overuse_detector.h"
27#include "webrtc/modules/remote_bitrate_estimator/overuse_estimator.h"
philipel863a8262016-06-17 09:21:34 -070028
29namespace webrtc {
30
Stefan Holmer280de9e2016-09-30 10:06:51 +020031class DelayBasedBwe {
philipel863a8262016-06-17 09:21:34 -070032 public:
Stefan Holmer280de9e2016-09-30 10:06:51 +020033 static const int64_t kStreamTimeOutMs = 2000;
34
35 struct Result {
36 Result() : updated(false), probe(false), target_bitrate_bps(0) {}
37 Result(bool probe, uint32_t target_bitrate_bps)
38 : updated(true), probe(probe), target_bitrate_bps(target_bitrate_bps) {}
39 bool updated;
40 bool probe;
41 uint32_t target_bitrate_bps;
42 };
43
44 explicit DelayBasedBwe(Clock* clock);
philipel863a8262016-06-17 09:21:34 -070045 virtual ~DelayBasedBwe() {}
46
Stefan Holmer280de9e2016-09-30 10:06:51 +020047 Result IncomingPacketFeedbackVector(
48 const std::vector<PacketInfo>& packet_feedback_vector);
49 void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms);
philipel7522a282016-08-16 10:59:36 +020050 bool LatestEstimate(std::vector<uint32_t>* ssrcs,
Stefan Holmer280de9e2016-09-30 10:06:51 +020051 uint32_t* bitrate_bps) const;
52 void SetMinBitrate(int min_bitrate_bps);
philipel863a8262016-06-17 09:21:34 -070053
philipel863a8262016-06-17 09:21:34 -070054 private:
Stefan Holmer492ee282016-10-27 17:19:20 +020055 // Computes a bayesian estimate of the throughput given acks containing
56 // the arrival time and payload size. Samples which are far from the current
57 // estimate or are based on few packets are given a smaller weight, as they
58 // are considered to be more likely to have been caused by, e.g., delay spikes
59 // unrelated to congestion.
60 class BitrateEstimator {
61 public:
62 BitrateEstimator();
63 void Update(int64_t now_ms, int bytes);
64 rtc::Optional<uint32_t> bitrate_bps() const;
65
66 private:
67 float UpdateWindow(int64_t now_ms, int bytes, int rate_window_ms);
68 int sum_;
69 int64_t current_win_ms_;
70 int64_t prev_time_ms_;
71 float bitrate_estimate_;
72 float bitrate_estimate_var_;
73 RateStatistics old_estimator_;
74 const bool in_experiment_;
75 };
76
Stefan Holmer280de9e2016-09-30 10:06:51 +020077 Result IncomingPacketInfo(const PacketInfo& info);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070078 // Updates the current remote rate estimate and returns true if a valid
79 // estimate exists.
80 bool UpdateEstimate(int64_t packet_arrival_time_ms,
81 int64_t now_ms,
Stefan Holmer492ee282016-10-27 17:19:20 +020082 rtc::Optional<uint32_t> acked_bitrate_bps,
Stefan Holmer280de9e2016-09-30 10:06:51 +020083 uint32_t* target_bitrate_bps);
philipel863a8262016-06-17 09:21:34 -070084
85 rtc::ThreadChecker network_thread_;
stefan5e12d362016-07-11 01:44:02 -070086 Clock* const clock_;
philipel863a8262016-06-17 09:21:34 -070087 std::unique_ptr<InterArrival> inter_arrival_;
88 std::unique_ptr<OveruseEstimator> estimator_;
89 OveruseDetector detector_;
Stefan Holmer492ee282016-10-27 17:19:20 +020090 BitrateEstimator receiver_incoming_bitrate_;
philipel863a8262016-06-17 09:21:34 -070091 int64_t last_update_ms_;
philipel7522a282016-08-16 10:59:36 +020092 int64_t last_seen_packet_ms_;
stefan64636dd2016-08-03 00:29:03 -070093 bool uma_recorded_;
terelius6ed592d2016-10-18 05:55:30 -070094 AimdRateControl rate_control_;
Stefan Holmer280de9e2016-09-30 10:06:51 +020095 ProbeBitrateEstimator probe_bitrate_estimator_;
philipel863a8262016-06-17 09:21:34 -070096
97 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DelayBasedBwe);
98};
99
100} // namespace webrtc
101
102#endif // WEBRTC_MODULES_CONGESTION_CONTROLLER_DELAY_BASED_BWE_H_