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

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: 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++;
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 packet 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 LoopbackRecoveredPacketReceiver()
480 : receiver_(nullptr), did_receive_call_back_(false) {}
481
482 void SetReceiver(FlexfecReceiver* receiver) { receiver_ = receiver; }
483
484 bool DidReceiveCallback() { return did_receive_call_back_; }
485
486 // Implements RecoveredPacketReceiver.
487 void OnRecoveredPacket(const uint8_t* packet, size_t length) {
nisse-webrtc 2017/05/22 10:39:05 Can you add the recursion counter here? Something
brandtr 2017/05/22 11:52:39 Yes, that makes a lot of sense! I forgot that I ha
488 RtpPacketReceived parsed_packet;
489 EXPECT_TRUE(parsed_packet.Parse(packet, length));
490 RTC_DCHECK(receiver_);
491 receiver_->OnRtpPacket(parsed_packet);
492 did_receive_call_back_ = true;
493 }
494
495 private:
496 FlexfecReceiver* receiver_;
497 bool did_receive_call_back_;
498 } loopback_recovered_packet_receiver;
499
500 // Feed recovered packets back into |receiver|.
501 FlexfecReceiver receiver(kFlexfecSsrc, kMediaSsrc,
502 &loopback_recovered_packet_receiver);
503 loopback_recovered_packet_receiver.SetReceiver(&receiver);
504
505 const size_t kNumMediaPackets = 2;
506 const size_t kNumFecPackets = 1;
507
508 PacketList media_packets;
509 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
510 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
511
512 // Receive first media packet but drop second.
513 auto media_it = media_packets.begin();
514 receiver.OnRtpPacket(ParsePacket(**media_it));
515
516 // Receive FEC packet and verify that a packet was recovered.
517 auto fec_it = fec_packets.begin();
518 std::unique_ptr<Packet> packet_with_rtp_header =
519 packet_generator_.BuildFlexfecPacket(**fec_it);
520 receiver.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
521 EXPECT_TRUE(loopback_recovered_packet_receiver.DidReceiveCallback());
522
523 // No extra callback, and thus no infinite loop.
nisse-webrtc 2017/05/22 08:39:20 If this test fails (by undoing the fix in the othe
brandtr 2017/05/22 09:10:09 Yes, I this test crashes by undoing your change.
danilchap 2017/05/22 09:17:28 did you try EXPECT_DEATH ? (not sure it would in t
danilchap 2017/05/22 09:18:22 nvm... it is for opposite case.
nisse-webrtc 2017/05/22 10:39:05 I agree it's worth doing only if it can be done by
524 }
525
467 TEST_F(FlexfecReceiverTest, CalculatesNumberOfPackets) { 526 TEST_F(FlexfecReceiverTest, CalculatesNumberOfPackets) {
468 const size_t kNumMediaPackets = 2; 527 const size_t kNumMediaPackets = 2;
469 const size_t kNumFecPackets = 1; 528 const size_t kNumFecPackets = 1;
470 529
471 PacketList media_packets; 530 PacketList media_packets;
472 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 531 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
473 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 532 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
474 533
475 // Receive first media packet but drop second. 534 // Receive first media packet but drop second.
476 auto media_it = media_packets.begin(); 535 auto media_it = media_packets.begin();
(...skipping 11 matching lines...) Expand all
488 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header)); 547 receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
489 548
490 // Check stats calculations. 549 // Check stats calculations.
491 FecPacketCounter packet_counter = receiver_.GetPacketCounter(); 550 FecPacketCounter packet_counter = receiver_.GetPacketCounter();
492 EXPECT_EQ(2U, packet_counter.num_packets); 551 EXPECT_EQ(2U, packet_counter.num_packets);
493 EXPECT_EQ(1U, packet_counter.num_fec_packets); 552 EXPECT_EQ(1U, packet_counter.num_fec_packets);
494 EXPECT_EQ(1U, packet_counter.num_recovered_packets); 553 EXPECT_EQ(1U, packet_counter.num_recovered_packets);
495 } 554 }
496 555
497 } // namespace webrtc 556 } // 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