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 "webrtc/modules/pacing/paced_sender.h" | 14 #include "webrtc/modules/pacing/paced_sender.h" |
15 #include "webrtc/system_wrappers/include/clock.h" | 15 #include "webrtc/system_wrappers/include/clock.h" |
16 #include "webrtc/test/gmock.h" | 16 #include "webrtc/test/gmock.h" |
17 #include "webrtc/test/gtest.h" | 17 #include "webrtc/test/gtest.h" |
18 | 18 |
19 using testing::_; | 19 using testing::_; |
| 20 using testing::Field; |
20 using testing::Return; | 21 using testing::Return; |
21 | 22 |
22 namespace { | 23 namespace { |
23 constexpr unsigned kFirstClusterBps = 900000; | 24 constexpr unsigned kFirstClusterBps = 900000; |
24 constexpr unsigned kSecondClusterBps = 1800000; | 25 constexpr unsigned kSecondClusterBps = 1800000; |
25 | 26 |
26 // The error stems from truncating the time interval of probe packets to integer | 27 // The error stems from truncating the time interval of probe packets to integer |
27 // values. This results in probing slightly higher than the target bitrate. | 28 // values. This results in probing slightly higher than the target bitrate. |
28 // For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets. | 29 // For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets. |
29 constexpr int kBitrateProbingError = 150000; | 30 constexpr int kBitrateProbingError = 150000; |
30 } // namespace | 31 } // namespace |
31 | 32 |
32 namespace webrtc { | 33 namespace webrtc { |
33 namespace test { | 34 namespace test { |
34 | 35 |
35 static const int kTargetBitrateBps = 800000; | 36 static const int kTargetBitrateBps = 800000; |
36 | 37 |
37 class MockPacedSenderCallback : public PacedSender::PacketSender { | 38 class MockPacedSenderCallback : public PacedSender::PacketSender { |
38 public: | 39 public: |
39 MOCK_METHOD5(TimeToSendPacket, | 40 MOCK_METHOD5(TimeToSendPacket, |
40 bool(uint32_t ssrc, | 41 bool(uint32_t ssrc, |
41 uint16_t sequence_number, | 42 uint16_t sequence_number, |
42 int64_t capture_time_ms, | 43 int64_t capture_time_ms, |
43 bool retransmission, | 44 bool retransmission, |
44 int probe_cluster_id)); | 45 const PacedPacketInfo& pacing_info)); |
45 MOCK_METHOD2(TimeToSendPadding, size_t(size_t bytes, int probe_cluster_id)); | 46 MOCK_METHOD2(TimeToSendPadding, |
| 47 size_t(size_t bytes, const PacedPacketInfo& pacing_info)); |
46 }; | 48 }; |
47 | 49 |
48 class PacedSenderPadding : public PacedSender::PacketSender { | 50 class PacedSenderPadding : public PacedSender::PacketSender { |
49 public: | 51 public: |
50 PacedSenderPadding() : padding_sent_(0) {} | 52 PacedSenderPadding() : padding_sent_(0) {} |
51 | 53 |
52 bool TimeToSendPacket(uint32_t ssrc, | 54 bool TimeToSendPacket(uint32_t ssrc, |
53 uint16_t sequence_number, | 55 uint16_t sequence_number, |
54 int64_t capture_time_ms, | 56 int64_t capture_time_ms, |
55 bool retransmission, | 57 bool retransmission, |
56 int probe_cluster_id) override { | 58 const PacedPacketInfo& pacing_info) override { |
57 return true; | 59 return true; |
58 } | 60 } |
59 | 61 |
60 size_t TimeToSendPadding(size_t bytes, int probe_cluster_id) override { | 62 size_t TimeToSendPadding(size_t bytes, |
| 63 const PacedPacketInfo& pacing_info) override { |
61 const size_t kPaddingPacketSize = 224; | 64 const size_t kPaddingPacketSize = 224; |
62 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize; | 65 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize; |
63 padding_sent_ += kPaddingPacketSize * num_packets; | 66 padding_sent_ += kPaddingPacketSize * num_packets; |
64 return kPaddingPacketSize * num_packets; | 67 return kPaddingPacketSize * num_packets; |
65 } | 68 } |
66 | 69 |
67 size_t padding_sent() { return padding_sent_; } | 70 size_t padding_sent() { return padding_sent_; } |
68 | 71 |
69 private: | 72 private: |
70 size_t padding_sent_; | 73 size_t padding_sent_; |
71 }; | 74 }; |
72 | 75 |
73 class PacedSenderProbing : public PacedSender::PacketSender { | 76 class PacedSenderProbing : public PacedSender::PacketSender { |
74 public: | 77 public: |
75 PacedSenderProbing() : packets_sent_(0), padding_sent_(0) {} | 78 PacedSenderProbing() : packets_sent_(0), padding_sent_(0) {} |
76 | 79 |
77 bool TimeToSendPacket(uint32_t ssrc, | 80 bool TimeToSendPacket(uint32_t ssrc, |
78 uint16_t sequence_number, | 81 uint16_t sequence_number, |
79 int64_t capture_time_ms, | 82 int64_t capture_time_ms, |
80 bool retransmission, | 83 bool retransmission, |
81 int probe_cluster_id) override { | 84 const PacedPacketInfo& pacing_info) override { |
82 packets_sent_++; | 85 packets_sent_++; |
83 return true; | 86 return true; |
84 } | 87 } |
85 | 88 |
86 size_t TimeToSendPadding(size_t bytes, int probe_cluster_id) override { | 89 size_t TimeToSendPadding(size_t bytes, |
| 90 const PacedPacketInfo& pacing_info) override { |
87 padding_sent_ += bytes; | 91 padding_sent_ += bytes; |
88 return padding_sent_; | 92 return padding_sent_; |
89 } | 93 } |
90 | 94 |
91 int packets_sent() const { return packets_sent_; } | 95 int packets_sent() const { return packets_sent_; } |
92 | 96 |
93 int padding_sent() const { return padding_sent_; } | 97 int padding_sent() const { return padding_sent_; } |
94 | 98 |
95 private: | 99 private: |
96 int packets_sent_; | 100 int packets_sent_; |
(...skipping 23 matching lines...) Expand all Loading... |
120 int64_t capture_time_ms, | 124 int64_t capture_time_ms, |
121 size_t size, | 125 size_t size, |
122 bool retransmission) { | 126 bool retransmission) { |
123 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms, | 127 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms, |
124 size, retransmission); | 128 size, retransmission); |
125 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, | 129 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number, |
126 capture_time_ms, retransmission, _)) | 130 capture_time_ms, retransmission, _)) |
127 .Times(1) | 131 .Times(1) |
128 .WillRepeatedly(Return(true)); | 132 .WillRepeatedly(Return(true)); |
129 } | 133 } |
130 | |
131 SimulatedClock clock_; | 134 SimulatedClock clock_; |
132 MockPacedSenderCallback callback_; | 135 MockPacedSenderCallback callback_; |
133 std::unique_ptr<PacedSender> send_bucket_; | 136 std::unique_ptr<PacedSender> send_bucket_; |
134 }; | 137 }; |
135 | 138 |
136 TEST_F(PacedSenderTest, QueuePacket) { | 139 TEST_F(PacedSenderTest, QueuePacket) { |
137 uint32_t ssrc = 12345; | 140 uint32_t ssrc = 12345; |
138 uint16_t sequence_number = 1234; | 141 uint16_t sequence_number = 1234; |
139 // Due to the multiplicative factor we can send 5 packets during a send | 142 // Due to the multiplicative factor we can send 5 packets during a send |
140 // interval. (network capacity * multiplier / (8 bits per byte * | 143 // interval. (network capacity * multiplier / (8 bits per byte * |
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1004 | 1007 |
1005 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps); | 1008 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps); |
1006 send_bucket_->SetProbingEnabled(true); | 1009 send_bucket_->SetProbingEnabled(true); |
1007 for (int i = 0; i < 10; ++i) { | 1010 for (int i = 0; i < 10; ++i) { |
1008 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, | 1011 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc, |
1009 sequence_number + i, clock_.TimeInMilliseconds(), | 1012 sequence_number + i, clock_.TimeInMilliseconds(), |
1010 kPacketSize, false); | 1013 kPacketSize, false); |
1011 } | 1014 } |
1012 | 1015 |
1013 // First probing cluster. | 1016 // First probing cluster. |
1014 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 0)) | 1017 EXPECT_CALL(callback_, |
| 1018 TimeToSendPacket(_, _, _, _, |
| 1019 Field(&PacedPacketInfo::probe_cluster_id, 0))) |
1015 .Times(5) | 1020 .Times(5) |
1016 .WillRepeatedly(Return(true)); | 1021 .WillRepeatedly(Return(true)); |
1017 for (int i = 0; i < 5; ++i) { | 1022 for (int i = 0; i < 5; ++i) { |
1018 clock_.AdvanceTimeMilliseconds(20); | 1023 clock_.AdvanceTimeMilliseconds(20); |
1019 send_bucket_->Process(); | 1024 send_bucket_->Process(); |
1020 } | 1025 } |
1021 | 1026 |
1022 // Second probing cluster. | 1027 // Second probing cluster. |
1023 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 1)) | 1028 EXPECT_CALL(callback_, |
| 1029 TimeToSendPacket(_, _, _, _, |
| 1030 Field(&PacedPacketInfo::probe_cluster_id, 1))) |
1024 .Times(5) | 1031 .Times(5) |
1025 .WillRepeatedly(Return(true)); | 1032 .WillRepeatedly(Return(true)); |
1026 for (int i = 0; i < 5; ++i) { | 1033 for (int i = 0; i < 5; ++i) { |
1027 clock_.AdvanceTimeMilliseconds(20); | 1034 clock_.AdvanceTimeMilliseconds(20); |
1028 send_bucket_->Process(); | 1035 send_bucket_->Process(); |
1029 } | 1036 } |
1030 | 1037 |
| 1038 // Needed for the Field comparer below. |
| 1039 const int kNotAProbe = PacedPacketInfo::kNotAProbe; |
1031 // No more probing packets. | 1040 // No more probing packets. |
1032 EXPECT_CALL(callback_, TimeToSendPadding(_, PacketInfo::kNotAProbe)) | 1041 EXPECT_CALL(callback_, |
1033 .Times(1) | 1042 TimeToSendPadding( |
1034 .WillRepeatedly(Return(500)); | 1043 _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe))) |
| 1044 .Times(1) |
| 1045 .WillRepeatedly(Return(500)); |
1035 send_bucket_->Process(); | 1046 send_bucket_->Process(); |
1036 } | 1047 } |
1037 | 1048 |
1038 } // namespace test | 1049 } // namespace test |
1039 } // namespace webrtc | 1050 } // namespace webrtc |
OLD | NEW |