OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright (c) 2017 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/receive_side_congestion_c
ontroller.h" |
| 12 |
| 13 #include "webrtc/base/logging.h" |
| 14 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_s
end_time.h" |
| 15 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl
e_stream.h" |
| 16 |
| 17 namespace webrtc { |
| 18 |
| 19 namespace { |
| 20 static const uint32_t kTimeOffsetSwitchThreshold = 30; |
| 21 } // namespace |
| 22 |
| 23 ReceiveSideCongestionController::WrappingBitrateEstimator:: |
| 24 WrappingBitrateEstimator(RemoteBitrateObserver* observer, |
| 25 const Clock* clock) |
| 26 : observer_(observer), |
| 27 clock_(clock), |
| 28 rbe_(new RemoteBitrateEstimatorSingleStream(observer_, clock_)), |
| 29 using_absolute_send_time_(false), |
| 30 packets_since_absolute_send_time_(0), |
| 31 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()) {} |
| 32 |
| 33 void ReceiveSideCongestionController::WrappingBitrateEstimator::IncomingPacket( |
| 34 int64_t arrival_time_ms, |
| 35 size_t payload_size, |
| 36 const RTPHeader& header) { |
| 37 rtc::CritScope cs(&crit_sect_); |
| 38 PickEstimatorFromHeader(header); |
| 39 rbe_->IncomingPacket(arrival_time_ms, payload_size, header); |
| 40 } |
| 41 |
| 42 void ReceiveSideCongestionController::WrappingBitrateEstimator::Process() { |
| 43 rtc::CritScope cs(&crit_sect_); |
| 44 rbe_->Process(); |
| 45 } |
| 46 |
| 47 int64_t ReceiveSideCongestionController::WrappingBitrateEstimator:: |
| 48 TimeUntilNextProcess() { |
| 49 rtc::CritScope cs(&crit_sect_); |
| 50 return rbe_->TimeUntilNextProcess(); |
| 51 } |
| 52 |
| 53 void ReceiveSideCongestionController::WrappingBitrateEstimator::OnRttUpdate( |
| 54 int64_t avg_rtt_ms, |
| 55 int64_t max_rtt_ms) { |
| 56 rtc::CritScope cs(&crit_sect_); |
| 57 rbe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
| 58 } |
| 59 |
| 60 void ReceiveSideCongestionController::WrappingBitrateEstimator::RemoveStream( |
| 61 unsigned int ssrc) { |
| 62 rtc::CritScope cs(&crit_sect_); |
| 63 rbe_->RemoveStream(ssrc); |
| 64 } |
| 65 |
| 66 bool ReceiveSideCongestionController::WrappingBitrateEstimator::LatestEstimate( |
| 67 std::vector<unsigned int>* ssrcs, |
| 68 unsigned int* bitrate_bps) const { |
| 69 rtc::CritScope cs(&crit_sect_); |
| 70 return rbe_->LatestEstimate(ssrcs, bitrate_bps); |
| 71 } |
| 72 |
| 73 void ReceiveSideCongestionController::WrappingBitrateEstimator::SetMinBitrate( |
| 74 int min_bitrate_bps) { |
| 75 rtc::CritScope cs(&crit_sect_); |
| 76 rbe_->SetMinBitrate(min_bitrate_bps); |
| 77 min_bitrate_bps_ = min_bitrate_bps; |
| 78 } |
| 79 |
| 80 void ReceiveSideCongestionController::WrappingBitrateEstimator:: |
| 81 PickEstimatorFromHeader(const RTPHeader& header) { |
| 82 if (header.extension.hasAbsoluteSendTime) { |
| 83 // If we see AST in header, switch RBE strategy immediately. |
| 84 if (!using_absolute_send_time_) { |
| 85 LOG(LS_INFO) |
| 86 << "WrappingBitrateEstimator: Switching to absolute send time RBE."; |
| 87 using_absolute_send_time_ = true; |
| 88 PickEstimator(); |
| 89 } |
| 90 packets_since_absolute_send_time_ = 0; |
| 91 } else { |
| 92 // When we don't see AST, wait for a few packets before going back to TOF. |
| 93 if (using_absolute_send_time_) { |
| 94 ++packets_since_absolute_send_time_; |
| 95 if (packets_since_absolute_send_time_ >= kTimeOffsetSwitchThreshold) { |
| 96 LOG(LS_INFO) << "WrappingBitrateEstimator: Switching to transmission " |
| 97 << "time offset RBE."; |
| 98 using_absolute_send_time_ = false; |
| 99 PickEstimator(); |
| 100 } |
| 101 } |
| 102 } |
| 103 } |
| 104 |
| 105 // Instantiate RBE for Time Offset or Absolute Send Time extensions. |
| 106 void ReceiveSideCongestionController::WrappingBitrateEstimator:: |
| 107 PickEstimator() { |
| 108 if (using_absolute_send_time_) { |
| 109 rbe_.reset(new RemoteBitrateEstimatorAbsSendTime(observer_, clock_)); |
| 110 } else { |
| 111 rbe_.reset(new RemoteBitrateEstimatorSingleStream(observer_, clock_)); |
| 112 } |
| 113 rbe_->SetMinBitrate(min_bitrate_bps_); |
| 114 } |
| 115 |
| 116 ReceiveSideCongestionController::ReceiveSideCongestionController( |
| 117 const Clock* clock, |
| 118 RemoteBitrateObserver* remote_bitrate_observer, |
| 119 PacketRouter* packet_router) |
| 120 : remote_bitrate_estimator_(remote_bitrate_observer, clock), |
| 121 remote_estimator_proxy_(clock, packet_router) {} |
| 122 |
| 123 void ReceiveSideCongestionController::OnReceivedPacket( |
| 124 int64_t arrival_time_ms, |
| 125 size_t payload_size, |
| 126 const RTPHeader& header) { |
| 127 // Send-side BWE. |
| 128 if (header.extension.hasTransportSequenceNumber) { |
| 129 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, |
| 130 header); |
| 131 } else { |
| 132 // Receive-side BWE. |
| 133 remote_bitrate_estimator_.IncomingPacket(arrival_time_ms, payload_size, |
| 134 header); |
| 135 } |
| 136 } |
| 137 |
| 138 RemoteBitrateEstimator* |
| 139 ReceiveSideCongestionController::GetRemoteBitrateEstimator(bool send_side_bwe) { |
| 140 if (send_side_bwe) { |
| 141 return &remote_estimator_proxy_; |
| 142 } else { |
| 143 return &remote_bitrate_estimator_; |
| 144 } |
| 145 } |
| 146 |
| 147 const RemoteBitrateEstimator* |
| 148 ReceiveSideCongestionController::GetRemoteBitrateEstimator( |
| 149 bool send_side_bwe) const { |
| 150 if (send_side_bwe) { |
| 151 return &remote_estimator_proxy_; |
| 152 } else { |
| 153 return &remote_bitrate_estimator_; |
| 154 } |
| 155 } |
| 156 |
| 157 void ReceiveSideCongestionController::OnRttUpdate(int64_t avg_rtt_ms, |
| 158 int64_t max_rtt_ms) { |
| 159 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
| 160 } |
| 161 |
| 162 void ReceiveSideCongestionController::OnBitrateChanged(int bitrate_bps) { |
| 163 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); |
| 164 } |
| 165 |
| 166 int64_t ReceiveSideCongestionController::TimeUntilNextProcess() { |
| 167 return remote_bitrate_estimator_.TimeUntilNextProcess(); |
| 168 } |
| 169 |
| 170 void ReceiveSideCongestionController::Process() { |
| 171 remote_bitrate_estimator_.Process(); |
| 172 } |
| 173 |
| 174 } // namespace webrtc |
OLD | NEW |