blob: 73c4e41f63ca129a71ba96c88e2a5411958e0bae [file] [log] [blame]
Sebastian Janssondf023aa2018-02-20 19:38:37 +01001/*
2 * Copyright (c) 2018 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 CALL_RTP_BITRATE_CONFIGURATOR_H_
12#define CALL_RTP_BITRATE_CONFIGURATOR_H_
13
Yves Gerey3e707812018-11-28 16:47:49 +010014#include "absl/types/optional.h"
Niels Möller0c4f7be2018-05-07 14:01:37 +020015#include "api/transport/bitrate_settings.h"
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +010016#include "api/units/data_rate.h"
Steve Anton10542f22019-01-11 09:11:00 -080017#include "rtc_base/constructor_magic.h"
Sebastian Janssondf023aa2018-02-20 19:38:37 +010018
19namespace webrtc {
20
21// RtpBitrateConfigurator calculates the bitrate configuration based on received
22// remote configuration combined with local overrides.
23class RtpBitrateConfigurator {
24 public:
25 explicit RtpBitrateConfigurator(const BitrateConstraints& bitrate_config);
26 ~RtpBitrateConfigurator();
27 BitrateConstraints GetConfig() const;
28
Sebastian Jansson8f83b422018-02-21 13:07:13 +010029 // The greater min and smaller max set by this and SetClientBitratePreferences
30 // will be used. The latest non-negative start value from either call will be
31 // used. Specifying a start bitrate (>0) will reset the current bitrate
32 // estimate. This is due to how the 'x-google-start-bitrate' flag is currently
Sebastian Janssondf023aa2018-02-20 19:38:37 +010033 // implemented. Passing -1 leaves the start bitrate unchanged. Behavior is not
34 // guaranteed for other negative values or 0.
35 // The optional return value is set with new configuration if it was updated.
Danil Chapovalovb9b146c2018-06-15 12:28:07 +020036 absl::optional<BitrateConstraints> UpdateWithSdpParameters(
Sebastian Janssondf023aa2018-02-20 19:38:37 +010037 const BitrateConstraints& bitrate_config_);
38
Sebastian Jansson8f83b422018-02-21 13:07:13 +010039 // The greater min and smaller max set by this and SetSdpBitrateParameters
40 // will be used. The latest non-negative start value form either call will be
41 // used. Specifying a start bitrate will reset the current bitrate estimate.
Sebastian Janssondf023aa2018-02-20 19:38:37 +010042 // Assumes 0 <= min <= start <= max holds for set parameters.
43 // Update the bitrate configuration
44 // The optional return value is set with new configuration if it was updated.
Danil Chapovalovb9b146c2018-06-15 12:28:07 +020045 absl::optional<BitrateConstraints> UpdateWithClientPreferences(
Niels Möller0c4f7be2018-05-07 14:01:37 +020046 const BitrateSettings& bitrate_mask);
Sebastian Janssondf023aa2018-02-20 19:38:37 +010047
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +010048 // Apply a cap for relayed calls.
49 absl::optional<BitrateConstraints> UpdateWithRelayCap(DataRate cap);
50
Sebastian Janssondf023aa2018-02-20 19:38:37 +010051 private:
52 // Applies update to the BitrateConstraints cached in |config_|, resetting
53 // with |new_start| if set.
Danil Chapovalovb9b146c2018-06-15 12:28:07 +020054 absl::optional<BitrateConstraints> UpdateConstraints(
55 const absl::optional<int>& new_start);
Sebastian Janssondf023aa2018-02-20 19:38:37 +010056
57 // Bitrate config used until valid bitrate estimates are calculated. Also
58 // used to cap total bitrate used. This comes from the remote connection.
59 BitrateConstraints bitrate_config_;
60
Sebastian Jansson8f83b422018-02-21 13:07:13 +010061 // The config mask set by SetClientBitratePreferences.
Sebastian Janssondf023aa2018-02-20 19:38:37 +010062 // 0 <= min <= start <= max
Niels Möller0c4f7be2018-05-07 14:01:37 +020063 BitrateSettings bitrate_config_mask_;
Sebastian Janssondf023aa2018-02-20 19:38:37 +010064
Sebastian Jansson8f83b422018-02-21 13:07:13 +010065 // The config set by SetSdpBitrateParameters.
Sebastian Janssondf023aa2018-02-20 19:38:37 +010066 // min >= 0, start != 0, max == -1 || max > 0
67 BitrateConstraints base_bitrate_config_;
68
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +010069 // Bandwidth cap applied for relayed calls.
70 DataRate max_bitrate_over_relay_ = DataRate::PlusInfinity();
71
Sebastian Janssondf023aa2018-02-20 19:38:37 +010072 RTC_DISALLOW_COPY_AND_ASSIGN(RtpBitrateConfigurator);
73};
74} // namespace webrtc
75
76#endif // CALL_RTP_BITRATE_CONFIGURATOR_H_