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 |
11 #include "webrtc/modules/pacing/paced_sender.h" | 11 #include "webrtc/modules/pacing/paced_sender.h" |
12 | 12 |
13 #include <algorithm> | 13 #include <algorithm> |
14 #include <map> | 14 #include <map> |
15 #include <queue> | 15 #include <queue> |
16 #include <set> | 16 #include <set> |
17 #include <vector> | 17 #include <vector> |
18 | 18 |
19 #include "webrtc/base/checks.h" | 19 #include "webrtc/base/checks.h" |
20 #include "webrtc/base/logging.h" | 20 #include "webrtc/base/logging.h" |
21 #include "webrtc/modules/include/module_common_types.h" | 21 #include "webrtc/modules/include/module_common_types.h" |
22 #include "webrtc/modules/pacing/bitrate_prober.h" | 22 #include "webrtc/modules/pacing/bitrate_prober.h" |
| 23 #include "webrtc/modules/pacing/alr_detector.h" |
23 #include "webrtc/system_wrappers/include/clock.h" | 24 #include "webrtc/system_wrappers/include/clock.h" |
24 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 25 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
25 #include "webrtc/system_wrappers/include/field_trial.h" | 26 #include "webrtc/system_wrappers/include/field_trial.h" |
26 | 27 |
27 namespace { | 28 namespace { |
28 // Time limit in milliseconds between packet bursts. | 29 // Time limit in milliseconds between packet bursts. |
29 const int64_t kMinPacketLimitMs = 5; | 30 const int64_t kMinPacketLimitMs = 5; |
30 | 31 |
31 // Upper cap on process interval, in case process has not been called in a long | 32 // Upper cap on process interval, in case process has not been called in a long |
32 // time. | 33 // time. |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 static const int kWindowMs = 500; | 239 static const int kWindowMs = 500; |
239 | 240 |
240 int target_rate_kbps_; | 241 int target_rate_kbps_; |
241 int bytes_remaining_; | 242 int bytes_remaining_; |
242 }; | 243 }; |
243 } // namespace paced_sender | 244 } // namespace paced_sender |
244 | 245 |
245 const int64_t PacedSender::kMaxQueueLengthMs = 2000; | 246 const int64_t PacedSender::kMaxQueueLengthMs = 2000; |
246 const float PacedSender::kDefaultPaceMultiplier = 2.5f; | 247 const float PacedSender::kDefaultPaceMultiplier = 2.5f; |
247 | 248 |
248 PacedSender::PacedSender(Clock* clock, PacketSender* packet_sender) | 249 PacedSender::PacedSender(Clock* clock, |
| 250 PacketSender* packet_sender, |
| 251 AlrDetector* alr_detector) |
249 : clock_(clock), | 252 : clock_(clock), |
250 packet_sender_(packet_sender), | 253 packet_sender_(packet_sender), |
| 254 alr_detector_(alr_detector), |
251 critsect_(CriticalSectionWrapper::CreateCriticalSection()), | 255 critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
252 paused_(false), | 256 paused_(false), |
253 media_budget_(new paced_sender::IntervalBudget(0)), | 257 media_budget_(new paced_sender::IntervalBudget(0)), |
254 padding_budget_(new paced_sender::IntervalBudget(0)), | 258 padding_budget_(new paced_sender::IntervalBudget(0)), |
255 prober_(new BitrateProber()), | 259 prober_(new BitrateProber()), |
256 estimated_bitrate_bps_(0), | 260 estimated_bitrate_bps_(0), |
257 min_send_bitrate_kbps_(0u), | 261 min_send_bitrate_kbps_(0u), |
258 max_padding_bitrate_kbps_(0u), | 262 max_padding_bitrate_kbps_(0u), |
259 pacing_bitrate_kbps_(0), | 263 pacing_bitrate_kbps_(0), |
260 time_last_update_us_(clock->TimeInMicroseconds()), | 264 time_last_update_us_(clock->TimeInMicroseconds()), |
261 packets_(new paced_sender::PacketQueue(clock)), | 265 packets_(new paced_sender::PacketQueue(clock)), |
262 packet_counter_(0) { | 266 packet_counter_(0) { |
263 UpdateBytesPerInterval(kMinPacketLimitMs); | 267 UpdateBudgetWithElapsedTime(kMinPacketLimitMs); |
264 } | 268 } |
265 | 269 |
266 PacedSender::~PacedSender() {} | 270 PacedSender::~PacedSender() {} |
267 | 271 |
268 void PacedSender::CreateProbeCluster(int bitrate_bps, int num_packets) { | 272 void PacedSender::CreateProbeCluster(int bitrate_bps, int num_packets) { |
269 CriticalSectionScoped cs(critsect_.get()); | 273 CriticalSectionScoped cs(critsect_.get()); |
270 prober_->CreateProbeCluster(bitrate_bps, num_packets); | 274 prober_->CreateProbeCluster(bitrate_bps, num_packets); |
271 } | 275 } |
272 | 276 |
273 void PacedSender::Pause() { | 277 void PacedSender::Pause() { |
(...skipping 17 matching lines...) Expand all Loading... |
291 void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) { | 295 void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) { |
292 if (bitrate_bps == 0) | 296 if (bitrate_bps == 0) |
293 LOG(LS_ERROR) << "PacedSender is not designed to handle 0 bitrate."; | 297 LOG(LS_ERROR) << "PacedSender is not designed to handle 0 bitrate."; |
294 CriticalSectionScoped cs(critsect_.get()); | 298 CriticalSectionScoped cs(critsect_.get()); |
295 estimated_bitrate_bps_ = bitrate_bps; | 299 estimated_bitrate_bps_ = bitrate_bps; |
296 padding_budget_->set_target_rate_kbps( | 300 padding_budget_->set_target_rate_kbps( |
297 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_)); | 301 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_)); |
298 pacing_bitrate_kbps_ = | 302 pacing_bitrate_kbps_ = |
299 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * | 303 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * |
300 kDefaultPaceMultiplier; | 304 kDefaultPaceMultiplier; |
| 305 if (alr_detector_) |
| 306 alr_detector_->SetEstimatedBitrate(bitrate_bps); |
301 } | 307 } |
302 | 308 |
303 void PacedSender::SetSendBitrateLimits(int min_send_bitrate_bps, | 309 void PacedSender::SetSendBitrateLimits(int min_send_bitrate_bps, |
304 int padding_bitrate) { | 310 int padding_bitrate) { |
305 CriticalSectionScoped cs(critsect_.get()); | 311 CriticalSectionScoped cs(critsect_.get()); |
306 min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000; | 312 min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000; |
307 pacing_bitrate_kbps_ = | 313 pacing_bitrate_kbps_ = |
308 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * | 314 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * |
309 kDefaultPaceMultiplier; | 315 kDefaultPaceMultiplier; |
310 max_padding_bitrate_kbps_ = padding_bitrate / 1000; | 316 max_padding_bitrate_kbps_ = padding_bitrate / 1000; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 1, kMaxQueueLengthMs - packets_->AverageQueueTimeMs()); | 397 1, kMaxQueueLengthMs - packets_->AverageQueueTimeMs()); |
392 int min_bitrate_needed_kbps = | 398 int min_bitrate_needed_kbps = |
393 static_cast<int>(queue_size_bytes * 8 / avg_time_left_ms); | 399 static_cast<int>(queue_size_bytes * 8 / avg_time_left_ms); |
394 if (min_bitrate_needed_kbps > target_bitrate_kbps) | 400 if (min_bitrate_needed_kbps > target_bitrate_kbps) |
395 target_bitrate_kbps = min_bitrate_needed_kbps; | 401 target_bitrate_kbps = min_bitrate_needed_kbps; |
396 } | 402 } |
397 | 403 |
398 media_budget_->set_target_rate_kbps(target_bitrate_kbps); | 404 media_budget_->set_target_rate_kbps(target_bitrate_kbps); |
399 | 405 |
400 int64_t delta_time_ms = std::min(kMaxIntervalTimeMs, elapsed_time_ms); | 406 int64_t delta_time_ms = std::min(kMaxIntervalTimeMs, elapsed_time_ms); |
401 UpdateBytesPerInterval(delta_time_ms); | 407 UpdateBudgetWithElapsedTime(delta_time_ms); |
402 } | 408 } |
403 | 409 |
404 bool is_probing = prober_->IsProbing(); | 410 bool is_probing = prober_->IsProbing(); |
405 int probe_cluster_id = is_probing ? prober_->CurrentClusterId() | 411 int probe_cluster_id = is_probing ? prober_->CurrentClusterId() |
406 : PacketInfo::kNotAProbe; | 412 : PacketInfo::kNotAProbe; |
407 while (!packets_->Empty()) { | 413 while (!packets_->Empty()) { |
408 // Since we need to release the lock in order to send, we first pop the | 414 // Since we need to release the lock in order to send, we first pop the |
409 // element from the priority queue but keep it in storage, so that we can | 415 // element from the priority queue but keep it in storage, so that we can |
410 // reinsert it if send fails. | 416 // reinsert it if send fails. |
411 const paced_sender::Packet& packet = packets_->BeginPop(); | 417 const paced_sender::Packet& packet = packets_->BeginPop(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 packet.ssrc, packet.sequence_number, packet.capture_time_ms, | 462 packet.ssrc, packet.sequence_number, packet.capture_time_ms, |
457 packet.retransmission, probe_cluster_id); | 463 packet.retransmission, probe_cluster_id); |
458 critsect_->Enter(); | 464 critsect_->Enter(); |
459 | 465 |
460 if (success) { | 466 if (success) { |
461 prober_->PacketSent(clock_->TimeInMilliseconds(), packet.bytes); | 467 prober_->PacketSent(clock_->TimeInMilliseconds(), packet.bytes); |
462 // TODO(holmer): High priority packets should only be accounted for if we | 468 // TODO(holmer): High priority packets should only be accounted for if we |
463 // are allocating bandwidth for audio. | 469 // are allocating bandwidth for audio. |
464 if (packet.priority != kHighPriority) { | 470 if (packet.priority != kHighPriority) { |
465 // Update media bytes sent. | 471 // Update media bytes sent. |
466 media_budget_->UseBudget(packet.bytes); | 472 UpdateBudgetWithBytesSent(packet.bytes); |
467 padding_budget_->UseBudget(packet.bytes); | |
468 } | 473 } |
469 } | 474 } |
470 | 475 |
471 return success; | 476 return success; |
472 } | 477 } |
473 | 478 |
474 void PacedSender::SendPadding(size_t padding_needed, int probe_cluster_id) { | 479 void PacedSender::SendPadding(size_t padding_needed, int probe_cluster_id) { |
475 critsect_->Leave(); | 480 critsect_->Leave(); |
476 size_t bytes_sent = | 481 size_t bytes_sent = |
477 packet_sender_->TimeToSendPadding(padding_needed, probe_cluster_id); | 482 packet_sender_->TimeToSendPadding(padding_needed, probe_cluster_id); |
478 critsect_->Enter(); | 483 critsect_->Enter(); |
479 | 484 |
480 if (bytes_sent > 0) { | 485 if (bytes_sent > 0) { |
481 prober_->PacketSent(clock_->TimeInMilliseconds(), bytes_sent); | 486 prober_->PacketSent(clock_->TimeInMilliseconds(), bytes_sent); |
482 media_budget_->UseBudget(bytes_sent); | 487 UpdateBudgetWithBytesSent(bytes_sent); |
483 padding_budget_->UseBudget(bytes_sent); | |
484 } | 488 } |
485 } | 489 } |
486 | 490 |
487 void PacedSender::UpdateBytesPerInterval(int64_t delta_time_ms) { | 491 void PacedSender::UpdateBudgetWithElapsedTime(int64_t delta_time_ms) { |
488 media_budget_->IncreaseBudget(delta_time_ms); | 492 media_budget_->IncreaseBudget(delta_time_ms); |
489 padding_budget_->IncreaseBudget(delta_time_ms); | 493 padding_budget_->IncreaseBudget(delta_time_ms); |
| 494 if (alr_detector_) |
| 495 alr_detector_->ReportElapsedTime(delta_time_ms); |
| 496 } |
| 497 |
| 498 void PacedSender::UpdateBudgetWithBytesSent(size_t bytes_sent) { |
| 499 media_budget_->UseBudget(bytes_sent); |
| 500 padding_budget_->UseBudget(bytes_sent); |
| 501 if (alr_detector_) |
| 502 alr_detector_->ReportBytesSent(bytes_sent); |
490 } | 503 } |
491 } // namespace webrtc | 504 } // namespace webrtc |
OLD | NEW |