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:
@ -673,6 +673,16 @@ int32_t ForwardErrorCorrection::DecodeFEC(
|
|||||||
RecoveredPacketList* recoveredPacketList) {
|
RecoveredPacketList* recoveredPacketList) {
|
||||||
// TODO(marpan/ajm): can we check for multiple ULP headers, and return an
|
// TODO(marpan/ajm): can we check for multiple ULP headers, and return an
|
||||||
// error?
|
// 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);
|
InsertPackets(receivedPacketList, recoveredPacketList);
|
||||||
AttemptRecover(recoveredPacketList);
|
AttemptRecover(recoveredPacketList);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -288,7 +288,7 @@ TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) {
|
|||||||
delayed_fec = fec_packets.front();
|
delayed_fec = fec_packets.front();
|
||||||
|
|
||||||
// Fill the FEC decoder. No packets should be dropped.
|
// 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<RtpPacket*> media_rtp_packets_batch2;
|
||||||
std::list<Packet*> media_packets_batch2;
|
std::list<Packet*> media_packets_batch2;
|
||||||
GenerateAndAddFrames(kNumMediaPacketsBatch2, 1, &media_rtp_packets_batch2,
|
GenerateAndAddFrames(kNumMediaPacketsBatch2, 1, &media_rtp_packets_batch2,
|
||||||
|
Reference in New Issue
Block a user