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 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) | 216 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
217 .Times(1) | 217 .Times(1) |
218 .WillOnce(Invoke([expected_packets, this]( | 218 .WillOnce(Invoke([expected_packets, this]( |
219 const std::vector<PacketInfo>& feedback_vector) { | 219 const std::vector<PacketInfo>& feedback_vector) { |
220 ComparePacketVectors(expected_packets, feedback_vector); | 220 ComparePacketVectors(expected_packets, feedback_vector); |
221 })); | 221 })); |
222 adapter_->OnTransportFeedback(*feedback.get()); | 222 adapter_->OnTransportFeedback(*feedback.get()); |
223 } | 223 } |
224 } | 224 } |
225 | 225 |
| 226 TEST_F(TransportFeedbackAdapterTest, HandlesReordering) { |
| 227 std::vector<PacketInfo> packets; |
| 228 packets.push_back(PacketInfo(120, 200, 0, 1500, true)); |
| 229 packets.push_back(PacketInfo(110, 210, 1, 1500, true)); |
| 230 packets.push_back(PacketInfo(100, 220, 2, 1500, true)); |
| 231 std::vector<PacketInfo> expected_packets; |
| 232 expected_packets.push_back(packets[2]); |
| 233 expected_packets.push_back(packets[1]); |
| 234 expected_packets.push_back(packets[0]); |
| 235 |
| 236 for (const PacketInfo& packet : packets) |
| 237 OnSentPacket(packet); |
| 238 |
| 239 rtcp::TransportFeedback feedback; |
| 240 feedback.WithBase(packets[0].sequence_number, |
| 241 packets[0].arrival_time_ms * 1000); |
| 242 |
| 243 for (const PacketInfo& packet : packets) { |
| 244 EXPECT_TRUE(feedback.WithReceivedPacket(packet.sequence_number, |
| 245 packet.arrival_time_ms * 1000)); |
| 246 } |
| 247 |
| 248 feedback.Build(); |
| 249 |
| 250 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
| 251 .Times(1) |
| 252 .WillOnce(Invoke([expected_packets, |
| 253 this](const std::vector<PacketInfo>& feedback_vector) { |
| 254 ComparePacketVectors(expected_packets, feedback_vector); |
| 255 })); |
| 256 adapter_->OnTransportFeedback(feedback); |
| 257 } |
| 258 |
226 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { | 259 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { |
227 std::vector<PacketInfo> sent_packets; | 260 std::vector<PacketInfo> sent_packets; |
228 const int64_t kSmallDeltaUs = | 261 const int64_t kSmallDeltaUs = |
229 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); | 262 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); |
230 const int64_t kLargePositiveDeltaUs = | 263 const int64_t kLargePositiveDeltaUs = |
231 rtcp::TransportFeedback::kDeltaScaleFactor * | 264 rtcp::TransportFeedback::kDeltaScaleFactor * |
232 std::numeric_limits<int16_t>::max(); | 265 std::numeric_limits<int16_t>::max(); |
233 const int64_t kLargeNegativeDeltaUs = | 266 const int64_t kLargeNegativeDeltaUs = |
234 rtcp::TransportFeedback::kDeltaScaleFactor * | 267 rtcp::TransportFeedback::kDeltaScaleFactor * |
235 std::numeric_limits<int16_t>::min(); | 268 std::numeric_limits<int16_t>::min(); |
(...skipping 14 matching lines...) Expand all Loading... |
250 info.send_time_ms += kLargeNegativeDeltaUs / 1000; | 283 info.send_time_ms += kLargeNegativeDeltaUs / 1000; |
251 info.arrival_time_ms += kLargeNegativeDeltaUs / 1000; | 284 info.arrival_time_ms += kLargeNegativeDeltaUs / 1000; |
252 ++info.sequence_number; | 285 ++info.sequence_number; |
253 sent_packets.push_back(info); | 286 sent_packets.push_back(info); |
254 | 287 |
255 // Too large, delta - will need two feedback messages. | 288 // Too large, delta - will need two feedback messages. |
256 info.send_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; | 289 info.send_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; |
257 info.arrival_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; | 290 info.arrival_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; |
258 ++info.sequence_number; | 291 ++info.sequence_number; |
259 | 292 |
| 293 // Expected to be ordered on arrival time when the feedback message has been |
| 294 // parsed. |
| 295 std::vector<PacketInfo> expected_packets; |
| 296 expected_packets.push_back(sent_packets[0]); |
| 297 expected_packets.push_back(sent_packets[3]); |
| 298 expected_packets.push_back(sent_packets[1]); |
| 299 expected_packets.push_back(sent_packets[2]); |
| 300 |
260 // Packets will be added to send history. | 301 // Packets will be added to send history. |
261 for (const PacketInfo& packet : sent_packets) | 302 for (const PacketInfo& packet : sent_packets) |
262 OnSentPacket(packet); | 303 OnSentPacket(packet); |
263 OnSentPacket(info); | 304 OnSentPacket(info); |
264 | 305 |
265 // Create expected feedback and send into adapter. | 306 // Create expected feedback and send into adapter. |
266 std::unique_ptr<rtcp::TransportFeedback> feedback( | 307 std::unique_ptr<rtcp::TransportFeedback> feedback( |
267 new rtcp::TransportFeedback()); | 308 new rtcp::TransportFeedback()); |
268 feedback->WithBase(sent_packets[0].sequence_number, | 309 feedback->WithBase(sent_packets[0].sequence_number, |
269 sent_packets[0].arrival_time_ms * 1000); | 310 sent_packets[0].arrival_time_ms * 1000); |
270 | 311 |
271 for (const PacketInfo& packet : sent_packets) { | 312 for (const PacketInfo& packet : sent_packets) { |
272 EXPECT_TRUE(feedback->WithReceivedPacket(packet.sequence_number, | 313 EXPECT_TRUE(feedback->WithReceivedPacket(packet.sequence_number, |
273 packet.arrival_time_ms * 1000)); | 314 packet.arrival_time_ms * 1000)); |
274 } | 315 } |
275 EXPECT_FALSE(feedback->WithReceivedPacket(info.sequence_number, | 316 EXPECT_FALSE(feedback->WithReceivedPacket(info.sequence_number, |
276 info.arrival_time_ms * 1000)); | 317 info.arrival_time_ms * 1000)); |
277 | 318 |
278 rtc::Buffer raw_packet = feedback->Build(); | 319 rtc::Buffer raw_packet = feedback->Build(); |
279 feedback = rtc::ScopedToUnique( | 320 feedback = rtc::ScopedToUnique( |
280 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size())); | 321 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size())); |
281 | 322 |
282 std::vector<PacketInfo> received_feedback; | 323 std::vector<PacketInfo> received_feedback; |
283 | 324 |
284 EXPECT_TRUE(feedback.get() != nullptr); | 325 EXPECT_TRUE(feedback.get() != nullptr); |
285 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) | 326 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
286 .Times(1) | 327 .Times(1) |
287 .WillOnce(Invoke([sent_packets, &received_feedback]( | 328 .WillOnce(Invoke([expected_packets, &received_feedback]( |
288 const std::vector<PacketInfo>& feedback_vector) { | 329 const std::vector<PacketInfo>& feedback_vector) { |
289 EXPECT_EQ(sent_packets.size(), feedback_vector.size()); | 330 EXPECT_EQ(expected_packets.size(), feedback_vector.size()); |
290 received_feedback = feedback_vector; | 331 received_feedback = feedback_vector; |
291 })); | 332 })); |
292 adapter_->OnTransportFeedback(*feedback.get()); | 333 adapter_->OnTransportFeedback(*feedback.get()); |
293 | 334 |
294 // Create a new feedback message and add the trailing item. | 335 // Create a new feedback message and add the trailing item. |
295 feedback.reset(new rtcp::TransportFeedback()); | 336 feedback.reset(new rtcp::TransportFeedback()); |
296 feedback->WithBase(info.sequence_number, info.arrival_time_ms * 1000); | 337 feedback->WithBase(info.sequence_number, info.arrival_time_ms * 1000); |
297 EXPECT_TRUE(feedback->WithReceivedPacket(info.sequence_number, | 338 EXPECT_TRUE(feedback->WithReceivedPacket(info.sequence_number, |
298 info.arrival_time_ms * 1000)); | 339 info.arrival_time_ms * 1000)); |
299 raw_packet = feedback->Build(); | 340 raw_packet = feedback->Build(); |
300 feedback = rtc::ScopedToUnique( | 341 feedback = rtc::ScopedToUnique( |
301 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size())); | 342 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size())); |
302 | 343 |
303 EXPECT_TRUE(feedback.get() != nullptr); | 344 EXPECT_TRUE(feedback.get() != nullptr); |
304 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) | 345 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) |
305 .Times(1) | 346 .Times(1) |
306 .WillOnce(Invoke( | 347 .WillOnce(Invoke( |
307 [&received_feedback](const std::vector<PacketInfo>& feedback_vector) { | 348 [&received_feedback](const std::vector<PacketInfo>& feedback_vector) { |
308 EXPECT_EQ(1u, feedback_vector.size()); | 349 EXPECT_EQ(1u, feedback_vector.size()); |
309 received_feedback.push_back(feedback_vector[0]); | 350 received_feedback.push_back(feedback_vector[0]); |
310 })); | 351 })); |
311 adapter_->OnTransportFeedback(*feedback.get()); | 352 adapter_->OnTransportFeedback(*feedback.get()); |
312 | 353 |
313 sent_packets.push_back(info); | 354 expected_packets.push_back(info); |
314 | 355 |
315 ComparePacketVectors(sent_packets, received_feedback); | 356 ComparePacketVectors(expected_packets, received_feedback); |
316 } | 357 } |
317 | 358 |
318 } // namespace test | 359 } // namespace test |
319 } // namespace webrtc | 360 } // namespace webrtc |
OLD | NEW |