00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00037 #ifndef RTPSOURCES_H
00038
00039 #define RTPSOURCES_H
00040
00041 #include "rtpconfig.h"
00042 #include "rtpkeyhashtable.h"
00043 #include "rtcpsdespacket.h"
00044 #include "rtptypes.h"
00045 #include "rtpmemoryobject.h"
00046
00047 #define RTPSOURCES_HASHSIZE 8317
00048
00049 class RTPSources_GetHashIndex
00050 {
00051 public:
00052 static int GetIndex(const uint32_t &ssrc) { return ssrc%RTPSOURCES_HASHSIZE; }
00053 };
00054
00055 class RTPNTPTime;
00056 class RTPTransmitter;
00057 class RTCPAPPPacket;
00058 class RTPInternalSourceData;
00059 class RTPRawPacket;
00060 class RTPPacket;
00061 class RTPTime;
00062 class RTPAddress;
00063 class RTPSourceData;
00064
00071 class RTPSources : public RTPMemoryObject
00072 {
00073 public:
00075 enum ProbationType
00076 {
00077 NoProbation,
00078 ProbationDiscard,
00079 ProbationStore
00080 };
00081
00083 RTPSources(ProbationType = ProbationStore,RTPMemoryManager *mgr = 0);
00084 virtual ~RTPSources();
00085
00087 void Clear();
00088 #ifdef RTP_SUPPORT_PROBATION
00089
00090 void SetProbationType(ProbationType probtype) { probationtype = probtype; }
00091 #endif // RTP_SUPPORT_PROBATION
00092
00094 int CreateOwnSSRC(uint32_t ssrc);
00095
00097 int DeleteOwnSSRC();
00098
00103 void SentRTPPacket();
00104
00110 int ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *trans,bool acceptownpackets);
00111
00117 int ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *trans[],int numtrans,bool acceptownpackets);
00118
00126 int ProcessRTPPacket(RTPPacket *rtppack,const RTPTime &receivetime,const RTPAddress *senderaddress,bool *stored);
00127
00132 int ProcessRTCPCompoundPacket(RTCPCompoundPacket *rtcpcomppack,const RTPTime &receivetime,
00133 const RTPAddress *senderaddress);
00134
00140 int ProcessRTCPSenderInfo(uint32_t ssrc,const RTPNTPTime &ntptime,uint32_t rtptime,
00141 uint32_t packetcount,uint32_t octetcount,const RTPTime &receivetime,
00142 const RTPAddress *senderaddress);
00143
00149 int ProcessRTCPReportBlock(uint32_t ssrc,uint8_t fractionlost,int32_t lostpackets,
00150 uint32_t exthighseqnr,uint32_t jitter,uint32_t lsr,
00151 uint32_t dlsr,const RTPTime &receivetime,const RTPAddress *senderaddress);
00152
00158 int ProcessSDESNormalItem(uint32_t ssrc,RTCPSDESPacket::ItemType t,size_t itemlength,
00159 const void *itemdata,const RTPTime &receivetime,const RTPAddress *senderaddress);
00160 #ifdef RTP_SUPPORT_SDESPRIV
00161
00166 int ProcessSDESPrivateItem(uint32_t ssrc,size_t prefixlen,const void *prefixdata,
00167 size_t valuelen,const void *valuedata,const RTPTime &receivetime,
00168 const RTPAddress *senderaddress);
00169 #endif //RTP_SUPPORT_SDESPRIV
00170
00175 int ProcessBYE(uint32_t ssrc,size_t reasonlength,const void *reasondata,const RTPTime &receivetime,
00176 const RTPAddress *senderaddress);
00177
00187 int UpdateReceiveTime(uint32_t ssrc,const RTPTime &receivetime,const RTPAddress *senderaddress);
00188
00193 bool GotoFirstSource();
00194
00199 bool GotoNextSource();
00200
00205 bool GotoPreviousSource();
00206
00213 bool GotoFirstSourceWithData();
00214
00221 bool GotoNextSourceWithData();
00222
00229 bool GotoPreviousSourceWithData();
00230
00232 RTPSourceData *GetCurrentSourceInfo();
00233
00237 RTPSourceData *GetSourceInfo(uint32_t ssrc);
00238
00240 RTPPacket *GetNextPacket();
00241
00243 bool GotEntry(uint32_t ssrc);
00244
00246 RTPSourceData *GetOwnSourceInfo() { return (RTPSourceData *)owndata; }
00247
00251 void Timeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
00252
00256 void SenderTimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
00257
00261 void BYETimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
00262
00266 void NoteTimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
00267
00272 void MultipleTimeouts(const RTPTime &curtime,const RTPTime &sendertimeout,
00273 const RTPTime &byetimeout,const RTPTime &generaltimeout,
00274 const RTPTime ¬etimeout);
00275
00277 int GetSenderCount() const { return sendercount; }
00278
00280 int GetTotalCount() const { return totalcount; }
00281
00283 int GetActiveMemberCount() const { return activecount; }
00284 #ifdef RTPDEBUG
00285 void Dump();
00286 void SafeCountTotal();
00287 void SafeCountSenders();
00288 void SafeCountActive();
00289 #endif // RTPDEBUG
00290 protected:
00292 virtual void OnRTPPacket(RTPPacket *pack,const RTPTime &receivetime, const RTPAddress *senderaddress) { }
00293
00295 virtual void OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,
00296 const RTPAddress *senderaddress) { }
00297
00303 virtual void OnSSRCCollision(RTPSourceData *srcdat,const RTPAddress *senderaddress,bool isrtp) { }
00304
00306 virtual void OnCNAMECollision(RTPSourceData *srcdat,const RTPAddress *senderaddress,
00307 const uint8_t *cname,size_t cnamelength) { }
00308
00310 virtual void OnNewSource(RTPSourceData *srcdat) { }
00311
00313 virtual void OnRemoveSource(RTPSourceData *srcdat) { }
00314
00316 virtual void OnTimeout(RTPSourceData *srcdat) { }
00317
00319 virtual void OnBYETimeout(RTPSourceData *srcdat) { }
00320
00322 virtual void OnBYEPacket(RTPSourceData *srcdat) { }
00323
00327 virtual void OnAPPPacket(RTCPAPPPacket *apppacket,const RTPTime &receivetime,
00328 const RTPAddress *senderaddress) { }
00329
00331 virtual void OnUnknownPacketType(RTCPPacket *rtcppack,const RTPTime &receivetime,
00332 const RTPAddress *senderaddress) { }
00333
00335 virtual void OnUnknownPacketFormat(RTCPPacket *rtcppack,const RTPTime &receivetime,
00336 const RTPAddress *senderaddress) { }
00337
00339 virtual void OnNoteTimeout(RTPSourceData *srcdat) { }
00340 private:
00341 void ClearSourceList();
00342 int ObtainSourceDataInstance(uint32_t ssrc,RTPInternalSourceData **srcdat,bool *created);
00343 int GetRTCPSourceData(uint32_t ssrc,const RTPAddress *senderaddress,RTPInternalSourceData **srcdat,bool *newsource);
00344 bool CheckCollision(RTPInternalSourceData *srcdat,const RTPAddress *senderaddress,bool isrtp);
00345
00346 RTPKeyHashTable<const uint32_t,RTPInternalSourceData*,RTPSources_GetHashIndex,RTPSOURCES_HASHSIZE> sourcelist;
00347
00348 int sendercount;
00349 int totalcount;
00350 int activecount;
00351
00352 #ifdef RTP_SUPPORT_PROBATION
00353 ProbationType probationtype;
00354 #endif // RTP_SUPPORT_PROBATION
00355
00356 RTPInternalSourceData *owndata;
00357 };
00358
00359 #endif // RTPSOURCES_H
00360