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 |
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 kTargetBitrate = 800; |
26 static const float kPaceMultiplier = 1.5f; | 26 static const float kPaceMultiplier = 1.5f; |
27 | 27 |
28 class MockPacedSenderCallback : public PacedSender::Callback { | 28 class MockPacedSenderCallback : public PacedSender::Callback { |
29 public: | 29 public: |
30 MOCK_METHOD4(TimeToSendPacket, | 30 MOCK_METHOD5(TimeToSendPacket, |
31 bool(uint32_t ssrc, | 31 bool(uint32_t ssrc, |
32 uint16_t sequence_number, | 32 uint16_t sequence_number, |
33 int64_t capture_time_ms, | 33 int64_t capture_time_ms, |
34 bool retransmission)); | 34 bool retransmission, |
| 35 int cluster_id)); |
35 MOCK_METHOD1(TimeToSendPadding, | 36 MOCK_METHOD1(TimeToSendPadding, |
36 size_t(size_t bytes)); | 37 size_t(size_t bytes)); |
37 }; | 38 }; |
38 | 39 |
39 class PacedSenderPadding : public PacedSender::Callback { | 40 class PacedSenderPadding : public PacedSender::Callback { |
40 public: | 41 public: |
41 PacedSenderPadding() : padding_sent_(0) {} | 42 PacedSenderPadding() : padding_sent_(0) {} |
42 | 43 |
43 bool TimeToSendPacket(uint32_t ssrc, | 44 bool TimeToSendPacket(uint32_t ssrc, |
44 uint16_t sequence_number, | 45 uint16_t sequence_number, |
45 int64_t capture_time_ms, | 46 int64_t capture_time_ms, |
46 bool retransmission) { | 47 bool retransmission, |
| 48 int cluster_id) override { |
47 return true; | 49 return true; |
48 } | 50 } |
49 | 51 |
50 size_t TimeToSendPadding(size_t bytes) { | 52 size_t TimeToSendPadding(size_t bytes) { |
51 const size_t kPaddingPacketSize = 224; | 53 const size_t kPaddingPacketSize = 224; |
52 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize; | 54 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize; |
53 padding_sent_ += kPaddingPacketSize * num_packets; | 55 padding_sent_ += kPaddingPacketSize * num_packets; |
54 return kPaddingPacketSize * num_packets; | 56 return kPaddingPacketSize * num_packets; |
55 } | 57 } |
56 | 58 |
57 size_t padding_sent() { return padding_sent_; } | 59 size_t padding_sent() { return padding_sent_; } |
58 | 60 |
59 private: | 61 private: |
60 size_t padding_sent_; | 62 size_t padding_sent_; |
61 }; | 63 }; |
62 | 64 |
63 class PacedSenderProbing : public PacedSender::Callback { | 65 class PacedSenderProbing : public PacedSender::Callback { |
64 public: | 66 public: |
65 PacedSenderProbing(const std::list<int>& expected_deltas, Clock* clock) | 67 PacedSenderProbing(const std::list<int>& expected_deltas, Clock* clock) |
66 : prev_packet_time_ms_(-1), | 68 : prev_packet_time_ms_(-1), |
67 expected_deltas_(expected_deltas), | 69 expected_deltas_(expected_deltas), |
68 packets_sent_(0), | 70 packets_sent_(0), |
69 clock_(clock) {} | 71 clock_(clock) {} |
70 | 72 |
71 bool TimeToSendPacket(uint32_t ssrc, | 73 bool TimeToSendPacket(uint32_t ssrc, |
72 uint16_t sequence_number, | 74 uint16_t sequence_number, |
73 int64_t capture_time_ms, | 75 int64_t capture_time_ms, |
74 bool retransmission) { | 76 bool retransmission, |
| 77 int cluster_id) override { |
75 ExpectAndCountPacket(); | 78 ExpectAndCountPacket(); |
76 return true; | 79 return true; |
77 } | 80 } |
78 | 81 |
79 size_t TimeToSendPadding(size_t bytes) { | 82 size_t TimeToSendPadding(size_t bytes) { |
80 ExpectAndCountPacket(); | 83 ExpectAndCountPacket(); |
81 return bytes; | 84 return bytes; |
82 } | 85 } |
83 | 86 |
84 void ExpectAndCountPacket() { | 87 void ExpectAndCountPacket() { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 } | 123 } |
121 | 124 |
122 void SendAndExpectPacket(PacedSender::Priority priority, | 125 void SendAndExpectPacket(PacedSender::Priority priority, |
123 uint32_t ssrc, | 126 uint32_t ssrc, |
124 uint16_t sequence_number, | 127 uint16_t sequence_number, |
125 int64_t capture_time_ms, | 128 int64_t capture_time_ms, |
126 size_t size, | 129 size_t size, |
127 bool retransmission) { | 130 bool retransmission) { |
128 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms, | 131 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms, |
129 size, retransmission); | 132 size, retransmission); |
130 EXPECT_CALL(callback_, | 133 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, |
131 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false)) | 134 capture_time_ms, false, _)) |
132 .Times(1) | 135 .Times(1) |
133 .WillRepeatedly(Return(true)); | 136 .WillRepeatedly(Return(true)); |
134 } | 137 } |
135 | 138 |
136 SimulatedClock clock_; | 139 SimulatedClock clock_; |
137 MockPacedSenderCallback callback_; | 140 MockPacedSenderCallback callback_; |
138 std::unique_ptr<PacedSender> send_bucket_; | 141 std::unique_ptr<PacedSender> send_bucket_; |
139 }; | 142 }; |
140 | 143 |
141 TEST_F(PacedSenderTest, QueuePacket) { | 144 TEST_F(PacedSenderTest, QueuePacket) { |
(...skipping 22 matching lines...) Expand all Loading... |
164 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 167 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
165 sequence_number, queued_packet_timestamp, 250, | 168 sequence_number, queued_packet_timestamp, 250, |
166 false); | 169 false); |
167 send_bucket_->Process(); | 170 send_bucket_->Process(); |
168 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 171 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
169 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 172 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
170 clock_.AdvanceTimeMilliseconds(4); | 173 clock_.AdvanceTimeMilliseconds(4); |
171 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess()); | 174 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess()); |
172 clock_.AdvanceTimeMilliseconds(1); | 175 clock_.AdvanceTimeMilliseconds(1); |
173 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 176 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
174 EXPECT_CALL( | 177 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++, |
175 callback_, | 178 queued_packet_timestamp, false, _)) |
176 TimeToSendPacket(ssrc, sequence_number++, queued_packet_timestamp, false)) | |
177 .Times(1) | 179 .Times(1) |
178 .WillRepeatedly(Return(true)); | 180 .WillRepeatedly(Return(true)); |
179 send_bucket_->Process(); | 181 send_bucket_->Process(); |
180 sequence_number++; | 182 sequence_number++; |
181 SendAndExpectPacket(PacedSender::kNormalPriority, | 183 SendAndExpectPacket(PacedSender::kNormalPriority, |
182 ssrc, | 184 ssrc, |
183 sequence_number++, | 185 sequence_number++, |
184 clock_.TimeInMilliseconds(), | 186 clock_.TimeInMilliseconds(), |
185 250, | 187 250, |
186 false); | 188 false); |
(...skipping 25 matching lines...) Expand all Loading... |
212 for (int j = 0; j < 30; ++j) { | 214 for (int j = 0; j < 30; ++j) { |
213 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 215 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
214 sequence_number++, clock_.TimeInMilliseconds(), | 216 sequence_number++, clock_.TimeInMilliseconds(), |
215 250, false); | 217 250, false); |
216 } | 218 } |
217 send_bucket_->Process(); | 219 send_bucket_->Process(); |
218 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 220 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
219 for (int k = 0; k < 10; ++k) { | 221 for (int k = 0; k < 10; ++k) { |
220 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 222 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
221 clock_.AdvanceTimeMilliseconds(5); | 223 clock_.AdvanceTimeMilliseconds(5); |
222 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false)) | 224 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false, _)) |
223 .Times(3) | 225 .Times(3) |
224 .WillRepeatedly(Return(true)); | 226 .WillRepeatedly(Return(true)); |
225 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 227 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
226 send_bucket_->Process(); | 228 send_bucket_->Process(); |
227 } | 229 } |
228 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 230 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
229 clock_.AdvanceTimeMilliseconds(5); | 231 clock_.AdvanceTimeMilliseconds(5); |
230 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 232 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
231 send_bucket_->Process(); | 233 send_bucket_->Process(); |
232 SendAndExpectPacket(PacedSender::kNormalPriority, | 234 SendAndExpectPacket(PacedSender::kNormalPriority, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 250, false); | 281 250, false); |
280 } | 282 } |
281 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 283 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
282 send_bucket_->Process(); | 284 send_bucket_->Process(); |
283 for (int k = 0; k < 10; ++k) { | 285 for (int k = 0; k < 10; ++k) { |
284 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 286 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
285 clock_.AdvanceTimeMilliseconds(5); | 287 clock_.AdvanceTimeMilliseconds(5); |
286 | 288 |
287 for (int i = 0; i < 3; ++i) { | 289 for (int i = 0; i < 3; ++i) { |
288 EXPECT_CALL(callback_, | 290 EXPECT_CALL(callback_, |
289 TimeToSendPacket(ssrc, queued_sequence_number++, _, false)) | 291 TimeToSendPacket(ssrc, queued_sequence_number++, _, false, _)) |
290 .Times(1) | 292 .Times(1) |
291 .WillRepeatedly(Return(true)); | 293 .WillRepeatedly(Return(true)); |
292 } | 294 } |
293 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 295 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
294 send_bucket_->Process(); | 296 send_bucket_->Process(); |
295 } | 297 } |
296 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 298 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
297 clock_.AdvanceTimeMilliseconds(5); | 299 clock_.AdvanceTimeMilliseconds(5); |
298 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 300 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
299 send_bucket_->Process(); | 301 send_bucket_->Process(); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 sequence_number++, capture_time_ms, 250, false); | 475 sequence_number++, capture_time_ms, 250, false); |
474 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 476 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
475 sequence_number++, capture_time_ms, 250, false); | 477 sequence_number++, capture_time_ms, 250, false); |
476 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 478 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
477 sequence_number++, capture_time_ms, 250, false); | 479 sequence_number++, capture_time_ms, 250, false); |
478 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, | 480 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, |
479 sequence_number++, capture_time_ms, 250, false); | 481 sequence_number++, capture_time_ms, 250, false); |
480 | 482 |
481 // Expect all high and normal priority to be sent out first. | 483 // Expect all high and normal priority to be sent out first. |
482 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 484 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
483 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false)) | 485 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _)) |
484 .Times(4) | 486 .Times(4) |
485 .WillRepeatedly(Return(true)); | 487 .WillRepeatedly(Return(true)); |
486 | 488 |
487 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 489 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
488 clock_.AdvanceTimeMilliseconds(5); | 490 clock_.AdvanceTimeMilliseconds(5); |
489 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 491 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
490 send_bucket_->Process(); | 492 send_bucket_->Process(); |
491 | 493 |
492 EXPECT_CALL(callback_, | 494 EXPECT_CALL(callback_, |
493 TimeToSendPacket( | 495 TimeToSendPacket(ssrc_low_priority, _, |
494 ssrc_low_priority, _, capture_time_ms_low_priority, false)) | 496 capture_time_ms_low_priority, false, _)) |
495 .Times(1) | 497 .Times(1) |
496 .WillRepeatedly(Return(true)); | 498 .WillRepeatedly(Return(true)); |
497 | 499 |
498 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 500 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
499 clock_.AdvanceTimeMilliseconds(5); | 501 clock_.AdvanceTimeMilliseconds(5); |
500 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 502 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
501 send_bucket_->Process(); | 503 send_bucket_->Process(); |
502 } | 504 } |
503 | 505 |
504 TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) { | 506 TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) { |
(...skipping 12 matching lines...) Expand all Loading... |
517 // 3 at once, the 4th should be queued. | 519 // 3 at once, the 4th should be queued. |
518 for (int i = 0; i < 3; ++i) { | 520 for (int i = 0; i < 3; ++i) { |
519 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++, | 521 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++, |
520 capture_time_ms, 250, false); | 522 capture_time_ms, 250, false); |
521 } | 523 } |
522 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number, | 524 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number, |
523 capture_time_ms, 250, false); | 525 capture_time_ms, 250, false); |
524 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 526 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
525 clock_.AdvanceTimeMilliseconds(5); | 527 clock_.AdvanceTimeMilliseconds(5); |
526 send_bucket_->Process(); | 528 send_bucket_->Process(); |
527 EXPECT_CALL(callback_, | 529 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++, |
528 TimeToSendPacket(ssrc, sequence_number++, capture_time_ms, false)) | 530 capture_time_ms, false, _)) |
529 .Times(1); | 531 .Times(1); |
530 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 532 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
531 clock_.AdvanceTimeMilliseconds(5); | 533 clock_.AdvanceTimeMilliseconds(5); |
532 send_bucket_->Process(); | 534 send_bucket_->Process(); |
533 } | 535 } |
534 | 536 |
535 TEST_F(PacedSenderTest, Pause) { | 537 TEST_F(PacedSenderTest, Pause) { |
536 uint32_t ssrc_low_priority = 12345; | 538 uint32_t ssrc_low_priority = 12345; |
537 uint32_t ssrc = 12346; | 539 uint32_t ssrc = 12346; |
538 uint16_t sequence_number = 1234; | 540 uint16_t sequence_number = 1234; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 // Expect everything to be queued. | 578 // Expect everything to be queued. |
577 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority, | 579 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority, |
578 sequence_number++, second_capture_time_ms, 250, | 580 sequence_number++, second_capture_time_ms, 250, |
579 false); | 581 false); |
580 | 582 |
581 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, | 583 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, |
582 send_bucket_->QueueInMs()); | 584 send_bucket_->QueueInMs()); |
583 | 585 |
584 // Expect no packet to come out while paused. | 586 // Expect no packet to come out while paused. |
585 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); | 587 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0); |
586 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0); | 588 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _)).Times(0); |
587 | 589 |
588 for (int i = 0; i < 10; ++i) { | 590 for (int i = 0; i < 10; ++i) { |
589 clock_.AdvanceTimeMilliseconds(5); | 591 clock_.AdvanceTimeMilliseconds(5); |
590 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 592 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
591 send_bucket_->Process(); | 593 send_bucket_->Process(); |
592 } | 594 } |
593 // Expect high prio packets to come out first followed by all packets in the | 595 // Expect high prio packets to come out first followed by all packets in the |
594 // way they were added. | 596 // way they were added. |
595 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false)) | 597 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false, _)) |
596 .Times(3) | 598 .Times(3) |
597 .WillRepeatedly(Return(true)); | 599 .WillRepeatedly(Return(true)); |
598 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false)) | 600 EXPECT_CALL(callback_, |
| 601 TimeToSendPacket(_, _, second_capture_time_ms, false, _)) |
599 .Times(1) | 602 .Times(1) |
600 .WillRepeatedly(Return(true)); | 603 .WillRepeatedly(Return(true)); |
601 send_bucket_->Resume(); | 604 send_bucket_->Resume(); |
602 | 605 |
603 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); | 606 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess()); |
604 clock_.AdvanceTimeMilliseconds(5); | 607 clock_.AdvanceTimeMilliseconds(5); |
605 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); | 608 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess()); |
606 send_bucket_->Process(); | 609 send_bucket_->Process(); |
607 | 610 |
608 EXPECT_EQ(0, send_bucket_->QueueInMs()); | 611 EXPECT_EQ(0, send_bucket_->QueueInMs()); |
609 } | 612 } |
610 | 613 |
611 TEST_F(PacedSenderTest, ResendPacket) { | 614 TEST_F(PacedSenderTest, ResendPacket) { |
612 uint32_t ssrc = 12346; | 615 uint32_t ssrc = 12346; |
613 uint16_t sequence_number = 1234; | 616 uint16_t sequence_number = 1234; |
614 int64_t capture_time_ms = clock_.TimeInMilliseconds(); | 617 int64_t capture_time_ms = clock_.TimeInMilliseconds(); |
615 EXPECT_EQ(0, send_bucket_->QueueInMs()); | 618 EXPECT_EQ(0, send_bucket_->QueueInMs()); |
616 | 619 |
617 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 620 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
618 sequence_number, capture_time_ms, 250, false); | 621 sequence_number, capture_time_ms, 250, false); |
619 clock_.AdvanceTimeMilliseconds(1); | 622 clock_.AdvanceTimeMilliseconds(1); |
620 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 623 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
621 sequence_number + 1, capture_time_ms + 1, 250, | 624 sequence_number + 1, capture_time_ms + 1, 250, |
622 false); | 625 false); |
623 clock_.AdvanceTimeMilliseconds(9999); | 626 clock_.AdvanceTimeMilliseconds(9999); |
624 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, | 627 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, |
625 send_bucket_->QueueInMs()); | 628 send_bucket_->QueueInMs()); |
626 // Fails to send first packet so only one call. | 629 // Fails to send first packet so only one call. |
627 EXPECT_CALL(callback_, | 630 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, |
628 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false)) | 631 capture_time_ms, false, _)) |
629 .Times(1) | 632 .Times(1) |
630 .WillOnce(Return(false)); | 633 .WillOnce(Return(false)); |
631 clock_.AdvanceTimeMilliseconds(10000); | 634 clock_.AdvanceTimeMilliseconds(10000); |
632 send_bucket_->Process(); | 635 send_bucket_->Process(); |
633 | 636 |
634 // Queue remains unchanged. | 637 // Queue remains unchanged. |
635 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, | 638 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms, |
636 send_bucket_->QueueInMs()); | 639 send_bucket_->QueueInMs()); |
637 | 640 |
638 // Fails to send second packet. | 641 // Fails to send second packet. |
639 EXPECT_CALL(callback_, | 642 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, |
640 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false)) | 643 capture_time_ms, false, _)) |
641 .Times(1) | 644 .Times(1) |
642 .WillOnce(Return(true)); | 645 .WillOnce(Return(true)); |
643 EXPECT_CALL( | 646 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1, |
644 callback_, | 647 capture_time_ms + 1, false, _)) |
645 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false)) | |
646 .Times(1) | 648 .Times(1) |
647 .WillOnce(Return(false)); | 649 .WillOnce(Return(false)); |
648 clock_.AdvanceTimeMilliseconds(10000); | 650 clock_.AdvanceTimeMilliseconds(10000); |
649 send_bucket_->Process(); | 651 send_bucket_->Process(); |
650 | 652 |
651 // Queue is reduced by 1 packet. | 653 // Queue is reduced by 1 packet. |
652 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1, | 654 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1, |
653 send_bucket_->QueueInMs()); | 655 send_bucket_->QueueInMs()); |
654 | 656 |
655 // Send second packet and queue becomes empty. | 657 // Send second packet and queue becomes empty. |
656 EXPECT_CALL( | 658 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1, |
657 callback_, | 659 capture_time_ms + 1, false, _)) |
658 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false)) | |
659 .Times(1) | 660 .Times(1) |
660 .WillOnce(Return(true)); | 661 .WillOnce(Return(true)); |
661 clock_.AdvanceTimeMilliseconds(10000); | 662 clock_.AdvanceTimeMilliseconds(10000); |
662 send_bucket_->Process(); | 663 send_bucket_->Process(); |
663 EXPECT_EQ(0, send_bucket_->QueueInMs()); | 664 EXPECT_EQ(0, send_bucket_->QueueInMs()); |
664 } | 665 } |
665 | 666 |
666 TEST_F(PacedSenderTest, ExpectedQueueTimeMs) { | 667 TEST_F(PacedSenderTest, ExpectedQueueTimeMs) { |
667 uint32_t ssrc = 12346; | 668 uint32_t ssrc = 12346; |
668 uint16_t sequence_number = 1234; | 669 uint16_t sequence_number = 1234; |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number, | 804 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number, |
804 clock_.TimeInMilliseconds(), kPacketSize, true); | 805 clock_.TimeInMilliseconds(), kPacketSize, true); |
805 | 806 |
806 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, | 807 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, |
807 sequence_number + 1, clock_.TimeInMilliseconds(), | 808 sequence_number + 1, clock_.TimeInMilliseconds(), |
808 kPacketSize, true); | 809 kPacketSize, true); |
809 | 810 |
810 // Packets from earlier frames should be sent first. | 811 // Packets from earlier frames should be sent first. |
811 { | 812 { |
812 ::testing::InSequence sequence; | 813 ::testing::InSequence sequence; |
813 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, | 814 EXPECT_CALL(callback_, |
814 clock_.TimeInMilliseconds(), true)) | 815 TimeToSendPacket(ssrc, sequence_number, |
| 816 clock_.TimeInMilliseconds(), true, _)) |
815 .WillOnce(Return(true)); | 817 .WillOnce(Return(true)); |
816 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1, | 818 EXPECT_CALL(callback_, |
817 clock_.TimeInMilliseconds(), true)) | 819 TimeToSendPacket(ssrc, sequence_number + 1, |
| 820 clock_.TimeInMilliseconds(), true, _)) |
818 .WillOnce(Return(true)); | 821 .WillOnce(Return(true)); |
819 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 3, | 822 EXPECT_CALL(callback_, |
820 clock_.TimeInMilliseconds() + 33, | 823 TimeToSendPacket(ssrc, sequence_number + 3, |
821 true)).WillOnce(Return(true)); | 824 clock_.TimeInMilliseconds() + 33, true, _)) |
822 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 2, | 825 .WillOnce(Return(true)); |
823 clock_.TimeInMilliseconds() + 33, | 826 EXPECT_CALL(callback_, |
824 true)).WillOnce(Return(true)); | 827 TimeToSendPacket(ssrc, sequence_number + 2, |
| 828 clock_.TimeInMilliseconds() + 33, true, _)) |
| 829 .WillOnce(Return(true)); |
825 | 830 |
826 while (send_bucket_->QueueSizePackets() > 0) { | 831 while (send_bucket_->QueueSizePackets() > 0) { |
827 int time_until_process = send_bucket_->TimeUntilNextProcess(); | 832 int time_until_process = send_bucket_->TimeUntilNextProcess(); |
828 if (time_until_process <= 0) { | 833 if (time_until_process <= 0) { |
829 send_bucket_->Process(); | 834 send_bucket_->Process(); |
830 } else { | 835 } else { |
831 clock_.AdvanceTimeMilliseconds(time_until_process); | 836 clock_.AdvanceTimeMilliseconds(time_until_process); |
832 } | 837 } |
833 } | 838 } |
834 } | 839 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 883 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
879 sequence_number + 1, clock_.TimeInMilliseconds(), | 884 sequence_number + 1, clock_.TimeInMilliseconds(), |
880 kPacketSize, false); | 885 kPacketSize, false); |
881 clock_.AdvanceTimeMilliseconds(10); | 886 clock_.AdvanceTimeMilliseconds(10); |
882 | 887 |
883 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs()); | 888 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs()); |
884 | 889 |
885 // Only first packet (queued for 20ms) should be removed, leave the second | 890 // Only first packet (queued for 20ms) should be removed, leave the second |
886 // packet (queued for 10ms) alone in the queue. | 891 // packet (queued for 10ms) alone in the queue. |
887 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, | 892 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, |
888 first_capture_time, false)) | 893 first_capture_time, false, _)) |
889 .Times(1) | 894 .Times(1) |
890 .WillRepeatedly(Return(true)); | 895 .WillRepeatedly(Return(true)); |
891 send_bucket_->Process(); | 896 send_bucket_->Process(); |
892 | 897 |
893 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs()); | 898 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs()); |
894 | 899 |
895 clock_.AdvanceTimeMilliseconds(10); | 900 clock_.AdvanceTimeMilliseconds(10); |
896 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1, | 901 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1, |
897 first_capture_time + 10, false)) | 902 first_capture_time + 10, false, _)) |
898 .Times(1) | 903 .Times(1) |
899 .WillRepeatedly(Return(true)); | 904 .WillRepeatedly(Return(true)); |
900 for (int i = 0; i < 3; ++i) { | 905 for (int i = 0; i < 3; ++i) { |
901 clock_.AdvanceTimeMilliseconds(30); // Max delta. | 906 clock_.AdvanceTimeMilliseconds(30); // Max delta. |
902 send_bucket_->Process(); | 907 send_bucket_->Process(); |
903 } | 908 } |
904 | 909 |
905 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs()); | 910 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs()); |
906 } | 911 } |
907 | 912 |
908 } // namespace test | 913 } // namespace test |
909 } // namespace webrtc | 914 } // namespace webrtc |
OLD | NEW |