remb_throttler.cc (2332B)
1 /* 2 * Copyright (c) 2021 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 #include "modules/congestion_controller/remb_throttler.h" 12 13 #include <algorithm> 14 #include <cstdint> 15 #include <utility> 16 #include <vector> 17 18 #include "api/units/data_rate.h" 19 #include "api/units/time_delta.h" 20 #include "api/units/timestamp.h" 21 #include "rtc_base/synchronization/mutex.h" 22 #include "system_wrappers/include/clock.h" 23 24 namespace webrtc { 25 26 namespace { 27 constexpr TimeDelta kRembSendInterval = TimeDelta::Millis(200); 28 } // namespace 29 30 RembThrottler::RembThrottler(RembSender remb_sender, Clock* clock) 31 : remb_sender_(std::move(remb_sender)), 32 clock_(clock), 33 last_remb_time_(Timestamp::MinusInfinity()), 34 last_send_remb_bitrate_(DataRate::PlusInfinity()), 35 max_remb_bitrate_(DataRate::PlusInfinity()) {} 36 37 void RembThrottler::OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs, 38 uint32_t bitrate_bps) { 39 DataRate receive_bitrate = DataRate::BitsPerSec(bitrate_bps); 40 Timestamp now = clock_->CurrentTime(); 41 { 42 MutexLock lock(&mutex_); 43 // % threshold for if we should send a new REMB asap. 44 const int64_t kSendThresholdPercent = 103; 45 if (receive_bitrate * kSendThresholdPercent / 100 > 46 last_send_remb_bitrate_ && 47 now < last_remb_time_ + kRembSendInterval) { 48 return; 49 } 50 last_remb_time_ = now; 51 last_send_remb_bitrate_ = receive_bitrate; 52 receive_bitrate = std::min(last_send_remb_bitrate_, max_remb_bitrate_); 53 } 54 remb_sender_(receive_bitrate.bps(), ssrcs); 55 } 56 57 void RembThrottler::SetMaxDesiredReceiveBitrate(DataRate bitrate) { 58 Timestamp now = clock_->CurrentTime(); 59 { 60 MutexLock lock(&mutex_); 61 max_remb_bitrate_ = bitrate; 62 if (now - last_remb_time_ < kRembSendInterval && 63 !last_send_remb_bitrate_.IsZero() && 64 last_send_remb_bitrate_ <= max_remb_bitrate_) { 65 return; 66 } 67 } 68 remb_sender_(bitrate.bps(), /*ssrcs=*/{}); 69 } 70 71 } // namespace webrtc