Chromium Code Reviews| Index: webrtc/modules/pacing/paced_sender.cc |
| diff --git a/webrtc/modules/pacing/paced_sender.cc b/webrtc/modules/pacing/paced_sender.cc |
| index c1741d690245610b6d8c936876d850fe075fd0b3..6f6996294f8edcf37899161e603ae127827ed6e4 100644 |
| --- a/webrtc/modules/pacing/paced_sender.cc |
| +++ b/webrtc/modules/pacing/paced_sender.cc |
| @@ -32,6 +32,7 @@ const int64_t kMinPacketLimitMs = 5; |
| // time. |
| const int64_t kMaxIntervalTimeMs = 30; |
| +const int64_t kMaxRtt = 1000; |
|
danilchap
2016/06/23 12:46:12
kMaxRttMs
|
| } // namespace |
| // TODO(sprang): Move at least PacketQueue and MediaBudget out to separate |
| @@ -260,7 +261,8 @@ PacedSender::PacedSender(Clock* clock, PacketSender* packet_sender) |
| pacing_bitrate_kbps_(0), |
| time_last_update_us_(clock->TimeInMicroseconds()), |
| packets_(new paced_sender::PacketQueue(clock)), |
| - packet_counter_(0) { |
| + packet_counter_(0), |
| + retransmission_rate_(kMaxRtt, 8) { // Scale 8 for bits per second. |
|
danilchap
2016/06/23 12:46:12
shouldn't this be 8000 instead of 8? (scale is for
sprang_webrtc
2016/06/28 09:12:32
Yes.
|
| UpdateBytesPerInterval(kMinPacketLimitMs); |
| } |
| @@ -326,6 +328,42 @@ void PacedSender::InsertPacket(RtpPacketSender::Priority priority, |
| retransmission, packet_counter_++)); |
| } |
| +bool PacedSender::AllocateRetransmissionBitrate(size_t bytes) { |
| + int64_t now_ms = clock_->TimeInMilliseconds(); |
| + CriticalSectionScoped cs(critsect_.get()); |
| + |
| + rtc::Optional<uint32_t> retransmission_rate_bps = |
| + retransmission_rate_.Rate(now_ms); |
| + if (!retransmission_rate_bps) { |
| + // Rate not high enough to measure, let it slide. |
| + return true; |
| + } |
| + |
| + int64_t max_retransmission_rate_bps = |
|
danilchap
2016/06/23 12:46:12
rate (bits/s) * rtt (ms) should result in bits, no
sprang_webrtc
2016/06/28 09:12:32
Not sure what happened here, thought I had removed
|
| + (2 * rtt_ms_ * |
| + std::max(min_send_bitrate_kbps_ * 1000, estimated_bitrate_bps_)) / |
| + 1000; |
| + if (*retransmission_rate_bps < max_retransmission_rate_bps) { |
| + retransmission_rate_.Update(bytes, now_ms); |
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| +int PacedSender::CurrentRetransmissionBitrate() { |
| + int64_t now_ms = clock_->TimeInMilliseconds(); |
| + CriticalSectionScoped cs(critsect_.get()); |
| + return retransmission_rate_.Rate(now_ms).value_or(0); |
| +} |
| + |
| +void PacedSender::OnRttUpdate(int64_t rtt) { |
| + RTC_DCHECK_GT(rtt, 0); |
| + CriticalSectionScoped cs(critsect_.get()); |
| + rtt_ms_ = std::min(rtt, kMaxRtt); |
| + retransmission_rate_.SetWindowSize(rtt_ms_, clock_->TimeInMilliseconds()); |
| +} |
| + |
| int64_t PacedSender::ExpectedQueueTimeMs() const { |
| CriticalSectionScoped cs(critsect_.get()); |
| RTC_DCHECK_GT(pacing_bitrate_kbps_, 0u); |