LCOV - code coverage report
Current view: top level - media/webrtc/trunk/webrtc/modules/congestion_controller - congestion_controller.cc (source / functions) Hit Total Coverage
Test: output.info Lines: 0 197 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 37 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  *  Copyright (c) 2012 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 "webrtc/modules/congestion_controller/include/congestion_controller.h"
      12             : 
      13             : #include <algorithm>
      14             : #include <memory>
      15             : #include <vector>
      16             : 
      17             : #include "webrtc/base/checks.h"
      18             : #include "webrtc/base/logging.h"
      19             : #include "webrtc/base/rate_limiter.h"
      20             : #include "webrtc/base/socket.h"
      21             : #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
      22             : #include "webrtc/modules/congestion_controller/probe_controller.h"
      23             : #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
      24             : #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
      25             : #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h"
      26             : #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
      27             : 
      28             : namespace webrtc {
      29             : namespace {
      30             : 
      31             : static const uint32_t kTimeOffsetSwitchThreshold = 30;
      32             : static const int64_t kRetransmitWindowSizeMs = 500;
      33             : 
      34             : // Makes sure that the bitrate and the min, max values are in valid range.
      35           0 : static void ClampBitrates(int* bitrate_bps,
      36             :                           int* min_bitrate_bps,
      37             :                           int* max_bitrate_bps) {
      38             :   // TODO(holmer): We should make sure the default bitrates are set to 10 kbps,
      39             :   // and that we don't try to set the min bitrate to 0 from any applications.
      40             :   // The congestion controller should allow a min bitrate of 0.
      41           0 :   if (*min_bitrate_bps < congestion_controller::GetMinBitrateBps())
      42           0 :     *min_bitrate_bps = congestion_controller::GetMinBitrateBps();
      43           0 :   if (*max_bitrate_bps > 0)
      44           0 :     *max_bitrate_bps = std::max(*min_bitrate_bps, *max_bitrate_bps);
      45           0 :   if (*bitrate_bps > 0)
      46           0 :     *bitrate_bps = std::max(*min_bitrate_bps, *bitrate_bps);
      47           0 : }
      48             : 
      49             : class WrappingBitrateEstimator : public RemoteBitrateEstimator {
      50             :  public:
      51           0 :   WrappingBitrateEstimator(RemoteBitrateObserver* observer, Clock* clock)
      52           0 :       : observer_(observer),
      53             :         clock_(clock),
      54             :         crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
      55           0 :         rbe_(new RemoteBitrateEstimatorSingleStream(observer_, clock_)),
      56             :         using_absolute_send_time_(false),
      57             :         packets_since_absolute_send_time_(0),
      58           0 :         min_bitrate_bps_(congestion_controller::GetMinBitrateBps()) {}
      59             : 
      60           0 :   virtual ~WrappingBitrateEstimator() {}
      61             : 
      62           0 :   void IncomingPacket(int64_t arrival_time_ms,
      63             :                       size_t payload_size,
      64             :                       const RTPHeader& header) override {
      65           0 :     CriticalSectionScoped cs(crit_sect_.get());
      66           0 :     PickEstimatorFromHeader(header);
      67           0 :     rbe_->IncomingPacket(arrival_time_ms, payload_size, header);
      68           0 :   }
      69             : 
      70           0 :   void Process() override {
      71           0 :     CriticalSectionScoped cs(crit_sect_.get());
      72           0 :     rbe_->Process();
      73           0 :   }
      74             : 
      75           0 :   int64_t TimeUntilNextProcess() override {
      76           0 :     CriticalSectionScoped cs(crit_sect_.get());
      77           0 :     return rbe_->TimeUntilNextProcess();
      78             :   }
      79             : 
      80           0 :   void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override {
      81           0 :     CriticalSectionScoped cs(crit_sect_.get());
      82           0 :     rbe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
      83           0 :   }
      84             : 
      85           0 :   void RemoveStream(unsigned int ssrc) override {
      86           0 :     CriticalSectionScoped cs(crit_sect_.get());
      87           0 :     rbe_->RemoveStream(ssrc);
      88           0 :   }
      89             : 
      90           0 :   bool LatestEstimate(std::vector<unsigned int>* ssrcs,
      91             :                       unsigned int* bitrate_bps) const override {
      92           0 :     CriticalSectionScoped cs(crit_sect_.get());
      93           0 :     return rbe_->LatestEstimate(ssrcs, bitrate_bps);
      94             :   }
      95             : 
      96           0 :   void SetMinBitrate(int min_bitrate_bps) override {
      97           0 :     CriticalSectionScoped cs(crit_sect_.get());
      98           0 :     rbe_->SetMinBitrate(min_bitrate_bps);
      99           0 :     min_bitrate_bps_ = min_bitrate_bps;
     100           0 :   }
     101             : 
     102             :  private:
     103           0 :   void PickEstimatorFromHeader(const RTPHeader& header)
     104             :       EXCLUSIVE_LOCKS_REQUIRED(crit_sect_.get()) {
     105           0 :     if (header.extension.hasAbsoluteSendTime) {
     106             :       // If we see AST in header, switch RBE strategy immediately.
     107           0 :       if (!using_absolute_send_time_) {
     108           0 :         LOG(LS_INFO) <<
     109           0 :             "WrappingBitrateEstimator: Switching to absolute send time RBE.";
     110           0 :         using_absolute_send_time_ = true;
     111           0 :         PickEstimator();
     112             :       }
     113           0 :       packets_since_absolute_send_time_ = 0;
     114             :     } else {
     115             :       // When we don't see AST, wait for a few packets before going back to TOF.
     116           0 :       if (using_absolute_send_time_) {
     117           0 :         ++packets_since_absolute_send_time_;
     118           0 :         if (packets_since_absolute_send_time_ >= kTimeOffsetSwitchThreshold) {
     119           0 :           LOG(LS_INFO) << "WrappingBitrateEstimator: Switching to transmission "
     120           0 :                        << "time offset RBE.";
     121           0 :           using_absolute_send_time_ = false;
     122           0 :           PickEstimator();
     123             :         }
     124             :       }
     125             :     }
     126           0 :   }
     127             : 
     128             :   // Instantiate RBE for Time Offset or Absolute Send Time extensions.
     129           0 :   void PickEstimator() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_.get()) {
     130           0 :     if (using_absolute_send_time_) {
     131           0 :       rbe_.reset(new RemoteBitrateEstimatorAbsSendTime(observer_, clock_));
     132             :     } else {
     133           0 :       rbe_.reset(new RemoteBitrateEstimatorSingleStream(observer_, clock_));
     134             :     }
     135           0 :     rbe_->SetMinBitrate(min_bitrate_bps_);
     136           0 :   }
     137             : 
     138             :   RemoteBitrateObserver* observer_;
     139             :   Clock* const clock_;
     140             :   std::unique_ptr<CriticalSectionWrapper> crit_sect_;
     141             :   std::unique_ptr<RemoteBitrateEstimator> rbe_;
     142             :   bool using_absolute_send_time_;
     143             :   uint32_t packets_since_absolute_send_time_;
     144             :   int min_bitrate_bps_;
     145             : 
     146             :   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WrappingBitrateEstimator);
     147             : };
     148             : 
     149             : }  // namespace
     150             : 
     151           0 : CongestionController::CongestionController(
     152             :     Clock* clock,
     153             :     Observer* observer,
     154             :     RemoteBitrateObserver* remote_bitrate_observer,
     155             :     RtcEventLog* event_log,
     156           0 :     PacketRouter* packet_router)
     157             :     : CongestionController(
     158             :           clock,
     159             :           observer,
     160             :           remote_bitrate_observer,
     161             :           event_log,
     162             :           packet_router,
     163           0 :           std::unique_ptr<PacedSender>(new PacedSender(clock, packet_router))) {
     164           0 : }
     165             : 
     166           0 : CongestionController::CongestionController(
     167             :     Clock* clock,
     168             :     Observer* observer,
     169             :     RemoteBitrateObserver* remote_bitrate_observer,
     170             :     RtcEventLog* event_log,
     171             :     PacketRouter* packet_router,
     172           0 :     std::unique_ptr<PacedSender> pacer)
     173             :     : clock_(clock),
     174             :       observer_(observer),
     175             :       packet_router_(packet_router),
     176           0 :       pacer_(std::move(pacer)),
     177             :       remote_bitrate_estimator_(
     178           0 :           new WrappingBitrateEstimator(remote_bitrate_observer, clock_)),
     179             :       // Constructed last as this object calls the provided callback on
     180             :       // construction.
     181             :       bitrate_controller_(
     182           0 :           BitrateController::CreateBitrateController(clock_, event_log)),
     183           0 :       probe_controller_(new ProbeController(pacer_.get(), clock_)),
     184             :       retransmission_rate_limiter_(
     185           0 :           new RateLimiter(clock, kRetransmitWindowSizeMs)),
     186           0 :       remote_estimator_proxy_(clock_, packet_router_),
     187           0 :       transport_feedback_adapter_(clock_, bitrate_controller_.get()),
     188           0 :       min_bitrate_bps_(congestion_controller::GetMinBitrateBps()),
     189             :       max_bitrate_bps_(0),
     190             :       last_reported_bitrate_bps_(0),
     191             :       last_reported_fraction_loss_(0),
     192             :       last_reported_rtt_(0),
     193           0 :       network_state_(kNetworkUp) {
     194           0 :   transport_feedback_adapter_.InitBwe();
     195           0 :   transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_);
     196           0 : }
     197             : 
     198           0 : CongestionController::~CongestionController() {}
     199             : 
     200           0 : void CongestionController::OnReceivedPacket(int64_t arrival_time_ms,
     201             :                                             size_t payload_size,
     202             :                                             const RTPHeader& header) {
     203             :   // Send-side BWE.
     204           0 :   if (header.extension.hasTransportSequenceNumber) {
     205           0 :     remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size,
     206           0 :                                            header);
     207           0 :     return;
     208             :   }
     209             : 
     210             :   // Receive-side BWE.
     211           0 :   if (remote_bitrate_estimator_) {
     212           0 :     remote_bitrate_estimator_->IncomingPacket(arrival_time_ms, payload_size,
     213           0 :                                               header);
     214             :   }
     215             : }
     216             : 
     217           0 : void CongestionController::SetBweBitrates(int min_bitrate_bps,
     218             :                                           int start_bitrate_bps,
     219             :                                           int max_bitrate_bps) {
     220           0 :   ClampBitrates(&start_bitrate_bps, &min_bitrate_bps, &max_bitrate_bps);
     221           0 :   bitrate_controller_->SetBitrates(start_bitrate_bps,
     222             :                                    min_bitrate_bps,
     223           0 :                                    max_bitrate_bps);
     224             : 
     225           0 :   probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps,
     226           0 :                                  max_bitrate_bps);
     227           0 :   max_bitrate_bps_ = max_bitrate_bps;
     228             : 
     229           0 :   if (remote_bitrate_estimator_)
     230           0 :     remote_bitrate_estimator_->SetMinBitrate(min_bitrate_bps);
     231           0 :   min_bitrate_bps_ = min_bitrate_bps;
     232           0 :   transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_);
     233           0 :   MaybeTriggerOnNetworkChanged();
     234           0 : }
     235             : 
     236           0 : void CongestionController::ResetBweAndBitrates(int bitrate_bps,
     237             :                                                int min_bitrate_bps,
     238             :                                                int max_bitrate_bps) {
     239           0 :   ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps);
     240             :   // TODO(honghaiz): Recreate this object once the bitrate controller is
     241             :   // no longer exposed outside CongestionController.
     242           0 :   bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps,
     243           0 :                                      max_bitrate_bps);
     244           0 :   min_bitrate_bps_ = min_bitrate_bps;
     245           0 :   max_bitrate_bps_ = max_bitrate_bps;
     246             :   // TODO(honghaiz): Recreate this object once the remote bitrate estimator is
     247             :   // no longer exposed outside CongestionController.
     248           0 :   if (remote_bitrate_estimator_)
     249           0 :     remote_bitrate_estimator_->SetMinBitrate(min_bitrate_bps);
     250             : 
     251           0 :   transport_feedback_adapter_.InitBwe();
     252           0 :   transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps);
     253             :   // TODO(holmer): Trigger a new probe once mid-call probing is implemented.
     254           0 :   MaybeTriggerOnNetworkChanged();
     255           0 : }
     256             : 
     257           0 : BitrateController* CongestionController::GetBitrateController() const {
     258           0 :   return bitrate_controller_.get();
     259             : }
     260             : 
     261           0 : RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator(
     262             :     bool send_side_bwe) {
     263           0 :   if (send_side_bwe) {
     264           0 :     return &remote_estimator_proxy_;
     265             :   } else {
     266           0 :     return remote_bitrate_estimator_.get();
     267             :   }
     268             : }
     269             : 
     270             : TransportFeedbackObserver*
     271           0 : CongestionController::GetTransportFeedbackObserver() {
     272           0 :   return &transport_feedback_adapter_;
     273             : }
     274             : 
     275           0 : RateLimiter* CongestionController::GetRetransmissionRateLimiter() {
     276           0 :   return retransmission_rate_limiter_.get();
     277             : }
     278             : 
     279           0 : void CongestionController::EnablePeriodicAlrProbing(bool enable) {
     280           0 :   probe_controller_->EnablePeriodicAlrProbing(enable);
     281           0 : }
     282             : 
     283           0 : void CongestionController::SetAllocatedSendBitrateLimits(
     284             :     int min_send_bitrate_bps,
     285             :     int max_padding_bitrate_bps) {
     286           0 :   pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
     287           0 : }
     288             : 
     289           0 : int64_t CongestionController::GetPacerQueuingDelayMs() const {
     290           0 :   return IsNetworkDown() ? 0 : pacer_->QueueInMs();
     291             : }
     292             : 
     293           0 : void CongestionController::SignalNetworkState(NetworkState state) {
     294           0 :   LOG(LS_INFO) << "SignalNetworkState "
     295           0 :                << (state == kNetworkUp ? "Up" : "Down");
     296           0 :   if (state == kNetworkUp) {
     297           0 :     pacer_->Resume();
     298             :   } else {
     299           0 :     pacer_->Pause();
     300             :   }
     301             :   {
     302           0 :     rtc::CritScope cs(&critsect_);
     303           0 :     network_state_ = state;
     304             :   }
     305           0 :   probe_controller_->OnNetworkStateChanged(state);
     306           0 :   MaybeTriggerOnNetworkChanged();
     307           0 : }
     308             : 
     309           0 : void CongestionController::SetTransportOverhead(
     310             :     size_t transport_overhead_bytes_per_packet) {
     311           0 :   transport_feedback_adapter_.SetTransportOverhead(
     312           0 :       transport_overhead_bytes_per_packet);
     313           0 : }
     314             : 
     315           0 : void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) {
     316             :   // We're not interested in packets without an id, which may be stun packets,
     317             :   // etc, sent on the same transport.
     318           0 :   if (sent_packet.packet_id == -1)
     319           0 :     return;
     320           0 :   transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id,
     321           0 :                                            sent_packet.send_time_ms);
     322             : }
     323             : 
     324           0 : void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
     325           0 :   remote_bitrate_estimator_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
     326           0 :   transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms);
     327           0 : }
     328             : 
     329           0 : int64_t CongestionController::TimeUntilNextProcess() {
     330           0 :   return std::min(bitrate_controller_->TimeUntilNextProcess(),
     331           0 :                   remote_bitrate_estimator_->TimeUntilNextProcess());
     332             : }
     333             : 
     334           0 : void CongestionController::Process() {
     335           0 :   bitrate_controller_->Process();
     336           0 :   remote_bitrate_estimator_->Process();
     337           0 :   probe_controller_->Process();
     338           0 :   MaybeTriggerOnNetworkChanged();
     339           0 : }
     340             : 
     341           0 : void CongestionController::MaybeTriggerOnNetworkChanged() {
     342             :   // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a
     343             :   // BitrateObserver is used. Remove this check once the ctor is removed.
     344           0 :   if (!observer_)
     345           0 :     return;
     346             : 
     347             :   uint32_t bitrate_bps;
     348             :   uint8_t fraction_loss;
     349             :   int64_t rtt;
     350           0 :   bool estimate_changed = bitrate_controller_->GetNetworkParameters(
     351           0 :       &bitrate_bps, &fraction_loss, &rtt);
     352           0 :   if (estimate_changed) {
     353           0 :     pacer_->SetEstimatedBitrate(bitrate_bps);
     354           0 :     probe_controller_->SetEstimatedBitrate(bitrate_bps);
     355           0 :     retransmission_rate_limiter_->SetMaxRate(bitrate_bps);
     356             :   }
     357             : 
     358           0 :   bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps;
     359             : 
     360           0 :   if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) {
     361           0 :     observer_->OnNetworkChanged(
     362             :         bitrate_bps, fraction_loss, rtt,
     363           0 :         transport_feedback_adapter_.GetProbingIntervalMs());
     364           0 :     remote_estimator_proxy_.OnBitrateChanged(bitrate_bps);
     365             :   }
     366             : }
     367             : 
     368           0 : bool CongestionController::HasNetworkParametersToReportChanged(
     369             :     uint32_t bitrate_bps,
     370             :     uint8_t fraction_loss,
     371             :     int64_t rtt) {
     372           0 :   rtc::CritScope cs(&critsect_);
     373             :   bool changed =
     374           0 :       last_reported_bitrate_bps_ != bitrate_bps ||
     375           0 :       (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss ||
     376           0 :                            last_reported_rtt_ != rtt));
     377           0 :   if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) {
     378           0 :     LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps
     379           0 :                  << " bps.";
     380             :   }
     381           0 :   last_reported_bitrate_bps_ = bitrate_bps;
     382           0 :   last_reported_fraction_loss_ = fraction_loss;
     383           0 :   last_reported_rtt_ = rtt;
     384           0 :   return changed;
     385             : }
     386             : 
     387           0 : bool CongestionController::IsSendQueueFull() const {
     388           0 :   return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs;
     389             : }
     390             : 
     391           0 : bool CongestionController::IsNetworkDown() const {
     392           0 :   rtc::CritScope cs(&critsect_);
     393           0 :   return network_state_ == kNetworkDown;
     394             : }
     395             : 
     396             : }  // namespace webrtc

Generated by: LCOV version 1.13