Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: webrtc/modules/pacing/paced_sender.cc

Issue 2628563003: Propagate packet pacing information to SenTimeHistory (Closed)
Patch Set: Rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/modules/pacing/paced_sender.h ('k') | webrtc/modules/pacing/paced_sender_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « webrtc/modules/pacing/paced_sender.h ('k') | webrtc/modules/pacing/paced_sender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698