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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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<PacketFeedback>& truth, | 79 void ComparePacketVectors(const std::vector<PacketFeedback>& truth, |
80 const std::vector<PacketFeedback>& input) { | 80 const std::vector<PacketFeedback>& input, |
81 bool allow_unreceived = false) { | |
81 ASSERT_EQ(truth.size(), input.size()); | 82 ASSERT_EQ(truth.size(), input.size()); |
82 size_t len = truth.size(); | 83 size_t len = truth.size(); |
83 // truth contains the input data for the test, and input is what will be | 84 // 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 | 85 // sent to the bandwidth estimator. truth.arrival_tims_ms is used to |
85 // populate the transport feedback messages. As these times may be changed | 86 // populate the transport feedback messages. As these times may be changed |
86 // (because of resolution limits in the packets, and because of the time | 87 // (because of resolution limits in the packets, and because of the time |
87 // base adjustment performed by the TransportFeedbackAdapter at the first | 88 // base adjustment performed by the TransportFeedbackAdapter at the first |
88 // packet, the truth[x].arrival_time and input[x].arrival_time may not be | 89 // 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. | 90 // equal. However, the difference must be the same for all x. |
90 int64_t arrival_time_delta = | 91 int64_t arrival_time_delta = |
91 truth[0].arrival_time_ms - input[0].arrival_time_ms; | 92 truth[0].arrival_time_ms - input[0].arrival_time_ms; |
92 for (size_t i = 0; i < len; ++i) { | 93 for (size_t i = 0; i < len; ++i) { |
93 EXPECT_EQ(truth[i].arrival_time_ms, | 94 RTC_CHECK(truth[i].arrival_time_ms != PacketFeedback::kLost); |
94 input[i].arrival_time_ms + arrival_time_delta); | 95 if (!allow_unreceived || |
stefan-webrtc
2017/02/28 14:51:12
Why can't we always allow unreceived? I would assu
elad.alon_webrtc.org
2017/02/28 15:20:18
I can remove this, it shouldn't interfere with any
| |
96 input[i].arrival_time_ms != PacketFeedback::kLost) { | |
97 EXPECT_EQ(truth[i].arrival_time_ms, | |
98 input[i].arrival_time_ms + arrival_time_delta); | |
99 } | |
95 EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms); | 100 EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms); |
96 EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number); | 101 EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number); |
97 EXPECT_EQ(truth[i].payload_size, input[i].payload_size); | 102 EXPECT_EQ(truth[i].payload_size, input[i].payload_size); |
98 EXPECT_EQ(truth[i].pacing_info, input[i].pacing_info); | 103 EXPECT_EQ(truth[i].pacing_info, input[i].pacing_info); |
99 } | 104 } |
100 } | 105 } |
101 | 106 |
102 // Utility method, to reset arrival_time_ms before adding send time. | 107 // Utility method, to reset arrival_time_ms before adding send time. |
103 void OnSentPacket(PacketFeedback packet_feedback) { | 108 void OnSentPacket(PacketFeedback packet_feedback) { |
104 packet_feedback.arrival_time_ms = 0; | 109 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, | 141 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
137 packet.arrival_time_ms * 1000)); | 142 packet.arrival_time_ms * 1000)); |
138 } | 143 } |
139 | 144 |
140 feedback.Build(); | 145 feedback.Build(); |
141 | 146 |
142 adapter_->OnTransportFeedback(feedback); | 147 adapter_->OnTransportFeedback(feedback); |
143 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); | 148 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); |
144 } | 149 } |
145 | 150 |
151 TEST_F(TransportFeedbackAdapterTest, FeedbackVectorReportsUnreceived) { | |
152 std::vector<PacketFeedback> sent_packets = { | |
153 PacketFeedback(100, 220, 0, 1500, kPacingInfo0), | |
154 PacketFeedback(110, 210, 1, 1500, kPacingInfo0), | |
155 PacketFeedback(120, 220, 2, 1500, kPacingInfo0), | |
156 PacketFeedback(130, 230, 3, 1500, kPacingInfo0), | |
157 PacketFeedback(140, 240, 4, 1500, kPacingInfo0), | |
158 PacketFeedback(150, 250, 5, 1500, kPacingInfo0), | |
159 PacketFeedback(160, 260, 6, 1500, kPacingInfo0) | |
160 }; | |
161 | |
162 for (const PacketFeedback& packet : sent_packets) | |
163 OnSentPacket(packet); | |
164 | |
165 // Note: Important to include the last packet, as only unreceived packets in | |
166 // between received packets can be inferred. | |
167 std::vector<PacketFeedback> received_packets = { | |
168 sent_packets[0], sent_packets[2], sent_packets[6] | |
169 }; | |
170 | |
171 rtcp::TransportFeedback feedback; | |
172 feedback.SetBase(received_packets[0].sequence_number, | |
173 received_packets[0].arrival_time_ms * 1000); | |
174 | |
175 for (const PacketFeedback& packet : received_packets) { | |
176 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | |
177 packet.arrival_time_ms * 1000)); | |
178 } | |
179 | |
180 feedback.Build(); | |
181 | |
182 adapter_->OnTransportFeedback(feedback); | |
183 ComparePacketVectors(sent_packets, | |
184 adapter_->GetTransportFeedbackVector(), | |
185 true); | |
186 } | |
187 | |
146 TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) { | 188 TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) { |
147 const int64_t kFeedbackTimeoutMs = 60001; | 189 const int64_t kFeedbackTimeoutMs = 60001; |
148 const int kMaxConsecutiveFailedLookups = 5; | 190 const int kMaxConsecutiveFailedLookups = 5; |
149 for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) { | 191 for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) { |
150 std::vector<PacketFeedback> packets; | 192 std::vector<PacketFeedback> packets; |
151 packets.push_back( | 193 packets.push_back( |
152 PacketFeedback(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0)); | 194 PacketFeedback(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0)); |
153 packets.push_back( | 195 packets.push_back( |
154 PacketFeedback(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0)); | 196 PacketFeedback(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0)); |
155 packets.push_back( | 197 packets.push_back( |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
301 | 343 |
302 std::vector<PacketFeedback> expected_packets; | 344 std::vector<PacketFeedback> expected_packets; |
303 expected_packets.push_back(packets[i]); | 345 expected_packets.push_back(packets[i]); |
304 | 346 |
305 adapter_->OnTransportFeedback(*feedback.get()); | 347 adapter_->OnTransportFeedback(*feedback.get()); |
306 ComparePacketVectors(expected_packets, | 348 ComparePacketVectors(expected_packets, |
307 adapter_->GetTransportFeedbackVector()); | 349 adapter_->GetTransportFeedbackVector()); |
308 } | 350 } |
309 } | 351 } |
310 | 352 |
311 TEST_F(TransportFeedbackAdapterTest, HandlesReordering) { | 353 TEST_F(TransportFeedbackAdapterTest, HandlesArrivalReordering) { |
312 std::vector<PacketFeedback> packets; | 354 std::vector<PacketFeedback> packets; |
313 packets.push_back(PacketFeedback(120, 200, 0, 1500, kPacingInfo0)); | 355 packets.push_back(PacketFeedback(120, 200, 0, 1500, kPacingInfo0)); |
314 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0)); | 356 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0)); |
315 packets.push_back(PacketFeedback(100, 220, 2, 1500, kPacingInfo0)); | 357 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 | 358 |
321 for (const PacketFeedback& packet : packets) | 359 for (const PacketFeedback& packet : packets) |
322 OnSentPacket(packet); | 360 OnSentPacket(packet); |
323 | 361 |
324 rtcp::TransportFeedback feedback; | 362 rtcp::TransportFeedback feedback; |
325 feedback.SetBase(packets[0].sequence_number, | 363 feedback.SetBase(packets[0].sequence_number, |
326 packets[0].arrival_time_ms * 1000); | 364 packets[0].arrival_time_ms * 1000); |
327 | 365 |
328 for (const PacketFeedback& packet : packets) { | 366 for (const PacketFeedback& packet : packets) { |
329 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, | 367 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, |
330 packet.arrival_time_ms * 1000)); | 368 packet.arrival_time_ms * 1000)); |
331 } | 369 } |
332 | 370 |
333 feedback.Build(); | 371 feedback.Build(); |
334 | 372 |
373 // Adapter keeps the packets ordered by sequence number (which is itself | |
374 // assigned by the order of transmission). Reordering by some other criteria, | |
375 // eg. arrival time, is up to the observers. | |
335 adapter_->OnTransportFeedback(feedback); | 376 adapter_->OnTransportFeedback(feedback); |
336 ComparePacketVectors(expected_packets, | 377 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); |
337 adapter_->GetTransportFeedbackVector()); | |
338 } | 378 } |
339 | 379 |
340 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { | 380 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { |
341 std::vector<PacketFeedback> sent_packets; | 381 std::vector<PacketFeedback> sent_packets; |
342 const int64_t kSmallDeltaUs = | 382 const int64_t kSmallDeltaUs = |
343 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); | 383 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); |
344 const int64_t kLargePositiveDeltaUs = | 384 const int64_t kLargePositiveDeltaUs = |
345 rtcp::TransportFeedback::kDeltaScaleFactor * | 385 rtcp::TransportFeedback::kDeltaScaleFactor * |
346 std::numeric_limits<int16_t>::max(); | 386 std::numeric_limits<int16_t>::max(); |
347 const int64_t kLargeNegativeDeltaUs = | 387 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)); | 430 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); |
391 | 431 |
392 rtc::Buffer raw_packet = feedback->Build(); | 432 rtc::Buffer raw_packet = feedback->Build(); |
393 feedback = | 433 feedback = |
394 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); | 434 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); |
395 | 435 |
396 std::vector<PacketFeedback> received_feedback; | 436 std::vector<PacketFeedback> received_feedback; |
397 | 437 |
398 EXPECT_TRUE(feedback.get() != nullptr); | 438 EXPECT_TRUE(feedback.get() != nullptr); |
399 adapter_->OnTransportFeedback(*feedback.get()); | 439 adapter_->OnTransportFeedback(*feedback.get()); |
400 { | 440 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 | 441 |
412 // Create a new feedback message and add the trailing item. | 442 // Create a new feedback message and add the trailing item. |
413 feedback.reset(new rtcp::TransportFeedback()); | 443 feedback.reset(new rtcp::TransportFeedback()); |
414 feedback->SetBase(packet_feedback.sequence_number, | 444 feedback->SetBase(packet_feedback.sequence_number, |
415 packet_feedback.arrival_time_ms * 1000); | 445 packet_feedback.arrival_time_ms * 1000); |
416 EXPECT_TRUE(feedback->AddReceivedPacket( | 446 EXPECT_TRUE(feedback->AddReceivedPacket( |
417 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); | 447 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); |
418 raw_packet = feedback->Build(); | 448 raw_packet = feedback->Build(); |
419 feedback = | 449 feedback = |
420 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); | 450 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); | 483 EXPECT_TRUE(feedback.get() != nullptr); |
454 adapter_->OnTransportFeedback(*feedback.get()); | 484 adapter_->OnTransportFeedback(*feedback.get()); |
455 clock_.AdvanceTimeMilliseconds(50); | 485 clock_.AdvanceTimeMilliseconds(50); |
456 ++seq_num; | 486 ++seq_num; |
457 } | 487 } |
458 EXPECT_GT(target_bitrate_bps_, 0u); | 488 EXPECT_GT(target_bitrate_bps_, 0u); |
459 } | 489 } |
460 | 490 |
461 } // namespace test | 491 } // namespace test |
462 } // namespace webrtc | 492 } // namespace webrtc |
OLD | NEW |