From 38f247d800c80f6d2a42180e0bee357e7d7ff495 Mon Sep 17 00:00:00 2001 From: "stefan@webrtc.org" Date: Fri, 23 Mar 2012 22:34:14 +0000 Subject: [PATCH] Fixes an issue in the FEC decoder where a big jump in sequence numbers may cause new packets to be discarded if there is a wrap around. BUG= TEST= Review URL: https://webrtc-codereview.appspot.com/455003 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1934 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../rtp_rtcp/source/forward_error_correction.cc | 10 ++++++++++ src/modules/rtp_rtcp/source/receiver_fec_unittest.cc | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) 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,