Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(113)

Side by Side Diff: webrtc/modules/congestion_controller/transport_feedback_adapter_unittest.cc

Issue 2707383006: GetTransportFeedbackVector() includes unreceived packets, sorted by seq-num (Closed)
Patch Set: . Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698