OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 <algorithm> | 11 #include <algorithm> |
12 #include <limits> | 12 #include <limits> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h" | 15 #include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h" |
16 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | 16 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
17 #include "webrtc/system_wrappers/include/clock.h" | 17 #include "webrtc/system_wrappers/include/clock.h" |
18 #include "webrtc/test/gtest.h" | 18 #include "webrtc/test/gtest.h" |
19 | 19 |
| 20 namespace { |
| 21 |
| 22 constexpr int kDefaultHistoryLengthMs = 1000; |
| 23 constexpr size_t kRtpHeadersSize = 12; |
| 24 constexpr size_t kTransportHeadersSize = 20; |
| 25 |
| 26 } // namespace |
| 27 |
20 namespace webrtc { | 28 namespace webrtc { |
21 namespace test { | 29 namespace test { |
22 | 30 |
23 static const int kDefaultHistoryLengthMs = 1000; | |
24 | |
25 class SendTimeHistoryTest : public ::testing::Test { | 31 class SendTimeHistoryTest : public ::testing::Test { |
26 protected: | 32 protected: |
27 SendTimeHistoryTest() | 33 SendTimeHistoryTest() |
28 : clock_(0), history_(&clock_, kDefaultHistoryLengthMs) {} | 34 : clock_(0), history_(&clock_, kDefaultHistoryLengthMs) {} |
29 ~SendTimeHistoryTest() {} | 35 ~SendTimeHistoryTest() {} |
30 | 36 |
31 virtual void SetUp() {} | 37 virtual void SetUp() {} |
32 | 38 |
33 virtual void TearDown() {} | 39 virtual void TearDown() {} |
34 | 40 |
35 void AddPacketWithSendTime(uint16_t sequence_number, | 41 void AddPacketWithSendTime(uint16_t sequence_number, |
36 size_t length, | 42 size_t payload_size, |
37 int64_t send_time_ms, | 43 int64_t send_time_ms, |
38 const PacedPacketInfo& pacing_info) { | 44 const PacedPacketInfo& pacing_info) { |
39 PacketFeedback packet(clock_.TimeInMilliseconds(), sequence_number, length, | 45 PacketFeedback packet(clock_.TimeInMilliseconds(), sequence_number, |
| 46 payload_size, kRtpHeadersSize, kTransportHeadersSize, |
40 0, 0, pacing_info); | 47 0, 0, pacing_info); |
41 history_.AddAndRemoveOld(packet); | 48 history_.AddAndRemoveOld(packet); |
42 history_.OnSentPacket(sequence_number, send_time_ms); | 49 history_.OnSentPacket(sequence_number, send_time_ms); |
43 } | 50 } |
44 | 51 |
45 webrtc::SimulatedClock clock_; | 52 webrtc::SimulatedClock clock_; |
46 SendTimeHistory history_; | 53 SendTimeHistory history_; |
47 }; | 54 }; |
48 | 55 |
49 TEST_F(SendTimeHistoryTest, SaveAndRestoreNetworkId) { | 56 TEST_F(SendTimeHistoryTest, SaveAndRestoreNetworkId) { |
50 const PacedPacketInfo kPacingInfo(0, 5, 1200); | 57 const PacedPacketInfo kPacingInfo(0, 5, 1200); |
51 uint16_t sequence_number = 0; | 58 uint16_t sequence_number = 0; |
52 int64_t now_ms = clock_.TimeInMilliseconds(); | 59 int64_t now_ms = clock_.TimeInMilliseconds(); |
53 for (int i = 1; i < 5; ++i) { | 60 for (int i = 1; i < 5; ++i) { |
54 PacketFeedback packet(now_ms, sequence_number, 1000, i, i - 1, | 61 PacketFeedback packet(now_ms, sequence_number, 1000, kRtpHeadersSize, |
55 kPacingInfo); | 62 kTransportHeadersSize, i, i - 1, kPacingInfo); |
56 history_.AddAndRemoveOld(packet); | 63 history_.AddAndRemoveOld(packet); |
57 history_.OnSentPacket(sequence_number, now_ms); | 64 history_.OnSentPacket(sequence_number, now_ms); |
58 PacketFeedback restored(now_ms, sequence_number); | 65 PacketFeedback restored(now_ms, sequence_number); |
59 EXPECT_TRUE(history_.GetFeedback(&restored, sequence_number++)); | 66 EXPECT_TRUE(history_.GetFeedback(&restored, sequence_number++)); |
60 EXPECT_EQ(packet.local_net_id, restored.local_net_id); | 67 EXPECT_EQ(packet.local_net_id, restored.local_net_id); |
61 EXPECT_EQ(packet.remote_net_id, restored.remote_net_id); | 68 EXPECT_EQ(packet.remote_net_id, restored.remote_net_id); |
62 } | 69 } |
63 } | 70 } |
64 | 71 |
65 TEST_F(SendTimeHistoryTest, AddRemoveOne) { | 72 TEST_F(SendTimeHistoryTest, AddRemoveOne) { |
66 const uint16_t kSeqNo = 10; | 73 const uint16_t kSeqNo = 10; |
67 // TODO(philipel): Fix PacedPacketInfo constructor? | 74 // TODO(philipel): Fix PacedPacketInfo constructor? |
68 const PacedPacketInfo kPacingInfo(0, 5, 1200); | 75 const PacedPacketInfo kPacingInfo(0, 5, 1200); |
69 const PacketFeedback kSentPacket(0, 1, kSeqNo, 1, kPacingInfo); | 76 const PacketFeedback kSentPacket(0, 1, kSeqNo, 1, kRtpHeadersSize, |
| 77 kTransportHeadersSize, kPacingInfo); |
70 AddPacketWithSendTime(kSeqNo, 1, 1, kPacingInfo); | 78 AddPacketWithSendTime(kSeqNo, 1, 1, kPacingInfo); |
71 | 79 |
72 PacketFeedback received_packet(0, 0, kSeqNo, 0, kPacingInfo); | 80 PacketFeedback received_packet(0, 0, kSeqNo, 0, kRtpHeadersSize, |
| 81 kTransportHeadersSize, kPacingInfo); |
73 EXPECT_TRUE(history_.GetFeedback(&received_packet, false)); | 82 EXPECT_TRUE(history_.GetFeedback(&received_packet, false)); |
74 EXPECT_EQ(kSentPacket, received_packet); | 83 EXPECT_EQ(kSentPacket, received_packet); |
75 | 84 |
76 PacketFeedback received_packet2(0, 0, kSeqNo, 0, kPacingInfo); | 85 PacketFeedback received_packet2(0, 0, kSeqNo, 0, kRtpHeadersSize, |
| 86 kTransportHeadersSize, kPacingInfo); |
77 EXPECT_TRUE(history_.GetFeedback(&received_packet2, true)); | 87 EXPECT_TRUE(history_.GetFeedback(&received_packet2, true)); |
78 EXPECT_EQ(kSentPacket, received_packet2); | 88 EXPECT_EQ(kSentPacket, received_packet2); |
79 | 89 |
80 PacketFeedback received_packet3(0, 0, kSeqNo, 0, kPacingInfo); | 90 PacketFeedback received_packet3(0, 0, kSeqNo, 0, kRtpHeadersSize, |
| 91 kTransportHeadersSize, kPacingInfo); |
81 EXPECT_FALSE(history_.GetFeedback(&received_packet3, true)); | 92 EXPECT_FALSE(history_.GetFeedback(&received_packet3, true)); |
82 } | 93 } |
83 | 94 |
84 TEST_F(SendTimeHistoryTest, PopulatesExpectedFields) { | 95 TEST_F(SendTimeHistoryTest, PopulatesExpectedFields) { |
85 const uint16_t kSeqNo = 10; | 96 const uint16_t kSeqNo = 10; |
86 const int64_t kSendTime = 1000; | 97 const int64_t kSendTime = 1000; |
87 const int64_t kReceiveTime = 2000; | 98 const int64_t kReceiveTime = 2000; |
88 const size_t kPayloadSize = 42; | 99 const size_t kPayloadSize = 42; |
89 const PacedPacketInfo kPacingInfo(3, 10, 1212); | 100 const PacedPacketInfo kPacingInfo(3, 10, 1212); |
90 | 101 |
91 AddPacketWithSendTime(kSeqNo, kPayloadSize, kSendTime, kPacingInfo); | 102 AddPacketWithSendTime(kSeqNo, kPayloadSize, kSendTime, kPacingInfo); |
92 | 103 |
93 PacketFeedback packet_feedback(kReceiveTime, kSeqNo); | 104 PacketFeedback packet_feedback(kReceiveTime, kSeqNo); |
94 EXPECT_TRUE(history_.GetFeedback(&packet_feedback, true)); | 105 EXPECT_TRUE(history_.GetFeedback(&packet_feedback, true)); |
95 EXPECT_EQ(kReceiveTime, packet_feedback.arrival_time_ms); | 106 EXPECT_EQ(kReceiveTime, packet_feedback.arrival_time_ms); |
96 EXPECT_EQ(kSendTime, packet_feedback.send_time_ms); | 107 EXPECT_EQ(kSendTime, packet_feedback.send_time_ms); |
97 EXPECT_EQ(kSeqNo, packet_feedback.sequence_number); | 108 EXPECT_EQ(kSeqNo, packet_feedback.sequence_number); |
98 EXPECT_EQ(kPayloadSize, packet_feedback.payload_size); | 109 EXPECT_EQ(kPayloadSize, packet_feedback.payload_size); |
99 EXPECT_EQ(kPacingInfo, packet_feedback.pacing_info); | 110 EXPECT_EQ(kPacingInfo, packet_feedback.pacing_info); |
100 } | 111 } |
101 | 112 |
102 TEST_F(SendTimeHistoryTest, AddThenRemoveOutOfOrder) { | 113 TEST_F(SendTimeHistoryTest, AddThenRemoveOutOfOrder) { |
103 std::vector<PacketFeedback> sent_packets; | 114 std::vector<PacketFeedback> sent_packets; |
104 std::vector<PacketFeedback> received_packets; | 115 std::vector<PacketFeedback> received_packets; |
105 const size_t num_items = 100; | 116 const size_t num_items = 100; |
106 const size_t kPacketSize = 400; | 117 const size_t kPayloadSize = 400; |
107 const size_t kTransmissionTime = 1234; | 118 const size_t kTransmissionTime = 1234; |
108 const PacedPacketInfo kPacingInfo(1, 2, 200); | 119 const PacedPacketInfo kPacingInfo(1, 2, 200); |
109 for (size_t i = 0; i < num_items; ++i) { | 120 for (size_t i = 0; i < num_items; ++i) { |
110 sent_packets.push_back(PacketFeedback(0, static_cast<int64_t>(i), | 121 sent_packets.push_back(PacketFeedback( |
111 static_cast<uint16_t>(i), kPacketSize, | 122 0, static_cast<int64_t>(i), static_cast<uint16_t>(i), kPayloadSize, |
112 kPacingInfo)); | 123 kRtpHeadersSize, kTransportHeadersSize, kPacingInfo)); |
113 received_packets.push_back(PacketFeedback( | 124 received_packets.push_back( |
114 static_cast<int64_t>(i) + kTransmissionTime, 0, | 125 PacketFeedback(static_cast<int64_t>(i) + kTransmissionTime, 0, |
115 static_cast<uint16_t>(i), kPacketSize, PacedPacketInfo())); | 126 static_cast<uint16_t>(i), kPayloadSize, kRtpHeadersSize, |
| 127 kTransportHeadersSize, PacedPacketInfo())); |
116 } | 128 } |
117 for (size_t i = 0; i < num_items; ++i) { | 129 for (size_t i = 0; i < num_items; ++i) { |
118 PacketFeedback packet = sent_packets[i]; | 130 PacketFeedback packet = sent_packets[i]; |
119 packet.arrival_time_ms = -1; | 131 packet.arrival_time_ms = -1; |
120 packet.send_time_ms = -1; | 132 packet.send_time_ms = -1; |
121 history_.AddAndRemoveOld(packet); | 133 history_.AddAndRemoveOld(packet); |
122 } | 134 } |
123 for (size_t i = 0; i < num_items; ++i) | 135 for (size_t i = 0; i < num_items; ++i) |
124 history_.OnSentPacket(sent_packets[i].sequence_number, | 136 history_.OnSentPacket(sent_packets[i].sequence_number, |
125 sent_packets[i].send_time_ms); | 137 sent_packets[i].send_time_ms); |
(...skipping 10 matching lines...) Expand all Loading... |
136 EXPECT_FALSE(history_.GetFeedback(&packet, false)); | 148 EXPECT_FALSE(history_.GetFeedback(&packet, false)); |
137 } | 149 } |
138 | 150 |
139 TEST_F(SendTimeHistoryTest, HistorySize) { | 151 TEST_F(SendTimeHistoryTest, HistorySize) { |
140 const int kItems = kDefaultHistoryLengthMs / 100; | 152 const int kItems = kDefaultHistoryLengthMs / 100; |
141 for (int i = 0; i < kItems; ++i) { | 153 for (int i = 0; i < kItems; ++i) { |
142 clock_.AdvanceTimeMilliseconds(100); | 154 clock_.AdvanceTimeMilliseconds(100); |
143 AddPacketWithSendTime(i, 0, i * 100, PacedPacketInfo()); | 155 AddPacketWithSendTime(i, 0, i * 100, PacedPacketInfo()); |
144 } | 156 } |
145 for (int i = 0; i < kItems; ++i) { | 157 for (int i = 0; i < kItems; ++i) { |
146 PacketFeedback packet(0, 0, static_cast<uint16_t>(i), 0, PacedPacketInfo()); | 158 PacketFeedback packet(0, 0, static_cast<uint16_t>(i), 0, kRtpHeadersSize, |
| 159 kTransportHeadersSize, PacedPacketInfo()); |
147 EXPECT_TRUE(history_.GetFeedback(&packet, false)); | 160 EXPECT_TRUE(history_.GetFeedback(&packet, false)); |
148 EXPECT_EQ(i * 100, packet.send_time_ms); | 161 EXPECT_EQ(i * 100, packet.send_time_ms); |
149 } | 162 } |
150 clock_.AdvanceTimeMilliseconds(101); | 163 clock_.AdvanceTimeMilliseconds(101); |
151 AddPacketWithSendTime(kItems, 0, kItems * 101, PacedPacketInfo()); | 164 AddPacketWithSendTime(kItems, 0, kItems * 101, PacedPacketInfo()); |
152 PacketFeedback packet(0, 0, 0, 0, PacedPacketInfo()); | 165 PacketFeedback packet(0, 0, 0, 0, kRtpHeadersSize, kTransportHeadersSize, |
| 166 PacedPacketInfo()); |
153 EXPECT_FALSE(history_.GetFeedback(&packet, false)); | 167 EXPECT_FALSE(history_.GetFeedback(&packet, false)); |
154 for (int i = 1; i < (kItems + 1); ++i) { | 168 for (int i = 1; i < (kItems + 1); ++i) { |
155 PacketFeedback packet2(0, 0, static_cast<uint16_t>(i), 0, | 169 PacketFeedback packet2(0, 0, static_cast<uint16_t>(i), 0, kRtpHeadersSize, |
156 PacedPacketInfo()); | 170 kTransportHeadersSize, PacedPacketInfo()); |
157 EXPECT_TRUE(history_.GetFeedback(&packet2, false)); | 171 EXPECT_TRUE(history_.GetFeedback(&packet2, false)); |
158 int64_t expected_time_ms = (i == kItems) ? i * 101 : i * 100; | 172 int64_t expected_time_ms = (i == kItems) ? i * 101 : i * 100; |
159 EXPECT_EQ(expected_time_ms, packet2.send_time_ms); | 173 EXPECT_EQ(expected_time_ms, packet2.send_time_ms); |
160 } | 174 } |
161 } | 175 } |
162 | 176 |
163 TEST_F(SendTimeHistoryTest, HistorySizeWithWraparound) { | 177 TEST_F(SendTimeHistoryTest, HistorySizeWithWraparound) { |
164 const uint16_t kMaxSeqNo = std::numeric_limits<uint16_t>::max(); | 178 const uint16_t kMaxSeqNo = std::numeric_limits<uint16_t>::max(); |
165 AddPacketWithSendTime(kMaxSeqNo - 2, 0, 0, PacedPacketInfo()); | 179 AddPacketWithSendTime(kMaxSeqNo - 2, 0, 0, PacedPacketInfo()); |
166 | 180 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 EXPECT_TRUE(history_.GetFeedback(&packet10, false)); | 215 EXPECT_TRUE(history_.GetFeedback(&packet10, false)); |
202 } | 216 } |
203 | 217 |
204 TEST_F(SendTimeHistoryTest, InterlievedGetAndRemove) { | 218 TEST_F(SendTimeHistoryTest, InterlievedGetAndRemove) { |
205 const uint16_t kSeqNo = 1; | 219 const uint16_t kSeqNo = 1; |
206 const int64_t kTimestamp = 2; | 220 const int64_t kTimestamp = 2; |
207 const PacedPacketInfo kPacingInfo1(1, 1, 100); | 221 const PacedPacketInfo kPacingInfo1(1, 1, 100); |
208 const PacedPacketInfo kPacingInfo2(2, 2, 200); | 222 const PacedPacketInfo kPacingInfo2(2, 2, 200); |
209 const PacedPacketInfo kPacingInfo3(3, 3, 300); | 223 const PacedPacketInfo kPacingInfo3(3, 3, 300); |
210 PacketFeedback packets[3] = { | 224 PacketFeedback packets[3] = { |
211 {0, kTimestamp, kSeqNo, 0, kPacingInfo1}, | 225 {0, kTimestamp, kSeqNo, 0, kRtpHeadersSize, kTransportHeadersSize, |
212 {0, kTimestamp + 1, kSeqNo + 1, 0, kPacingInfo2}, | 226 kPacingInfo1}, |
213 {0, kTimestamp + 2, kSeqNo + 2, 0, kPacingInfo3}}; | 227 {0, kTimestamp + 1, kSeqNo + 1, 0, kRtpHeadersSize, kTransportHeadersSize, |
| 228 kPacingInfo2}, |
| 229 {0, kTimestamp + 2, kSeqNo + 2, 0, kRtpHeadersSize, kTransportHeadersSize, |
| 230 kPacingInfo3}}; |
214 | 231 |
215 AddPacketWithSendTime(packets[0].sequence_number, packets[0].payload_size, | 232 AddPacketWithSendTime(packets[0].sequence_number, packets[0].payload_size, |
216 packets[0].send_time_ms, packets[0].pacing_info); | 233 packets[0].send_time_ms, packets[0].pacing_info); |
217 AddPacketWithSendTime(packets[1].sequence_number, packets[1].payload_size, | 234 AddPacketWithSendTime(packets[1].sequence_number, packets[1].payload_size, |
218 packets[1].send_time_ms, packets[1].pacing_info); | 235 packets[1].send_time_ms, packets[1].pacing_info); |
219 PacketFeedback packet(0, 0, packets[0].sequence_number, 0, PacedPacketInfo()); | 236 PacketFeedback packet(0, 0, packets[0].sequence_number, 0, kRtpHeadersSize, |
| 237 kTransportHeadersSize, PacedPacketInfo()); |
220 EXPECT_TRUE(history_.GetFeedback(&packet, true)); | 238 EXPECT_TRUE(history_.GetFeedback(&packet, true)); |
221 EXPECT_EQ(packets[0], packet); | 239 EXPECT_EQ(packets[0], packet); |
222 | 240 |
223 AddPacketWithSendTime(packets[2].sequence_number, packets[2].payload_size, | 241 AddPacketWithSendTime(packets[2].sequence_number, packets[2].payload_size, |
224 packets[2].send_time_ms, packets[2].pacing_info); | 242 packets[2].send_time_ms, packets[2].pacing_info); |
225 | 243 |
226 PacketFeedback packet2(0, 0, packets[1].sequence_number, 0, kPacingInfo1); | 244 PacketFeedback packet2(0, 0, packets[1].sequence_number, 0, kRtpHeadersSize, |
| 245 kTransportHeadersSize, kPacingInfo1); |
227 EXPECT_TRUE(history_.GetFeedback(&packet2, true)); | 246 EXPECT_TRUE(history_.GetFeedback(&packet2, true)); |
228 EXPECT_EQ(packets[1], packet2); | 247 EXPECT_EQ(packets[1], packet2); |
229 | 248 |
230 PacketFeedback packet3(0, 0, packets[2].sequence_number, 0, kPacingInfo2); | 249 PacketFeedback packet3(0, 0, packets[2].sequence_number, 0, kRtpHeadersSize, |
| 250 kTransportHeadersSize, kPacingInfo2); |
231 EXPECT_TRUE(history_.GetFeedback(&packet3, true)); | 251 EXPECT_TRUE(history_.GetFeedback(&packet3, true)); |
232 EXPECT_EQ(packets[2], packet3); | 252 EXPECT_EQ(packets[2], packet3); |
233 } | 253 } |
234 } // namespace test | 254 } // namespace test |
235 } // namespace webrtc | 255 } // namespace webrtc |
OLD | NEW |