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 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 | 69 |
70 TransportFeedbackAdapterTest* const owner_; | 70 TransportFeedbackAdapterTest* const owner_; |
71 }; | 71 }; |
72 | 72 |
73 void OnReceivedEstimatedBitrate(uint32_t bitrate) {} | 73 void OnReceivedEstimatedBitrate(uint32_t bitrate) {} |
74 | 74 |
75 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks, | 75 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks, |
76 int64_t rtt, | 76 int64_t rtt, |
77 int64_t now_ms) {} | 77 int64_t now_ms) {} |
78 | 78 |
79 void ComparePacketVectors(const std::vector<PacketInfo>& truth, | 79 void ComparePacketVectors(const std::vector<PacketFeedback>& truth, |
80 const std::vector<PacketInfo>& input) { | 80 const std::vector<PacketFeedback>& input) { |
81 ASSERT_EQ(truth.size(), input.size()); | 81 ASSERT_EQ(truth.size(), input.size()); |
82 size_t len = truth.size(); | 82 size_t len = truth.size(); |
83 // truth contains the input data for the test, and input is what will be | 83 // truth contains the input data for the test, and input is what will be |
84 // sent to the bandwidth estimator. truth.arrival_tims_ms is used to | 84 // sent to the bandwidth estimator. truth.arrival_tims_ms is used to |
85 // populate the transport feedback messages. As these times may be changed | 85 // populate the transport feedback messages. As these times may be changed |
86 // (because of resolution limits in the packets, and because of the time | 86 // (because of resolution limits in the packets, and because of the time |
87 // base adjustment performed by the TransportFeedbackAdapter at the first | 87 // base adjustment performed by the TransportFeedbackAdapter at the first |
88 // packet, the truth[x].arrival_time and input[x].arrival_time may not be | 88 // packet, the truth[x].arrival_time and input[x].arrival_time may not be |
89 // equal. However, the difference must be the same for all x. | 89 // equal. However, the difference must be the same for all x. |
90 int64_t arrival_time_delta = | 90 int64_t arrival_time_delta = |
91 truth[0].arrival_time_ms - input[0].arrival_time_ms; | 91 truth[0].arrival_time_ms - input[0].arrival_time_ms; |
92 for (size_t i = 0; i < len; ++i) { | 92 for (size_t i = 0; i < len; ++i) { |
93 EXPECT_EQ(truth[i].arrival_time_ms, | 93 EXPECT_EQ(truth[i].arrival_time_ms, |
94 input[i].arrival_time_ms + arrival_time_delta); | 94 input[i].arrival_time_ms + arrival_time_delta); |
95 EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms); | 95 EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms); |
96 EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number); | 96 EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number); |
97 EXPECT_EQ(truth[i].payload_size, input[i].payload_size); | 97 EXPECT_EQ(truth[i].payload_size, input[i].payload_size); |
98 EXPECT_EQ(truth[i].pacing_info, input[i].pacing_info); | 98 EXPECT_EQ(truth[i].pacing_info, input[i].pacing_info); |
99 } | 99 } |
100 } | 100 } |
101 | 101 |
102 // Utility method, to reset arrival_time_ms before adding send time. | 102 // Utility method, to reset arrival_time_ms before adding send time. |
103 void OnSentPacket(PacketInfo info) { | 103 void OnSentPacket(PacketFeedback packet_feedback) { |
104 info.arrival_time_ms = 0; | 104 packet_feedback.arrival_time_ms = 0; |
105 // TODO(philipel): Change -1, -1 to some values. | 105 // TODO(philipel): Change -1, -1 to some values. |
106 adapter_->AddPacket(info.sequence_number, info.payload_size, | 106 adapter_->AddPacket(packet_feedback.sequence_number, |
107 info.pacing_info); | 107 packet_feedback.payload_size, |
108 adapter_->OnSentPacket(info.sequence_number, info.send_time_ms); | 108 packet_feedback.pacing_info); |
| 109 adapter_->OnSentPacket(packet_feedback.sequence_number, |
| 110 packet_feedback.send_time_ms); |
109 } | 111 } |
110 | 112 |
111 SimulatedClock clock_; | 113 SimulatedClock clock_; |
112 MockBitrateControllerAdapter bitrate_controller_; | 114 MockBitrateControllerAdapter bitrate_controller_; |
113 std::unique_ptr<TransportFeedbackAdapter> adapter_; | 115 std::unique_ptr<TransportFeedbackAdapter> adapter_; |
114 | 116 |
115 uint32_t target_bitrate_bps_; | 117 uint32_t target_bitrate_bps_; |
116 }; | 118 }; |
117 | 119 |
118 TEST_F(TransportFeedbackAdapterTest, AdaptsFeedbackAndPopulatesSendTimes) { | 120 TEST_F(TransportFeedbackAdapterTest, AdaptsFeedbackAndPopulatesSendTimes) { |
119 std::vector<PacketInfo> packets; | 121 std::vector<PacketFeedback> packets; |
120 packets.push_back(PacketInfo(100, 200, 0, 1500, kPacingInfo0)); | 122 packets.push_back(PacketFeedback(100, 200, 0, 1500, kPacingInfo0)); |
121 packets.push_back(PacketInfo(110, 210, 1, 1500, kPacingInfo0)); | 123 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0)); |
122 packets.push_back(PacketInfo(120, 220, 2, 1500, kPacingInfo0)); | 124 packets.push_back(PacketFeedback(120, 220, 2, 1500, kPacingInfo0)); |
123 packets.push_back(PacketInfo(130, 230, 3, 1500, kPacingInfo1)); | 125 packets.push_back(PacketFeedback(130, 230, 3, 1500, kPacingInfo1)); |
124 packets.push_back(PacketInfo(140, 240, 4, 1500, kPacingInfo1)); | 126 packets.push_back(PacketFeedback(140, 240, 4, 1500, kPacingInfo1)); |
125 | 127 |
126 for (const PacketInfo& packet : packets) | 128 for (const PacketFeedback& packet : packets) |
127 OnSentPacket(packet); | 129 OnSentPacket(packet); |
128 | 130 |
129 rtcp::TransportFeedback feedback; | 131 rtcp::TransportFeedback feedback; |
130 feedback.SetBase(packets[0].sequence_number, | 132 feedback.SetBase(packets[0].sequence_number, |
131 packets[0].arrival_time_ms * 1000); | 133 packets[0].arrival_time_ms * 1000); |
132 | 134 |
133 for (const PacketInfo& packet : packets) { | 135 for (const PacketFeedback& packet : packets) { |
134 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 136 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
135 packet.arrival_time_ms * 1000)); | 137 packet.arrival_time_ms * 1000)); |
136 } | 138 } |
137 | 139 |
138 feedback.Build(); | 140 feedback.Build(); |
139 | 141 |
140 adapter_->OnTransportFeedback(feedback); | 142 adapter_->OnTransportFeedback(feedback); |
141 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); | 143 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); |
142 } | 144 } |
143 | 145 |
144 TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) { | 146 TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) { |
145 const int64_t kFeedbackTimeoutMs = 60001; | 147 const int64_t kFeedbackTimeoutMs = 60001; |
146 const int kMaxConsecutiveFailedLookups = 5; | 148 const int kMaxConsecutiveFailedLookups = 5; |
147 for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) { | 149 for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) { |
148 std::vector<PacketInfo> packets; | 150 std::vector<PacketFeedback> packets; |
149 packets.push_back(PacketInfo(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0)); | |
150 packets.push_back( | 151 packets.push_back( |
151 PacketInfo(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0)); | 152 PacketFeedback(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0)); |
152 packets.push_back( | 153 packets.push_back( |
153 PacketInfo(i * 100 + 20, 2 * i * 100 + 20, 2, 1500, kPacingInfo0)); | 154 PacketFeedback(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0)); |
154 packets.push_back( | 155 packets.push_back( |
155 PacketInfo(i * 100 + 30, 2 * i * 100 + 30, 3, 1500, kPacingInfo1)); | 156 PacketFeedback(i * 100 + 20, 2 * i * 100 + 20, 2, 1500, kPacingInfo0)); |
156 packets.push_back( | 157 packets.push_back( |
157 PacketInfo(i * 100 + 40, 2 * i * 100 + 40, 4, 1500, kPacingInfo1)); | 158 PacketFeedback(i * 100 + 30, 2 * i * 100 + 30, 3, 1500, kPacingInfo1)); |
| 159 packets.push_back( |
| 160 PacketFeedback(i * 100 + 40, 2 * i * 100 + 40, 4, 1500, kPacingInfo1)); |
158 | 161 |
159 for (const PacketInfo& packet : packets) | 162 for (const PacketFeedback& packet : packets) |
160 OnSentPacket(packet); | 163 OnSentPacket(packet); |
161 | 164 |
162 rtcp::TransportFeedback feedback; | 165 rtcp::TransportFeedback feedback; |
163 feedback.SetBase(packets[0].sequence_number, | 166 feedback.SetBase(packets[0].sequence_number, |
164 packets[0].arrival_time_ms * 1000); | 167 packets[0].arrival_time_ms * 1000); |
165 | 168 |
166 for (const PacketInfo& packet : packets) { | 169 for (const PacketFeedback& packet : packets) { |
167 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 170 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
168 packet.arrival_time_ms * 1000)); | 171 packet.arrival_time_ms * 1000)); |
169 } | 172 } |
170 | 173 |
171 feedback.Build(); | 174 feedback.Build(); |
172 | 175 |
173 clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs); | 176 clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs); |
174 PacketInfo later_packet(kFeedbackTimeoutMs + i * 100 + 40, | 177 PacketFeedback later_packet(kFeedbackTimeoutMs + i * 100 + 40, |
175 kFeedbackTimeoutMs + i * 200 + 40, 5, 1500, | 178 kFeedbackTimeoutMs + i * 200 + 40, 5, 1500, |
176 kPacingInfo1); | 179 kPacingInfo1); |
177 OnSentPacket(later_packet); | 180 OnSentPacket(later_packet); |
178 | 181 |
179 adapter_->OnTransportFeedback(feedback); | 182 adapter_->OnTransportFeedback(feedback); |
180 | 183 |
181 // Check that packets have timed out. | 184 // Check that packets have timed out. |
182 for (PacketInfo& packet : packets) { | 185 for (PacketFeedback& packet : packets) { |
183 packet.send_time_ms = -1; | 186 packet.send_time_ms = -1; |
184 packet.payload_size = 0; | 187 packet.payload_size = 0; |
185 packet.pacing_info = PacedPacketInfo(); | 188 packet.pacing_info = PacedPacketInfo(); |
186 } | 189 } |
187 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); | 190 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); |
188 } | 191 } |
189 | 192 |
190 // Target bitrate should have halved due to feedback delays. | 193 // Target bitrate should have halved due to feedback delays. |
191 EXPECT_EQ(150000u, target_bitrate_bps_); | 194 EXPECT_EQ(150000u, target_bitrate_bps_); |
192 | 195 |
193 // Test with feedback that isn't late enough to time out. | 196 // Test with feedback that isn't late enough to time out. |
194 { | 197 { |
195 std::vector<PacketInfo> packets; | 198 std::vector<PacketFeedback> packets; |
196 packets.push_back(PacketInfo(100, 200, 0, 1500, kPacingInfo0)); | 199 packets.push_back(PacketFeedback(100, 200, 0, 1500, kPacingInfo0)); |
197 packets.push_back(PacketInfo(110, 210, 1, 1500, kPacingInfo0)); | 200 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0)); |
198 packets.push_back(PacketInfo(120, 220, 2, 1500, kPacingInfo0)); | 201 packets.push_back(PacketFeedback(120, 220, 2, 1500, kPacingInfo0)); |
199 packets.push_back(PacketInfo(130, 230, 3, 1500, kPacingInfo1)); | 202 packets.push_back(PacketFeedback(130, 230, 3, 1500, kPacingInfo1)); |
200 packets.push_back(PacketInfo(140, 240, 4, 1500, kPacingInfo1)); | 203 packets.push_back(PacketFeedback(140, 240, 4, 1500, kPacingInfo1)); |
201 | 204 |
202 for (const PacketInfo& packet : packets) | 205 for (const PacketFeedback& packet : packets) |
203 OnSentPacket(packet); | 206 OnSentPacket(packet); |
204 | 207 |
205 rtcp::TransportFeedback feedback; | 208 rtcp::TransportFeedback feedback; |
206 feedback.SetBase(packets[0].sequence_number, | 209 feedback.SetBase(packets[0].sequence_number, |
207 packets[0].arrival_time_ms * 1000); | 210 packets[0].arrival_time_ms * 1000); |
208 | 211 |
209 for (const PacketInfo& packet : packets) { | 212 for (const PacketFeedback& packet : packets) { |
210 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 213 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
211 packet.arrival_time_ms * 1000)); | 214 packet.arrival_time_ms * 1000)); |
212 } | 215 } |
213 | 216 |
214 feedback.Build(); | 217 feedback.Build(); |
215 | 218 |
216 clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs - 1); | 219 clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs - 1); |
217 PacketInfo later_packet(kFeedbackTimeoutMs + 140, kFeedbackTimeoutMs + 240, | 220 PacketFeedback later_packet(kFeedbackTimeoutMs + 140, |
218 5, 1500, kPacingInfo1); | 221 kFeedbackTimeoutMs + 240, 5, 1500, |
| 222 kPacingInfo1); |
219 OnSentPacket(later_packet); | 223 OnSentPacket(later_packet); |
220 | 224 |
221 adapter_->OnTransportFeedback(feedback); | 225 adapter_->OnTransportFeedback(feedback); |
222 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); | 226 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); |
223 } | 227 } |
224 } | 228 } |
225 | 229 |
226 TEST_F(TransportFeedbackAdapterTest, HandlesDroppedPackets) { | 230 TEST_F(TransportFeedbackAdapterTest, HandlesDroppedPackets) { |
227 std::vector<PacketInfo> packets; | 231 std::vector<PacketFeedback> packets; |
228 packets.push_back(PacketInfo(100, 200, 0, 1500, kPacingInfo0)); | 232 packets.push_back(PacketFeedback(100, 200, 0, 1500, kPacingInfo0)); |
229 packets.push_back(PacketInfo(110, 210, 1, 1500, kPacingInfo1)); | 233 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo1)); |
230 packets.push_back(PacketInfo(120, 220, 2, 1500, kPacingInfo2)); | 234 packets.push_back(PacketFeedback(120, 220, 2, 1500, kPacingInfo2)); |
231 packets.push_back(PacketInfo(130, 230, 3, 1500, kPacingInfo3)); | 235 packets.push_back(PacketFeedback(130, 230, 3, 1500, kPacingInfo3)); |
232 packets.push_back(PacketInfo(140, 240, 4, 1500, kPacingInfo4)); | 236 packets.push_back(PacketFeedback(140, 240, 4, 1500, kPacingInfo4)); |
233 | 237 |
234 const uint16_t kSendSideDropBefore = 1; | 238 const uint16_t kSendSideDropBefore = 1; |
235 const uint16_t kReceiveSideDropAfter = 3; | 239 const uint16_t kReceiveSideDropAfter = 3; |
236 | 240 |
237 for (const PacketInfo& packet : packets) { | 241 for (const PacketFeedback& packet : packets) { |
238 if (packet.sequence_number >= kSendSideDropBefore) | 242 if (packet.sequence_number >= kSendSideDropBefore) |
239 OnSentPacket(packet); | 243 OnSentPacket(packet); |
240 } | 244 } |
241 | 245 |
242 rtcp::TransportFeedback feedback; | 246 rtcp::TransportFeedback feedback; |
243 feedback.SetBase(packets[0].sequence_number, | 247 feedback.SetBase(packets[0].sequence_number, |
244 packets[0].arrival_time_ms * 1000); | 248 packets[0].arrival_time_ms * 1000); |
245 | 249 |
246 for (const PacketInfo& packet : packets) { | 250 for (const PacketFeedback& packet : packets) { |
247 if (packet.sequence_number <= kReceiveSideDropAfter) { | 251 if (packet.sequence_number <= kReceiveSideDropAfter) { |
248 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 252 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
249 packet.arrival_time_ms * 1000)); | 253 packet.arrival_time_ms * 1000)); |
250 } | 254 } |
251 } | 255 } |
252 | 256 |
253 feedback.Build(); | 257 feedback.Build(); |
254 | 258 |
255 std::vector<PacketInfo> expected_packets( | 259 std::vector<PacketFeedback> expected_packets( |
256 packets.begin(), packets.begin() + kReceiveSideDropAfter + 1); | 260 packets.begin(), packets.begin() + kReceiveSideDropAfter + 1); |
257 // Packets that have timed out on the send-side have lost the | 261 // Packets that have timed out on the send-side have lost the |
258 // information stored on the send-side. | 262 // information stored on the send-side. |
259 for (size_t i = 0; i < kSendSideDropBefore; ++i) { | 263 for (size_t i = 0; i < kSendSideDropBefore; ++i) { |
260 expected_packets[i].send_time_ms = -1; | 264 expected_packets[i].send_time_ms = -1; |
261 expected_packets[i].payload_size = 0; | 265 expected_packets[i].payload_size = 0; |
262 expected_packets[i].pacing_info = PacedPacketInfo(); | 266 expected_packets[i].pacing_info = PacedPacketInfo(); |
263 } | 267 } |
264 | 268 |
265 adapter_->OnTransportFeedback(feedback); | 269 adapter_->OnTransportFeedback(feedback); |
266 ComparePacketVectors(expected_packets, | 270 ComparePacketVectors(expected_packets, |
267 adapter_->GetTransportFeedbackVector()); | 271 adapter_->GetTransportFeedbackVector()); |
268 } | 272 } |
269 | 273 |
270 TEST_F(TransportFeedbackAdapterTest, SendTimeWrapsBothWays) { | 274 TEST_F(TransportFeedbackAdapterTest, SendTimeWrapsBothWays) { |
271 int64_t kHighArrivalTimeMs = rtcp::TransportFeedback::kDeltaScaleFactor * | 275 int64_t kHighArrivalTimeMs = rtcp::TransportFeedback::kDeltaScaleFactor * |
272 static_cast<int64_t>(1 << 8) * | 276 static_cast<int64_t>(1 << 8) * |
273 static_cast<int64_t>((1 << 23) - 1) / 1000; | 277 static_cast<int64_t>((1 << 23) - 1) / 1000; |
274 std::vector<PacketInfo> packets; | 278 std::vector<PacketFeedback> packets; |
275 packets.push_back( | 279 packets.push_back( |
276 PacketInfo(kHighArrivalTimeMs - 64, 200, 0, 1500, PacedPacketInfo())); | 280 PacketFeedback(kHighArrivalTimeMs - 64, 200, 0, 1500, PacedPacketInfo())); |
277 packets.push_back( | 281 packets.push_back( |
278 PacketInfo(kHighArrivalTimeMs + 64, 210, 1, 1500, PacedPacketInfo())); | 282 PacketFeedback(kHighArrivalTimeMs + 64, 210, 1, 1500, PacedPacketInfo())); |
279 packets.push_back( | 283 packets.push_back( |
280 PacketInfo(kHighArrivalTimeMs, 220, 2, 1500, PacedPacketInfo())); | 284 PacketFeedback(kHighArrivalTimeMs, 220, 2, 1500, PacedPacketInfo())); |
281 | 285 |
282 for (const PacketInfo& packet : packets) | 286 for (const PacketFeedback& packet : packets) |
283 OnSentPacket(packet); | 287 OnSentPacket(packet); |
284 | 288 |
285 for (size_t i = 0; i < packets.size(); ++i) { | 289 for (size_t i = 0; i < packets.size(); ++i) { |
286 std::unique_ptr<rtcp::TransportFeedback> feedback( | 290 std::unique_ptr<rtcp::TransportFeedback> feedback( |
287 new rtcp::TransportFeedback()); | 291 new rtcp::TransportFeedback()); |
288 feedback->SetBase(packets[i].sequence_number, | 292 feedback->SetBase(packets[i].sequence_number, |
289 packets[i].arrival_time_ms * 1000); | 293 packets[i].arrival_time_ms * 1000); |
290 | 294 |
291 EXPECT_TRUE(feedback->AddReceivedPacket(packets[i].sequence_number, | 295 EXPECT_TRUE(feedback->AddReceivedPacket(packets[i].sequence_number, |
292 packets[i].arrival_time_ms * 1000)); | 296 packets[i].arrival_time_ms * 1000)); |
293 | 297 |
294 rtc::Buffer raw_packet = feedback->Build(); | 298 rtc::Buffer raw_packet = feedback->Build(); |
295 feedback = rtcp::TransportFeedback::ParseFrom(raw_packet.data(), | 299 feedback = rtcp::TransportFeedback::ParseFrom(raw_packet.data(), |
296 raw_packet.size()); | 300 raw_packet.size()); |
297 | 301 |
298 std::vector<PacketInfo> expected_packets; | 302 std::vector<PacketFeedback> expected_packets; |
299 expected_packets.push_back(packets[i]); | 303 expected_packets.push_back(packets[i]); |
300 | 304 |
301 adapter_->OnTransportFeedback(*feedback.get()); | 305 adapter_->OnTransportFeedback(*feedback.get()); |
302 ComparePacketVectors(expected_packets, | 306 ComparePacketVectors(expected_packets, |
303 adapter_->GetTransportFeedbackVector()); | 307 adapter_->GetTransportFeedbackVector()); |
304 } | 308 } |
305 } | 309 } |
306 | 310 |
307 TEST_F(TransportFeedbackAdapterTest, HandlesReordering) { | 311 TEST_F(TransportFeedbackAdapterTest, HandlesReordering) { |
308 std::vector<PacketInfo> packets; | 312 std::vector<PacketFeedback> packets; |
309 packets.push_back(PacketInfo(120, 200, 0, 1500, kPacingInfo0)); | 313 packets.push_back(PacketFeedback(120, 200, 0, 1500, kPacingInfo0)); |
310 packets.push_back(PacketInfo(110, 210, 1, 1500, kPacingInfo0)); | 314 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0)); |
311 packets.push_back(PacketInfo(100, 220, 2, 1500, kPacingInfo0)); | 315 packets.push_back(PacketFeedback(100, 220, 2, 1500, kPacingInfo0)); |
312 std::vector<PacketInfo> expected_packets; | 316 std::vector<PacketFeedback> expected_packets; |
313 expected_packets.push_back(packets[2]); | 317 expected_packets.push_back(packets[2]); |
314 expected_packets.push_back(packets[1]); | 318 expected_packets.push_back(packets[1]); |
315 expected_packets.push_back(packets[0]); | 319 expected_packets.push_back(packets[0]); |
316 | 320 |
317 for (const PacketInfo& packet : packets) | 321 for (const PacketFeedback& packet : packets) |
318 OnSentPacket(packet); | 322 OnSentPacket(packet); |
319 | 323 |
320 rtcp::TransportFeedback feedback; | 324 rtcp::TransportFeedback feedback; |
321 feedback.SetBase(packets[0].sequence_number, | 325 feedback.SetBase(packets[0].sequence_number, |
322 packets[0].arrival_time_ms * 1000); | 326 packets[0].arrival_time_ms * 1000); |
323 | 327 |
324 for (const PacketInfo& packet : packets) { | 328 for (const PacketFeedback& packet : packets) { |
325 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 329 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
326 packet.arrival_time_ms * 1000)); | 330 packet.arrival_time_ms * 1000)); |
327 } | 331 } |
328 | 332 |
329 feedback.Build(); | 333 feedback.Build(); |
330 | 334 |
331 adapter_->OnTransportFeedback(feedback); | 335 adapter_->OnTransportFeedback(feedback); |
332 ComparePacketVectors(expected_packets, | 336 ComparePacketVectors(expected_packets, |
333 adapter_->GetTransportFeedbackVector()); | 337 adapter_->GetTransportFeedbackVector()); |
334 } | 338 } |
335 | 339 |
336 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { | 340 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { |
337 std::vector<PacketInfo> sent_packets; | 341 std::vector<PacketFeedback> sent_packets; |
338 const int64_t kSmallDeltaUs = | 342 const int64_t kSmallDeltaUs = |
339 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); | 343 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); |
340 const int64_t kLargePositiveDeltaUs = | 344 const int64_t kLargePositiveDeltaUs = |
341 rtcp::TransportFeedback::kDeltaScaleFactor * | 345 rtcp::TransportFeedback::kDeltaScaleFactor * |
342 std::numeric_limits<int16_t>::max(); | 346 std::numeric_limits<int16_t>::max(); |
343 const int64_t kLargeNegativeDeltaUs = | 347 const int64_t kLargeNegativeDeltaUs = |
344 rtcp::TransportFeedback::kDeltaScaleFactor * | 348 rtcp::TransportFeedback::kDeltaScaleFactor * |
345 std::numeric_limits<int16_t>::min(); | 349 std::numeric_limits<int16_t>::min(); |
346 | 350 |
347 PacketInfo info(100, 200, 0, 1500, true, PacedPacketInfo()); | 351 PacketFeedback packet_feedback(100, 200, 0, 1500, true, PacedPacketInfo()); |
348 sent_packets.push_back(info); | 352 sent_packets.push_back(packet_feedback); |
349 | 353 |
350 info.send_time_ms += kSmallDeltaUs / 1000; | 354 packet_feedback.send_time_ms += kSmallDeltaUs / 1000; |
351 info.arrival_time_ms += kSmallDeltaUs / 1000; | 355 packet_feedback.arrival_time_ms += kSmallDeltaUs / 1000; |
352 ++info.sequence_number; | 356 ++packet_feedback.sequence_number; |
353 sent_packets.push_back(info); | 357 sent_packets.push_back(packet_feedback); |
354 | 358 |
355 info.send_time_ms += kLargePositiveDeltaUs / 1000; | 359 packet_feedback.send_time_ms += kLargePositiveDeltaUs / 1000; |
356 info.arrival_time_ms += kLargePositiveDeltaUs / 1000; | 360 packet_feedback.arrival_time_ms += kLargePositiveDeltaUs / 1000; |
357 ++info.sequence_number; | 361 ++packet_feedback.sequence_number; |
358 sent_packets.push_back(info); | 362 sent_packets.push_back(packet_feedback); |
359 | 363 |
360 info.send_time_ms += kLargeNegativeDeltaUs / 1000; | 364 packet_feedback.send_time_ms += kLargeNegativeDeltaUs / 1000; |
361 info.arrival_time_ms += kLargeNegativeDeltaUs / 1000; | 365 packet_feedback.arrival_time_ms += kLargeNegativeDeltaUs / 1000; |
362 ++info.sequence_number; | 366 ++packet_feedback.sequence_number; |
363 sent_packets.push_back(info); | 367 sent_packets.push_back(packet_feedback); |
364 | 368 |
365 // Too large, delta - will need two feedback messages. | 369 // Too large, delta - will need two feedback messages. |
366 info.send_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; | 370 packet_feedback.send_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; |
367 info.arrival_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; | 371 packet_feedback.arrival_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; |
368 ++info.sequence_number; | 372 ++packet_feedback.sequence_number; |
369 | 373 |
370 // Packets will be added to send history. | 374 // Packets will be added to send history. |
371 for (const PacketInfo& packet : sent_packets) | 375 for (const PacketFeedback& packet : sent_packets) |
372 OnSentPacket(packet); | 376 OnSentPacket(packet); |
373 OnSentPacket(info); | 377 OnSentPacket(packet_feedback); |
374 | 378 |
375 // Create expected feedback and send into adapter. | 379 // Create expected feedback and send into adapter. |
376 std::unique_ptr<rtcp::TransportFeedback> feedback( | 380 std::unique_ptr<rtcp::TransportFeedback> feedback( |
377 new rtcp::TransportFeedback()); | 381 new rtcp::TransportFeedback()); |
378 feedback->SetBase(sent_packets[0].sequence_number, | 382 feedback->SetBase(sent_packets[0].sequence_number, |
379 sent_packets[0].arrival_time_ms * 1000); | 383 sent_packets[0].arrival_time_ms * 1000); |
380 | 384 |
381 for (const PacketInfo& packet : sent_packets) { | 385 for (const PacketFeedback& packet : sent_packets) { |
382 EXPECT_TRUE(feedback->AddReceivedPacket(packet.sequence_number, | 386 EXPECT_TRUE(feedback->AddReceivedPacket(packet.sequence_number, |
383 packet.arrival_time_ms * 1000)); | 387 packet.arrival_time_ms * 1000)); |
384 } | 388 } |
385 EXPECT_FALSE(feedback->AddReceivedPacket(info.sequence_number, | 389 EXPECT_FALSE(feedback->AddReceivedPacket( |
386 info.arrival_time_ms * 1000)); | 390 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); |
387 | 391 |
388 rtc::Buffer raw_packet = feedback->Build(); | 392 rtc::Buffer raw_packet = feedback->Build(); |
389 feedback = | 393 feedback = |
390 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); | 394 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); |
391 | 395 |
392 std::vector<PacketInfo> received_feedback; | 396 std::vector<PacketFeedback> received_feedback; |
393 | 397 |
394 EXPECT_TRUE(feedback.get() != nullptr); | 398 EXPECT_TRUE(feedback.get() != nullptr); |
395 adapter_->OnTransportFeedback(*feedback.get()); | 399 adapter_->OnTransportFeedback(*feedback.get()); |
396 { | 400 { |
397 // Expected to be ordered on arrival time when the feedback message has been | 401 // Expected to be ordered on arrival time when the feedback message has been |
398 // parsed. | 402 // parsed. |
399 std::vector<PacketInfo> expected_packets; | 403 std::vector<PacketFeedback> expected_packets; |
400 expected_packets.push_back(sent_packets[0]); | 404 expected_packets.push_back(sent_packets[0]); |
401 expected_packets.push_back(sent_packets[3]); | 405 expected_packets.push_back(sent_packets[3]); |
402 expected_packets.push_back(sent_packets[1]); | 406 expected_packets.push_back(sent_packets[1]); |
403 expected_packets.push_back(sent_packets[2]); | 407 expected_packets.push_back(sent_packets[2]); |
404 ComparePacketVectors(expected_packets, | 408 ComparePacketVectors(expected_packets, |
405 adapter_->GetTransportFeedbackVector()); | 409 adapter_->GetTransportFeedbackVector()); |
406 } | 410 } |
407 | 411 |
408 // Create a new feedback message and add the trailing item. | 412 // Create a new feedback message and add the trailing item. |
409 feedback.reset(new rtcp::TransportFeedback()); | 413 feedback.reset(new rtcp::TransportFeedback()); |
410 feedback->SetBase(info.sequence_number, info.arrival_time_ms * 1000); | 414 feedback->SetBase(packet_feedback.sequence_number, |
411 EXPECT_TRUE(feedback->AddReceivedPacket(info.sequence_number, | 415 packet_feedback.arrival_time_ms * 1000); |
412 info.arrival_time_ms * 1000)); | 416 EXPECT_TRUE(feedback->AddReceivedPacket( |
| 417 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); |
413 raw_packet = feedback->Build(); | 418 raw_packet = feedback->Build(); |
414 feedback = | 419 feedback = |
415 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); | 420 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); |
416 | 421 |
417 EXPECT_TRUE(feedback.get() != nullptr); | 422 EXPECT_TRUE(feedback.get() != nullptr); |
418 adapter_->OnTransportFeedback(*feedback.get()); | 423 adapter_->OnTransportFeedback(*feedback.get()); |
419 { | 424 { |
420 std::vector<PacketInfo> expected_packets; | 425 std::vector<PacketFeedback> expected_packets; |
421 expected_packets.push_back(info); | 426 expected_packets.push_back(packet_feedback); |
422 ComparePacketVectors(expected_packets, | 427 ComparePacketVectors(expected_packets, |
423 adapter_->GetTransportFeedbackVector()); | 428 adapter_->GetTransportFeedbackVector()); |
424 } | 429 } |
425 } | 430 } |
426 | 431 |
427 TEST_F(TransportFeedbackAdapterTest, UpdatesDelayBasedEstimate) { | 432 TEST_F(TransportFeedbackAdapterTest, UpdatesDelayBasedEstimate) { |
428 uint16_t seq_num = 0; | 433 uint16_t seq_num = 0; |
429 size_t kPayloadSize = 1000; | 434 size_t kPayloadSize = 1000; |
430 // The test must run and insert packets/feedback long enough that the | 435 // The test must run and insert packets/feedback long enough that the |
431 // BWE computes a valid estimate. | 436 // BWE computes a valid estimate. |
432 const int64_t kRunTimeMs = 6000; | 437 const int64_t kRunTimeMs = 6000; |
433 int64_t start_time_ms = clock_.TimeInMilliseconds(); | 438 int64_t start_time_ms = clock_.TimeInMilliseconds(); |
434 while (clock_.TimeInMilliseconds() - start_time_ms < kRunTimeMs) { | 439 while (clock_.TimeInMilliseconds() - start_time_ms < kRunTimeMs) { |
435 PacketInfo packet(clock_.TimeInMilliseconds(), clock_.TimeInMilliseconds(), | 440 PacketFeedback packet(clock_.TimeInMilliseconds(), |
436 seq_num, kPayloadSize, PacedPacketInfo()); | 441 clock_.TimeInMilliseconds(), seq_num, kPayloadSize, |
| 442 PacedPacketInfo()); |
437 OnSentPacket(packet); | 443 OnSentPacket(packet); |
438 // Create expected feedback and send into adapter. | 444 // Create expected feedback and send into adapter. |
439 std::unique_ptr<rtcp::TransportFeedback> feedback( | 445 std::unique_ptr<rtcp::TransportFeedback> feedback( |
440 new rtcp::TransportFeedback()); | 446 new rtcp::TransportFeedback()); |
441 feedback->SetBase(packet.sequence_number, packet.arrival_time_ms * 1000); | 447 feedback->SetBase(packet.sequence_number, packet.arrival_time_ms * 1000); |
442 EXPECT_TRUE(feedback->AddReceivedPacket(packet.sequence_number, | 448 EXPECT_TRUE(feedback->AddReceivedPacket(packet.sequence_number, |
443 packet.arrival_time_ms * 1000)); | 449 packet.arrival_time_ms * 1000)); |
444 rtc::Buffer raw_packet = feedback->Build(); | 450 rtc::Buffer raw_packet = feedback->Build(); |
445 feedback = rtcp::TransportFeedback::ParseFrom(raw_packet.data(), | 451 feedback = rtcp::TransportFeedback::ParseFrom(raw_packet.data(), |
446 raw_packet.size()); | 452 raw_packet.size()); |
447 EXPECT_TRUE(feedback.get() != nullptr); | 453 EXPECT_TRUE(feedback.get() != nullptr); |
448 adapter_->OnTransportFeedback(*feedback.get()); | 454 adapter_->OnTransportFeedback(*feedback.get()); |
449 clock_.AdvanceTimeMilliseconds(50); | 455 clock_.AdvanceTimeMilliseconds(50); |
450 ++seq_num; | 456 ++seq_num; |
451 } | 457 } |
452 EXPECT_GT(target_bitrate_bps_, 0u); | 458 EXPECT_GT(target_bitrate_bps_, 0u); |
453 } | 459 } |
454 | 460 |
455 } // namespace test | 461 } // namespace test |
456 } // namespace webrtc | 462 } // namespace webrtc |
OLD | NEW |