OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 packet_router_(new PacketRouter()), | 144 packet_router_(new PacketRouter()), |
145 pacer_(new PacedSender(clock_, | 145 pacer_(new PacedSender(clock_, |
146 packet_router_.get())), | 146 packet_router_.get())), |
147 remote_bitrate_estimator_( | 147 remote_bitrate_estimator_( |
148 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), | 148 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), |
149 bitrate_controller_( | 149 bitrate_controller_( |
150 BitrateController::CreateBitrateController(clock_, bitrate_observer)), | 150 BitrateController::CreateBitrateController(clock_, bitrate_observer)), |
151 remote_estimator_proxy_(clock_, packet_router_.get()), | 151 remote_estimator_proxy_(clock_, packet_router_.get()), |
152 transport_feedback_adapter_(bitrate_controller_.get(), clock_), | 152 transport_feedback_adapter_(bitrate_controller_.get(), clock_), |
153 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), | 153 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), |
154 last_reported_bitrate_bps_(0), | 154 send_queue_is_full_(false) { |
155 last_reported_fraction_loss_(0), | |
156 last_reported_rtt_(0), | |
157 network_state_(kNetworkUp) { | |
158 Init(); | 155 Init(); |
159 } | 156 } |
160 | 157 |
161 CongestionController::CongestionController( | 158 CongestionController::CongestionController( |
162 Clock* clock, | 159 Clock* clock, |
163 Observer* observer, | 160 Observer* observer, |
164 RemoteBitrateObserver* remote_bitrate_observer) | 161 RemoteBitrateObserver* remote_bitrate_observer) |
165 : clock_(clock), | 162 : clock_(clock), |
166 observer_(observer), | 163 observer_(observer), |
167 packet_router_(new PacketRouter()), | 164 packet_router_(new PacketRouter()), |
168 pacer_(new PacedSender(clock_, | 165 pacer_(new PacedSender(clock_, |
169 packet_router_.get())), | 166 packet_router_.get())), |
170 remote_bitrate_estimator_( | 167 remote_bitrate_estimator_( |
171 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), | 168 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), |
172 bitrate_controller_(BitrateController::CreateBitrateController(clock_)), | 169 bitrate_controller_(BitrateController::CreateBitrateController(clock_)), |
173 remote_estimator_proxy_(clock_, packet_router_.get()), | 170 remote_estimator_proxy_(clock_, packet_router_.get()), |
174 transport_feedback_adapter_(bitrate_controller_.get(), clock_), | 171 transport_feedback_adapter_(bitrate_controller_.get(), clock_), |
175 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), | 172 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), |
176 last_reported_bitrate_bps_(0), | 173 send_queue_is_full_(false) { |
177 last_reported_fraction_loss_(0), | |
178 last_reported_rtt_(0), | |
179 network_state_(kNetworkUp) { | |
180 Init(); | 174 Init(); |
181 } | 175 } |
182 | 176 |
183 CongestionController::CongestionController( | 177 CongestionController::CongestionController( |
184 Clock* clock, | 178 Clock* clock, |
185 Observer* observer, | 179 Observer* observer, |
186 RemoteBitrateObserver* remote_bitrate_observer, | 180 RemoteBitrateObserver* remote_bitrate_observer, |
187 std::unique_ptr<PacketRouter> packet_router, | 181 std::unique_ptr<PacketRouter> packet_router, |
188 std::unique_ptr<PacedSender> pacer) | 182 std::unique_ptr<PacedSender> pacer) |
189 : clock_(clock), | 183 : clock_(clock), |
190 observer_(observer), | 184 observer_(observer), |
191 packet_router_(std::move(packet_router)), | 185 packet_router_(std::move(packet_router)), |
192 pacer_(std::move(pacer)), | 186 pacer_(std::move(pacer)), |
193 remote_bitrate_estimator_( | 187 remote_bitrate_estimator_( |
194 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), | 188 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), |
195 // Constructed last as this object calls the provided callback on | 189 // Constructed last as this object calls the provided callback on |
196 // construction. | 190 // construction. |
197 bitrate_controller_(BitrateController::CreateBitrateController(clock_)), | 191 bitrate_controller_(BitrateController::CreateBitrateController(clock_)), |
198 remote_estimator_proxy_(clock_, packet_router_.get()), | 192 remote_estimator_proxy_(clock_, packet_router_.get()), |
199 transport_feedback_adapter_(bitrate_controller_.get(), clock_), | 193 transport_feedback_adapter_(bitrate_controller_.get(), clock_), |
200 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), | 194 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), |
201 last_reported_bitrate_bps_(0), | 195 send_queue_is_full_(false) { |
202 last_reported_fraction_loss_(0), | |
203 last_reported_rtt_(0), | |
204 network_state_(kNetworkUp) { | |
205 Init(); | 196 Init(); |
206 } | 197 } |
207 | 198 |
208 CongestionController::~CongestionController() {} | 199 CongestionController::~CongestionController() {} |
209 | 200 |
210 void CongestionController::Init() { | 201 void CongestionController::Init() { |
211 transport_feedback_adapter_.SetBitrateEstimator( | 202 transport_feedback_adapter_.SetBitrateEstimator( |
212 new RemoteBitrateEstimatorAbsSendTime(&transport_feedback_adapter_)); | 203 new RemoteBitrateEstimatorAbsSendTime(&transport_feedback_adapter_)); |
213 transport_feedback_adapter_.GetBitrateEstimator()->SetMinBitrate( | 204 transport_feedback_adapter_.GetBitrateEstimator()->SetMinBitrate( |
214 min_bitrate_bps_); | 205 min_bitrate_bps_); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 int64_t CongestionController::GetPacerQueuingDelayMs() const { | 258 int64_t CongestionController::GetPacerQueuingDelayMs() const { |
268 return pacer_->QueueInMs(); | 259 return pacer_->QueueInMs(); |
269 } | 260 } |
270 | 261 |
271 void CongestionController::SignalNetworkState(NetworkState state) { | 262 void CongestionController::SignalNetworkState(NetworkState state) { |
272 if (state == kNetworkUp) { | 263 if (state == kNetworkUp) { |
273 pacer_->Resume(); | 264 pacer_->Resume(); |
274 } else { | 265 } else { |
275 pacer_->Pause(); | 266 pacer_->Pause(); |
276 } | 267 } |
277 { | |
278 rtc::CritScope cs(&critsect_); | |
279 network_state_ = state; | |
280 } | |
281 MaybeTriggerOnNetworkChanged(); | |
282 } | 268 } |
283 | 269 |
284 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { | 270 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { |
285 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, | 271 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, |
286 sent_packet.send_time_ms); | 272 sent_packet.send_time_ms); |
287 } | 273 } |
288 | 274 |
289 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { | 275 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
290 remote_bitrate_estimator_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 276 remote_bitrate_estimator_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
291 transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 277 transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
(...skipping 12 matching lines...) Expand all Loading... |
304 | 290 |
305 void CongestionController::MaybeTriggerOnNetworkChanged() { | 291 void CongestionController::MaybeTriggerOnNetworkChanged() { |
306 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a | 292 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a |
307 // BitrateObserver is used. Remove this check once the ctor is removed. | 293 // BitrateObserver is used. Remove this check once the ctor is removed. |
308 if (!observer_) | 294 if (!observer_) |
309 return; | 295 return; |
310 | 296 |
311 uint32_t bitrate_bps; | 297 uint32_t bitrate_bps; |
312 uint8_t fraction_loss; | 298 uint8_t fraction_loss; |
313 int64_t rtt; | 299 int64_t rtt; |
314 bool estimate_changed = bitrate_controller_->GetNetworkParameters( | 300 bool network_changed = bitrate_controller_->GetNetworkParameters( |
315 &bitrate_bps, &fraction_loss, &rtt); | 301 &bitrate_bps, &fraction_loss, &rtt); |
316 if (estimate_changed) | 302 if (network_changed) |
317 pacer_->SetEstimatedBitrate(bitrate_bps); | 303 pacer_->SetEstimatedBitrate(bitrate_bps); |
318 | 304 bool send_queue_is_full = |
319 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; | 305 pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; |
320 | 306 bitrate_bps = send_queue_is_full ? 0 : bitrate_bps; |
321 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { | 307 if ((network_changed && !send_queue_is_full) || |
| 308 UpdateSendQueueStatus(send_queue_is_full)) { |
322 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt); | 309 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt); |
323 } | 310 } |
324 } | 311 } |
325 | 312 |
326 bool CongestionController::HasNetworkParametersToReportChanged( | 313 bool CongestionController::UpdateSendQueueStatus(bool send_queue_is_full) { |
327 uint32_t bitrate_bps, | |
328 uint8_t fraction_loss, | |
329 int64_t rtt) { | |
330 rtc::CritScope cs(&critsect_); | 314 rtc::CritScope cs(&critsect_); |
331 bool changed = | 315 bool result = send_queue_is_full_ != send_queue_is_full; |
332 last_reported_bitrate_bps_ != bitrate_bps || | 316 send_queue_is_full_ = send_queue_is_full; |
333 (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss || | 317 return result; |
334 last_reported_rtt_ != rtt)); | |
335 last_reported_bitrate_bps_ = bitrate_bps; | |
336 last_reported_fraction_loss_ = fraction_loss; | |
337 last_reported_rtt_ = rtt; | |
338 return changed; | |
339 } | |
340 | |
341 bool CongestionController::IsSendQueueFull() const { | |
342 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; | |
343 } | |
344 | |
345 bool CongestionController::IsNetworkDown() const { | |
346 rtc::CritScope cs(&critsect_); | |
347 return network_state_ == kNetworkDown; | |
348 } | 318 } |
349 | 319 |
350 } // namespace webrtc | 320 } // namespace webrtc |
OLD | NEW |