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 RTPSESSION_H
00038
00039 #define RTPSESSION_H
00040
00041 #include "rtpconfig.h"
00042 #include "rtplibraryversion.h"
00043 #include "rtppacketbuilder.h"
00044 #include "rtpsessionsources.h"
00045 #include "rtptransmitter.h"
00046 #include "rtpcollisionlist.h"
00047 #include "rtcpscheduler.h"
00048 #include "rtcppacketbuilder.h"
00049 #include "rtptimeutilities.h"
00050 #include "rtcpcompoundpacketbuilder.h"
00051 #include "rtpmemoryobject.h"
00052 #include <list>
00053
00054 #ifdef RTP_SUPPORT_THREAD
00055 #include <jmutex.h>
00056 #endif // RTP_SUPPORT_THREAD
00057
00058 class RTPTransmitter;
00059 class RTPSessionParams;
00060 class RTPTransmissionParams;
00061 class RTPAddress;
00062 class RTPSourceData;
00063 class RTPPacket;
00064 class RTPPollThread;
00065 class RTPTransmissionInfo;
00066 class RTCPCompoundPacket;
00067 class RTCPPacket;
00068 class RTCPAPPPacket;
00069
00076 class RTPSession : public RTPMemoryObject
00077 {
00078 public:
00080 RTPSession(RTPMemoryManager *mgr = 0);
00081 virtual ~RTPSession();
00082
00089 int Create(const RTPSessionParams &sessparams,const RTPTransmissionParams *transparams = 0, RTPTransmitter::TransmissionProtocol proto = RTPTransmitter::IPv4UDPProto);
00090
00098 int Create(const RTPSessionParams &sessparams,RTPTransmitter *transmitter);
00099
00101 void Destroy();
00102
00108 void BYEDestroy(const RTPTime &maxwaittime,const void *reason,size_t reasonlength);
00109
00111 bool IsActive();
00112
00114 uint32_t GetLocalSSRC();
00115
00117 int AddDestination(const RTPAddress &addr);
00118
00120 int DeleteDestination(const RTPAddress &addr);
00121
00123 void ClearDestinations();
00124
00126 bool SupportsMulticasting();
00127
00129 int JoinMulticastGroup(const RTPAddress &addr);
00130
00132 int LeaveMulticastGroup(const RTPAddress &addr);
00133
00135 void LeaveAllMulticastGroups();
00136
00142 int SendPacket(const void *data,size_t len);
00143
00148 int SendPacket(const void *data,size_t len,
00149 uint8_t pt,bool mark,uint32_t timestampinc);
00150
00157 int SendPacketEx(const void *data,size_t len,
00158 uint16_t hdrextID,const void *hdrextdata,size_t numhdrextwords);
00159
00166 int SendPacketEx(const void *data,size_t len,
00167 uint8_t pt,bool mark,uint32_t timestampinc,
00168 uint16_t hdrextID,const void *hdrextdata,size_t numhdrextwords);
00169 #ifdef RTP_SUPPORT_SENDAPP
00170
00177 int SendRTCPAPPPacket(uint8_t subtype, const uint8_t name[4], const void *appdata, size_t appdatalen);
00178 #endif // RTP_SUPPORT_SENDAPP
00179
00181 int SetDefaultPayloadType(uint8_t pt);
00182
00184 int SetDefaultMark(bool m);
00185
00187 int SetDefaultTimestampIncrement(uint32_t timestampinc);
00188
00195 int IncrementTimestamp(uint32_t inc);
00196
00204 int IncrementTimestampDefault();
00205
00212 int SetPreTransmissionDelay(const RTPTime &delay);
00213
00221 RTPTransmissionInfo *GetTransmissionInfo();
00222
00224 void DeleteTransmissionInfo(RTPTransmissionInfo *inf);
00225
00229 int Poll();
00230
00236 int WaitForIncomingData(const RTPTime &delay,bool *dataavailable = 0);
00237
00241 int AbortWait();
00242
00246 RTPTime GetRTCPDelay();
00247
00254 int BeginDataAccess();
00255
00260 bool GotoFirstSource();
00261
00266 bool GotoNextSource();
00267
00272 bool GotoPreviousSource();
00273
00280 bool GotoFirstSourceWithData();
00281
00288 bool GotoNextSourceWithData();
00289
00296 bool GotoPreviousSourceWithData();
00297
00299 RTPSourceData *GetCurrentSourceInfo();
00300
00304 RTPSourceData *GetSourceInfo(uint32_t ssrc);
00305
00312 RTPPacket *GetNextPacket();
00313
00315 void DeletePacket(RTPPacket *p);
00316
00318 int EndDataAccess();
00319
00324 int SetReceiveMode(RTPTransmitter::ReceiveMode m);
00325
00327 int AddToIgnoreList(const RTPAddress &addr);
00328
00330 int DeleteFromIgnoreList(const RTPAddress &addr);
00331
00333 void ClearIgnoreList();
00334
00336 int AddToAcceptList(const RTPAddress &addr);
00337
00339 int DeleteFromAcceptList(const RTPAddress &addr);
00340
00342 void ClearAcceptList();
00343
00345 int SetMaximumPacketSize(size_t s);
00346
00348 int SetSessionBandwidth(double bw);
00349
00356 int SetTimestampUnit(double u);
00357
00364 void SetNameInterval(int count);
00365
00372 void SetEMailInterval(int count);
00373
00380 void SetLocationInterval(int count);
00381
00388 void SetPhoneInterval(int count);
00389
00396 void SetToolInterval(int count);
00397
00404 void SetNoteInterval(int count);
00405
00407 int SetLocalName(const void *s,size_t len);
00408
00410 int SetLocalEMail(const void *s,size_t len);
00411
00413 int SetLocalLocation(const void *s,size_t len);
00414
00416 int SetLocalPhone(const void *s,size_t len);
00417
00419 int SetLocalTool(const void *s,size_t len);
00420
00422 int SetLocalNote(const void *s,size_t len);
00423
00424 #ifdef RTPDEBUG
00425 void DumpSources();
00426 void DumpTransmitter();
00427 #endif // RTPDEBUG
00428 protected:
00436 virtual RTPTransmitter *NewUserDefinedTransmitter() { return 0; }
00437
00439 virtual void OnRTPPacket(RTPPacket *pack,const RTPTime &receivetime,
00440 const RTPAddress *senderaddress) { }
00441
00443 virtual void OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,
00444 const RTPAddress *senderaddress) { }
00445
00451 virtual void OnSSRCCollision(RTPSourceData *srcdat,const RTPAddress *senderaddress,bool isrtp) { }
00452
00454 virtual void OnCNAMECollision(RTPSourceData *srcdat,const RTPAddress *senderaddress,
00455 const uint8_t *cname,size_t cnamelength) { }
00456
00458 virtual void OnNewSource(RTPSourceData *srcdat) { }
00459
00461 virtual void OnRemoveSource(RTPSourceData *srcdat) { }
00462
00464 virtual void OnTimeout(RTPSourceData *srcdat) { }
00465
00467 virtual void OnBYETimeout(RTPSourceData *srcdat) { }
00468
00472 virtual void OnAPPPacket(RTCPAPPPacket *apppacket,const RTPTime &receivetime,
00473 const RTPAddress *senderaddress) { }
00474
00476 virtual void OnUnknownPacketType(RTCPPacket *rtcppack,const RTPTime &receivetime,
00477 const RTPAddress *senderaddress) { }
00478
00480 virtual void OnUnknownPacketFormat(RTCPPacket *rtcppack,const RTPTime &receivetime,
00481 const RTPAddress *senderaddress) { }
00482
00484 virtual void OnNoteTimeout(RTPSourceData *srcdat) { }
00485
00487 virtual void OnBYEPacket(RTPSourceData *srcdat) { }
00488
00490 virtual void OnSendRTCPCompoundPacket(RTCPCompoundPacket *pack) { }
00491 #ifdef RTP_SUPPORT_THREAD
00492
00493 virtual void OnPollThreadError(int errcode) { }
00494
00499 virtual void OnPollThreadStep() { }
00500 #endif // RTP_SUPPORT_THREAD
00501 private:
00502 int InternalCreate(const RTPSessionParams &sessparams);
00503 int CreateCNAME(uint8_t *buffer,size_t *bufferlength,bool resolve);
00504 int ProcessPolledData();
00505 int ProcessRTCPCompoundPacket(RTCPCompoundPacket &rtcpcomppack,RTPRawPacket *pack);
00506
00507 RTPTransmitter *rtptrans;
00508 bool created;
00509 bool deletetransmitter;
00510 bool usingpollthread;
00511 bool acceptownpackets;
00512 bool useSR_BYEifpossible;
00513 size_t maxpacksize;
00514 double sessionbandwidth;
00515 double controlfragment;
00516 double sendermultiplier;
00517 double byemultiplier;
00518 double membermultiplier;
00519 double collisionmultiplier;
00520 double notemultiplier;
00521 bool sentpackets;
00522
00523 RTPSessionSources sources;
00524 RTPPacketBuilder packetbuilder;
00525 RTCPScheduler rtcpsched;
00526 RTCPPacketBuilder rtcpbuilder;
00527 RTPCollisionList collisionlist;
00528
00529 std::list<RTCPCompoundPacket *> byepackets;
00530
00531 #ifdef RTP_SUPPORT_THREAD
00532 RTPPollThread *pollthread;
00533 JMutex sourcesmutex,buildermutex,schedmutex,packsentmutex;
00534
00535 friend class RTPPollThread;
00536 #endif // RTP_SUPPORT_THREAD
00537 friend class RTPSessionSources;
00538 friend class RTCPSessionPacketBuilder;
00539 };
00540
00541 #endif // RTPSESSION_H
00542