tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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