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

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

Issue 1958113003: Remove SendPacer from ViEEncoder and make sure SendPacer starts at a valid bitrate (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Removed initial bitrate from PacedSender. Updated unittests. Created 4 years, 7 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.cc ('k') | webrtc/modules/pacing/packet_router.h » ('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
11 #include <list> 11 #include <list>
12 #include <memory> 12 #include <memory>
13 13
14 #include "testing/gmock/include/gmock/gmock.h" 14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "webrtc/modules/pacing/paced_sender.h" 16 #include "webrtc/modules/pacing/paced_sender.h"
17 #include "webrtc/system_wrappers/include/clock.h" 17 #include "webrtc/system_wrappers/include/clock.h"
18 18
19 using testing::_; 19 using testing::_;
20 using testing::Return; 20 using testing::Return;
21 21
22 namespace webrtc { 22 namespace webrtc {
23 namespace test { 23 namespace test {
24 24
25 static const int kTargetBitrate = 800; 25 static const int kTargetBitrateBps = 800000;
26 static const float kPaceMultiplier = 1.5f;
27 26
28 class MockPacedSenderCallback : public PacedSender::Callback { 27 class MockPacedSenderCallback : public PacedSender::PacketSender {
29 public: 28 public:
30 MOCK_METHOD4(TimeToSendPacket, 29 MOCK_METHOD4(TimeToSendPacket,
31 bool(uint32_t ssrc, 30 bool(uint32_t ssrc,
32 uint16_t sequence_number, 31 uint16_t sequence_number,
33 int64_t capture_time_ms, 32 int64_t capture_time_ms,
34 bool retransmission)); 33 bool retransmission));
35 MOCK_METHOD1(TimeToSendPadding, 34 MOCK_METHOD1(TimeToSendPadding,
36 size_t(size_t bytes)); 35 size_t(size_t bytes));
37 }; 36 };
38 37
39 class PacedSenderPadding : public PacedSender::Callback { 38 class PacedSenderPadding : public PacedSender::PacketSender {
40 public: 39 public:
41 PacedSenderPadding() : padding_sent_(0) {} 40 PacedSenderPadding() : padding_sent_(0) {}
42 41
43 bool TimeToSendPacket(uint32_t ssrc, 42 bool TimeToSendPacket(uint32_t ssrc,
44 uint16_t sequence_number, 43 uint16_t sequence_number,
45 int64_t capture_time_ms, 44 int64_t capture_time_ms,
46 bool retransmission) { 45 bool retransmission) {
47 return true; 46 return true;
48 } 47 }
49 48
50 size_t TimeToSendPadding(size_t bytes) { 49 size_t TimeToSendPadding(size_t bytes) {
51 const size_t kPaddingPacketSize = 224; 50 const size_t kPaddingPacketSize = 224;
52 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize; 51 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
53 padding_sent_ += kPaddingPacketSize * num_packets; 52 padding_sent_ += kPaddingPacketSize * num_packets;
54 return kPaddingPacketSize * num_packets; 53 return kPaddingPacketSize * num_packets;
55 } 54 }
56 55
57 size_t padding_sent() { return padding_sent_; } 56 size_t padding_sent() { return padding_sent_; }
58 57
59 private: 58 private:
60 size_t padding_sent_; 59 size_t padding_sent_;
61 }; 60 };
62 61
63 class PacedSenderProbing : public PacedSender::Callback { 62 class PacedSenderProbing : public PacedSender::PacketSender {
64 public: 63 public:
65 PacedSenderProbing(const std::list<int>& expected_deltas, Clock* clock) 64 PacedSenderProbing(const std::list<int>& expected_deltas, Clock* clock)
66 : prev_packet_time_ms_(-1), 65 : prev_packet_time_ms_(-1),
67 expected_deltas_(expected_deltas), 66 expected_deltas_(expected_deltas),
68 packets_sent_(0), 67 packets_sent_(0),
69 clock_(clock) {} 68 clock_(clock) {}
70 69
71 bool TimeToSendPacket(uint32_t ssrc, 70 bool TimeToSendPacket(uint32_t ssrc,
72 uint16_t sequence_number, 71 uint16_t sequence_number,
73 int64_t capture_time_ms, 72 int64_t capture_time_ms,
(...skipping 27 matching lines...) Expand all
101 std::list<int> expected_deltas_; 100 std::list<int> expected_deltas_;
102 int packets_sent_; 101 int packets_sent_;
103 Clock* clock_; 102 Clock* clock_;
104 }; 103 };
105 104
106 class PacedSenderTest : public ::testing::Test { 105 class PacedSenderTest : public ::testing::Test {
107 protected: 106 protected:
108 PacedSenderTest() : clock_(123456) { 107 PacedSenderTest() : clock_(123456) {
109 srand(0); 108 srand(0);
110 // Need to initialize PacedSender after we initialize clock. 109 // Need to initialize PacedSender after we initialize clock.
111 send_bucket_.reset(new PacedSender(&clock_, 110 send_bucket_.reset(new PacedSender(&clock_, &callback_));
112 &callback_,
113 kTargetBitrate,
114 kPaceMultiplier * kTargetBitrate,
115 0));
116 // Default to bitrate probing disabled for testing purposes. Probing tests 111 // Default to bitrate probing disabled for testing purposes. Probing tests
117 // have to enable probing, either by creating a new PacedSender instance or 112 // have to enable probing, either by creating a new PacedSender instance or
118 // by calling SetProbingEnabled(true). 113 // by calling SetProbingEnabled(true).
119 send_bucket_->SetProbingEnabled(false); 114 send_bucket_->SetProbingEnabled(false);
115 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
116
117 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
120 } 118 }
121 119
122 void SendAndExpectPacket(PacedSender::Priority priority, 120 void SendAndExpectPacket(PacedSender::Priority priority,
123 uint32_t ssrc, 121 uint32_t ssrc,
124 uint16_t sequence_number, 122 uint16_t sequence_number,
125 int64_t capture_time_ms, 123 int64_t capture_time_ms,
126 size_t size, 124 size_t size,
127 bool retransmission) { 125 bool retransmission) {
128 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms, 126 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
129 size, retransmission); 127 size, retransmission);
130 EXPECT_CALL(callback_, 128 EXPECT_CALL(callback_,
131 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false)) 129 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
132 .Times(1) 130 .Times(1)
133 .WillRepeatedly(Return(true)); 131 .WillRepeatedly(Return(true));
134 } 132 }
135 133
136 SimulatedClock clock_; 134 SimulatedClock clock_;
137 MockPacedSenderCallback callback_; 135 MockPacedSenderCallback callback_;
138 std::unique_ptr<PacedSender> send_bucket_; 136 std::unique_ptr<PacedSender> send_bucket_;
139 }; 137 };
140 138
141 TEST_F(PacedSenderTest, QueuePacket) { 139 TEST_F(PacedSenderTest, QueuePacket) {
142 uint32_t ssrc = 12345; 140 uint32_t ssrc = 12345;
143 uint16_t sequence_number = 1234; 141 uint16_t sequence_number = 1234;
144 // Due to the multiplicative factor we can send 3 packets not 2 packets. 142 // Due to the multiplicative factor we can send 5 packets during a send
145 SendAndExpectPacket(PacedSender::kNormalPriority, 143 // interval. (network capacity * multiplier / (8 bits per byte *
146 ssrc, 144 // (packet size * #send intervals per second)
147 sequence_number++, 145 const size_t packets_to_send =
148 clock_.TimeInMilliseconds(), 146 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
149 250, 147 for (size_t i = 0; i < packets_to_send; ++i) {
150 false); 148 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
151 SendAndExpectPacket(PacedSender::kNormalPriority, 149 clock_.TimeInMilliseconds(), 250, false);
152 ssrc, 150 }
153 sequence_number++, 151
154 clock_.TimeInMilliseconds(),
155 250,
156 false);
157 SendAndExpectPacket(PacedSender::kNormalPriority,
158 ssrc,
159 sequence_number++,
160 clock_.TimeInMilliseconds(),
161 250,
162 false);
163 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds(); 152 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
164 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 153 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
165 sequence_number, queued_packet_timestamp, 250, 154 sequence_number, queued_packet_timestamp, 250,
166 false); 155 false);
156 EXPECT_EQ(packets_to_send + 1, send_bucket_->QueueSizePackets());
167 send_bucket_->Process(); 157 send_bucket_->Process();
168 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 158 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
169 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); 159 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
170 clock_.AdvanceTimeMilliseconds(4); 160 clock_.AdvanceTimeMilliseconds(4);
171 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess()); 161 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
172 clock_.AdvanceTimeMilliseconds(1); 162 clock_.AdvanceTimeMilliseconds(1);
173 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); 163 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
174 EXPECT_CALL( 164 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
175 callback_, 165 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
176 TimeToSendPacket(ssrc, sequence_number++, queued_packet_timestamp, false)) 166 queued_packet_timestamp, false))
177 .Times(1) 167 .Times(1)
178 .WillRepeatedly(Return(true)); 168 .WillRepeatedly(Return(true));
179 send_bucket_->Process(); 169 send_bucket_->Process();
180 sequence_number++; 170 sequence_number++;
181 SendAndExpectPacket(PacedSender::kNormalPriority, 171 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
182 ssrc, 172
183 sequence_number++, 173 // We can send packets_to_send -1 packets of size 250 during the current
184 clock_.TimeInMilliseconds(), 174 // interval since one packet has already been sent.
185 250, 175 for (size_t i = 0; i < packets_to_send - 1; ++i) {
186 false); 176 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
187 SendAndExpectPacket(PacedSender::kNormalPriority, 177 clock_.TimeInMilliseconds(), 250, false);
188 ssrc, 178 }
189 sequence_number++,
190 clock_.TimeInMilliseconds(),
191 250,
192 false);
193 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 179 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
194 sequence_number++, clock_.TimeInMilliseconds(), 180 sequence_number++, clock_.TimeInMilliseconds(),
195 250, false); 181 250, false);
182 EXPECT_EQ(packets_to_send, send_bucket_->QueueSizePackets());
196 send_bucket_->Process(); 183 send_bucket_->Process();
184 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
197 } 185 }
198 186
199 TEST_F(PacedSenderTest, PaceQueuedPackets) { 187 TEST_F(PacedSenderTest, PaceQueuedPackets) {
200 uint32_t ssrc = 12345; 188 uint32_t ssrc = 12345;
201 uint16_t sequence_number = 1234; 189 uint16_t sequence_number = 1234;
202 190
203 // Due to the multiplicative factor we can send 3 packets not 2 packets. 191 // Due to the multiplicative factor we can send 5 packets during a send
204 for (int i = 0; i < 3; ++i) { 192 // interval. (network capacity * multiplier / (8 bits per byte *
205 SendAndExpectPacket(PacedSender::kNormalPriority, 193 // (packet size * #send intervals per second)
206 ssrc, 194 const size_t packets_to_send_per_interval =
207 sequence_number++, 195 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
208 clock_.TimeInMilliseconds(), 196 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
209 250, 197 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
210 false); 198 clock_.TimeInMilliseconds(), 250, false);
211 } 199 }
212 for (int j = 0; j < 30; ++j) { 200
201 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
213 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 202 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
214 sequence_number++, clock_.TimeInMilliseconds(), 203 sequence_number++, clock_.TimeInMilliseconds(),
215 250, false); 204 250, false);
216 } 205 }
206 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
207 send_bucket_->QueueSizePackets());
217 send_bucket_->Process(); 208 send_bucket_->Process();
209 EXPECT_EQ(packets_to_send_per_interval * 10,
210 send_bucket_->QueueSizePackets());
218 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); 211 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
219 for (int k = 0; k < 10; ++k) { 212 for (int k = 0; k < 10; ++k) {
220 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 213 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
221 clock_.AdvanceTimeMilliseconds(5); 214 clock_.AdvanceTimeMilliseconds(5);
222 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false)) 215 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false))
223 .Times(3) 216 .Times(packets_to_send_per_interval)
224 .WillRepeatedly(Return(true)); 217 .WillRepeatedly(Return(true));
225 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); 218 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
226 send_bucket_->Process(); 219 send_bucket_->Process();
227 } 220 }
221 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
228 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 222 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
229 clock_.AdvanceTimeMilliseconds(5); 223 clock_.AdvanceTimeMilliseconds(5);
230 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); 224 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
225 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
231 send_bucket_->Process(); 226 send_bucket_->Process();
232 SendAndExpectPacket(PacedSender::kNormalPriority, 227
233 ssrc, 228 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
234 sequence_number++, 229 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
235 clock_.TimeInMilliseconds(), 230 clock_.TimeInMilliseconds(), 250, false);
236 250, 231 }
237 false);
238 SendAndExpectPacket(PacedSender::kNormalPriority,
239 ssrc,
240 sequence_number++,
241 clock_.TimeInMilliseconds(),
242 250,
243 false);
244 SendAndExpectPacket(PacedSender::kNormalPriority,
245 ssrc,
246 sequence_number++,
247 clock_.TimeInMilliseconds(),
248 250,
249 false);
250 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 232 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
251 sequence_number, clock_.TimeInMilliseconds(), 250, 233 sequence_number, clock_.TimeInMilliseconds(), 250,
252 false); 234 false);
253 send_bucket_->Process(); 235 send_bucket_->Process();
236 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
254 } 237 }
255 238
256 TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) { 239 TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
257 uint32_t ssrc = 12345; 240 uint32_t ssrc = 12345;
258 uint16_t sequence_number = 1234; 241 uint16_t sequence_number = 1234;
259 uint16_t queued_sequence_number; 242 uint16_t queued_sequence_number;
260 243
261 // Due to the multiplicative factor we can send 3 packets not 2 packets. 244 // Due to the multiplicative factor we can send 5 packets during a send
262 for (int i = 0; i < 3; ++i) { 245 // interval. (network capacity * multiplier / (8 bits per byte *
263 SendAndExpectPacket(PacedSender::kNormalPriority, 246 // (packet size * #send intervals per second)
264 ssrc, 247 const size_t packets_to_send_per_interval =
265 sequence_number++, 248 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
266 clock_.TimeInMilliseconds(), 249 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
267 250, 250 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
268 false); 251 clock_.TimeInMilliseconds(), 250, false);
269 } 252 }
270 queued_sequence_number = sequence_number; 253 queued_sequence_number = sequence_number;
271 254
272 for (int j = 0; j < 30; ++j) { 255 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
273 // Send in duplicate packets. 256 // Send in duplicate packets.
274 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 257 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
275 sequence_number, clock_.TimeInMilliseconds(), 258 sequence_number, clock_.TimeInMilliseconds(),
276 250, false); 259 250, false);
277 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 260 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
278 sequence_number++, clock_.TimeInMilliseconds(), 261 sequence_number++, clock_.TimeInMilliseconds(),
279 250, false); 262 250, false);
280 } 263 }
281 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); 264 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
282 send_bucket_->Process(); 265 send_bucket_->Process();
283 for (int k = 0; k < 10; ++k) { 266 for (int k = 0; k < 10; ++k) {
284 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 267 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
285 clock_.AdvanceTimeMilliseconds(5); 268 clock_.AdvanceTimeMilliseconds(5);
286 269
287 for (int i = 0; i < 3; ++i) { 270 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
288 EXPECT_CALL(callback_, 271 EXPECT_CALL(callback_,
289 TimeToSendPacket(ssrc, queued_sequence_number++, _, false)) 272 TimeToSendPacket(ssrc, queued_sequence_number++, _, false))
290 .Times(1) 273 .Times(1)
291 .WillRepeatedly(Return(true)); 274 .WillRepeatedly(Return(true));
292 } 275 }
293 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); 276 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
294 send_bucket_->Process(); 277 send_bucket_->Process();
295 } 278 }
296 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 279 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
297 clock_.AdvanceTimeMilliseconds(5); 280 clock_.AdvanceTimeMilliseconds(5);
298 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); 281 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
299 send_bucket_->Process(); 282 send_bucket_->Process();
300 SendAndExpectPacket(PacedSender::kNormalPriority, 283
301 ssrc, 284 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
302 sequence_number++, 285 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
303 clock_.TimeInMilliseconds(), 286 clock_.TimeInMilliseconds(), 250, false);
304 250, 287 }
305 false);
306 SendAndExpectPacket(PacedSender::kNormalPriority,
307 ssrc,
308 sequence_number++,
309 clock_.TimeInMilliseconds(),
310 250,
311 false);
312 SendAndExpectPacket(PacedSender::kNormalPriority,
313 ssrc,
314 sequence_number++,
315 clock_.TimeInMilliseconds(),
316 250,
317 false);
318 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 288 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
319 sequence_number++, clock_.TimeInMilliseconds(), 289 sequence_number++, clock_.TimeInMilliseconds(),
320 250, false); 290 250, false);
321 send_bucket_->Process(); 291 send_bucket_->Process();
292 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
322 } 293 }
323 294
324 TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) { 295 TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
325 uint32_t ssrc = 12345; 296 uint32_t ssrc = 12345;
326 uint16_t sequence_number = 1234; 297 uint16_t sequence_number = 1234;
327 298
328 SendAndExpectPacket(PacedSender::kNormalPriority, 299 SendAndExpectPacket(PacedSender::kNormalPriority,
329 ssrc, 300 ssrc,
330 sequence_number, 301 sequence_number,
331 clock_.TimeInMilliseconds(), 302 clock_.TimeInMilliseconds(),
332 250, 303 250,
333 false); 304 false);
334 305
335 // Expect packet on second ssrc to be queued and sent as well. 306 // Expect packet on second ssrc to be queued and sent as well.
336 SendAndExpectPacket(PacedSender::kNormalPriority, 307 SendAndExpectPacket(PacedSender::kNormalPriority,
337 ssrc + 1, 308 ssrc + 1,
338 sequence_number, 309 sequence_number,
339 clock_.TimeInMilliseconds(), 310 clock_.TimeInMilliseconds(),
340 250, 311 250,
341 false); 312 false);
342 313
343 clock_.AdvanceTimeMilliseconds(1000); 314 clock_.AdvanceTimeMilliseconds(1000);
344 send_bucket_->Process(); 315 send_bucket_->Process();
345 } 316 }
346 317
347 TEST_F(PacedSenderTest, Padding) { 318 TEST_F(PacedSenderTest, Padding) {
348 uint32_t ssrc = 12345; 319 uint32_t ssrc = 12345;
349 uint16_t sequence_number = 1234; 320 uint16_t sequence_number = 1234;
350 321
351 send_bucket_->UpdateBitrate( 322 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
352 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate); 323 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
353 // Due to the multiplicative factor we can send 3 packets not 2 packets. 324
354 SendAndExpectPacket(PacedSender::kNormalPriority, 325 // Due to the multiplicative factor we can send 5 packets during a send
355 ssrc, 326 // interval. (network capacity * multiplier / (8 bits per byte *
356 sequence_number++, 327 // (packet size * #send intervals per second)
357 clock_.TimeInMilliseconds(), 328 const size_t packets_to_send_per_interval =
358 250, 329 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
359 false); 330 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
360 SendAndExpectPacket(PacedSender::kNormalPriority, 331 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
361 ssrc, 332 clock_.TimeInMilliseconds(), 250, false);
362 sequence_number++, 333 }
363 clock_.TimeInMilliseconds(),
364 250,
365 false);
366 SendAndExpectPacket(PacedSender::kNormalPriority,
367 ssrc,
368 sequence_number++,
369 clock_.TimeInMilliseconds(),
370 250,
371 false);
372 // No padding is expected since we have sent too much already. 334 // No padding is expected since we have sent too much already.
373 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); 335 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
336 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
337 send_bucket_->Process();
338 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
339
340 // 5 milliseconds later should not send padding since we filled the buffers
341 // initially.
342 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(0);
374 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 343 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
375 clock_.AdvanceTimeMilliseconds(5); 344 clock_.AdvanceTimeMilliseconds(5);
376 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); 345 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
377 send_bucket_->Process(); 346 send_bucket_->Process();
378 347
379 // 5 milliseconds later we have enough budget to send some padding. 348 // 5 milliseconds later we have enough budget to send some padding.
380 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1). 349 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
381 WillOnce(Return(250)); 350 WillOnce(Return(250));
382 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 351 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
383 clock_.AdvanceTimeMilliseconds(5); 352 clock_.AdvanceTimeMilliseconds(5);
384 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); 353 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
385 send_bucket_->Process(); 354 send_bucket_->Process();
386 } 355 }
387 356
388 TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) { 357 TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
389 uint32_t ssrc = 12345; 358 uint32_t ssrc = 12345;
390 uint16_t sequence_number = 1234; 359 uint16_t sequence_number = 1234;
391 int64_t capture_time_ms = 56789; 360 int64_t capture_time_ms = 56789;
392 const int kTimeStep = 5; 361 const int kTimeStep = 5;
393 const int64_t kBitrateWindow = 100; 362 const int64_t kBitrateWindow = 100;
394 send_bucket_->UpdateBitrate( 363 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
395 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate); 364 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
365
396 int64_t start_time = clock_.TimeInMilliseconds(); 366 int64_t start_time = clock_.TimeInMilliseconds();
397 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) { 367 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
398 SendAndExpectPacket(PacedSender::kNormalPriority, 368 SendAndExpectPacket(PacedSender::kNormalPriority,
399 ssrc, 369 ssrc,
400 sequence_number++, 370 sequence_number++,
401 capture_time_ms, 371 capture_time_ms,
402 250, 372 250,
403 false); 373 false);
404 clock_.AdvanceTimeMilliseconds(kTimeStep);
405 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1). 374 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
406 WillOnce(Return(250)); 375 WillOnce(Return(250));
407 send_bucket_->Process(); 376 send_bucket_->Process();
377 clock_.AdvanceTimeMilliseconds(kTimeStep);
408 } 378 }
409 } 379 }
410 380
411 TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) { 381 TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
412 uint32_t ssrc = 12345; 382 uint32_t ssrc = 12345;
413 uint16_t sequence_number = 1234; 383 uint16_t sequence_number = 1234;
414 int64_t capture_time_ms = 56789; 384 int64_t capture_time_ms = 56789;
415 const int kTimeStep = 5; 385 const int kTimeStep = 5;
416 const int64_t kBitrateWindow = 10000; 386 const int64_t kBitrateWindow = 10000;
417 PacedSenderPadding callback; 387 PacedSenderPadding callback;
418 send_bucket_.reset(new PacedSender( 388 send_bucket_.reset(new PacedSender(&clock_, &callback));
419 &clock_, &callback, kTargetBitrate, kPaceMultiplier * kTargetBitrate, 0));
420 send_bucket_->SetProbingEnabled(false); 389 send_bucket_->SetProbingEnabled(false);
421 send_bucket_->UpdateBitrate( 390 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
422 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate); 391 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
392
423 int64_t start_time = clock_.TimeInMilliseconds(); 393 int64_t start_time = clock_.TimeInMilliseconds();
424 size_t media_bytes = 0; 394 size_t media_bytes = 0;
425 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) { 395 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
426 int rand_value = rand(); // NOLINT (rand_r instead of rand) 396 int rand_value = rand(); // NOLINT (rand_r instead of rand)
427 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes. 397 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
428 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 398 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
429 sequence_number++, capture_time_ms, 399 sequence_number++, capture_time_ms,
430 media_payload, false); 400 media_payload, false);
431 media_bytes += media_payload; 401 media_bytes += media_payload;
432 clock_.AdvanceTimeMilliseconds(kTimeStep); 402 clock_.AdvanceTimeMilliseconds(kTimeStep);
433 send_bucket_->Process(); 403 send_bucket_->Process();
434 } 404 }
435 EXPECT_NEAR(kTargetBitrate, 405 EXPECT_NEAR(kTargetBitrateBps / 1000,
436 static_cast<int>(8 * (media_bytes + callback.padding_sent()) / 406 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
437 kBitrateWindow), 1); 407 kBitrateWindow),
408 1);
438 } 409 }
439 410
440 TEST_F(PacedSenderTest, Priority) { 411 TEST_F(PacedSenderTest, Priority) {
441 uint32_t ssrc_low_priority = 12345; 412 uint32_t ssrc_low_priority = 12345;
442 uint32_t ssrc = 12346; 413 uint32_t ssrc = 12346;
443 uint16_t sequence_number = 1234; 414 uint16_t sequence_number = 1234;
444 int64_t capture_time_ms = 56789; 415 int64_t capture_time_ms = 56789;
445 int64_t capture_time_ms_low_priority = 1234567; 416 int64_t capture_time_ms_low_priority = 1234567;
446 417
447 // Due to the multiplicative factor we can send 3 packets not 2 packets. 418 // Due to the multiplicative factor we can send 5 packets during a send
448 SendAndExpectPacket(PacedSender::kLowPriority, 419 // interval. (network capacity * multiplier / (8 bits per byte *
449 ssrc, 420 // (packet size * #send intervals per second)
450 sequence_number++, 421 const size_t packets_to_send_per_interval =
451 capture_time_ms, 422 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
452 250, 423 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
453 false); 424 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
454 SendAndExpectPacket(PacedSender::kNormalPriority, 425 clock_.TimeInMilliseconds(), 250, false);
455 ssrc, 426 }
456 sequence_number++,
457 capture_time_ms,
458 250,
459 false);
460 SendAndExpectPacket(PacedSender::kNormalPriority,
461 ssrc,
462 sequence_number++,
463 capture_time_ms,
464 250,
465 false);
466 send_bucket_->Process(); 427 send_bucket_->Process();
428 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
467 429
468 // Expect normal and low priority to be queued and high to pass through. 430 // Expect normal and low priority to be queued and high to pass through.
469 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority, 431 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
470 sequence_number++, capture_time_ms_low_priority, 432 sequence_number++, capture_time_ms_low_priority,
471 250, false); 433 250, false);
472 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 434
473 sequence_number++, capture_time_ms, 250, false); 435 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
474 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 436 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
475 sequence_number++, capture_time_ms, 250, false); 437 sequence_number++, capture_time_ms, 250, false);
476 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 438 }
477 sequence_number++, capture_time_ms, 250, false);
478 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, 439 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
479 sequence_number++, capture_time_ms, 250, false); 440 sequence_number++, capture_time_ms, 250, false);
480 441
481 // Expect all high and normal priority to be sent out first. 442 // Expect all high and normal priority to be sent out first.
482 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); 443 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
483 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false)) 444 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
484 .Times(4) 445 .Times(packets_to_send_per_interval + 1)
485 .WillRepeatedly(Return(true)); 446 .WillRepeatedly(Return(true));
486 447
487 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 448 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
488 clock_.AdvanceTimeMilliseconds(5); 449 clock_.AdvanceTimeMilliseconds(5);
489 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); 450 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
490 send_bucket_->Process(); 451 send_bucket_->Process();
452 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
491 453
492 EXPECT_CALL(callback_, 454 EXPECT_CALL(callback_,
493 TimeToSendPacket( 455 TimeToSendPacket(
494 ssrc_low_priority, _, capture_time_ms_low_priority, false)) 456 ssrc_low_priority, _, capture_time_ms_low_priority, false))
495 .Times(1) 457 .Times(1)
496 .WillRepeatedly(Return(true)); 458 .WillRepeatedly(Return(true));
497 459
498 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 460 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
499 clock_.AdvanceTimeMilliseconds(5); 461 clock_.AdvanceTimeMilliseconds(5);
500 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); 462 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
501 send_bucket_->Process(); 463 send_bucket_->Process();
502 } 464 }
503 465
504 TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) { 466 TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
505 uint32_t ssrc = 12346; 467 uint32_t ssrc = 12346;
506 uint16_t sequence_number = 1234; 468 uint16_t sequence_number = 1234;
507 int64_t capture_time_ms = 56789; 469 int64_t capture_time_ms = 56789;
508 470
509 // As high prio packets doesn't affect the budget, we should be able to send 471 // As high prio packets doesn't affect the budget, we should be able to send
510 // a high number of them at once. 472 // a high number of them at once.
511 for (int i = 0; i < 25; ++i) { 473 for (int i = 0; i < 25; ++i) {
512 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++, 474 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
513 capture_time_ms, 250, false); 475 capture_time_ms, 250, false);
514 } 476 }
515 send_bucket_->Process(); 477 send_bucket_->Process();
516 // Low prio packets does affect the budget, so we should only be able to send 478 // Low prio packets does affect the budget.
517 // 3 at once, the 4th should be queued. 479 // Due to the multiplicative factor we can send 5 packets during a send
518 for (int i = 0; i < 3; ++i) { 480 // interval. (network capacity * multiplier / (8 bits per byte *
481 // (packet size * #send intervals per second)
482 const size_t packets_to_send_per_interval =
483 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
484 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
519 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++, 485 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
520 capture_time_ms, 250, false); 486 clock_.TimeInMilliseconds(), 250, false);
521 } 487 }
522 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number, 488 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
523 capture_time_ms, 250, false); 489 capture_time_ms, 250, false);
524 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 490 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
525 clock_.AdvanceTimeMilliseconds(5); 491 clock_.AdvanceTimeMilliseconds(5);
526 send_bucket_->Process(); 492 send_bucket_->Process();
493 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
527 EXPECT_CALL(callback_, 494 EXPECT_CALL(callback_,
528 TimeToSendPacket(ssrc, sequence_number++, capture_time_ms, false)) 495 TimeToSendPacket(ssrc, sequence_number++, capture_time_ms, false))
529 .Times(1); 496 .Times(1)
497 .WillRepeatedly(Return(true));
530 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); 498 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
531 clock_.AdvanceTimeMilliseconds(5); 499 clock_.AdvanceTimeMilliseconds(5);
532 send_bucket_->Process(); 500 send_bucket_->Process();
501 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
533 } 502 }
534 503
535 TEST_F(PacedSenderTest, Pause) { 504 TEST_F(PacedSenderTest, Pause) {
536 uint32_t ssrc_low_priority = 12345; 505 uint32_t ssrc_low_priority = 12345;
537 uint32_t ssrc = 12346; 506 uint32_t ssrc = 12346;
538 uint16_t sequence_number = 1234; 507 uint16_t sequence_number = 1234;
539 int64_t capture_time_ms = clock_.TimeInMilliseconds(); 508 int64_t capture_time_ms = clock_.TimeInMilliseconds();
540 509
541 EXPECT_EQ(0, send_bucket_->QueueInMs()); 510 EXPECT_EQ(0, send_bucket_->QueueInMs());
542 511
543 // Due to the multiplicative factor we can send 3 packets not 2 packets. 512 // Due to the multiplicative factor we can send 5 packets during a send
544 SendAndExpectPacket(PacedSender::kLowPriority, 513 // interval. (network capacity * multiplier / (8 bits per byte *
545 ssrc, 514 // (packet size * #send intervals per second)
546 sequence_number++, 515 const size_t packets_to_send_per_interval =
547 capture_time_ms, 516 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
548 250, 517 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
549 false); 518 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
550 SendAndExpectPacket(PacedSender::kNormalPriority, 519 clock_.TimeInMilliseconds(), 250, false);
551 ssrc, 520 }
552 sequence_number++, 521
553 capture_time_ms,
554 250,
555 false);
556 SendAndExpectPacket(PacedSender::kNormalPriority,
557 ssrc,
558 sequence_number++,
559 capture_time_ms,
560 250,
561 false);
562 send_bucket_->Process(); 522 send_bucket_->Process();
563 523
564 send_bucket_->Pause(); 524 send_bucket_->Pause();
565 525
566 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 526 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
567 sequence_number++, capture_time_ms, 250, false); 527 sequence_number++, capture_time_ms, 250, false);
568 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 528 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
569 sequence_number++, capture_time_ms, 250, false); 529 sequence_number++, capture_time_ms, 250, false);
570 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, 530 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
571 sequence_number++, capture_time_ms, 250, false); 531 sequence_number++, capture_time_ms, 250, false);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 clock_.AdvanceTimeMilliseconds(10000); 621 clock_.AdvanceTimeMilliseconds(10000);
662 send_bucket_->Process(); 622 send_bucket_->Process();
663 EXPECT_EQ(0, send_bucket_->QueueInMs()); 623 EXPECT_EQ(0, send_bucket_->QueueInMs());
664 } 624 }
665 625
666 TEST_F(PacedSenderTest, ExpectedQueueTimeMs) { 626 TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
667 uint32_t ssrc = 12346; 627 uint32_t ssrc = 12346;
668 uint16_t sequence_number = 1234; 628 uint16_t sequence_number = 1234;
669 const size_t kNumPackets = 60; 629 const size_t kNumPackets = 60;
670 const size_t kPacketSize = 1200; 630 const size_t kPacketSize = 1200;
671 const int32_t kMaxBitrate = kPaceMultiplier * 30; 631 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
672 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs()); 632 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
673 633
674 send_bucket_->UpdateBitrate(30, kMaxBitrate, 0); 634 send_bucket_->SetEstimatedBitrate(30000);
675 for (size_t i = 0; i < kNumPackets; ++i) { 635 for (size_t i = 0; i < kNumPackets; ++i) {
676 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++, 636 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
677 clock_.TimeInMilliseconds(), kPacketSize, false); 637 clock_.TimeInMilliseconds(), kPacketSize, false);
678 } 638 }
679 639
680 // Queue in ms = 1000 * (bytes in queue) / (kbit per second * 1000 / 8) 640 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
681 int64_t queue_in_ms = 641 int64_t queue_in_ms =
682 static_cast<int64_t>(kNumPackets * kPacketSize * 8 / kMaxBitrate); 642 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
683 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs()); 643 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
684 644
685 int64_t time_start = clock_.TimeInMilliseconds(); 645 int64_t time_start = clock_.TimeInMilliseconds();
686 while (send_bucket_->QueueSizePackets() > 0) { 646 while (send_bucket_->QueueSizePackets() > 0) {
687 int time_until_process = send_bucket_->TimeUntilNextProcess(); 647 int time_until_process = send_bucket_->TimeUntilNextProcess();
688 if (time_until_process <= 0) { 648 if (time_until_process <= 0) {
689 send_bucket_->Process(); 649 send_bucket_->Process();
690 } else { 650 } else {
691 clock_.AdvanceTimeMilliseconds(time_until_process); 651 clock_.AdvanceTimeMilliseconds(time_until_process);
692 } 652 }
693 } 653 }
694 int64_t duration = clock_.TimeInMilliseconds() - time_start; 654 int64_t duration = clock_.TimeInMilliseconds() - time_start;
695 655
696 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs()); 656 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
697 657
698 // Allow for aliasing, duration should be within one pack of max time limit. 658 // Allow for aliasing, duration should be within one pack of max time limit.
699 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs, 659 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
700 static_cast<int64_t>(kPacketSize * 8 / kMaxBitrate)); 660 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
701 } 661 }
702 662
703 TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) { 663 TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
704 uint32_t ssrc = 12346; 664 uint32_t ssrc = 12346;
705 uint16_t sequence_number = 1234; 665 uint16_t sequence_number = 1234;
706 EXPECT_EQ(0, send_bucket_->QueueInMs()); 666 EXPECT_EQ(0, send_bucket_->QueueInMs());
707 667
708 send_bucket_->UpdateBitrate(30, kPaceMultiplier * 30, 0); 668 send_bucket_->SetEstimatedBitrate(30000);
709 SendAndExpectPacket(PacedSender::kNormalPriority, 669 SendAndExpectPacket(PacedSender::kNormalPriority,
710 ssrc, 670 ssrc,
711 sequence_number, 671 sequence_number,
712 clock_.TimeInMilliseconds(), 672 clock_.TimeInMilliseconds(),
713 1200, 673 1200,
714 false); 674 false);
715 675
716 clock_.AdvanceTimeMilliseconds(500); 676 clock_.AdvanceTimeMilliseconds(500);
717 EXPECT_EQ(500, send_bucket_->QueueInMs()); 677 EXPECT_EQ(500, send_bucket_->QueueInMs());
718 send_bucket_->Process(); 678 send_bucket_->Process();
719 EXPECT_EQ(0, send_bucket_->QueueInMs()); 679 EXPECT_EQ(0, send_bucket_->QueueInMs());
720 } 680 }
721 681
722 TEST_F(PacedSenderTest, ProbingWithInitialFrame) { 682 TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
723 const int kNumPackets = 11; 683 const int kNumPackets = 11;
724 const int kNumDeltas = kNumPackets - 1; 684 const int kNumDeltas = kNumPackets - 1;
725 const size_t kPacketSize = 1200; 685 const size_t kPacketSize = 1200;
726 const int kInitialBitrateKbps = 300; 686 const int kInitialBitrateBps = 300000;
727 uint32_t ssrc = 12346; 687 uint32_t ssrc = 12346;
728 uint16_t sequence_number = 1234; 688 uint16_t sequence_number = 1234;
689
729 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5}; 690 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
730 std::list<int> expected_deltas_list(expected_deltas, 691 std::list<int> expected_deltas_list(expected_deltas,
731 expected_deltas + kNumDeltas); 692 expected_deltas + kNumDeltas);
732 PacedSenderProbing callback(expected_deltas_list, &clock_); 693 PacedSenderProbing callback(expected_deltas_list, &clock_);
733 send_bucket_.reset( 694 send_bucket_.reset(new PacedSender(&clock_, &callback));
734 new PacedSender(&clock_, 695 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
735 &callback,
736 kInitialBitrateKbps,
737 kPaceMultiplier * kInitialBitrateKbps,
738 0));
739 696
740 for (int i = 0; i < kNumPackets; ++i) { 697 for (int i = 0; i < kNumPackets; ++i) {
741 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 698 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
742 sequence_number++, clock_.TimeInMilliseconds(), 699 sequence_number++, clock_.TimeInMilliseconds(),
743 kPacketSize, false); 700 kPacketSize, false);
744 } 701 }
702
745 while (callback.packets_sent() < kNumPackets) { 703 while (callback.packets_sent() < kNumPackets) {
746 int time_until_process = send_bucket_->TimeUntilNextProcess(); 704 int time_until_process = send_bucket_->TimeUntilNextProcess();
747 if (time_until_process <= 0) { 705 if (time_until_process <= 0) {
748 send_bucket_->Process(); 706 send_bucket_->Process();
749 } else { 707 } else {
750 clock_.AdvanceTimeMilliseconds(time_until_process); 708 clock_.AdvanceTimeMilliseconds(time_until_process);
751 } 709 }
752 } 710 }
753 } 711 }
754 712
755 TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) { 713 TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) {
756 const int kNumPackets = 11; 714 const int kNumPackets = 11;
757 const int kNumDeltas = kNumPackets - 1; 715 const int kNumDeltas = kNumPackets - 1;
758 const size_t kPacketSize = 1200; 716 const size_t kPacketSize = 1200;
759 const int kInitialBitrateKbps = 300; 717 const int kInitialBitrateBps = 300000;
760 uint32_t ssrc = 12346; 718 uint32_t ssrc = 12346;
761 uint16_t sequence_number = 1234; 719 uint16_t sequence_number = 1234;
762 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5}; 720 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
763 std::list<int> expected_deltas_list(expected_deltas, 721 std::list<int> expected_deltas_list(expected_deltas,
764 expected_deltas + kNumDeltas); 722 expected_deltas + kNumDeltas);
765 PacedSenderProbing callback(expected_deltas_list, &clock_); 723 PacedSenderProbing callback(expected_deltas_list, &clock_);
766 send_bucket_.reset(new PacedSender(&clock_, &callback, kInitialBitrateKbps, 724 send_bucket_.reset(new PacedSender(&clock_, &callback));
767 kPaceMultiplier * kInitialBitrateKbps, 0)); 725 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
768 726
769 for (int i = 0; i < kNumPackets - 5; ++i) { 727 for (int i = 0; i < kNumPackets - 5; ++i) {
770 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 728 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
771 sequence_number++, clock_.TimeInMilliseconds(), 729 sequence_number++, clock_.TimeInMilliseconds(),
772 kPacketSize, false); 730 kPacketSize, false);
773 } 731 }
774 while (callback.packets_sent() < kNumPackets) { 732 while (callback.packets_sent() < kNumPackets) {
775 int time_until_process = send_bucket_->TimeUntilNextProcess(); 733 int time_until_process = send_bucket_->TimeUntilNextProcess();
776 if (time_until_process <= 0) { 734 if (time_until_process <= 0) {
777 send_bucket_->Process(); 735 send_bucket_->Process();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 } 790 }
833 } 791 }
834 } 792 }
835 } 793 }
836 794
837 TEST_F(PacedSenderTest, PaddingOveruse) { 795 TEST_F(PacedSenderTest, PaddingOveruse) {
838 uint32_t ssrc = 12346; 796 uint32_t ssrc = 12346;
839 uint16_t sequence_number = 1234; 797 uint16_t sequence_number = 1234;
840 const size_t kPacketSize = 1200; 798 const size_t kPacketSize = 1200;
841 799
842 // Min bitrate 0 => no padding, padding budget will stay at 0. 800 send_bucket_->Process();
843 send_bucket_->UpdateBitrate(60, 90, 0); 801 send_bucket_->SetEstimatedBitrate(60000);
802 send_bucket_->SetAllocatedSendBitrate(60000, 0);
803
844 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++, 804 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
845 clock_.TimeInMilliseconds(), kPacketSize, false); 805 clock_.TimeInMilliseconds(), kPacketSize, false);
846 send_bucket_->Process(); 806 send_bucket_->Process();
847 807
848 // Add 30kbit padding. When increasing budget, media budget will increase from 808 // Add 30kbit padding. When increasing budget, media budget will increase from
849 // negative (overuse) while padding budget will increase form 0. 809 // negative (overuse) while padding budget will increase from 0.
850 clock_.AdvanceTimeMilliseconds(5); 810 clock_.AdvanceTimeMilliseconds(5);
851 send_bucket_->UpdateBitrate(60, 90, 30); 811 send_bucket_->SetAllocatedSendBitrate(60000, 30000);
852 812
853 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, 813 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
854 sequence_number++, clock_.TimeInMilliseconds(), 814 clock_.TimeInMilliseconds(), kPacketSize, false);
855 kPacketSize, false); 815 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
856
857 // Don't send padding if queue is non-empty, even if padding budget > 0. 816 // Don't send padding if queue is non-empty, even if padding budget > 0.
858 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); 817 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
859 send_bucket_->Process(); 818 send_bucket_->Process();
860 } 819 }
861 820
862 TEST_F(PacedSenderTest, AverageQueueTime) { 821 TEST_F(PacedSenderTest, AverageQueueTime) {
863 uint32_t ssrc = 12346; 822 uint32_t ssrc = 12346;
864 uint16_t sequence_number = 1234; 823 uint16_t sequence_number = 1234;
865 const size_t kPacketSize = 1200; 824 const size_t kPacketSize = 1200;
866 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second. 825 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
867 const int kBitrateKbps = (kBitrateBps + 500) / 1000;
868 826
869 send_bucket_->UpdateBitrate(kBitrateKbps, kBitrateKbps, kBitrateKbps); 827 send_bucket_->SetEstimatedBitrate(kBitrateBps);
870 828
871 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs()); 829 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
872 830
873 int64_t first_capture_time = clock_.TimeInMilliseconds(); 831 int64_t first_capture_time = clock_.TimeInMilliseconds();
874 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 832 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
875 sequence_number, first_capture_time, kPacketSize, 833 sequence_number, first_capture_time, kPacketSize,
876 false); 834 false);
877 clock_.AdvanceTimeMilliseconds(10); 835 clock_.AdvanceTimeMilliseconds(10);
878 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, 836 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
879 sequence_number + 1, clock_.TimeInMilliseconds(), 837 sequence_number + 1, clock_.TimeInMilliseconds(),
(...skipping 20 matching lines...) Expand all
900 for (int i = 0; i < 3; ++i) { 858 for (int i = 0; i < 3; ++i) {
901 clock_.AdvanceTimeMilliseconds(30); // Max delta. 859 clock_.AdvanceTimeMilliseconds(30); // Max delta.
902 send_bucket_->Process(); 860 send_bucket_->Process();
903 } 861 }
904 862
905 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs()); 863 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
906 } 864 }
907 865
908 } // namespace test 866 } // namespace test
909 } // namespace webrtc 867 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/pacing/paced_sender.cc ('k') | webrtc/modules/pacing/packet_router.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698