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

Side by Side Diff: webrtc/modules/rtp_rtcp/source/flexfec_receiver_unittest.cc

Issue 2895083002: Add FlexfecReceiver unit test for infinite recovery loop. (Closed)
Patch Set: nisse comments 1. Created 3 years, 7 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 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 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 auto fec_it = fec_packets.begin(); 294 auto fec_it = fec_packets.begin();
295 std::unique_ptr<Packet> packet_with_rtp_header = 295 std::unique_ptr<Packet> packet_with_rtp_header =
296 packet_generator_.BuildFlexfecPacket(**fec_it); 296 packet_generator_.BuildFlexfecPacket(**fec_it);
297 media_it++; 297 media_it++;
298 EXPECT_CALL(recovered_packet_receiver_, 298 EXPECT_CALL(recovered_packet_receiver_,
299 OnRecoveredPacket(_, (*media_it)->length)) 299 OnRecoveredPacket(_, (*media_it)->length))
300 .With( 300 .With(
301 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))); 301 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)));
302 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); 302 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
303 303
304 // Receive FEC packet again. 304 // Receive the FEC packet again, but do not call back.
305 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); 305 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
306 306
307 // Do not call back again. 307 // Receive the first media packet again, but do not call back.
308 media_it = media_packets.begin();
309 receiver_.OnRtpPacket(ParsePacket(**media_it));
310
311 // Receive the second media packet again (the one recovered above),
312 // but do not call back again.
313 media_it++;
danilchap 2017/05/23 13:07:15 nit: ++media_it;
brandtr 2017/05/23 13:19:17 The style of this file is the other way :/
314 receiver_.OnRtpPacket(ParsePacket(**media_it));
308 } 315 }
309 316
310 // Here we are implicitly assuming packet masks that are suitable for 317 // Here we are implicitly assuming packet masks that are suitable for
311 // this type of 50% correlated loss. If we are changing our precomputed 318 // this type of 50% correlated loss. If we are changing our precomputed
312 // packet masks, this test might need to be updated. 319 // packet masks, this test might need to be updated.
313 TEST_F(FlexfecReceiverTest, RecoversFrom50PercentLoss) { 320 TEST_F(FlexfecReceiverTest, RecoversFrom50PercentLoss) {
314 const size_t kNumFecPackets = 5; 321 const size_t kNumFecPackets = 5;
315 const size_t kNumFrames = 2 * kNumFecPackets; 322 const size_t kNumFrames = 2 * kNumFecPackets;
316 const size_t kNumMediaPacketsPerFrame = 1; 323 const size_t kNumMediaPacketsPerFrame = 1;
317 324
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 // Add FEC packets. 464 // Add FEC packets.
458 auto fec_it = fec_packets.begin(); 465 auto fec_it = fec_packets.begin();
459 std::unique_ptr<Packet> packet_with_rtp_header; 466 std::unique_ptr<Packet> packet_with_rtp_header;
460 while (fec_it != fec_packets.end()) { 467 while (fec_it != fec_packets.end()) {
461 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it); 468 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it);
462 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); 469 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
463 ++fec_it; 470 ++fec_it;
464 } 471 }
465 } 472 }
466 473
474 // Recovered media packets may be fed back into the FlexfecReceiver by the
475 // callback. This test ensures the idempotency of such a situation.
476 TEST_F(FlexfecReceiverTest, RecoveryCallbackDoesNotLoopInfinitely) {
477 class LoopbackRecoveredPacketReceiver : public RecoveredPacketReceiver {
478 public:
479 const int kMaxRecursionDepth = 10;
480
481 LoopbackRecoveredPacketReceiver()
482 : receiver_(nullptr),
483 did_receive_call_back_(false),
484 recursion_depth_(0),
485 deep_recursion_(false) {}
486
487 void SetReceiver(FlexfecReceiver* receiver) { receiver_ = receiver; }
488 bool DidReceiveCallback() const { return did_receive_call_back_; }
489 bool DeepRecursion() const { return deep_recursion_; }
490
491 // Implements RecoveredPacketReceiver.
492 void OnRecoveredPacket(const uint8_t* packet, size_t length) {
493 RtpPacketReceived parsed_packet;
494 EXPECT_TRUE(parsed_packet.Parse(packet, length));
495
496 did_receive_call_back_ = true;
497
498 if (recursion_depth_ > kMaxRecursionDepth) {
danilchap 2017/05/23 13:07:14 alternative approach: ASSERT_LT(recursion_depth_,
brandtr 2017/05/23 13:19:17 Good idea! Done.
nisse-webrtc 2017/05/23 14:05:25 ASSERT_* does some magic which works as intended o
brandtr 2017/05/23 15:02:47 Better avoid confusion and use the old approach th
499 deep_recursion_ = true;
500 return;
501 }
502 ++recursion_depth_;
503 RTC_DCHECK(receiver_);
504 receiver_->OnRtpPacket(parsed_packet);
505 --recursion_depth_;
506 }
507
508 private:
509 FlexfecReceiver* receiver_;
510 bool did_receive_call_back_;
511 int recursion_depth_;
512 bool deep_recursion_;
513 } loopback_recovered_packet_receiver;
514
515 // Feed recovered packets back into |receiver|.
516 FlexfecReceiver receiver(kFlexfecSsrc, kMediaSsrc,
517 &loopback_recovered_packet_receiver);
518 loopback_recovered_packet_receiver.SetReceiver(&receiver);
519
520 const size_t kNumMediaPackets = 2;
521 const size_t kNumFecPackets = 1;
522
523 PacketList media_packets;
524 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
525 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
526
527 // Receive first media packet but drop second.
528 auto media_it = media_packets.begin();
529 receiver.OnRtpPacket(ParsePacket(**media_it));
530
531 // Receive FEC packet and verify that a packet was recovered.
532 auto fec_it = fec_packets.begin();
533 std::unique_ptr<Packet> packet_with_rtp_header =
534 packet_generator_.BuildFlexfecPacket(**fec_it);
535 receiver.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
536 EXPECT_TRUE(loopback_recovered_packet_receiver.DidReceiveCallback());
537 EXPECT_FALSE(loopback_recovered_packet_receiver.DeepRecursion());
538 }
539
467 TEST_F(FlexfecReceiverTest, CalculatesNumberOfPackets) { 540 TEST_F(FlexfecReceiverTest, CalculatesNumberOfPackets) {
468 const size_t kNumMediaPackets = 2; 541 const size_t kNumMediaPackets = 2;
469 const size_t kNumFecPackets = 1; 542 const size_t kNumFecPackets = 1;
470 543
471 PacketList media_packets; 544 PacketList media_packets;
472 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 545 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
473 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 546 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
474 547
475 // Receive first media packet but drop second. 548 // Receive first media packet but drop second.
476 auto media_it = media_packets.begin(); 549 auto media_it = media_packets.begin();
(...skipping 11 matching lines...) Expand all
488 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); 561 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
489 562
490 // Check stats calculations. 563 // Check stats calculations.
491 FecPacketCounter packet_counter = receiver_.GetPacketCounter(); 564 FecPacketCounter packet_counter = receiver_.GetPacketCounter();
492 EXPECT_EQ(2U, packet_counter.num_packets); 565 EXPECT_EQ(2U, packet_counter.num_packets);
493 EXPECT_EQ(1U, packet_counter.num_fec_packets); 566 EXPECT_EQ(1U, packet_counter.num_fec_packets);
494 EXPECT_EQ(1U, packet_counter.num_recovered_packets); 567 EXPECT_EQ(1U, packet_counter.num_recovered_packets);
495 } 568 }
496 569
497 } // namespace webrtc 570 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698