rtpsession.h

Go to the documentation of this file.
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 

Generated on Thu Feb 8 16:22:05 2007 for jrtplib by  doxygen 1.5.1