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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 // by calling SetProbingEnabled(true). | 117 // by calling SetProbingEnabled(true). |
118 send_bucket_->SetProbingEnabled(false); | 118 send_bucket_->SetProbingEnabled(false); |
119 } | 119 } |
120 | 120 |
121 void SendAndExpectPacket(PacedSender::Priority priority, | 121 void SendAndExpectPacket(PacedSender::Priority priority, |
122 uint32_t ssrc, | 122 uint32_t ssrc, |
123 uint16_t sequence_number, | 123 uint16_t sequence_number, |
124 int64_t capture_time_ms, | 124 int64_t capture_time_ms, |
125 size_t size, | 125 size_t size, |
126 bool retransmission) { | 126 bool retransmission) { |
127 EXPECT_FALSE(send_bucket_->SendPacket(priority, ssrc, | 127 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms, |
128 sequence_number, capture_time_ms, size, retransmission)); | 128 size, retransmission); |
129 EXPECT_CALL(callback_, | 129 EXPECT_CALL(callback_, |
130 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false)) | 130 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false)) |
131 .Times(1) | 131 .Times(1) |
132 .WillRepeatedly(Return(true)); | 132 .WillRepeatedly(Return(true)); |
133 } | 133 } |
134 | 134 |
135 SimulatedClock clock_; | 135 SimulatedClock clock_; |
136 MockPacedSenderCallback callback_; | 136 MockPacedSenderCallback callback_; |
137 rtc::scoped_ptr<PacedSender> send_bucket_; | 137 rtc::scoped_ptr<PacedSender> send_bucket_; |
138 }; | 138 }; |
(...skipping 14 matching lines...) Expand all Loading... |
153 clock_.TimeInMilliseconds(), | 153 clock_.TimeInMilliseconds(), |
154 250, | 154 250, |
155 false); | 155 false); |
156 SendAndExpectPacket(PacedSender::kNormalPriority, | 156 SendAndExpectPacket(PacedSender::kNormalPriority, |
157 ssrc, | 157 ssrc, |
158 sequence_number++, | 158 sequence_number++, |
159 clock_.TimeInMilliseconds(), | 159 clock_.TimeInMilliseconds(), |
160 250, | 160 250, |
161 false); | 161 false); |
162 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds(); | 162 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds(); |
163 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc, | 163 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
164 sequence_number, queued_packet_timestamp, 250, false)); | 164 sequence_number, queued_packet_timestamp, 250, |
| 165 false); |
165 send_bucket_->Process(); | 166 send_bucket_->Process(); |
166 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 167 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
167 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 168 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
168 clock_.AdvanceTimeMilliseconds(4); | 169 clock_.AdvanceTimeMilliseconds(4); |
169 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess()); | 170 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess()); |
170 clock_.AdvanceTimeMilliseconds(1); | 171 clock_.AdvanceTimeMilliseconds(1); |
171 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 172 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
172 EXPECT_CALL( | 173 EXPECT_CALL( |
173 callback_, | 174 callback_, |
174 TimeToSendPacket(ssrc, sequence_number++, queued_packet_timestamp, false)) | 175 TimeToSendPacket(ssrc, sequence_number++, queued_packet_timestamp, false)) |
175 .Times(1) | 176 .Times(1) |
176 .WillRepeatedly(Return(true)); | 177 .WillRepeatedly(Return(true)); |
177 send_bucket_->Process(); | 178 send_bucket_->Process(); |
178 sequence_number++; | 179 sequence_number++; |
179 SendAndExpectPacket(PacedSender::kNormalPriority, | 180 SendAndExpectPacket(PacedSender::kNormalPriority, |
180 ssrc, | 181 ssrc, |
181 sequence_number++, | 182 sequence_number++, |
182 clock_.TimeInMilliseconds(), | 183 clock_.TimeInMilliseconds(), |
183 250, | 184 250, |
184 false); | 185 false); |
185 SendAndExpectPacket(PacedSender::kNormalPriority, | 186 SendAndExpectPacket(PacedSender::kNormalPriority, |
186 ssrc, | 187 ssrc, |
187 sequence_number++, | 188 sequence_number++, |
188 clock_.TimeInMilliseconds(), | 189 clock_.TimeInMilliseconds(), |
189 250, | 190 250, |
190 false); | 191 false); |
191 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc, | 192 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
192 sequence_number++, clock_.TimeInMilliseconds(), 250, false)); | 193 sequence_number++, clock_.TimeInMilliseconds(), |
| 194 250, false); |
193 send_bucket_->Process(); | 195 send_bucket_->Process(); |
194 } | 196 } |
195 | 197 |
196 TEST_F(PacedSenderTest, PaceQueuedPackets) { | 198 TEST_F(PacedSenderTest, PaceQueuedPackets) { |
197 uint32_t ssrc = 12345; | 199 uint32_t ssrc = 12345; |
198 uint16_t sequence_number = 1234; | 200 uint16_t sequence_number = 1234; |
199 | 201 |
200 // Due to the multiplicative factor we can send 3 packets not 2 packets. | 202 // Due to the multiplicative factor we can send 3 packets not 2 packets. |
201 for (int i = 0; i < 3; ++i) { | 203 for (int i = 0; i < 3; ++i) { |
202 SendAndExpectPacket(PacedSender::kNormalPriority, | 204 SendAndExpectPacket(PacedSender::kNormalPriority, |
203 ssrc, | 205 ssrc, |
204 sequence_number++, | 206 sequence_number++, |
205 clock_.TimeInMilliseconds(), | 207 clock_.TimeInMilliseconds(), |
206 250, | 208 250, |
207 false); | 209 false); |
208 } | 210 } |
209 for (int j = 0; j < 30; ++j) { | 211 for (int j = 0; j < 30; ++j) { |
210 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc, | 212 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
211 sequence_number++, clock_.TimeInMilliseconds(), 250, false)); | 213 sequence_number++, clock_.TimeInMilliseconds(), |
| 214 250, false); |
212 } | 215 } |
213 send_bucket_->Process(); | 216 send_bucket_->Process(); |
214 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 217 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
215 for (int k = 0; k < 10; ++k) { | 218 for (int k = 0; k < 10; ++k) { |
216 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 219 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
217 clock_.AdvanceTimeMilliseconds(5); | 220 clock_.AdvanceTimeMilliseconds(5); |
218 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false)) | 221 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false)) |
219 .Times(3) | 222 .Times(3) |
220 .WillRepeatedly(Return(true)); | 223 .WillRepeatedly(Return(true)); |
221 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 224 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
(...skipping 14 matching lines...) Expand all Loading... |
236 sequence_number++, | 239 sequence_number++, |
237 clock_.TimeInMilliseconds(), | 240 clock_.TimeInMilliseconds(), |
238 250, | 241 250, |
239 false); | 242 false); |
240 SendAndExpectPacket(PacedSender::kNormalPriority, | 243 SendAndExpectPacket(PacedSender::kNormalPriority, |
241 ssrc, | 244 ssrc, |
242 sequence_number++, | 245 sequence_number++, |
243 clock_.TimeInMilliseconds(), | 246 clock_.TimeInMilliseconds(), |
244 250, | 247 250, |
245 false); | 248 false); |
246 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc, | 249 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
247 sequence_number, clock_.TimeInMilliseconds(), 250, false)); | 250 sequence_number, clock_.TimeInMilliseconds(), 250, |
| 251 false); |
248 send_bucket_->Process(); | 252 send_bucket_->Process(); |
249 } | 253 } |
250 | 254 |
251 TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) { | 255 TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) { |
252 uint32_t ssrc = 12345; | 256 uint32_t ssrc = 12345; |
253 uint16_t sequence_number = 1234; | 257 uint16_t sequence_number = 1234; |
254 uint16_t queued_sequence_number; | 258 uint16_t queued_sequence_number; |
255 | 259 |
256 // Due to the multiplicative factor we can send 3 packets not 2 packets. | 260 // Due to the multiplicative factor we can send 3 packets not 2 packets. |
257 for (int i = 0; i < 3; ++i) { | 261 for (int i = 0; i < 3; ++i) { |
258 SendAndExpectPacket(PacedSender::kNormalPriority, | 262 SendAndExpectPacket(PacedSender::kNormalPriority, |
259 ssrc, | 263 ssrc, |
260 sequence_number++, | 264 sequence_number++, |
261 clock_.TimeInMilliseconds(), | 265 clock_.TimeInMilliseconds(), |
262 250, | 266 250, |
263 false); | 267 false); |
264 } | 268 } |
265 queued_sequence_number = sequence_number; | 269 queued_sequence_number = sequence_number; |
266 | 270 |
267 for (int j = 0; j < 30; ++j) { | 271 for (int j = 0; j < 30; ++j) { |
268 // Send in duplicate packets. | 272 // Send in duplicate packets. |
269 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc, | 273 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
270 sequence_number, clock_.TimeInMilliseconds(), 250, false)); | 274 sequence_number, clock_.TimeInMilliseconds(), |
271 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc, | 275 250, false); |
272 sequence_number++, clock_.TimeInMilliseconds(), 250, false)); | 276 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
| 277 sequence_number++, clock_.TimeInMilliseconds(), |
| 278 250, false); |
273 } | 279 } |
274 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 280 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
275 send_bucket_->Process(); | 281 send_bucket_->Process(); |
276 for (int k = 0; k < 10; ++k) { | 282 for (int k = 0; k < 10; ++k) { |
277 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 283 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
278 clock_.AdvanceTimeMilliseconds(5); | 284 clock_.AdvanceTimeMilliseconds(5); |
279 | 285 |
280 for (int i = 0; i < 3; ++i) { | 286 for (int i = 0; i < 3; ++i) { |
281 EXPECT_CALL(callback_, | 287 EXPECT_CALL(callback_, |
282 TimeToSendPacket(ssrc, queued_sequence_number++, _, false)) | 288 TimeToSendPacket(ssrc, queued_sequence_number++, _, false)) |
(...skipping 18 matching lines...) Expand all Loading... |
301 sequence_number++, | 307 sequence_number++, |
302 clock_.TimeInMilliseconds(), | 308 clock_.TimeInMilliseconds(), |
303 250, | 309 250, |
304 false); | 310 false); |
305 SendAndExpectPacket(PacedSender::kNormalPriority, | 311 SendAndExpectPacket(PacedSender::kNormalPriority, |
306 ssrc, | 312 ssrc, |
307 sequence_number++, | 313 sequence_number++, |
308 clock_.TimeInMilliseconds(), | 314 clock_.TimeInMilliseconds(), |
309 250, | 315 250, |
310 false); | 316 false); |
311 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc, | 317 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
312 sequence_number++, clock_.TimeInMilliseconds(), 250, false)); | 318 sequence_number++, clock_.TimeInMilliseconds(), |
| 319 250, false); |
313 send_bucket_->Process(); | 320 send_bucket_->Process(); |
314 } | 321 } |
315 | 322 |
316 TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) { | 323 TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) { |
317 uint32_t ssrc = 12345; | 324 uint32_t ssrc = 12345; |
318 uint16_t sequence_number = 1234; | 325 uint16_t sequence_number = 1234; |
319 | 326 |
320 SendAndExpectPacket(PacedSender::kNormalPriority, | 327 SendAndExpectPacket(PacedSender::kNormalPriority, |
321 ssrc, | 328 ssrc, |
322 sequence_number, | 329 sequence_number, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 | 377 |
371 // 5 milliseconds later we have enough budget to send some padding. | 378 // 5 milliseconds later we have enough budget to send some padding. |
372 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1). | 379 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1). |
373 WillOnce(Return(250)); | 380 WillOnce(Return(250)); |
374 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 381 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
375 clock_.AdvanceTimeMilliseconds(5); | 382 clock_.AdvanceTimeMilliseconds(5); |
376 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 383 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
377 EXPECT_EQ(0, send_bucket_->Process()); | 384 EXPECT_EQ(0, send_bucket_->Process()); |
378 } | 385 } |
379 | 386 |
380 TEST_F(PacedSenderTest, NoPaddingWhenDisabled) { | |
381 send_bucket_->SetStatus(false); | |
382 send_bucket_->UpdateBitrate( | |
383 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate); | |
384 // No padding is expected since the pacer is disabled. | |
385 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | |
386 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | |
387 clock_.AdvanceTimeMilliseconds(5); | |
388 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | |
389 EXPECT_EQ(0, send_bucket_->Process()); | |
390 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | |
391 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | |
392 clock_.AdvanceTimeMilliseconds(5); | |
393 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | |
394 EXPECT_EQ(0, send_bucket_->Process()); | |
395 } | |
396 | |
397 TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) { | 387 TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) { |
398 uint32_t ssrc = 12345; | 388 uint32_t ssrc = 12345; |
399 uint16_t sequence_number = 1234; | 389 uint16_t sequence_number = 1234; |
400 int64_t capture_time_ms = 56789; | 390 int64_t capture_time_ms = 56789; |
401 const int kTimeStep = 5; | 391 const int kTimeStep = 5; |
402 const int64_t kBitrateWindow = 100; | 392 const int64_t kBitrateWindow = 100; |
403 send_bucket_->UpdateBitrate( | 393 send_bucket_->UpdateBitrate( |
404 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate); | 394 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate); |
405 int64_t start_time = clock_.TimeInMilliseconds(); | 395 int64_t start_time = clock_.TimeInMilliseconds(); |
406 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) { | 396 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) { |
(...skipping 19 matching lines...) Expand all Loading... |
426 PacedSenderPadding callback; | 416 PacedSenderPadding callback; |
427 send_bucket_.reset(new PacedSender( | 417 send_bucket_.reset(new PacedSender( |
428 &clock_, &callback, kTargetBitrate, kPaceMultiplier * kTargetBitrate, 0)); | 418 &clock_, &callback, kTargetBitrate, kPaceMultiplier * kTargetBitrate, 0)); |
429 send_bucket_->SetProbingEnabled(false); | 419 send_bucket_->SetProbingEnabled(false); |
430 send_bucket_->UpdateBitrate( | 420 send_bucket_->UpdateBitrate( |
431 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate); | 421 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate); |
432 int64_t start_time = clock_.TimeInMilliseconds(); | 422 int64_t start_time = clock_.TimeInMilliseconds(); |
433 size_t media_bytes = 0; | 423 size_t media_bytes = 0; |
434 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) { | 424 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) { |
435 size_t media_payload = rand() % 100 + 200; // [200, 300] bytes. | 425 size_t media_payload = rand() % 100 + 200; // [200, 300] bytes. |
436 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc, | 426 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
437 sequence_number++, capture_time_ms, | 427 sequence_number++, capture_time_ms, |
438 media_payload, false)); | 428 media_payload, false); |
439 media_bytes += media_payload; | 429 media_bytes += media_payload; |
440 clock_.AdvanceTimeMilliseconds(kTimeStep); | 430 clock_.AdvanceTimeMilliseconds(kTimeStep); |
441 send_bucket_->Process(); | 431 send_bucket_->Process(); |
442 } | 432 } |
443 EXPECT_NEAR(kTargetBitrate, | 433 EXPECT_NEAR(kTargetBitrate, |
444 static_cast<int>(8 * (media_bytes + callback.padding_sent()) / | 434 static_cast<int>(8 * (media_bytes + callback.padding_sent()) / |
445 kBitrateWindow), 1); | 435 kBitrateWindow), 1); |
446 } | 436 } |
447 | 437 |
448 TEST_F(PacedSenderTest, Priority) { | 438 TEST_F(PacedSenderTest, Priority) { |
(...skipping 18 matching lines...) Expand all Loading... |
467 false); | 457 false); |
468 SendAndExpectPacket(PacedSender::kNormalPriority, | 458 SendAndExpectPacket(PacedSender::kNormalPriority, |
469 ssrc, | 459 ssrc, |
470 sequence_number++, | 460 sequence_number++, |
471 capture_time_ms, | 461 capture_time_ms, |
472 250, | 462 250, |
473 false); | 463 false); |
474 send_bucket_->Process(); | 464 send_bucket_->Process(); |
475 | 465 |
476 // Expect normal and low priority to be queued and high to pass through. | 466 // Expect normal and low priority to be queued and high to pass through. |
477 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority, | 467 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority, |
478 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250, | 468 sequence_number++, capture_time_ms_low_priority, |
479 false)); | 469 250, false); |
480 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, | 470 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
481 ssrc, sequence_number++, capture_time_ms, 250, false)); | 471 sequence_number++, capture_time_ms, 250, false); |
482 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, | 472 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
483 ssrc, sequence_number++, capture_time_ms, 250, false)); | 473 sequence_number++, capture_time_ms, 250, false); |
484 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority, | 474 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, |
485 ssrc, sequence_number++, capture_time_ms, 250, false)); | 475 sequence_number++, capture_time_ms, 250, false); |
486 | 476 |
487 // Expect all high and normal priority to be sent out first. | 477 // Expect all high and normal priority to be sent out first. |
488 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 478 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
489 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false)) | 479 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false)) |
490 .Times(3) | 480 .Times(3) |
491 .WillRepeatedly(Return(true)); | 481 .WillRepeatedly(Return(true)); |
492 | 482 |
493 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 483 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
494 clock_.AdvanceTimeMilliseconds(5); | 484 clock_.AdvanceTimeMilliseconds(5); |
495 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 485 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 SendAndExpectPacket(PacedSender::kNormalPriority, | 521 SendAndExpectPacket(PacedSender::kNormalPriority, |
532 ssrc, | 522 ssrc, |
533 sequence_number++, | 523 sequence_number++, |
534 capture_time_ms, | 524 capture_time_ms, |
535 250, | 525 250, |
536 false); | 526 false); |
537 send_bucket_->Process(); | 527 send_bucket_->Process(); |
538 | 528 |
539 send_bucket_->Pause(); | 529 send_bucket_->Pause(); |
540 | 530 |
541 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, | 531 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
542 ssrc, sequence_number++, capture_time_ms, 250, false)); | 532 sequence_number++, capture_time_ms, 250, false); |
543 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, | 533 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
544 ssrc, sequence_number++, capture_time_ms, 250, false)); | 534 sequence_number++, capture_time_ms, 250, false); |
545 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority, | 535 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, |
546 ssrc, sequence_number++, capture_time_ms, 250, false)); | 536 sequence_number++, capture_time_ms, 250, false); |
547 | 537 |
548 clock_.AdvanceTimeMilliseconds(10000); | 538 clock_.AdvanceTimeMilliseconds(10000); |
549 int64_t second_capture_time_ms = clock_.TimeInMilliseconds(); | 539 int64_t second_capture_time_ms = clock_.TimeInMilliseconds(); |
550 | 540 |
551 // Expect everything to be queued. | 541 // Expect everything to be queued. |
552 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority, | 542 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority, |
553 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250, | 543 sequence_number++, second_capture_time_ms, 250, |
554 false)); | 544 false); |
555 | 545 |
556 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, | 546 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, |
557 send_bucket_->QueueInMs()); | 547 send_bucket_->QueueInMs()); |
558 | 548 |
559 // Expect no packet to come out while paused. | 549 // Expect no packet to come out while paused. |
560 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 550 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
561 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0); | 551 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0); |
562 | 552 |
563 for (int i = 0; i < 10; ++i) { | 553 for (int i = 0; i < 10; ++i) { |
564 clock_.AdvanceTimeMilliseconds(5); | 554 clock_.AdvanceTimeMilliseconds(5); |
(...skipping 21 matching lines...) Expand all Loading... |
586 EXPECT_EQ(0, send_bucket_->Process()); | 576 EXPECT_EQ(0, send_bucket_->Process()); |
587 EXPECT_EQ(0, send_bucket_->QueueInMs()); | 577 EXPECT_EQ(0, send_bucket_->QueueInMs()); |
588 } | 578 } |
589 | 579 |
590 TEST_F(PacedSenderTest, ResendPacket) { | 580 TEST_F(PacedSenderTest, ResendPacket) { |
591 uint32_t ssrc = 12346; | 581 uint32_t ssrc = 12346; |
592 uint16_t sequence_number = 1234; | 582 uint16_t sequence_number = 1234; |
593 int64_t capture_time_ms = clock_.TimeInMilliseconds(); | 583 int64_t capture_time_ms = clock_.TimeInMilliseconds(); |
594 EXPECT_EQ(0, send_bucket_->QueueInMs()); | 584 EXPECT_EQ(0, send_bucket_->QueueInMs()); |
595 | 585 |
596 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, | 586 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
597 ssrc, | 587 sequence_number, capture_time_ms, 250, false); |
598 sequence_number, | |
599 capture_time_ms, | |
600 250, | |
601 false)); | |
602 clock_.AdvanceTimeMilliseconds(1); | 588 clock_.AdvanceTimeMilliseconds(1); |
603 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, | 589 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
604 ssrc, | 590 sequence_number + 1, capture_time_ms + 1, 250, |
605 sequence_number + 1, | 591 false); |
606 capture_time_ms + 1, | |
607 250, | |
608 false)); | |
609 clock_.AdvanceTimeMilliseconds(9999); | 592 clock_.AdvanceTimeMilliseconds(9999); |
610 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, | 593 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, |
611 send_bucket_->QueueInMs()); | 594 send_bucket_->QueueInMs()); |
612 // Fails to send first packet so only one call. | 595 // Fails to send first packet so only one call. |
613 EXPECT_CALL(callback_, | 596 EXPECT_CALL(callback_, |
614 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false)) | 597 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false)) |
615 .Times(1) | 598 .Times(1) |
616 .WillOnce(Return(false)); | 599 .WillOnce(Return(false)); |
617 clock_.AdvanceTimeMilliseconds(10000); | 600 clock_.AdvanceTimeMilliseconds(10000); |
618 send_bucket_->Process(); | 601 send_bucket_->Process(); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 expected_deltas + kNumPackets - 1); | 702 expected_deltas + kNumPackets - 1); |
720 PacedSenderProbing callback(expected_deltas_list, &clock_); | 703 PacedSenderProbing callback(expected_deltas_list, &clock_); |
721 send_bucket_.reset( | 704 send_bucket_.reset( |
722 new PacedSender(&clock_, | 705 new PacedSender(&clock_, |
723 &callback, | 706 &callback, |
724 kInitialBitrateKbps, | 707 kInitialBitrateKbps, |
725 kPaceMultiplier * kInitialBitrateKbps, | 708 kPaceMultiplier * kInitialBitrateKbps, |
726 0)); | 709 0)); |
727 | 710 |
728 for (int i = 0; i < kNumPackets; ++i) { | 711 for (int i = 0; i < kNumPackets; ++i) { |
729 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, | 712 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
730 ssrc, | 713 sequence_number++, clock_.TimeInMilliseconds(), |
731 sequence_number++, | 714 kPacketSize, false); |
732 clock_.TimeInMilliseconds(), | |
733 kPacketSize, | |
734 false)); | |
735 } | 715 } |
736 while (callback.packets_sent() < kNumPackets) { | 716 while (callback.packets_sent() < kNumPackets) { |
737 int time_until_process = send_bucket_->TimeUntilNextProcess(); | 717 int time_until_process = send_bucket_->TimeUntilNextProcess(); |
738 if (time_until_process <= 0) { | 718 if (time_until_process <= 0) { |
739 send_bucket_->Process(); | 719 send_bucket_->Process(); |
740 } else { | 720 } else { |
741 clock_.AdvanceTimeMilliseconds(time_until_process); | 721 clock_.AdvanceTimeMilliseconds(time_until_process); |
742 } | 722 } |
743 } | 723 } |
744 } | 724 } |
745 | 725 |
746 TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) { | 726 TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) { |
747 const int kNumPackets = 11; | 727 const int kNumPackets = 11; |
748 const int kNumDeltas = kNumPackets - 1; | 728 const int kNumDeltas = kNumPackets - 1; |
749 const size_t kPacketSize = 1200; | 729 const size_t kPacketSize = 1200; |
750 const int kInitialBitrateKbps = 300; | 730 const int kInitialBitrateKbps = 300; |
751 uint32_t ssrc = 12346; | 731 uint32_t ssrc = 12346; |
752 uint16_t sequence_number = 1234; | 732 uint16_t sequence_number = 1234; |
753 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5}; | 733 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5}; |
754 std::list<int> expected_deltas_list(expected_deltas, | 734 std::list<int> expected_deltas_list(expected_deltas, |
755 expected_deltas + kNumPackets - 1); | 735 expected_deltas + kNumPackets - 1); |
756 PacedSenderProbing callback(expected_deltas_list, &clock_); | 736 PacedSenderProbing callback(expected_deltas_list, &clock_); |
757 send_bucket_.reset(new PacedSender(&clock_, &callback, kInitialBitrateKbps, | 737 send_bucket_.reset(new PacedSender(&clock_, &callback, kInitialBitrateKbps, |
758 kPaceMultiplier * kInitialBitrateKbps, 0)); | 738 kPaceMultiplier * kInitialBitrateKbps, 0)); |
759 | 739 |
760 for (int i = 0; i < kNumPackets - 5; ++i) { | 740 for (int i = 0; i < kNumPackets - 5; ++i) { |
761 EXPECT_FALSE(send_bucket_->SendPacket( | 741 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
762 PacedSender::kNormalPriority, ssrc, sequence_number++, | 742 sequence_number++, clock_.TimeInMilliseconds(), |
763 clock_.TimeInMilliseconds(), kPacketSize, false)); | 743 kPacketSize, false); |
764 } | 744 } |
765 while (callback.packets_sent() < kNumPackets) { | 745 while (callback.packets_sent() < kNumPackets) { |
766 int time_until_process = send_bucket_->TimeUntilNextProcess(); | 746 int time_until_process = send_bucket_->TimeUntilNextProcess(); |
767 if (time_until_process <= 0) { | 747 if (time_until_process <= 0) { |
768 send_bucket_->Process(); | 748 send_bucket_->Process(); |
769 } else { | 749 } else { |
770 clock_.AdvanceTimeMilliseconds(time_until_process); | 750 clock_.AdvanceTimeMilliseconds(time_until_process); |
771 } | 751 } |
772 } | 752 } |
773 | 753 |
774 // Process one more time and make sure we don't send any more probes. | 754 // Process one more time and make sure we don't send any more probes. |
775 int time_until_process = send_bucket_->TimeUntilNextProcess(); | 755 int time_until_process = send_bucket_->TimeUntilNextProcess(); |
776 clock_.AdvanceTimeMilliseconds(time_until_process); | 756 clock_.AdvanceTimeMilliseconds(time_until_process); |
777 send_bucket_->Process(); | 757 send_bucket_->Process(); |
778 EXPECT_EQ(kNumPackets, callback.packets_sent()); | 758 EXPECT_EQ(kNumPackets, callback.packets_sent()); |
779 } | 759 } |
780 | 760 |
781 TEST_F(PacedSenderTest, PriorityInversion) { | 761 TEST_F(PacedSenderTest, PriorityInversion) { |
782 uint32_t ssrc = 12346; | 762 uint32_t ssrc = 12346; |
783 uint16_t sequence_number = 1234; | 763 uint16_t sequence_number = 1234; |
784 const size_t kPacketSize = 1200; | 764 const size_t kPacketSize = 1200; |
785 | 765 |
786 EXPECT_FALSE(send_bucket_->SendPacket( | 766 send_bucket_->InsertPacket( |
787 PacedSender::kHighPriority, ssrc, sequence_number + 3, | 767 PacedSender::kHighPriority, ssrc, sequence_number + 3, |
788 clock_.TimeInMilliseconds() + 33, kPacketSize, true)); | 768 clock_.TimeInMilliseconds() + 33, kPacketSize, true); |
789 | 769 |
790 EXPECT_FALSE(send_bucket_->SendPacket( | 770 send_bucket_->InsertPacket( |
791 PacedSender::kHighPriority, ssrc, sequence_number + 2, | 771 PacedSender::kHighPriority, ssrc, sequence_number + 2, |
792 clock_.TimeInMilliseconds() + 33, kPacketSize, true)); | 772 clock_.TimeInMilliseconds() + 33, kPacketSize, true); |
793 | 773 |
794 EXPECT_FALSE(send_bucket_->SendPacket( | 774 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number, |
795 PacedSender::kHighPriority, ssrc, sequence_number, | 775 clock_.TimeInMilliseconds(), kPacketSize, true); |
796 clock_.TimeInMilliseconds(), kPacketSize, true)); | |
797 | 776 |
798 EXPECT_FALSE(send_bucket_->SendPacket( | 777 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, |
799 PacedSender::kHighPriority, ssrc, sequence_number + 1, | 778 sequence_number + 1, clock_.TimeInMilliseconds(), |
800 clock_.TimeInMilliseconds(), kPacketSize, true)); | 779 kPacketSize, true); |
801 | 780 |
802 // Packets from earlier frames should be sent first. | 781 // Packets from earlier frames should be sent first. |
803 { | 782 { |
804 ::testing::InSequence sequence; | 783 ::testing::InSequence sequence; |
805 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, | 784 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, |
806 clock_.TimeInMilliseconds(), true)) | 785 clock_.TimeInMilliseconds(), true)) |
807 .WillOnce(Return(true)); | 786 .WillOnce(Return(true)); |
808 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1, | 787 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1, |
809 clock_.TimeInMilliseconds(), true)) | 788 clock_.TimeInMilliseconds(), true)) |
810 .WillOnce(Return(true)); | 789 .WillOnce(Return(true)); |
(...skipping 24 matching lines...) Expand all Loading... |
835 send_bucket_->UpdateBitrate(60, 90, 0); | 814 send_bucket_->UpdateBitrate(60, 90, 0); |
836 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++, | 815 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++, |
837 clock_.TimeInMilliseconds(), kPacketSize, false); | 816 clock_.TimeInMilliseconds(), kPacketSize, false); |
838 send_bucket_->Process(); | 817 send_bucket_->Process(); |
839 | 818 |
840 // Add 30kbit padding. When increasing budget, media budget will increase from | 819 // Add 30kbit padding. When increasing budget, media budget will increase from |
841 // negative (overuse) while padding budget will increase form 0. | 820 // negative (overuse) while padding budget will increase form 0. |
842 clock_.AdvanceTimeMilliseconds(5); | 821 clock_.AdvanceTimeMilliseconds(5); |
843 send_bucket_->UpdateBitrate(60, 90, 30); | 822 send_bucket_->UpdateBitrate(60, 90, 30); |
844 | 823 |
845 EXPECT_FALSE(send_bucket_->SendPacket( | 824 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, |
846 PacedSender::kHighPriority, ssrc, sequence_number++, | 825 sequence_number++, clock_.TimeInMilliseconds(), |
847 clock_.TimeInMilliseconds(), kPacketSize, false)); | 826 kPacketSize, false); |
848 | 827 |
849 // Don't send padding if queue is non-empty, even if padding budget > 0. | 828 // Don't send padding if queue is non-empty, even if padding budget > 0. |
850 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 829 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
851 send_bucket_->Process(); | 830 send_bucket_->Process(); |
852 } | 831 } |
853 | 832 |
854 } // namespace test | 833 } // namespace test |
855 } // namespace webrtc | 834 } // namespace webrtc |
OLD | NEW |