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
This commit is contained in:
stefan@webrtc.org
2012-03-23 22:34:14 +00:00
parent af5ffd5bb9
commit 38f247d800
2 changed files with 11 additions and 1 deletions

View File

@ -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<int>(receivedPacketList->front()->seqNum) -
static_cast<int>(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;

View File

@ -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<RtpPacket*> media_rtp_packets_batch2;
std::list<Packet*> media_packets_batch2;
GenerateAndAddFrames(kNumMediaPacketsBatch2, 1, &media_rtp_packets_batch2,