jrtplib 3.7.1
|
00001 /* 00002 00003 This file is a part of JRTPLIB 00004 Copyright (c) 1999-2007 Jori Liesenborgs 00005 00006 Contact: jori.liesenborgs@gmail.com 00007 00008 This library was developed at the "Expertisecentrum Digitale Media" 00009 (http://www.edm.uhasselt.be), a research center of the Hasselt University 00010 (http://www.uhasselt.be). The library is based upon work done for 00011 my thesis at the School for Knowledge Technology (Belgium/The Netherlands). 00012 00013 Permission is hereby granted, free of charge, to any person obtaining a 00014 copy of this software and associated documentation files (the "Software"), 00015 to deal in the Software without restriction, including without limitation 00016 the rights to use, copy, modify, merge, publish, distribute, sublicense, 00017 and/or sell copies of the Software, and to permit persons to whom the 00018 Software is furnished to do so, subject to the following conditions: 00019 00020 The above copyright notice and this permission notice shall be included 00021 in all copies or substantial portions of the Software. 00022 00023 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00024 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00025 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00026 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00027 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00028 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 00029 IN THE SOFTWARE. 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