- comment jitter calculation

This commit is contained in:
Dmytro Bogovych 2023-04-12 12:19:53 +03:00
parent 0607bd1c47
commit bb48e1a777
6 changed files with 276 additions and 246 deletions

View File

@ -49,6 +49,7 @@
#include "rtptimeutilities.h"
#include "rtcpcompoundpacketbuilder.h"
#include "rtpmemoryobject.h"
#include "rtpsourcedata.h"
#include <list>
#ifdef RTP_SUPPORT_THREAD
@ -476,11 +477,7 @@ protected:
const uint8_t *cname,size_t cnamelength) { }
/** Is called when a new entry \c srcdat is added to the source table. */
virtual void OnNewSource(RTPSourceData *srcdat)
{
// Sync timestamp unit
srcdat->SetTimestampUnit(timestampunit);
}
virtual void OnNewSource(RTPSourceData *srcdat) { }
/** Is called when the entry \c srcdat is about to be deleted from the source table. */
virtual void OnRemoveSource(RTPSourceData *srcdat) { }
@ -513,6 +510,10 @@ protected:
/** Is called when an RTCP compound packet has just been sent (useful to inspect outgoing RTCP data). */
virtual void OnSendRTCPCompoundPacket(RTCPCompoundPacket *pack) { }
virtual void OnSenderReport(RTPSourceData* srcdat) {}
virtual void OnReceiverReport(RTPSourceData* srcdat) {}
#ifdef RTP_SUPPORT_THREAD
/** Is called when error \c errcode was detected in the poll thread. */
virtual void OnPollThreadError(int errcode) { }

View File

@ -110,5 +110,15 @@ void RTPSessionSources::OnNoteTimeout(RTPSourceData *srcdat)
rtpsession.OnNoteTimeout(srcdat);
}
void RTPSessionSources::OnSenderReport(RTPSourceData *srcdat)
{
rtpsession.OnSenderReport(srcdat);
}
void RTPSessionSources::OnReceiverReport(RTPSourceData *srcdat)
{
rtpsession.OnReceiverReport(srcdat);
}
} // end namespace

View File

@ -74,7 +74,9 @@ private:
void OnUnknownPacketFormat(RTCPPacket *rtcppack,const RTPTime &receivetime,
const RTPAddress *senderaddress);
void OnNoteTimeout(RTPSourceData *srcdat);
void OnSenderReport(RTPSourceData* srcdat);
void OnReceiverReport(RTPSourceData* srcdat);
RTPSession &rtpsession;
bool owncollision;
};

View File

@ -43,6 +43,9 @@
#include <string>
#endif // RTPDEBUG
#include <iostream>
#include <iomanip>
#include "rtpdebug.h"
#define ACCEPTPACKETCODE \
@ -197,16 +200,19 @@ void RTPSourceStats::ProcessPacket(RTPPacket *pack,const RTPTime &receivetime,do
djitter += diff;
jitter = (uint32_t)djitter;
#else
// Current packet receive time
RTPTime curtime = receivetime;
double diffts1,diffts2,diff;
// Packet timestamp in units
uint32_t curts = pack->GetTimestamp();
curtime -= prevpacktime;
diffts1 = curtime.GetDouble() / tsunit;
curtime -= prevpacktime; // Difference in RTPTime (seconds)
diffts1 = curtime.GetDouble() / tsunit; // Current time in units
if (curts > prevtimestamp)
if (curts > prevtimestamp) // If packets are ordered ok
{
uint32_t unsigneddiff = curts - prevtimestamp;
uint32_t unsigneddiff = curts - prevtimestamp; // Difference in units
if (unsigneddiff < 0x10000000) // okay, curts realy is larger than prevtimestamp
diffts2 = (double)unsigneddiff;
@ -235,13 +241,17 @@ void RTPSourceStats::ProcessPacket(RTPPacket *pack,const RTPTime &receivetime,do
else
diffts2 = 0;
diff = diffts1 - diffts2;
diff = diffts1 - diffts2; // diffts1 is delta between packets in receive time; difftw2 is delta in timestamp. Both are expressed in units.
if (diff < 0)
diff = -diff;
diff -= djitter;
diff /= 16.0;
djitter += diff;
jitter = (uint32_t)djitter;
diff = -diff; // Get abs() if needed
djitter = djitter + (diff - djitter) / 16.0;
// std::cout << std::setprecision(3) << djitter << std::endl;
// diff -= djitter;
// diff /= 16.0;
// djitter += diff;
jitter = (uint32_t)djitter; // This is timestamp units !
#endif
}
else

View File

@ -659,6 +659,7 @@ int RTPSources::ProcessRTCPSenderInfo(uint32_t ssrc,const RTPNTPTime &ntptime,ui
// Call the callback
if (created)
OnNewSource(srcdat);
OnSenderReport(srcdat);
return 0;
}
@ -682,7 +683,9 @@ int RTPSources::ProcessRTCPReportBlock(uint32_t ssrc,uint8_t fractionlost,int32_
// Call the callback
if (created)
OnNewSource(srcdat);
OnReceiverReport(srcdat);
return 0;
}

View File

@ -7,7 +7,7 @@
This library was developed at the Expertise Centre for Digital Media
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
@ -52,9 +52,9 @@ namespace jrtplib
class JRTPLIB_IMPORTEXPORT RTPSources_GetHashIndex
{
public:
static int GetIndex(const uint32_t &ssrc) { return ssrc%RTPSOURCES_HASHSIZE; }
static int GetIndex(const uint32_t &ssrc) { return ssrc%RTPSOURCES_HASHSIZE; }
};
class RTPNTPTime;
class RTPTransmitter;
class RTCPAPPPacket;
@ -67,296 +67,300 @@ class RTPSourceData;
/** Represents a table in which information about the participating sources is kept.
* Represents a table in which information about the participating sources is kept. The class has member
* functions to process RTP and RTCP data and to iterate over the participants. Note that a NULL address
* is used to identify packets from our own session. The class also provides some overridable functions
* functions to process RTP and RTCP data and to iterate over the participants. Note that a NULL address
* is used to identify packets from our own session. The class also provides some overridable functions
* which can be used to catch certain events (new SSRC, SSRC collision, ...).
*/
class JRTPLIB_IMPORTEXPORT RTPSources : public RTPMemoryObject
{
public:
/** Type of probation to use for new sources. */
enum ProbationType
{
NoProbation, /**< Don't use the probation algorithm; accept RTP packets immediately. */
ProbationDiscard, /**< Discard incoming RTP packets originating from a source that's on probation. */
ProbationStore /**< Store incoming RTP packet from a source that's on probation for later retrieval. */
};
/** In the constructor you can select the probation type you'd like to use and also a memory manager. */
RTPSources(ProbationType = ProbationStore,RTPMemoryManager *mgr = 0);
virtual ~RTPSources();
/** Type of probation to use for new sources. */
enum ProbationType
{
NoProbation, /**< Don't use the probation algorithm; accept RTP packets immediately. */
ProbationDiscard, /**< Discard incoming RTP packets originating from a source that's on probation. */
ProbationStore /**< Store incoming RTP packet from a source that's on probation for later retrieval. */
};
/** Clears the source table. */
void Clear();
/** In the constructor you can select the probation type you'd like to use and also a memory manager. */
RTPSources(ProbationType = ProbationStore,RTPMemoryManager *mgr = 0);
virtual ~RTPSources();
/** Clears the source table. */
void Clear();
#ifdef RTP_SUPPORT_PROBATION
/** Changes the current probation type. */
void SetProbationType(ProbationType probtype) { probationtype = probtype; }
/** Changes the current probation type. */
void SetProbationType(ProbationType probtype) { probationtype = probtype; }
#endif // RTP_SUPPORT_PROBATION
/** Creates an entry for our own SSRC identifier. */
int CreateOwnSSRC(uint32_t ssrc);
/** Creates an entry for our own SSRC identifier. */
int CreateOwnSSRC(uint32_t ssrc);
/** Deletes the entry for our own SSRC identifier. */
int DeleteOwnSSRC();
/** Deletes the entry for our own SSRC identifier. */
int DeleteOwnSSRC();
/** This function should be called if our own session has sent an RTP packet.
* This function should be called if our own session has sent an RTP packet.
* For our own SSRC entry, the sender flag is updated based upon outgoing packets instead of incoming packets.
*/
void SentRTPPacket();
/** This function should be called if our own session has sent an RTP packet.
* This function should be called if our own session has sent an RTP packet.
* For our own SSRC entry, the sender flag is updated based upon outgoing packets instead of incoming packets.
*/
void SentRTPPacket();
/** Processes a raw packet \c rawpack.
* Processes a raw packet \c rawpack. The instance \c trans will be used to check if this
* packet is one of our own packets. The flag \c acceptownpackets indicates whether own packets should be
* accepted or ignored.
*/
int ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *trans,bool acceptownpackets);
/** Processes a raw packet \c rawpack.
* Processes a raw packet \c rawpack. The instance \c trans will be used to check if this
* packet is one of our own packets. The flag \c acceptownpackets indicates whether own packets should be
* accepted or ignored.
*/
int ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *trans,bool acceptownpackets);
/** Processes a raw packet \c rawpack.
* Processes a raw packet \c rawpack. Every transmitter in the array \c trans of length \c numtrans
* is used to check if the packet is from our own session. The flag \c acceptownpackets indicates
* whether own packets should be accepted or ignored.
*/
int ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *trans[],int numtrans,bool acceptownpackets);
/** Processes a raw packet \c rawpack.
* Processes a raw packet \c rawpack. Every transmitter in the array \c trans of length \c numtrans
* is used to check if the packet is from our own session. The flag \c acceptownpackets indicates
* whether own packets should be accepted or ignored.
*/
int ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *trans[],int numtrans,bool acceptownpackets);
/** Processes an RTPPacket instance \c rtppack which was received at time \c receivetime and
* which originated from \c senderaddres.
* Processes an RTPPacket instance \c rtppack which was received at time \c receivetime and
* which originated from \c senderaddres. The \c senderaddress parameter must be NULL if
* the packet was sent by the local participant. The flag \c stored indicates whether the packet
* was stored in the table or not. If so, the \c rtppack instance may not be deleted.
*/
int ProcessRTPPacket(RTPPacket *rtppack,const RTPTime &receivetime,const RTPAddress *senderaddress,bool *stored);
/** Processes an RTPPacket instance \c rtppack which was received at time \c receivetime and
* which originated from \c senderaddres.
* Processes an RTPPacket instance \c rtppack which was received at time \c receivetime and
* which originated from \c senderaddres. The \c senderaddress parameter must be NULL if
* the packet was sent by the local participant. The flag \c stored indicates whether the packet
* was stored in the table or not. If so, the \c rtppack instance may not be deleted.
*/
int ProcessRTPPacket(RTPPacket *rtppack,const RTPTime &receivetime,const RTPAddress *senderaddress,bool *stored);
/** Processes the RTCP compound packet \c rtcpcomppack which was received at time \c receivetime from \c senderaddress.
* Processes the RTCP compound packet \c rtcpcomppack which was received at time \c receivetime from \c senderaddress.
* The \c senderaddress parameter must be NULL if the packet was sent by the local participant.
*/
int ProcessRTCPCompoundPacket(RTCPCompoundPacket *rtcpcomppack,const RTPTime &receivetime,
const RTPAddress *senderaddress);
/** Process the sender information of SSRC \c ssrc into the source table.
* Process the sender information of SSRC \c ssrc into the source table. The information was received
* at time \c receivetime from address \c senderaddress. The \c senderaddress} parameter must be NULL
* if the packet was sent by the local participant.
*/
int ProcessRTCPSenderInfo(uint32_t ssrc,const RTPNTPTime &ntptime,uint32_t rtptime,
uint32_t packetcount,uint32_t octetcount,const RTPTime &receivetime,
const RTPAddress *senderaddress);
/** Processes the RTCP compound packet \c rtcpcomppack which was received at time \c receivetime from \c senderaddress.
* Processes the RTCP compound packet \c rtcpcomppack which was received at time \c receivetime from \c senderaddress.
* The \c senderaddress parameter must be NULL if the packet was sent by the local participant.
*/
int ProcessRTCPCompoundPacket(RTCPCompoundPacket *rtcpcomppack,const RTPTime &receivetime,
const RTPAddress *senderaddress);
/** Process the sender information of SSRC \c ssrc into the source table.
* Process the sender information of SSRC \c ssrc into the source table. The information was received
* at time \c receivetime from address \c senderaddress. The \c senderaddress} parameter must be NULL
* if the packet was sent by the local participant.
*/
int ProcessRTCPSenderInfo(uint32_t ssrc,const RTPNTPTime &ntptime,uint32_t rtptime,
uint32_t packetcount,uint32_t octetcount,const RTPTime &receivetime,
const RTPAddress *senderaddress);
/** Processes the report block information which was sent by participant \c ssrc into the source table.
* Processes the report block information which was sent by participant \c ssrc into the source table.
* The information was received at time \c receivetime from address \c senderaddress The \c senderaddress
* parameter must be NULL if the packet was sent by the local participant.
*/
int ProcessRTCPReportBlock(uint32_t ssrc,uint8_t fractionlost,int32_t lostpackets,
uint32_t exthighseqnr,uint32_t jitter,uint32_t lsr,
uint32_t dlsr,const RTPTime &receivetime,const RTPAddress *senderaddress);
* Processes the report block information which was sent by participant \c ssrc into the source table.
* The information was received at time \c receivetime from address \c senderaddress The \c senderaddress
* parameter must be NULL if the packet was sent by the local participant.
*/
int ProcessRTCPReportBlock(uint32_t ssrc,uint8_t fractionlost,int32_t lostpackets,
uint32_t exthighseqnr,uint32_t jitter,uint32_t lsr,
uint32_t dlsr,const RTPTime &receivetime,const RTPAddress *senderaddress);
/** Processes the non-private SDES item from source \c ssrc into the source table.
* Processes the non-private SDES item from source \c ssrc into the source table. The information was
* received at time \c receivetime from address \c senderaddress. The \c senderaddress parameter must
* be NULL if the packet was sent by the local participant.
*/
int ProcessSDESNormalItem(uint32_t ssrc,RTCPSDESPacket::ItemType t,size_t itemlength,
const void *itemdata,const RTPTime &receivetime,const RTPAddress *senderaddress);
/** Processes the non-private SDES item from source \c ssrc into the source table.
* Processes the non-private SDES item from source \c ssrc into the source table. The information was
* received at time \c receivetime from address \c senderaddress. The \c senderaddress parameter must
* be NULL if the packet was sent by the local participant.
*/
int ProcessSDESNormalItem(uint32_t ssrc,RTCPSDESPacket::ItemType t,size_t itemlength,
const void *itemdata,const RTPTime &receivetime,const RTPAddress *senderaddress);
#ifdef RTP_SUPPORT_SDESPRIV
/** Processes the SDES private item from source \c ssrc into the source table.
* Processes the SDES private item from source \c ssrc into the source table. The information was
* received at time \c receivetime from address \c senderaddress. The \c senderaddress
* parameter must be NULL if the packet was sent by the local participant.
*/
int ProcessSDESPrivateItem(uint32_t ssrc,size_t prefixlen,const void *prefixdata,
size_t valuelen,const void *valuedata,const RTPTime &receivetime,
const RTPAddress *senderaddress);
/** Processes the SDES private item from source \c ssrc into the source table.
* Processes the SDES private item from source \c ssrc into the source table. The information was
* received at time \c receivetime from address \c senderaddress. The \c senderaddress
* parameter must be NULL if the packet was sent by the local participant.
*/
int ProcessSDESPrivateItem(uint32_t ssrc,size_t prefixlen,const void *prefixdata,
size_t valuelen,const void *valuedata,const RTPTime &receivetime,
const RTPAddress *senderaddress);
#endif //RTP_SUPPORT_SDESPRIV
/** Processes the BYE message for SSRC \c ssrc.
* Processes the BYE message for SSRC \c ssrc. The information was received at time \c receivetime from
* address \c senderaddress. The \c senderaddress parameter must be NULL if the packet was sent by the
* local participant.
*/
int ProcessBYE(uint32_t ssrc,size_t reasonlength,const void *reasondata,const RTPTime &receivetime,
const RTPAddress *senderaddress);
/** Processes the BYE message for SSRC \c ssrc.
* Processes the BYE message for SSRC \c ssrc. The information was received at time \c receivetime from
* address \c senderaddress. The \c senderaddress parameter must be NULL if the packet was sent by the
* local participant.
*/
int ProcessBYE(uint32_t ssrc,size_t reasonlength,const void *reasondata,const RTPTime &receivetime,
const RTPAddress *senderaddress);
/** If we heard from source \c ssrc, but no actual data was added to the source table (for example, if
* no report block was meant for us), this function can e used to indicate that something was received from
* this source.
* If we heard from source \c ssrc, but no actual data was added to the source table (for example, if
* no report block was meant for us), this function can e used to indicate that something was received from
* this source. This will prevent a premature timeout for this participant. The message was received at time
* \c receivetime from address \c senderaddress. The \c senderaddress parameter must be NULL if the
* packet was sent by the local participant.
*/
int UpdateReceiveTime(uint32_t ssrc,const RTPTime &receivetime,const RTPAddress *senderaddress);
/** Starts the iteration over the participants by going to the first member in the table.
* Starts the iteration over the participants by going to the first member in the table.
* If a member was found, the function returns \c true, otherwise it returns \c false.
*/
bool GotoFirstSource();
/** If we heard from source \c ssrc, but no actual data was added to the source table (for example, if
* no report block was meant for us), this function can e used to indicate that something was received from
* this source.
* If we heard from source \c ssrc, but no actual data was added to the source table (for example, if
* no report block was meant for us), this function can e used to indicate that something was received from
* this source. This will prevent a premature timeout for this participant. The message was received at time
* \c receivetime from address \c senderaddress. The \c senderaddress parameter must be NULL if the
* packet was sent by the local participant.
*/
int UpdateReceiveTime(uint32_t ssrc,const RTPTime &receivetime,const RTPAddress *senderaddress);
/** Sets the current source to be the next source in the table.
* Sets the current source to be the next source in the table. If we're already at the last source,
* the function returns \c false, otherwise it returns \c true.
*/
bool GotoNextSource();
/** Starts the iteration over the participants by going to the first member in the table.
* Starts the iteration over the participants by going to the first member in the table.
* If a member was found, the function returns \c true, otherwise it returns \c false.
*/
bool GotoFirstSource();
/** Sets the current source to be the previous source in the table.
* Sets the current source to be the previous source in the table. If we're at the first source,
* the function returns \c false, otherwise it returns \c true.
*/
bool GotoPreviousSource();
/** Sets the current source to be the next source in the table.
* Sets the current source to be the next source in the table. If we're already at the last source,
* the function returns \c false, otherwise it returns \c true.
*/
bool GotoNextSource();
/** Sets the current source to be the first source in the table which has RTPPacket instances
* that we haven't extracted yet.
* Sets the current source to be the first source in the table which has RTPPacket instances
* that we haven't extracted yet. If no such member was found, the function returns \c false,
* otherwise it returns \c true.
*/
bool GotoFirstSourceWithData();
/** Sets the current source to be the previous source in the table.
* Sets the current source to be the previous source in the table. If we're at the first source,
* the function returns \c false, otherwise it returns \c true.
*/
bool GotoPreviousSource();
/** Sets the current source to be the next source in the table which has RTPPacket instances that
* we haven't extracted yet.
* Sets the current source to be the next source in the table which has RTPPacket instances that
* we haven't extracted yet. If no such member was found, the function returns \c false,
* otherwise it returns \c true.
*/
bool GotoNextSourceWithData();
/** Sets the current source to be the first source in the table which has RTPPacket instances
* that we haven't extracted yet.
* Sets the current source to be the first source in the table which has RTPPacket instances
* that we haven't extracted yet. If no such member was found, the function returns \c false,
* otherwise it returns \c true.
*/
bool GotoFirstSourceWithData();
/** Sets the current source to be the previous source in the table which has RTPPacket instances
* that we haven't extracted yet.
* Sets the current source to be the previous source in the table which has RTPPacket instances
* that we haven't extracted yet. If no such member was found, the function returns \c false,
* otherwise it returns \c true.
*/
bool GotoPreviousSourceWithData();
/** Sets the current source to be the next source in the table which has RTPPacket instances that
* we haven't extracted yet.
* Sets the current source to be the next source in the table which has RTPPacket instances that
* we haven't extracted yet. If no such member was found, the function returns \c false,
* otherwise it returns \c true.
*/
bool GotoNextSourceWithData();
/** Returns the RTPSourceData instance for the currently selected participant. */
RTPSourceData *GetCurrentSourceInfo();
/** Sets the current source to be the previous source in the table which has RTPPacket instances
* that we haven't extracted yet.
* Sets the current source to be the previous source in the table which has RTPPacket instances
* that we haven't extracted yet. If no such member was found, the function returns \c false,
* otherwise it returns \c true.
*/
bool GotoPreviousSourceWithData();
/** Returns the RTPSourceData instance for the participant identified by \c ssrc, or
* NULL if no such entry exists.
*/
RTPSourceData *GetSourceInfo(uint32_t ssrc);
/** Returns the RTPSourceData instance for the currently selected participant. */
RTPSourceData *GetCurrentSourceInfo();
/** Extracts the next packet from the received packets queue of the current participant. */
RTPPacket *GetNextPacket();
/** Returns the RTPSourceData instance for the participant identified by \c ssrc, or
* NULL if no such entry exists.
*/
RTPSourceData *GetSourceInfo(uint32_t ssrc);
/** Returns \c true if an entry for participant \c ssrc exists and \c false otherwise. */
bool GotEntry(uint32_t ssrc);
/** Extracts the next packet from the received packets queue of the current participant. */
RTPPacket *GetNextPacket();
/** If present, it returns the RTPSourceData instance of the entry which was created by CreateOwnSSRC. */
RTPSourceData *GetOwnSourceInfo() { return (RTPSourceData *)owndata; }
/** Returns \c true if an entry for participant \c ssrc exists and \c false otherwise. */
bool GotEntry(uint32_t ssrc);
/** Assuming that the current time is \c curtime, time out the members from whom we haven't heard
* during the previous time interval \c timeoutdelay.
*/
void Timeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
/** If present, it returns the RTPSourceData instance of the entry which was created by CreateOwnSSRC. */
RTPSourceData *GetOwnSourceInfo() { return (RTPSourceData *)owndata; }
/** Assuming that the current time is \c curtime, remove the sender flag for senders from whom we haven't
* received any RTP packets during the previous time interval \c timeoutdelay.
*/
void SenderTimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
/** Assuming that the current time is \c curtime, time out the members from whom we haven't heard
* during the previous time interval \c timeoutdelay.
*/
void Timeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
/** Assuming that the current time is \c curtime, remove the members who sent a BYE packet more than
* the time interval \c timeoutdelay ago.
*/
void BYETimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
/** Assuming that the current time is \c curtime, remove the sender flag for senders from whom we haven't
* received any RTP packets during the previous time interval \c timeoutdelay.
*/
void SenderTimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
/** Assuming that the current time is \c curtime, clear the SDES NOTE items which haven't been updated
* during the previous time interval \c timeoutdelay.
*/
void NoteTimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
/** Assuming that the current time is \c curtime, remove the members who sent a BYE packet more than
* the time interval \c timeoutdelay ago.
*/
void BYETimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
/** Combines the functions SenderTimeout, BYETimeout, Timeout and NoteTimeout.
* Combines the functions SenderTimeout, BYETimeout, Timeout and NoteTimeout. This is more efficient
* than calling all four functions since only one iteration is needed in this function.
*/
void MultipleTimeouts(const RTPTime &curtime,const RTPTime &sendertimeout,
const RTPTime &byetimeout,const RTPTime &generaltimeout,
const RTPTime &notetimeout);
/** Assuming that the current time is \c curtime, clear the SDES NOTE items which haven't been updated
* during the previous time interval \c timeoutdelay.
*/
void NoteTimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
/** Returns the number of participants which are marked as a sender. */
int GetSenderCount() const { return sendercount; }
/** Combines the functions SenderTimeout, BYETimeout, Timeout and NoteTimeout.
* Combines the functions SenderTimeout, BYETimeout, Timeout and NoteTimeout. This is more efficient
* than calling all four functions since only one iteration is needed in this function.
*/
void MultipleTimeouts(const RTPTime &curtime,const RTPTime &sendertimeout,
const RTPTime &byetimeout,const RTPTime &generaltimeout,
const RTPTime &notetimeout);
/** Returns the total number of entries in the source table. */
int GetTotalCount() const { return totalcount; }
/** Returns the number of participants which are marked as a sender. */
int GetSenderCount() const { return sendercount; }
/** Returns the number of members which have been validated and which haven't sent a BYE packet yet. */
int GetActiveMemberCount() const { return activecount; }
/** Returns the total number of entries in the source table. */
int GetTotalCount() const { return totalcount; }
/** Returns the number of members which have been validated and which haven't sent a BYE packet yet. */
int GetActiveMemberCount() const { return activecount; }
#ifdef RTPDEBUG
void Dump();
void SafeCountTotal();
void SafeCountSenders();
void SafeCountActive();
void Dump();
void SafeCountTotal();
void SafeCountSenders();
void SafeCountActive();
#endif // RTPDEBUG
protected:
/** Is called when an RTP packet is about to be processed. */
virtual void OnRTPPacket(RTPPacket * /*pack*/,const RTPTime &/*receivetime*/, const RTPAddress * /*senderaddress*/) { }
/** Is called when an RTP packet is about to be processed. */
virtual void OnRTPPacket(RTPPacket * /*pack*/,const RTPTime &/*receivetime*/, const RTPAddress * /*senderaddress*/) { }
/** Is called when an RTCP compound packet is about to be processed. */
virtual void OnRTCPCompoundPacket(RTCPCompoundPacket * /*pack*/,const RTPTime & /*receivetime*/,
/** Is called when an RTCP compound packet is about to be processed. */
virtual void OnRTCPCompoundPacket(RTCPCompoundPacket * /*pack*/,const RTPTime & /*receivetime*/,
const RTPAddress * /*senderaddress*/) { }
/** Is called when an SSRC collision was detected.
* Is called when an SSRC collision was detected. The instance \c srcdat is the one present in
* the table, the address \c senderaddress is the one that collided with one of the addresses
* and \c isrtp indicates against which address of \c srcdat the check failed.
*/
virtual void OnSSRCCollision(RTPSourceData * /*srcdat*/,const RTPAddress * /*senderaddress*/,bool /*isrtp*/) { }
/** Is called when an SSRC collision was detected.
* Is called when an SSRC collision was detected. The instance \c srcdat is the one present in
* the table, the address \c senderaddress is the one that collided with one of the addresses
* and \c isrtp indicates against which address of \c srcdat the check failed.
*/
virtual void OnSSRCCollision(RTPSourceData * /*srcdat*/,const RTPAddress * /*senderaddress*/,bool /*isrtp*/) { }
/** Is called when another CNAME was received than the one already present for source \c srcdat. */
virtual void OnCNAMECollision(RTPSourceData * /*srcdat*/,const RTPAddress * /*senderaddress*/,
/** Is called when another CNAME was received than the one already present for source \c srcdat. */
virtual void OnCNAMECollision(RTPSourceData * /*srcdat*/,const RTPAddress * /*senderaddress*/,
const uint8_t * /*cname*/,size_t /*cnamelength*/) { }
/** Is called when a new entry \c srcdat is added to the source table. */
virtual void OnNewSource(RTPSourceData * /*srcdat*/) { }
/** Is called when a new entry \c srcdat is added to the source table. */
virtual void OnNewSource(RTPSourceData * /*srcdat*/) { }
/** Is called when the entry \c srcdat is about to be deleted from the source table. */
virtual void OnRemoveSource(RTPSourceData * /*srcdat*/) { }
/** Is called when the entry \c srcdat is about to be deleted from the source table. */
virtual void OnRemoveSource(RTPSourceData * /*srcdat*/) { }
/** Is called when participant \c srcdat is timed out. */
virtual void OnTimeout(RTPSourceData * /*srcdat*/) { }
/** Is called when participant \c srcdat is timed out. */
virtual void OnTimeout(RTPSourceData * /*srcdat*/) { }
/** Is called when participant \c srcdat is timed after having sent a BYE packet. */
virtual void OnBYETimeout(RTPSourceData * /*srcdat*/) { }
/** Is called when participant \c srcdat is timed after having sent a BYE packet. */
virtual void OnBYETimeout(RTPSourceData * /*srcdat*/) { }
/** Is called when a BYE packet has been processed for source \c srcdat. */
virtual void OnBYEPacket(RTPSourceData * /*srcdat*/) { }
/** Is called when a BYE packet has been processed for source \c srcdat. */
virtual void OnBYEPacket(RTPSourceData * /*srcdat*/) { }
/** Is called when an RTCP APP packet \c apppacket has been received at time \c receivetime
* from address \c senderaddress.
*/
virtual void OnAPPPacket(RTCPAPPPacket * /*apppacket*/,const RTPTime &/*receivetime*/,
/** Is called when an RTCP APP packet \c apppacket has been received at time \c receivetime
* from address \c senderaddress.
*/
virtual void OnAPPPacket(RTCPAPPPacket * /*apppacket*/,const RTPTime &/*receivetime*/,
const RTPAddress * /*senderaddress*/) { }
/** Is called when an unknown RTCP packet type was detected. */
virtual void OnUnknownPacketType(RTCPPacket * /*rtcppack*/,const RTPTime &/*receivetime*/,
/** Is called when an unknown RTCP packet type was detected. */
virtual void OnUnknownPacketType(RTCPPacket * /*rtcppack*/,const RTPTime &/*receivetime*/,
const RTPAddress * /*senderaddress*/) { }
/** Is called when an unknown packet format for a known packet type was detected. */
virtual void OnUnknownPacketFormat(RTCPPacket * /*rtcppack*/,const RTPTime &/*receivetime*/,
/** Is called when an unknown packet format for a known packet type was detected. */
virtual void OnUnknownPacketFormat(RTCPPacket * /*rtcppack*/,const RTPTime &/*receivetime*/,
const RTPAddress * /*senderaddress*/) { }
/** Is called when the SDES NOTE item for source \c srcdat has been timed out. */
virtual void OnNoteTimeout(RTPSourceData * /*srcdat*/) { }
/** Is called when the SDES NOTE item for source \c srcdat has been timed out. */
virtual void OnNoteTimeout(RTPSourceData * /*srcdat*/) { }
virtual void OnSenderReport(RTPSourceData* /*srcdat*/) {}
virtual void OnReceiverReport(RTPSourceData* /*srcdat*/) {}
private:
void ClearSourceList();
int ObtainSourceDataInstance(uint32_t ssrc,RTPInternalSourceData **srcdat,bool *created);
int GetRTCPSourceData(uint32_t ssrc,const RTPAddress *senderaddress,RTPInternalSourceData **srcdat,bool *newsource);
bool CheckCollision(RTPInternalSourceData *srcdat,const RTPAddress *senderaddress,bool isrtp);
RTPKeyHashTable<const uint32_t,RTPInternalSourceData*,RTPSources_GetHashIndex,RTPSOURCES_HASHSIZE> sourcelist;
int sendercount;
int totalcount;
int activecount;
void ClearSourceList();
int ObtainSourceDataInstance(uint32_t ssrc,RTPInternalSourceData **srcdat,bool *created);
int GetRTCPSourceData(uint32_t ssrc,const RTPAddress *senderaddress,RTPInternalSourceData **srcdat,bool *newsource);
bool CheckCollision(RTPInternalSourceData *srcdat,const RTPAddress *senderaddress,bool isrtp);
RTPKeyHashTable<const uint32_t,RTPInternalSourceData*,RTPSources_GetHashIndex,RTPSOURCES_HASHSIZE> sourcelist;
int sendercount;
int totalcount;
int activecount;
#ifdef RTP_SUPPORT_PROBATION
ProbationType probationtype;
ProbationType probationtype;
#endif // RTP_SUPPORT_PROBATION
RTPInternalSourceData *owndata;
RTPInternalSourceData *owndata;
};
} // end namespace