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