JRTPLIB  3.11.1
rtpsources.h
Go to the documentation of this file.
1 /*
2 
3  This file is a part of JRTPLIB
4  Copyright (c) 1999-2017 Jori Liesenborgs
5 
6  Contact: jori.liesenborgs@gmail.com
7 
8  This library was developed at the Expertise Centre for Digital Media
9  (http://www.edm.uhasselt.be), a research center of the Hasselt University
10  (http://www.uhasselt.be). The library is based upon work done for
11  my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
12 
13  Permission is hereby granted, free of charge, to any person obtaining a
14  copy of this software and associated documentation files (the "Software"),
15  to deal in the Software without restriction, including without limitation
16  the rights to use, copy, modify, merge, publish, distribute, sublicense,
17  and/or sell copies of the Software, and to permit persons to whom the
18  Software is furnished to do so, subject to the following conditions:
19 
20  The above copyright notice and this permission notice shall be included
21  in all copies or substantial portions of the Software.
22 
23  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29  IN THE SOFTWARE.
30 
31 */
32 
37 #ifndef RTPSOURCES_H
38 
39 #define RTPSOURCES_H
40 
41 #include "rtpconfig.h"
42 #include "rtpkeyhashtable.h"
43 #include "rtcpsdespacket.h"
44 #include "rtptypes.h"
45 #include "rtpmemoryobject.h"
46 
47 #define RTPSOURCES_HASHSIZE 8317
48 
49 namespace jrtplib
50 {
51 
52 class JRTPLIB_IMPORTEXPORT RTPSources_GetHashIndex
53 {
54 public:
55  static int GetIndex(const uint32_t &ssrc) { return ssrc%RTPSOURCES_HASHSIZE; }
56 };
57 
58 class RTPNTPTime;
59 class RTPTransmitter;
60 class RTCPAPPPacket;
61 class RTPInternalSourceData;
62 class RTPRawPacket;
63 class RTPPacket;
64 class RTPTime;
65 class RTPAddress;
66 class RTPSourceData;
67 
74 class JRTPLIB_IMPORTEXPORT RTPSources : public RTPMemoryObject
75 {
76 public:
79  {
82  ProbationStore
83  };
84 
86  RTPSources(ProbationType = ProbationStore,RTPMemoryManager *mgr = 0);
87  virtual ~RTPSources();
88 
90  void Clear();
91 #ifdef RTP_SUPPORT_PROBATION
92 
93  void SetProbationType(ProbationType probtype) { probationtype = probtype; }
94 #endif // RTP_SUPPORT_PROBATION
95 
97  int CreateOwnSSRC(uint32_t ssrc);
98 
100  int DeleteOwnSSRC();
101 
106  void SentRTPPacket();
107 
113  int ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *trans,bool acceptownpackets);
114 
120  int ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *trans[],int numtrans,bool acceptownpackets);
121 
129  int ProcessRTPPacket(RTPPacket *rtppack,const RTPTime &receivetime,const RTPAddress *senderaddress,bool *stored);
130 
135  int ProcessRTCPCompoundPacket(RTCPCompoundPacket *rtcpcomppack,const RTPTime &receivetime,
136  const RTPAddress *senderaddress);
137 
143  int ProcessRTCPSenderInfo(uint32_t ssrc,const RTPNTPTime &ntptime,uint32_t rtptime,
144  uint32_t packetcount,uint32_t octetcount,const RTPTime &receivetime,
145  const RTPAddress *senderaddress);
146 
152  int ProcessRTCPReportBlock(uint32_t ssrc,uint8_t fractionlost,int32_t lostpackets,
153  uint32_t exthighseqnr,uint32_t jitter,uint32_t lsr,
154  uint32_t dlsr,const RTPTime &receivetime,const RTPAddress *senderaddress);
155 
161  int ProcessSDESNormalItem(uint32_t ssrc,RTCPSDESPacket::ItemType t,size_t itemlength,
162  const void *itemdata,const RTPTime &receivetime,const RTPAddress *senderaddress);
163 #ifdef RTP_SUPPORT_SDESPRIV
164 
169  int ProcessSDESPrivateItem(uint32_t ssrc,size_t prefixlen,const void *prefixdata,
170  size_t valuelen,const void *valuedata,const RTPTime &receivetime,
171  const RTPAddress *senderaddress);
172 #endif //RTP_SUPPORT_SDESPRIV
173 
178  int ProcessBYE(uint32_t ssrc,size_t reasonlength,const void *reasondata,const RTPTime &receivetime,
179  const RTPAddress *senderaddress);
180 
190  int UpdateReceiveTime(uint32_t ssrc,const RTPTime &receivetime,const RTPAddress *senderaddress);
191 
196  bool GotoFirstSource();
197 
202  bool GotoNextSource();
203 
208  bool GotoPreviousSource();
209 
216  bool GotoFirstSourceWithData();
217 
224  bool GotoNextSourceWithData();
225 
232  bool GotoPreviousSourceWithData();
233 
235  RTPSourceData *GetCurrentSourceInfo();
236 
240  RTPSourceData *GetSourceInfo(uint32_t ssrc);
241 
243  RTPPacket *GetNextPacket();
244 
246  bool GotEntry(uint32_t ssrc);
247 
249  RTPSourceData *GetOwnSourceInfo() { return (RTPSourceData *)owndata; }
250 
254  void Timeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
255 
259  void SenderTimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
260 
264  void BYETimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
265 
269  void NoteTimeout(const RTPTime &curtime,const RTPTime &timeoutdelay);
270 
275  void MultipleTimeouts(const RTPTime &curtime,const RTPTime &sendertimeout,
276  const RTPTime &byetimeout,const RTPTime &generaltimeout,
277  const RTPTime &notetimeout);
278 
280  int GetSenderCount() const { return sendercount; }
281 
283  int GetTotalCount() const { return totalcount; }
284 
286  int GetActiveMemberCount() const { return activecount; }
287 #ifdef RTPDEBUG
288  void Dump();
289  void SafeCountTotal();
290  void SafeCountSenders();
291  void SafeCountActive();
292 #endif // RTPDEBUG
293 protected:
295  virtual void OnRTPPacket(RTPPacket *pack,const RTPTime &receivetime, const RTPAddress *senderaddress);
296 
298  virtual void OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,
299  const RTPAddress *senderaddress);
300 
306  virtual void OnSSRCCollision(RTPSourceData *srcdat,const RTPAddress *senderaddress,bool isrtp);
307 
309  virtual void OnCNAMECollision(RTPSourceData *srcdat,const RTPAddress *senderaddress,
310  const uint8_t *cname,size_t cnamelength);
311 
313  virtual void OnNewSource(RTPSourceData *srcdat);
314 
316  virtual void OnRemoveSource(RTPSourceData *srcdat);
317 
319  virtual void OnTimeout(RTPSourceData *srcdat);
320 
322  virtual void OnBYETimeout(RTPSourceData *srcdat);
323 
325  virtual void OnBYEPacket(RTPSourceData *srcdat);
326 
328  virtual void OnRTCPSenderReport(RTPSourceData *srcdat);
329 
331  virtual void OnRTCPReceiverReport(RTPSourceData *srcdat);
332 
334  virtual void OnRTCPSDESItem(RTPSourceData *srcdat, RTCPSDESPacket::ItemType t,
335  const void *itemdata, size_t itemlength);
336 #ifdef RTP_SUPPORT_SDESPRIV
337 
338  virtual void OnRTCPSDESPrivateItem(RTPSourceData *srcdat, const void *prefixdata, size_t prefixlen,
339  const void *valuedata, size_t valuelen);
340 #endif // RTP_SUPPORT_SDESPRIV
341 
342 
346  virtual void OnAPPPacket(RTCPAPPPacket *apppacket,const RTPTime &receivetime,
347  const RTPAddress *senderaddress);
348 
350  virtual void OnUnknownPacketType(RTCPPacket *rtcppack,const RTPTime &receivetime,
351  const RTPAddress *senderaddress);
352 
354  virtual void OnUnknownPacketFormat(RTCPPacket *rtcppack,const RTPTime &receivetime,
355  const RTPAddress *senderaddress);
356 
358  virtual void OnNoteTimeout(RTPSourceData *srcdat);
359 
364  virtual void OnValidatedRTPPacket(RTPSourceData *srcdat, RTPPacket *rtppack, bool isonprobation, bool *ispackethandled);
365 private:
366  void ClearSourceList();
367  int ObtainSourceDataInstance(uint32_t ssrc,RTPInternalSourceData **srcdat,bool *created);
368  int GetRTCPSourceData(uint32_t ssrc,const RTPAddress *senderaddress,RTPInternalSourceData **srcdat,bool *newsource);
369  bool CheckCollision(RTPInternalSourceData *srcdat,const RTPAddress *senderaddress,bool isrtp);
370 
371  RTPKeyHashTable<const uint32_t,RTPInternalSourceData*,RTPSources_GetHashIndex,RTPSOURCES_HASHSIZE> sourcelist;
372 
373  int sendercount;
374  int totalcount;
375  int activecount;
376 
377 #ifdef RTP_SUPPORT_PROBATION
378  ProbationType probationtype;
379 #endif // RTP_SUPPORT_PROBATION
380 
381  RTPInternalSourceData *owndata;
382 
383  friend class RTPInternalSourceData;
384 };
385 
386 // Inlining the default implementations to avoid unused-parameter errors.
387 inline void RTPSources::OnRTPPacket(RTPPacket *, const RTPTime &, const RTPAddress *) { }
389 inline void RTPSources::OnSSRCCollision(RTPSourceData *, const RTPAddress *, bool) { }
390 inline void RTPSources::OnCNAMECollision(RTPSourceData *, const RTPAddress *, const uint8_t *, size_t) { }
398 inline void RTPSources::OnRTCPSDESItem(RTPSourceData *, RTCPSDESPacket::ItemType, const void *, size_t) { }
399 #ifdef RTP_SUPPORT_SDESPRIV
400 inline void RTPSources::OnRTCPSDESPrivateItem(RTPSourceData *, const void *, size_t, const void *, size_t) { }
401 #endif // RTP_SUPPORT_SDESPRIV
402 inline void RTPSources::OnAPPPacket(RTCPAPPPacket *, const RTPTime &, const RTPAddress *) { }
403 inline void RTPSources::OnUnknownPacketType(RTCPPacket *, const RTPTime &, const RTPAddress *) { }
406 inline void RTPSources::OnValidatedRTPPacket(RTPSourceData *, RTPPacket *, bool, bool *) { }
407 
408 } // end namespace
409 
410 #endif // RTPSOURCES_H
411 
virtual void OnRemoveSource(RTPSourceData *srcdat)
Is called when the entry srcdat is about to be deleted from the source table.
Definition: rtpsources.h:392
virtual void OnRTCPSenderReport(RTPSourceData *srcdat)
Is called when an RTCP sender report has been processed for this source.
Definition: rtpsources.h:396
Describes an RTCP APP packet.
Definition: rtcpapppacket.h:54
This class is used by the transmission component to store the incoming RTP and RTCP data in...
Definition: rtprawpacket.h:51
virtual void OnBYEPacket(RTPSourceData *srcdat)
Is called when a BYE packet has been processed for source srcdat.
Definition: rtpsources.h:395
virtual void OnRTCPSDESPrivateItem(RTPSourceData *srcdat, const void *prefixdata, size_t prefixlen, const void *valuedata, size_t valuelen)
Is called when a specific SDES item of &#39;private&#39; type was received for this source.
Definition: rtpsources.h:400
int GetSenderCount() const
Returns the number of participants which are marked as a sender.
Definition: rtpsources.h:280
virtual void OnRTCPCompoundPacket(RTCPCompoundPacket *pack, const RTPTime &receivetime, const RTPAddress *senderaddress)
Is called when an RTCP compound packet is about to be processed.
Definition: rtpsources.h:388
virtual void OnSSRCCollision(RTPSourceData *srcdat, const RTPAddress *senderaddress, bool isrtp)
Is called when an SSRC collision was detected.
Definition: rtpsources.h:389
virtual void OnUnknownPacketType(RTCPPacket *rtcppack, const RTPTime &receivetime, const RTPAddress *senderaddress)
Is called when an unknown RTCP packet type was detected.
Definition: rtpsources.h:403
virtual void OnBYETimeout(RTPSourceData *srcdat)
Is called when participant srcdat is timed after having sent a BYE packet.
Definition: rtpsources.h:394
Represents an RTCP compound packet.
Definition: rtcpcompoundpacket.h:53
void SetProbationType(ProbationType probtype)
Changes the current probation type.
Definition: rtpsources.h:93
virtual void OnUnknownPacketFormat(RTCPPacket *rtcppack, const RTPTime &receivetime, const RTPAddress *senderaddress)
Is called when an unknown packet format for a known packet type was detected.
Definition: rtpsources.h:404
virtual void OnTimeout(RTPSourceData *srcdat)
Is called when participant srcdat is timed out.
Definition: rtpsources.h:393
virtual void OnCNAMECollision(RTPSourceData *srcdat, const RTPAddress *senderaddress, const uint8_t *cname, size_t cnamelength)
Is called when another CNAME was received than the one already present for source srcdat...
Definition: rtpsources.h:390
int GetTotalCount() const
Returns the total number of entries in the source table.
Definition: rtpsources.h:283
virtual void OnRTCPSDESItem(RTPSourceData *srcdat, RTCPSDESPacket::ItemType t, const void *itemdata, size_t itemlength)
Is called when a specific SDES item was received for this source.
Definition: rtpsources.h:398
This is a simple wrapper for the most significant word (MSW) and least significant word (LSW) of an N...
Definition: rtptimeutilities.h:65
ProbationType
Type of probation to use for new sources.
Definition: rtpsources.h:78
virtual void OnRTPPacket(RTPPacket *pack, const RTPTime &receivetime, const RTPAddress *senderaddress)
Is called when an RTP packet is about to be processed.
Definition: rtpsources.h:387
This class is an abstract class which is used to specify destinations, multicast groups etc...
Definition: rtpaddress.h:50
ItemType
Identifies the type of an SDES item.
Definition: rtcpsdespacket.h:59
virtual void OnNewSource(RTPSourceData *srcdat)
Is called when a new entry srcdat is added to the source table.
Definition: rtpsources.h:391
Represents a table in which information about the participating sources is kept.
Definition: rtpsources.h:74
int GetActiveMemberCount() const
Returns the number of members which have been validated and which haven&#39;t sent a BYE packet yet...
Definition: rtpsources.h:286
Describes an entry in the RTPSources source table.
Definition: rtpsourcedata.h:166
Discard incoming RTP packets originating from a source that&#39;s on probation.
Definition: rtpsources.h:81
RTPSourceData * GetOwnSourceInfo()
If present, it returns the RTPSourceData instance of the entry which was created by CreateOwnSSRC...
Definition: rtpsources.h:249
Abstract class from which actual transmission components should be derived.
Definition: rtptransmitter.h:62
Definition: rtpfaketransmitter.h:64
This class is used to specify wallclock time, delay intervals etc.
Definition: rtptimeutilities.h:84
A memory manager.
Definition: rtpmemorymanager.h:150
virtual void OnValidatedRTPPacket(RTPSourceData *srcdat, RTPPacket *rtppack, bool isonprobation, bool *ispackethandled)
Allows you to use an RTP packet from the specified source directly.
Definition: rtpsources.h:406
Represents an RTP Packet.
Definition: rtppacket.h:56
Don&#39;t use the probation algorithm; accept RTP packets immediately.
Definition: rtpsources.h:80
virtual void OnNoteTimeout(RTPSourceData *srcdat)
Is called when the SDES NOTE item for source srcdat has been timed out.
Definition: rtpsources.h:405
Base class for specific types of RTCP packets.
Definition: rtcppacket.h:50
virtual void OnRTCPReceiverReport(RTPSourceData *srcdat)
Is called when an RTCP receiver report has been processed for this source.
Definition: rtpsources.h:397
virtual void OnAPPPacket(RTCPAPPPacket *apppacket, const RTPTime &receivetime, const RTPAddress *senderaddress)
Is called when an RTCP APP packet apppacket has been received at time receivetime from address sender...
Definition: rtpsources.h:402