1 /* 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 14 #include "absl/types/optional.h" 15 #include "api/transport/bitrate_settings.h" 16 #include "api/units/data_rate.h" 17 #include "rtc_base/constructor_magic.h" 18 19 namespace webrtc { 20 21 // RtpBitrateConfigurator calculates the bitrate configuration based on received 22 // remote configuration combined with local overrides. 23 class RtpBitrateConfigurator { 24 public: 25 explicit RtpBitrateConfigurator(const BitrateConstraints& bitrate_config); 26 ~RtpBitrateConfigurator(); 27 BitrateConstraints GetConfig() const; 28 29 // 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 33 // 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. 36 absl::optional<BitrateConstraints> UpdateWithSdpParameters( 37 const BitrateConstraints& bitrate_config_); 38 39 // 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. 42 // 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. 45 absl::optional<BitrateConstraints> UpdateWithClientPreferences( 46 const BitrateSettings& bitrate_mask); 47 48 // Apply a cap for relayed calls. 49 absl::optional<BitrateConstraints> UpdateWithRelayCap(DataRate cap); 50 51 private: 52 // Applies update to the BitrateConstraints cached in |config_|, resetting 53 // with |new_start| if set. 54 absl::optional<BitrateConstraints> UpdateConstraints( 55 const absl::optional<int>& new_start); 56 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 61 // The config mask set by SetClientBitratePreferences. 62 // 0 <= min <= start <= max 63 BitrateSettings bitrate_config_mask_; 64 65 // The config set by SetSdpBitrateParameters. 66 // min >= 0, start != 0, max == -1 || max > 0 67 BitrateConstraints base_bitrate_config_; 68 69 // Bandwidth cap applied for relayed calls. 70 DataRate max_bitrate_over_relay_ = DataRate::PlusInfinity(); 71 72 RTC_DISALLOW_COPY_AND_ASSIGN(RtpBitrateConfigurator); 73 }; 74 } // namespace webrtc 75 76 #endif // CALL_RTP_BITRATE_CONFIGURATOR_H_ 77