| 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 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 target_bitrate_kbps = min_bitrate_needed_kbps; | 403 target_bitrate_kbps = min_bitrate_needed_kbps; |
| 404 } | 404 } |
| 405 | 405 |
| 406 media_budget_->set_target_rate_kbps(target_bitrate_kbps); | 406 media_budget_->set_target_rate_kbps(target_bitrate_kbps); |
| 407 | 407 |
| 408 elapsed_time_ms = std::min(kMaxIntervalTimeMs, elapsed_time_ms); | 408 elapsed_time_ms = std::min(kMaxIntervalTimeMs, elapsed_time_ms); |
| 409 UpdateBudgetWithElapsedTime(elapsed_time_ms); | 409 UpdateBudgetWithElapsedTime(elapsed_time_ms); |
| 410 } | 410 } |
| 411 | 411 |
| 412 bool is_probing = prober_->IsProbing(); | 412 bool is_probing = prober_->IsProbing(); |
| 413 int probe_cluster_id = PacketInfo::kNotAProbe; | 413 PacedPacketInfo pacing_info; |
| 414 size_t bytes_sent = 0; | 414 size_t bytes_sent = 0; |
| 415 size_t recommended_probe_size = 0; | 415 size_t recommended_probe_size = 0; |
| 416 if (is_probing) { | 416 if (is_probing) { |
| 417 probe_cluster_id = prober_->CurrentClusterId(); | 417 pacing_info = prober_->CurrentCluster(); |
| 418 recommended_probe_size = prober_->RecommendedMinProbeSize(); | 418 recommended_probe_size = prober_->RecommendedMinProbeSize(); |
| 419 } | 419 } |
| 420 while (!packets_->Empty()) { | 420 while (!packets_->Empty()) { |
| 421 // Since we need to release the lock in order to send, we first pop the | 421 // Since we need to release the lock in order to send, we first pop the |
| 422 // element from the priority queue but keep it in storage, so that we can | 422 // element from the priority queue but keep it in storage, so that we can |
| 423 // reinsert it if send fails. | 423 // reinsert it if send fails. |
| 424 const paced_sender::Packet& packet = packets_->BeginPop(); | 424 const paced_sender::Packet& packet = packets_->BeginPop(); |
| 425 | 425 |
| 426 if (SendPacket(packet, probe_cluster_id)) { | 426 if (SendPacket(packet, pacing_info)) { |
| 427 // Send succeeded, remove it from the queue. | 427 // Send succeeded, remove it from the queue. |
| 428 bytes_sent += packet.bytes; | 428 bytes_sent += packet.bytes; |
| 429 packets_->FinalizePop(packet); | 429 packets_->FinalizePop(packet); |
| 430 if (is_probing && bytes_sent > recommended_probe_size) | 430 if (is_probing && bytes_sent > recommended_probe_size) |
| 431 break; | 431 break; |
| 432 } else { | 432 } else { |
| 433 // Send failed, put it back into the queue. | 433 // Send failed, put it back into the queue. |
| 434 packets_->CancelPop(packet); | 434 packets_->CancelPop(packet); |
| 435 break; | 435 break; |
| 436 } | 436 } |
| 437 } | 437 } |
| 438 | 438 |
| 439 if (packets_->Empty() && !paused_) { | 439 if (packets_->Empty() && !paused_) { |
| 440 // We can not send padding unless a normal packet has first been sent. If we | 440 // We can not send padding unless a normal packet has first been sent. If we |
| 441 // do, timestamps get messed up. | 441 // do, timestamps get messed up. |
| 442 if (packet_counter_ > 0) { | 442 if (packet_counter_ > 0) { |
| 443 int padding_needed = | 443 int padding_needed = |
| 444 static_cast<int>(is_probing ? (recommended_probe_size - bytes_sent) | 444 static_cast<int>(is_probing ? (recommended_probe_size - bytes_sent) |
| 445 : padding_budget_->bytes_remaining()); | 445 : padding_budget_->bytes_remaining()); |
| 446 | 446 |
| 447 if (padding_needed > 0) | 447 if (padding_needed > 0) |
| 448 bytes_sent += SendPadding(padding_needed, probe_cluster_id); | 448 bytes_sent += SendPadding(padding_needed, pacing_info); |
| 449 } | 449 } |
| 450 } | 450 } |
| 451 if (is_probing && bytes_sent > 0) | 451 if (is_probing && bytes_sent > 0) |
| 452 prober_->ProbeSent(clock_->TimeInMilliseconds(), bytes_sent); | 452 prober_->ProbeSent(clock_->TimeInMilliseconds(), bytes_sent); |
| 453 alr_detector_->OnBytesSent(bytes_sent, now_us / 1000); | 453 alr_detector_->OnBytesSent(bytes_sent, now_us / 1000); |
| 454 } | 454 } |
| 455 | 455 |
| 456 bool PacedSender::SendPacket(const paced_sender::Packet& packet, | 456 bool PacedSender::SendPacket(const paced_sender::Packet& packet, |
| 457 int probe_cluster_id) { | 457 const PacedPacketInfo& pacing_info) { |
| 458 if (paused_) | 458 if (paused_) |
| 459 return false; | 459 return false; |
| 460 if (media_budget_->bytes_remaining() == 0 && | 460 if (media_budget_->bytes_remaining() == 0 && |
| 461 probe_cluster_id == PacketInfo::kNotAProbe) { | 461 pacing_info.probe_cluster_id == PacedPacketInfo::kNotAProbe) { |
| 462 return false; | 462 return false; |
| 463 } | 463 } |
| 464 |
| 464 critsect_->Leave(); | 465 critsect_->Leave(); |
| 465 const bool success = packet_sender_->TimeToSendPacket( | 466 const bool success = packet_sender_->TimeToSendPacket( |
| 466 packet.ssrc, packet.sequence_number, packet.capture_time_ms, | 467 packet.ssrc, packet.sequence_number, packet.capture_time_ms, |
| 467 packet.retransmission, probe_cluster_id); | 468 packet.retransmission, pacing_info); |
| 468 critsect_->Enter(); | 469 critsect_->Enter(); |
| 469 | 470 |
| 470 if (success) { | 471 if (success) { |
| 471 // TODO(holmer): High priority packets should only be accounted for if we | 472 // TODO(holmer): High priority packets should only be accounted for if we |
| 472 // are allocating bandwidth for audio. | 473 // are allocating bandwidth for audio. |
| 473 if (packet.priority != kHighPriority) { | 474 if (packet.priority != kHighPriority) { |
| 474 // Update media bytes sent. | 475 // Update media bytes sent. |
| 475 UpdateBudgetWithBytesSent(packet.bytes); | 476 UpdateBudgetWithBytesSent(packet.bytes); |
| 476 } | 477 } |
| 477 } | 478 } |
| 478 | 479 |
| 479 return success; | 480 return success; |
| 480 } | 481 } |
| 481 | 482 |
| 482 size_t PacedSender::SendPadding(size_t padding_needed, int probe_cluster_id) { | 483 size_t PacedSender::SendPadding(size_t padding_needed, |
| 484 const PacedPacketInfo& pacing_info) { |
| 483 critsect_->Leave(); | 485 critsect_->Leave(); |
| 484 size_t bytes_sent = | 486 size_t bytes_sent = |
| 485 packet_sender_->TimeToSendPadding(padding_needed, probe_cluster_id); | 487 packet_sender_->TimeToSendPadding(padding_needed, pacing_info); |
| 486 critsect_->Enter(); | 488 critsect_->Enter(); |
| 487 | 489 |
| 488 if (bytes_sent > 0) { | 490 if (bytes_sent > 0) { |
| 489 UpdateBudgetWithBytesSent(bytes_sent); | 491 UpdateBudgetWithBytesSent(bytes_sent); |
| 490 } | 492 } |
| 491 return bytes_sent; | 493 return bytes_sent; |
| 492 } | 494 } |
| 493 | 495 |
| 494 void PacedSender::UpdateBudgetWithElapsedTime(int64_t delta_time_ms) { | 496 void PacedSender::UpdateBudgetWithElapsedTime(int64_t delta_time_ms) { |
| 495 media_budget_->IncreaseBudget(delta_time_ms); | 497 media_budget_->IncreaseBudget(delta_time_ms); |
| 496 padding_budget_->IncreaseBudget(delta_time_ms); | 498 padding_budget_->IncreaseBudget(delta_time_ms); |
| 497 } | 499 } |
| 498 | 500 |
| 499 void PacedSender::UpdateBudgetWithBytesSent(size_t bytes_sent) { | 501 void PacedSender::UpdateBudgetWithBytesSent(size_t bytes_sent) { |
| 500 media_budget_->UseBudget(bytes_sent); | 502 media_budget_->UseBudget(bytes_sent); |
| 501 padding_budget_->UseBudget(bytes_sent); | 503 padding_budget_->UseBudget(bytes_sent); |
| 502 } | 504 } |
| 503 } // namespace webrtc | 505 } // namespace webrtc |
| OLD | NEW |