Timestamps of full frames are adjusted to be unique.

git-svn-id: http://voip.null.ro/svn/yate@902 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2006-06-26 08:30:49 +00:00
parent ad7de0f1a8
commit fd660b0e5a
2 changed files with 19 additions and 5 deletions

View File

@ -49,6 +49,7 @@ IAXTransaction::IAXTransaction(IAXEngine* engine, IAXFullFrame* frame,
m_iSeqNo(0),
m_engine(engine),
m_userdata(data),
m_lastFullFrameOut(0),
m_lastMiniFrameOut(0xFFFF),
m_lastMiniFrameIn(0),
m_mutexInMedia(true),
@ -116,6 +117,7 @@ IAXTransaction::IAXTransaction(IAXEngine* engine, Type type, u_int16_t lcallno,
m_iSeqNo(0),
m_engine(engine),
m_userdata(data),
m_lastFullFrameOut(0),
m_lastMiniFrameOut(0xFFFF),
m_lastMiniFrameIn(0),
m_mutexInMedia(true),
@ -249,7 +251,7 @@ IAXTransaction* IAXTransaction::processFrame(IAXFrame* frame)
m_inTotalFramesCount++;
// Frame is VNAK ?
if (frame->type() == IAXFrame::IAX && frame->subclass() == IAXControl::VNAK)
return retransmittOnVNAK(frame->fullFrame()->iSeqNo());
return retransmitOnVNAK(frame->fullFrame()->iSeqNo());
// Do we have space?
if (m_inFrames.count() == m_maxInFrames) {
// Output(" Buffer overrun. DROP");
@ -786,8 +788,16 @@ void IAXTransaction::postFrame(IAXFrame::Type type, u_int32_t subclass, void* da
Lock lock(this);
if (state() == Terminated)
return;
if (!tStamp)
if (!tStamp) {
tStamp = timeStamp();
if (m_lastFullFrameOut) {
// adjust timestamp to be different from the last sent
int32_t delta = tStamp - m_lastFullFrameOut;
if (delta <= 0)
tStamp = m_lastFullFrameOut+1;
}
m_lastFullFrameOut = tStamp;
}
IAXFrameOut* frame = new IAXFrameOut(type,subclass,m_lCallNo,m_rCallNo,m_oSeqNo,m_iSeqNo,tStamp,
(unsigned char*)data,len,m_retransCount,m_retransInterval,ackOnly);
DDebug(m_engine,DebugAll,"Transaction posting Frame(%u,%u) oseq=%u iseq=%u stamp=%u [%p]",
@ -1364,15 +1374,18 @@ IAXEvent* IAXTransaction::getEventTerminating(u_int64_t time)
return 0;
}
IAXTransaction* IAXTransaction::retransmittOnVNAK(u_int16_t seqNo)
IAXTransaction* IAXTransaction::retransmitOnVNAK(u_int16_t seqNo)
{
DDebug(m_engine,DebugNote,"Transaction(%u,%u) - Received VNAK. Request: %u",localCallNo(),remoteCallNo(),seqNo);
int c = 0;
for (ObjList* l = m_outFrames.skipNull(); l; l = l->next()) {
IAXFrameOut* frame = static_cast<IAXFrameOut*>(l->get());
if (frame && frame->oSeqNo() >= seqNo) {
sendFrame(frame,true);
c++;
}
}
DDebug(m_engine,DebugNote,"Transaction(%u,%u) - Retransmitted %d frames on VNAK(%u)",
localCallNo(),remoteCallNo(),c,seqNo);
return 0;
}

View File

@ -1201,7 +1201,7 @@ protected:
* @param seqNo Requested sequence number
* @return 0.
*/
IAXTransaction* IAXTransaction::retransmittOnVNAK(u_int16_t seqNo);
IAXTransaction* IAXTransaction::retransmitOnVNAK(u_int16_t seqNo);
/**
* Generate an Accept event after internally accepting a transaction.
@ -1253,6 +1253,7 @@ private:
unsigned char m_iSeqNo; /* Incoming frame sequence number */
IAXEngine* m_engine; /* Engine that owns this transaction */
void* m_userdata; /* User data */
u_int32_t m_lastFullFrameOut; /* Last transmitted full frame timestamp */
u_int16_t m_lastMiniFrameOut; /* Last transmitted mini frame timestamp */
u_int32_t m_lastMiniFrameIn; /* Last received mini frame timestamp */
Mutex m_mutexInMedia; /* Keep received media thread safe */