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

Side by Side Diff: webrtc/modules/remote_bitrate_estimator/test/bbr_paced_sender.cc

Issue 2999073002: Tweaked version of BBR for WebRTC. (Closed)
Patch Set: Updated according to comments. Created 3 years, 4 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
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/modules/remote_bitrate_estimator/test/bbr_paced_sender.h"
12
13 #include <algorithm>
14 #include <queue>
15 #include <set>
16 #include <vector>
17
18 #include "webrtc/modules/pacing/paced_sender.h"
19 #include "webrtc/modules/remote_bitrate_estimator/test/estimators/congestion_win dow.h"
20 #include "webrtc/system_wrappers/include/clock.h"
21
22 namespace webrtc {
23
24 BbrPacedSender::BbrPacedSender(const Clock* clock,
25 PacedSender::PacketSender* packet_sender,
26 RtcEventLog* event_log)
27 : clock_(clock),
28 packet_sender_(packet_sender),
29 estimated_bitrate_bps_(100000),
30 min_send_bitrate_kbps_(0),
31 pacing_bitrate_kbps_(0),
32 time_last_update_us_(clock->TimeInMicroseconds()),
33 time_last_update_ms_(clock->TimeInMilliseconds()),
34 next_packet_send_time_(clock_->TimeInMilliseconds()),
35 rounding_error_time_ms_(0.0f),
36 packets_(),
37 max_data_inflight_bytes_(10000),
38 congestion_window_(new testing::bwe::CongestionWindow()) {}
39 BbrPacedSender::~BbrPacedSender() {}
40
41 void BbrPacedSender::SetEstimatedBitrateAndCongestionWindow(
42 uint32_t bitrate_bps,
43 bool in_probe_rtt,
44 uint64_t congestion_window) {
45 estimated_bitrate_bps_ = bitrate_bps;
46 max_data_inflight_bytes_ = congestion_window;
47 }
48
49 void BbrPacedSender::SetMinBitrate(int min_send_bitrate_bps) {
50 min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000;
51 pacing_bitrate_kbps_ =
52 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000);
53 }
54
55 void BbrPacedSender::InsertPacket(RtpPacketSender::Priority priority,
56 uint32_t ssrc,
57 uint16_t sequence_number,
58 int64_t capture_time_ms,
59 size_t bytes,
60 bool retransmission) {
61 int64_t now_ms = clock_->TimeInMilliseconds();
62 if (capture_time_ms < 0)
63 capture_time_ms = now_ms;
64 packets_.push_back(new Packet(priority, ssrc, sequence_number,
65 capture_time_ms, now_ms, bytes,
66 retransmission));
67 }
68
69 int64_t BbrPacedSender::TimeUntilNextProcess() {
70 // Once errors absolute value hits 1 millisecond, add compensating term to
71 // the |next_packet_send_time_|, so that we can send packet earlier or later,
72 // depending on the error.
73 rounding_error_time_ms_ = std::min(rounding_error_time_ms_, 1.0f);
philipel 2017/08/18 11:22:14 Could this logic be simplified?
gnish1 2017/08/18 11:48:42 Will remain the same after a discussion.
74 if (rounding_error_time_ms_ < -0.9f)
75 rounding_error_time_ms_ = -1.0f;
76 int64_t result =
77 std::max<int64_t>(next_packet_send_time_ + time_last_update_ms_ -
78 clock_->TimeInMilliseconds(),
79 0);
80 if (rounding_error_time_ms_ == 1.0f || rounding_error_time_ms_ == -1.0f) {
81 next_packet_send_time_ -= rounding_error_time_ms_;
82 result = std::max<int64_t>(next_packet_send_time_ + time_last_update_ms_ -
83 clock_->TimeInMilliseconds(),
84 0);
85 rounding_error_time_ms_ = 0;
86 }
87 return result;
88 }
89
90 void BbrPacedSender::OnBytesAcked(size_t bytes) {
91 congestion_window_->AckReceived(bytes);
92 }
93
94 void BbrPacedSender::Process() {
95 pacing_bitrate_kbps_ =
96 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000);
97 // If we have nothing to send, try sending again in 1 millisecond.
98 if (packets_.empty()) {
99 next_packet_send_time_ = 1;
100 return;
101 }
102 // If congestion window doesn't allow sending, try again in 1 millisecond.
103 if (packets_.front()->size_in_bytes + congestion_window_->data_inflight() >
104 max_data_inflight_bytes_) {
105 next_packet_send_time_ = 1;
106 return;
107 }
108 bool sent = TryToSendPacket(packets_.front());
109 if (sent) {
110 congestion_window_->PacketSent(packets_.front()->size_in_bytes);
111 delete packets_.front();
112 packets_.pop_front();
113 time_last_update_ms_ = clock_->TimeInMilliseconds();
114 if (!packets_.empty()) {
115 // Calculate in what time we should send current packet.
116 next_packet_send_time_ = (packets_.front()->size_in_bytes * 8000 +
117 estimated_bitrate_bps_ / 2) /
118 estimated_bitrate_bps_;
119 // As rounding errors may happen, |rounding_error_time_ms_| could be
120 // positive or negative depending on packet was sent earlier or later,
121 // after it hits certain threshold we will send a packet earlier or later
122 // depending on error we had so far.
123 rounding_error_time_ms_ +=
124 (next_packet_send_time_ - packets_.front()->size_in_bytes * 8000.0f /
125 estimated_bitrate_bps_ * 1.0f);
126 } else {
127 // If sending was unsuccessful try again in 1 millisecond.
128 next_packet_send_time_ = 1;
129 }
130 }
131 }
132
133 bool BbrPacedSender::TryToSendPacket(Packet* packet) {
134 PacedPacketInfo pacing_info;
135 return packet_sender_->TimeToSendPacket(packet->ssrc, packet->sequence_number,
136 packet->capture_time_ms,
137 packet->retransmission, pacing_info);
138 }
139
140 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698