[Opalvoip-svn] SF.net SVN: opalvoip:[34878] opal/branches/v3_16
Brought to you by:
csoutheren,
rjongbloed
From: <rjo...@us...> - 2016-07-19 21:19:54
|
Revision: 34878 http://sourceforge.net/p/opalvoip/code/34878 Author: rjongbloed Date: 2016-07-19 21:19:51 +0000 (Tue, 19 Jul 2016) Log Message: ----------- Fixed some issues in RTP playback: Reset sequence numbers on change of SSRC. Restore original RTP packet if failed to find out of order on. Improve some logging. Fix compile without trace logging. Modified Paths: -------------- opal/branches/v3_16/include/rtp/pcapfile.h opal/branches/v3_16/src/rtp/pcapfile.cxx Modified: opal/branches/v3_16/include/rtp/pcapfile.h =================================================================== --- opal/branches/v3_16/include/rtp/pcapfile.h 2016-07-19 21:16:44 UTC (rev 34877) +++ opal/branches/v3_16/include/rtp/pcapfile.h 2016-07-19 21:19:51 UTC (rev 34878) @@ -70,9 +70,11 @@ { OpalTranscoder * m_transcoder; RTP_SequenceNumber m_lastSequenceNumber; + RTP_SyncSourceId m_lastSSRC; DecodeContext() : m_transcoder(NULL) , m_lastSequenceNumber(0) + , m_lastSSRC(0) { } ~DecodeContext(); }; Modified: opal/branches/v3_16/src/rtp/pcapfile.cxx =================================================================== --- opal/branches/v3_16/src/rtp/pcapfile.cxx 2016-07-19 21:16:44 UTC (rev 34877) +++ opal/branches/v3_16/src/rtp/pcapfile.cxx 2016-07-19 21:19:51 UTC (rev 34878) @@ -64,9 +64,13 @@ : m_filterSSRC(0) { OpalMediaFormatList list = OpalMediaFormat::GetAllRegisteredMediaFormats(); - for (PINDEX i = 0; i < list.GetSize(); i++) { - if (list[i].GetPayloadType() < RTP_DataFrame::DynamicBase) - m_payloadType2mediaFormat[list[i].GetPayloadType()] = list[i]; + for (OpalMediaFormatList::iterator it = list.begin(); it != list.end(); ++it) { + OpalMediaFormat fmt = *it; + if (fmt.GetPayloadType() < RTP_DataFrame::LastKnownPayloadType) { + RTP_DataFrame::PayloadTypes pt = fmt.GetPayloadType(); + m_payloadType2mediaFormat[pt] = fmt; + PTRACE(4, "Pre-defined payload type " << pt << " set to " << fmt); + } } } @@ -276,31 +280,39 @@ return -2; } + RTP_SyncSourceId thisSSRC = encodedRTP.GetSyncSource(); RTP_SequenceNumber thisSequenceNumber = encodedRTP.GetSequenceNumber(); RTP_SequenceNumber expectedSequenceNumber = context.m_lastSequenceNumber + 1; RTP_SequenceNumber sequenceDelta = thisSequenceNumber - expectedSequenceNumber; if (context.m_lastSequenceNumber != 0) { - if (sequenceDelta > (1<<16)-500) { - PTRACE(3, "Skipping duplicate or out of order RTP packet " << thisSequenceNumber); + if (context.m_lastSSRC != thisSSRC) { + PTRACE(3, "Changed SSRC, restarting RTP sequence numbers from " << thisSequenceNumber); + } + else if (sequenceDelta > (1<<16)-500) { + PTRACE(3, "Skipping duplicate or out of order RTP packet " << thisSequenceNumber << ", expected " << expectedSequenceNumber); return 0; } - - if (sequenceDelta > 3000) + else if (sequenceDelta > 3000) PTRACE(3, "Restarting RTP sequence numbers from " << thisSequenceNumber); else if (sequenceDelta > 0) { bool missing = true; - off_t nextPacketsFilePosition = GetPosition(); // Scan ahead 100 packets looking for out of order one for (PINDEX i = 0; i < 100; ++i) { - if (GetRTP(encodedRTP) >= 0 && encodedRTP.GetSequenceNumber() == thisSequenceNumber) { - // Found it, move file back to the packet we just read, to read again next time - SetPosition(thisPacketsFilePosition); + if (GetRTP(encodedRTP) >= 0 && encodedRTP.GetSequenceNumber() == expectedSequenceNumber) { + PTRACE(3, "Restoring out of order packet at " << expectedSequenceNumber); missing = false; + break; } } + + /* If found move back to position so is read next time, then the one we + are using now is skipped as out of order. If not found we read it + again immediately. */ + SetPosition(thisPacketsFilePosition); + if (missing) { - SetPosition(nextPacketsFilePosition); + GetRTP(encodedRTP); encodedRTP.SetDiscontinuity(sequenceDelta); PTRACE(3, "Detected " << sequenceDelta << " missing RTP packets:" " expected=" << expectedSequenceNumber << ", got=" << thisSequenceNumber); @@ -309,6 +321,7 @@ } context.m_lastSequenceNumber = thisSequenceNumber; + context.m_lastSSRC = thisSSRC; RTP_DataFrameList output; if (!context.m_transcoder->ConvertFrames(encodedRTP, output)) @@ -347,7 +360,7 @@ void OpalPCAPFile::DiscoveredRTPKey::PrintOn(ostream & strm) const { - strm << m_src << " -> " << m_dst << " src=" << RTP_TRACE_SRC(m_ssrc); + strm << m_src << " -> " << m_dst << " SSRC=" << m_ssrc; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |