diff --git a/src/modules/rtp_rtcp/source/forward_error_correction.cc b/src/modules/rtp_rtcp/source/forward_error_correction.cc index 22e1a38081..4476d51251 100644 --- a/src/modules/rtp_rtcp/source/forward_error_correction.cc +++ b/src/modules/rtp_rtcp/source/forward_error_correction.cc @@ -673,6 +673,16 @@ int32_t ForwardErrorCorrection::DecodeFEC( RecoveredPacketList* recoveredPacketList) { // TODO(marpan/ajm): can we check for multiple ULP headers, and return an // error? + if (recoveredPacketList->size() == kMaxMediaPackets) { + const unsigned int seq_num_diff = abs( + static_cast(receivedPacketList->front()->seqNum) - + static_cast(recoveredPacketList->back()->seqNum)); + if (seq_num_diff > kMaxMediaPackets) { + // A big gap in sequence numbers. The old recovered packets + // are now useless, so it's safe to do a reset. + ResetState(recoveredPacketList); + } + } InsertPackets(receivedPacketList, recoveredPacketList); AttemptRecover(recoveredPacketList); return 0; diff --git a/src/modules/rtp_rtcp/source/receiver_fec_unittest.cc b/src/modules/rtp_rtcp/source/receiver_fec_unittest.cc index c57d54f116..a5d440958f 100644 --- a/src/modules/rtp_rtcp/source/receiver_fec_unittest.cc +++ b/src/modules/rtp_rtcp/source/receiver_fec_unittest.cc @@ -288,7 +288,7 @@ TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { delayed_fec = fec_packets.front(); // Fill the FEC decoder. No packets should be dropped. - const unsigned int kNumMediaPacketsBatch2 = 47u; + const unsigned int kNumMediaPacketsBatch2 = 46u; std::list media_rtp_packets_batch2; std::list media_packets_batch2; GenerateAndAddFrames(kNumMediaPacketsBatch2, 1, &media_rtp_packets_batch2,