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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 RTC_CHECK(truth[i].arrival_time_ms != PacketFeedback::kNotReceived); |
94 input[i].arrival_time_ms + arrival_time_delta); | 94 if (input[i].arrival_time_ms != PacketFeedback::kNotReceived) { |
| 95 EXPECT_EQ(truth[i].arrival_time_ms, |
| 96 input[i].arrival_time_ms + arrival_time_delta); |
| 97 } |
95 EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms); | 98 EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms); |
96 EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number); | 99 EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number); |
97 EXPECT_EQ(truth[i].payload_size, input[i].payload_size); | 100 EXPECT_EQ(truth[i].payload_size, input[i].payload_size); |
98 EXPECT_EQ(truth[i].pacing_info, input[i].pacing_info); | 101 EXPECT_EQ(truth[i].pacing_info, input[i].pacing_info); |
99 } | 102 } |
100 } | 103 } |
101 | 104 |
102 // Utility method, to reset arrival_time_ms before adding send time. | 105 // Utility method, to reset arrival_time_ms before adding send time. |
103 void OnSentPacket(PacketFeedback packet_feedback) { | 106 void OnSentPacket(PacketFeedback packet_feedback) { |
104 packet_feedback.arrival_time_ms = 0; | 107 packet_feedback.arrival_time_ms = 0; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 139 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
137 packet.arrival_time_ms * 1000)); | 140 packet.arrival_time_ms * 1000)); |
138 } | 141 } |
139 | 142 |
140 feedback.Build(); | 143 feedback.Build(); |
141 | 144 |
142 adapter_->OnTransportFeedback(feedback); | 145 adapter_->OnTransportFeedback(feedback); |
143 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); | 146 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); |
144 } | 147 } |
145 | 148 |
| 149 TEST_F(TransportFeedbackAdapterTest, FeedbackVectorReportsUnreceived) { |
| 150 std::vector<PacketFeedback> sent_packets = { |
| 151 PacketFeedback(100, 220, 0, 1500, kPacingInfo0), |
| 152 PacketFeedback(110, 210, 1, 1500, kPacingInfo0), |
| 153 PacketFeedback(120, 220, 2, 1500, kPacingInfo0), |
| 154 PacketFeedback(130, 230, 3, 1500, kPacingInfo0), |
| 155 PacketFeedback(140, 240, 4, 1500, kPacingInfo0), |
| 156 PacketFeedback(150, 250, 5, 1500, kPacingInfo0), |
| 157 PacketFeedback(160, 260, 6, 1500, kPacingInfo0) |
| 158 }; |
| 159 |
| 160 for (const PacketFeedback& packet : sent_packets) |
| 161 OnSentPacket(packet); |
| 162 |
| 163 // Note: Important to include the last packet, as only unreceived packets in |
| 164 // between received packets can be inferred. |
| 165 std::vector<PacketFeedback> received_packets = { |
| 166 sent_packets[0], sent_packets[2], sent_packets[6] |
| 167 }; |
| 168 |
| 169 rtcp::TransportFeedback feedback; |
| 170 feedback.SetBase(received_packets[0].sequence_number, |
| 171 received_packets[0].arrival_time_ms * 1000); |
| 172 |
| 173 for (const PacketFeedback& packet : received_packets) { |
| 174 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
| 175 packet.arrival_time_ms * 1000)); |
| 176 } |
| 177 |
| 178 feedback.Build(); |
| 179 |
| 180 adapter_->OnTransportFeedback(feedback); |
| 181 ComparePacketVectors(sent_packets, adapter_->GetTransportFeedbackVector()); |
| 182 } |
| 183 |
146 TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) { | 184 TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) { |
147 const int64_t kFeedbackTimeoutMs = 60001; | 185 const int64_t kFeedbackTimeoutMs = 60001; |
148 const int kMaxConsecutiveFailedLookups = 5; | 186 const int kMaxConsecutiveFailedLookups = 5; |
149 for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) { | 187 for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) { |
150 std::vector<PacketFeedback> packets; | 188 std::vector<PacketFeedback> packets; |
151 packets.push_back( | 189 packets.push_back( |
152 PacketFeedback(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0)); | 190 PacketFeedback(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0)); |
153 packets.push_back( | 191 packets.push_back( |
154 PacketFeedback(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0)); | 192 PacketFeedback(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0)); |
155 packets.push_back( | 193 packets.push_back( |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 | 339 |
302 std::vector<PacketFeedback> expected_packets; | 340 std::vector<PacketFeedback> expected_packets; |
303 expected_packets.push_back(packets[i]); | 341 expected_packets.push_back(packets[i]); |
304 | 342 |
305 adapter_->OnTransportFeedback(*feedback.get()); | 343 adapter_->OnTransportFeedback(*feedback.get()); |
306 ComparePacketVectors(expected_packets, | 344 ComparePacketVectors(expected_packets, |
307 adapter_->GetTransportFeedbackVector()); | 345 adapter_->GetTransportFeedbackVector()); |
308 } | 346 } |
309 } | 347 } |
310 | 348 |
311 TEST_F(TransportFeedbackAdapterTest, HandlesReordering) { | 349 TEST_F(TransportFeedbackAdapterTest, HandlesArrivalReordering) { |
312 std::vector<PacketFeedback> packets; | 350 std::vector<PacketFeedback> packets; |
313 packets.push_back(PacketFeedback(120, 200, 0, 1500, kPacingInfo0)); | 351 packets.push_back(PacketFeedback(120, 200, 0, 1500, kPacingInfo0)); |
314 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0)); | 352 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0)); |
315 packets.push_back(PacketFeedback(100, 220, 2, 1500, kPacingInfo0)); | 353 packets.push_back(PacketFeedback(100, 220, 2, 1500, kPacingInfo0)); |
316 std::vector<PacketFeedback> expected_packets; | |
317 expected_packets.push_back(packets[2]); | |
318 expected_packets.push_back(packets[1]); | |
319 expected_packets.push_back(packets[0]); | |
320 | 354 |
321 for (const PacketFeedback& packet : packets) | 355 for (const PacketFeedback& packet : packets) |
322 OnSentPacket(packet); | 356 OnSentPacket(packet); |
323 | 357 |
324 rtcp::TransportFeedback feedback; | 358 rtcp::TransportFeedback feedback; |
325 feedback.SetBase(packets[0].sequence_number, | 359 feedback.SetBase(packets[0].sequence_number, |
326 packets[0].arrival_time_ms * 1000); | 360 packets[0].arrival_time_ms * 1000); |
327 | 361 |
328 for (const PacketFeedback& packet : packets) { | 362 for (const PacketFeedback& packet : packets) { |
329 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 363 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
330 packet.arrival_time_ms * 1000)); | 364 packet.arrival_time_ms * 1000)); |
331 } | 365 } |
332 | 366 |
333 feedback.Build(); | 367 feedback.Build(); |
334 | 368 |
| 369 // Adapter keeps the packets ordered by sequence number (which is itself |
| 370 // assigned by the order of transmission). Reordering by some other criteria, |
| 371 // eg. arrival time, is up to the observers. |
335 adapter_->OnTransportFeedback(feedback); | 372 adapter_->OnTransportFeedback(feedback); |
336 ComparePacketVectors(expected_packets, | 373 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); |
337 adapter_->GetTransportFeedbackVector()); | |
338 } | 374 } |
339 | 375 |
340 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { | 376 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { |
341 std::vector<PacketFeedback> sent_packets; | 377 std::vector<PacketFeedback> sent_packets; |
342 const int64_t kSmallDeltaUs = | 378 const int64_t kSmallDeltaUs = |
343 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); | 379 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); |
344 const int64_t kLargePositiveDeltaUs = | 380 const int64_t kLargePositiveDeltaUs = |
345 rtcp::TransportFeedback::kDeltaScaleFactor * | 381 rtcp::TransportFeedback::kDeltaScaleFactor * |
346 std::numeric_limits<int16_t>::max(); | 382 std::numeric_limits<int16_t>::max(); |
347 const int64_t kLargeNegativeDeltaUs = | 383 const int64_t kLargeNegativeDeltaUs = |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); | 426 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); |
391 | 427 |
392 rtc::Buffer raw_packet = feedback->Build(); | 428 rtc::Buffer raw_packet = feedback->Build(); |
393 feedback = | 429 feedback = |
394 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); | 430 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); |
395 | 431 |
396 std::vector<PacketFeedback> received_feedback; | 432 std::vector<PacketFeedback> received_feedback; |
397 | 433 |
398 EXPECT_TRUE(feedback.get() != nullptr); | 434 EXPECT_TRUE(feedback.get() != nullptr); |
399 adapter_->OnTransportFeedback(*feedback.get()); | 435 adapter_->OnTransportFeedback(*feedback.get()); |
400 { | 436 ComparePacketVectors(sent_packets, adapter_->GetTransportFeedbackVector()); |
401 // Expected to be ordered on arrival time when the feedback message has been | |
402 // parsed. | |
403 std::vector<PacketFeedback> expected_packets; | |
404 expected_packets.push_back(sent_packets[0]); | |
405 expected_packets.push_back(sent_packets[3]); | |
406 expected_packets.push_back(sent_packets[1]); | |
407 expected_packets.push_back(sent_packets[2]); | |
408 ComparePacketVectors(expected_packets, | |
409 adapter_->GetTransportFeedbackVector()); | |
410 } | |
411 | 437 |
412 // Create a new feedback message and add the trailing item. | 438 // Create a new feedback message and add the trailing item. |
413 feedback.reset(new rtcp::TransportFeedback()); | 439 feedback.reset(new rtcp::TransportFeedback()); |
414 feedback->SetBase(packet_feedback.sequence_number, | 440 feedback->SetBase(packet_feedback.sequence_number, |
415 packet_feedback.arrival_time_ms * 1000); | 441 packet_feedback.arrival_time_ms * 1000); |
416 EXPECT_TRUE(feedback->AddReceivedPacket( | 442 EXPECT_TRUE(feedback->AddReceivedPacket( |
417 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); | 443 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); |
418 raw_packet = feedback->Build(); | 444 raw_packet = feedback->Build(); |
419 feedback = | 445 feedback = |
420 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); | 446 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 EXPECT_TRUE(feedback.get() != nullptr); | 479 EXPECT_TRUE(feedback.get() != nullptr); |
454 adapter_->OnTransportFeedback(*feedback.get()); | 480 adapter_->OnTransportFeedback(*feedback.get()); |
455 clock_.AdvanceTimeMilliseconds(50); | 481 clock_.AdvanceTimeMilliseconds(50); |
456 ++seq_num; | 482 ++seq_num; |
457 } | 483 } |
458 EXPECT_GT(target_bitrate_bps_, 0u); | 484 EXPECT_GT(target_bitrate_bps_, 0u); |
459 } | 485 } |
460 | 486 |
461 } // namespace test | 487 } // namespace test |
462 } // namespace webrtc | 488 } // namespace webrtc |
OLD | NEW |