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

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: SortPacketFeedbackVector moved out of class. 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/modules/congestion_controller/transport_feedback_adapter.cc ('k') | webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698