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 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 static const int kWindowMs = 500; | 238 static const int kWindowMs = 500; |
239 | 239 |
240 int target_rate_kbps_; | 240 int target_rate_kbps_; |
241 int bytes_remaining_; | 241 int bytes_remaining_; |
242 }; | 242 }; |
243 } // namespace paced_sender | 243 } // namespace paced_sender |
244 | 244 |
245 const int64_t PacedSender::kMaxQueueLengthMs = 2000; | 245 const int64_t PacedSender::kMaxQueueLengthMs = 2000; |
246 const float PacedSender::kDefaultPaceMultiplier = 2.5f; | 246 const float PacedSender::kDefaultPaceMultiplier = 2.5f; |
247 | 247 |
248 PacedSender::PacedSender(Clock* clock, PacketSender* packet_sender) | 248 PacedSender::PacedSender(Clock* clock, |
| 249 PacketSender* packet_sender, |
| 250 PacingObserver* pacing_observer) |
249 : clock_(clock), | 251 : clock_(clock), |
250 packet_sender_(packet_sender), | 252 packet_sender_(packet_sender), |
| 253 pacing_observer_(pacing_observer), |
251 critsect_(CriticalSectionWrapper::CreateCriticalSection()), | 254 critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
252 paused_(false), | 255 paused_(false), |
253 media_budget_(new paced_sender::IntervalBudget(0)), | 256 media_budget_(new paced_sender::IntervalBudget(0)), |
254 padding_budget_(new paced_sender::IntervalBudget(0)), | 257 padding_budget_(new paced_sender::IntervalBudget(0)), |
255 prober_(new BitrateProber()), | 258 prober_(new BitrateProber()), |
256 estimated_bitrate_bps_(0), | 259 estimated_bitrate_bps_(0), |
257 min_send_bitrate_kbps_(0u), | 260 min_send_bitrate_kbps_(0u), |
258 max_padding_bitrate_kbps_(0u), | 261 max_padding_bitrate_kbps_(0u), |
259 pacing_bitrate_kbps_(0), | 262 pacing_bitrate_kbps_(0), |
260 time_last_update_us_(clock->TimeInMicroseconds()), | 263 time_last_update_us_(clock->TimeInMicroseconds()), |
261 packets_(new paced_sender::PacketQueue(clock)), | 264 packets_(new paced_sender::PacketQueue(clock)), |
262 packet_counter_(0) { | 265 packet_counter_(0) { |
263 UpdateBytesPerInterval(kMinPacketLimitMs); | 266 UpdateBudgetWithElapsedTime(kMinPacketLimitMs); |
264 } | 267 } |
265 | 268 |
| 269 PacedSender::PacedSender(Clock* clock, PacketSender* packet_sender) |
| 270 : PacedSender(clock, packet_sender, nullptr) {} |
| 271 |
266 PacedSender::~PacedSender() {} | 272 PacedSender::~PacedSender() {} |
267 | 273 |
268 void PacedSender::CreateProbeCluster(int bitrate_bps, int num_packets) { | 274 void PacedSender::CreateProbeCluster(int bitrate_bps, int num_packets) { |
269 CriticalSectionScoped cs(critsect_.get()); | 275 CriticalSectionScoped cs(critsect_.get()); |
270 prober_->CreateProbeCluster(bitrate_bps, num_packets); | 276 prober_->CreateProbeCluster(bitrate_bps, num_packets); |
271 } | 277 } |
272 | 278 |
273 void PacedSender::Pause() { | 279 void PacedSender::Pause() { |
274 LOG(LS_INFO) << "PacedSender paused."; | 280 LOG(LS_INFO) << "PacedSender paused."; |
275 CriticalSectionScoped cs(critsect_.get()); | 281 CriticalSectionScoped cs(critsect_.get()); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 int64_t avg_time_left_ms = std::max<int64_t>( | 396 int64_t avg_time_left_ms = std::max<int64_t>( |
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 elapsed_time_ms = std::min(kMaxIntervalTimeMs, elapsed_time_ms); |
401 UpdateBytesPerInterval(delta_time_ms); | 407 UpdateBudgetWithElapsedTime(elapsed_time_ms); |
402 } | 408 } |
403 | 409 |
404 bool is_probing = prober_->IsProbing(); | 410 bool is_probing = prober_->IsProbing(); |
405 int probe_cluster_id = PacketInfo::kNotAProbe; | 411 int probe_cluster_id = PacketInfo::kNotAProbe; |
406 size_t bytes_sent = 0; | 412 size_t bytes_sent = 0; |
407 size_t recommended_probe_size = 0; | 413 size_t recommended_probe_size = 0; |
408 if (is_probing) { | 414 if (is_probing) { |
409 probe_cluster_id = prober_->CurrentClusterId(); | 415 probe_cluster_id = prober_->CurrentClusterId(); |
410 recommended_probe_size = prober_->RecommendedMinProbeSize(); | 416 recommended_probe_size = prober_->RecommendedMinProbeSize(); |
411 } | 417 } |
(...skipping 24 matching lines...) Expand all Loading... |
436 int padding_needed = | 442 int padding_needed = |
437 static_cast<int>(is_probing ? (recommended_probe_size - bytes_sent) | 443 static_cast<int>(is_probing ? (recommended_probe_size - bytes_sent) |
438 : padding_budget_->bytes_remaining()); | 444 : padding_budget_->bytes_remaining()); |
439 | 445 |
440 if (padding_needed > 0) | 446 if (padding_needed > 0) |
441 bytes_sent += SendPadding(padding_needed, probe_cluster_id); | 447 bytes_sent += SendPadding(padding_needed, probe_cluster_id); |
442 } | 448 } |
443 } | 449 } |
444 if (is_probing && bytes_sent > 0) | 450 if (is_probing && bytes_sent > 0) |
445 prober_->ProbeSent(clock_->TimeInMilliseconds(), bytes_sent); | 451 prober_->ProbeSent(clock_->TimeInMilliseconds(), bytes_sent); |
| 452 if (pacing_observer_) |
| 453 pacing_observer_->OnBytesSent(bytes_sent, elapsed_time_ms); |
446 } | 454 } |
447 | 455 |
448 bool PacedSender::SendPacket(const paced_sender::Packet& packet, | 456 bool PacedSender::SendPacket(const paced_sender::Packet& packet, |
449 int probe_cluster_id) { | 457 int probe_cluster_id) { |
450 // TODO(holmer): Because of this bug issue 5307 we have to send audio | 458 // TODO(holmer): Because of this bug issue 5307 we have to send audio |
451 // packets even when the pacer is paused. Here we assume audio packets are | 459 // packets even when the pacer is paused. Here we assume audio packets are |
452 // always high priority and that they are the only high priority packets. | 460 // always high priority and that they are the only high priority packets. |
453 if (packet.priority != kHighPriority) { | 461 if (packet.priority != kHighPriority) { |
454 if (paused_) | 462 if (paused_) |
455 return false; | 463 return false; |
456 if (media_budget_->bytes_remaining() == 0 && | 464 if (media_budget_->bytes_remaining() == 0 && |
457 probe_cluster_id == PacketInfo::kNotAProbe) { | 465 probe_cluster_id == PacketInfo::kNotAProbe) { |
458 return false; | 466 return false; |
459 } | 467 } |
460 } | 468 } |
461 critsect_->Leave(); | 469 critsect_->Leave(); |
462 const bool success = packet_sender_->TimeToSendPacket( | 470 const bool success = packet_sender_->TimeToSendPacket( |
463 packet.ssrc, packet.sequence_number, packet.capture_time_ms, | 471 packet.ssrc, packet.sequence_number, packet.capture_time_ms, |
464 packet.retransmission, probe_cluster_id); | 472 packet.retransmission, probe_cluster_id); |
465 critsect_->Enter(); | 473 critsect_->Enter(); |
466 | 474 |
467 if (success) { | 475 if (success) { |
468 // TODO(holmer): High priority packets should only be accounted for if we | 476 // TODO(holmer): High priority packets should only be accounted for if we |
469 // are allocating bandwidth for audio. | 477 // are allocating bandwidth for audio. |
470 if (packet.priority != kHighPriority) { | 478 if (packet.priority != kHighPriority) { |
471 // Update media bytes sent. | 479 // Update media bytes sent. |
472 media_budget_->UseBudget(packet.bytes); | 480 UpdateBudgetWithBytesSent(packet.bytes); |
473 padding_budget_->UseBudget(packet.bytes); | |
474 } | 481 } |
475 } | 482 } |
476 | 483 |
477 return success; | 484 return success; |
478 } | 485 } |
479 | 486 |
480 size_t PacedSender::SendPadding(size_t padding_needed, int probe_cluster_id) { | 487 size_t PacedSender::SendPadding(size_t padding_needed, int probe_cluster_id) { |
481 critsect_->Leave(); | 488 critsect_->Leave(); |
482 size_t bytes_sent = | 489 size_t bytes_sent = |
483 packet_sender_->TimeToSendPadding(padding_needed, probe_cluster_id); | 490 packet_sender_->TimeToSendPadding(padding_needed, probe_cluster_id); |
484 critsect_->Enter(); | 491 critsect_->Enter(); |
485 | 492 |
486 if (bytes_sent > 0) { | 493 if (bytes_sent > 0) { |
487 media_budget_->UseBudget(bytes_sent); | 494 UpdateBudgetWithBytesSent(bytes_sent); |
488 padding_budget_->UseBudget(bytes_sent); | |
489 } | 495 } |
490 return bytes_sent; | 496 return bytes_sent; |
491 } | 497 } |
492 | 498 |
493 void PacedSender::UpdateBytesPerInterval(int64_t delta_time_ms) { | 499 void PacedSender::UpdateBudgetWithElapsedTime(int64_t delta_time_ms) { |
494 media_budget_->IncreaseBudget(delta_time_ms); | 500 media_budget_->IncreaseBudget(delta_time_ms); |
495 padding_budget_->IncreaseBudget(delta_time_ms); | 501 padding_budget_->IncreaseBudget(delta_time_ms); |
496 } | 502 } |
| 503 |
| 504 void PacedSender::UpdateBudgetWithBytesSent(size_t bytes_sent) { |
| 505 media_budget_->UseBudget(bytes_sent); |
| 506 padding_budget_->UseBudget(bytes_sent); |
| 507 } |
497 } // namespace webrtc | 508 } // namespace webrtc |
OLD | NEW |