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 RTPUDPV4TRANSMITTER_H
00038
00039 #define RTPUDPV4TRANSMITTER_H
00040
00041 #include "rtpconfig.h"
00042 #include "rtptransmitter.h"
00043 #include "rtpipv4destination.h"
00044 #include "rtphashtable.h"
00045 #include "rtpkeyhashtable.h"
00046 #include <list>
00047
00048 #ifdef RTP_SUPPORT_THREAD
00049 #include <jmutex.h>
00050 #endif // RTP_SUPPORT_THREAD
00051
00052 #define RTPUDPV4TRANS_HASHSIZE 8317
00053 #define RTPUDPV4TRANS_DEFAULTPORTBASE 5000
00054
00055 #define RTPUDPV4TRANS_RTPRECEIVEBUFFER 32768
00056 #define RTPUDPV4TRANS_RTCPRECEIVEBUFFER 32768
00057 #define RTPUDPV4TRANS_RTPTRANSMITBUFFER 32768
00058 #define RTPUDPV4TRANS_RTCPTRANSMITBUFFER 32768
00059
00061 class RTPUDPv4TransmissionParams : public RTPTransmissionParams
00062 {
00063 public:
00064 RTPUDPv4TransmissionParams():RTPTransmissionParams(RTPTransmitter::IPv4UDPProto) { portbase = RTPUDPV4TRANS_DEFAULTPORTBASE; bindIP = 0; multicastTTL = 1; mcastifaceIP = 0; rtpsendbuf = RTPUDPV4TRANS_RTPTRANSMITBUFFER; rtprecvbuf= RTPUDPV4TRANS_RTPRECEIVEBUFFER; rtcpsendbuf = RTPUDPV4TRANS_RTCPTRANSMITBUFFER; rtcprecvbuf = RTPUDPV4TRANS_RTCPRECEIVEBUFFER; }
00065
00067 void SetBindIP(uint32_t ip) { bindIP = ip; }
00068
00070 void SetMulticastInterfaceIP(uint32_t ip) { mcastifaceIP = ip; }
00071
00073 void SetPortbase(uint16_t pbase) { portbase = pbase; }
00074
00076 void SetMulticastTTL(uint8_t mcastTTL) { multicastTTL = mcastTTL; }
00077
00079 void SetLocalIPList(std::list<uint32_t> &iplist) { localIPs = iplist; }
00080
00085 void ClearLocalIPList() { localIPs.clear(); }
00086
00088 uint32_t GetBindIP() const { return bindIP; }
00089
00091 uint32_t GetMulticastInterfaceIP() const { return mcastifaceIP; }
00092
00094 uint16_t GetPortbase() const { return portbase; }
00095
00097 uint8_t GetMulticastTTL() const { return multicastTTL; }
00098
00100 const std::list<uint32_t> &GetLocalIPList() const { return localIPs; }
00101
00103 void SetRTPSendBuffer(int s) { rtpsendbuf = s; }
00104
00106 void SetRTPReceiveBuffer(int s) { rtprecvbuf = s; }
00107
00109 void SetRTCPSendBuffer(int s) { rtcpsendbuf = s; }
00110
00112 void SetRTCPReceiveBuffer(int s) { rtcprecvbuf = s; }
00113
00115 int GetRTPSendBuffer() const { return rtpsendbuf; }
00116
00118 int GetRTPReceiveBuffer() const { return rtprecvbuf; }
00119
00121 int GetRTCPSendBuffer() const { return rtcpsendbuf; }
00122
00124 int GetRTCPReceiveBuffer() const { return rtcprecvbuf; }
00125 private:
00126 uint16_t portbase;
00127 uint32_t bindIP, mcastifaceIP;
00128 std::list<uint32_t> localIPs;
00129 uint8_t multicastTTL;
00130 int rtpsendbuf, rtprecvbuf;
00131 int rtcpsendbuf, rtcprecvbuf;
00132 };
00133
00135 class RTPUDPv4TransmissionInfo : public RTPTransmissionInfo
00136 {
00137 public:
00138 #if ! (defined(WIN32) || defined(_WIN32_WCE))
00139 RTPUDPv4TransmissionInfo(std::list<uint32_t> iplist,int rtpsock,int rtcpsock) : RTPTransmissionInfo(RTPTransmitter::IPv4UDPProto)
00140 #else
00141 RTPUDPv4TransmissionInfo(std::list<uint32_t> iplist,SOCKET rtpsock,SOCKET rtcpsock) : RTPTransmissionInfo(RTPTransmitter::IPv4UDPProto)
00142 #endif // WIN32
00143 { localIPlist = iplist; rtpsocket = rtpsock; rtcpsocket = rtcpsock; }
00144
00145 ~RTPUDPv4TransmissionInfo() { }
00146
00148 std::list<uint32_t> GetLocalIPList() const { return localIPlist; }
00149 #if ! (defined(WIN32) || defined(_WIN32_WCE))
00150
00151 int GetRTPSocket() const { return rtpsocket; }
00152
00154 int GetRTCPSocket() const { return rtcpsocket; }
00155 #else
00156 SOCKET GetRTPSocket() const { return rtpsocket; }
00157 SOCKET GetRTCPSocket() const { return rtcpsocket; }
00158 #endif // WIN32
00159 private:
00160 std::list<uint32_t> localIPlist;
00161 #if ! (defined(WIN32) || defined(_WIN32_WCE))
00162 int rtpsocket,rtcpsocket;
00163 #else
00164 SOCKET rtpsocket,rtcpsocket;
00165 #endif // WIN32
00166 };
00167
00168 class RTPUDPv4Trans_GetHashIndex_IPv4Dest
00169 {
00170 public:
00171 static int GetIndex(const RTPIPv4Destination &d) { return d.GetIP()%RTPUDPV4TRANS_HASHSIZE; }
00172 };
00173
00174 class RTPUDPv4Trans_GetHashIndex_uint32_t
00175 {
00176 public:
00177 static int GetIndex(const uint32_t &k) { return k%RTPUDPV4TRANS_HASHSIZE; }
00178 };
00179
00180 #define RTPUDPV4TRANS_HEADERSIZE (20+8)
00181
00189 class RTPUDPv4Transmitter : public RTPTransmitter
00190 {
00191 public:
00192 RTPUDPv4Transmitter(RTPMemoryManager *mgr);
00193 ~RTPUDPv4Transmitter();
00194
00195 int Init(bool treadsafe);
00196 int Create(size_t maxpacksize,const RTPTransmissionParams *transparams);
00197 void Destroy();
00198 RTPTransmissionInfo *GetTransmissionInfo();
00199
00200 int GetLocalHostName(uint8_t *buffer,size_t *bufferlength);
00201 bool ComesFromThisTransmitter(const RTPAddress *addr);
00202 size_t GetHeaderOverhead() { return RTPUDPV4TRANS_HEADERSIZE; }
00203
00204 int Poll();
00205 int WaitForIncomingData(const RTPTime &delay,bool *dataavailable = 0);
00206 int AbortWait();
00207
00208 int SendRTPData(const void *data,size_t len);
00209 int SendRTCPData(const void *data,size_t len);
00210
00211 int AddDestination(const RTPAddress &addr);
00212 int DeleteDestination(const RTPAddress &addr);
00213 void ClearDestinations();
00214
00215 bool SupportsMulticasting();
00216 int JoinMulticastGroup(const RTPAddress &addr);
00217 int LeaveMulticastGroup(const RTPAddress &addr);
00218 void LeaveAllMulticastGroups();
00219
00220 int SetReceiveMode(RTPTransmitter::ReceiveMode m);
00221 int AddToIgnoreList(const RTPAddress &addr);
00222 int DeleteFromIgnoreList(const RTPAddress &addr);
00223 void ClearIgnoreList();
00224 int AddToAcceptList(const RTPAddress &addr);
00225 int DeleteFromAcceptList(const RTPAddress &addr);
00226 void ClearAcceptList();
00227 int SetMaximumPacketSize(size_t s);
00228
00229 bool NewDataAvailable();
00230 RTPRawPacket *GetNextPacket();
00231 #ifdef RTPDEBUG
00232 void Dump();
00233 #endif // RTPDEBUG
00234 private:
00235 int CreateLocalIPList();
00236 bool GetLocalIPList_Interfaces();
00237 void GetLocalIPList_DNS();
00238 void AddLoopbackAddress();
00239 void FlushPackets();
00240 int PollSocket(bool rtp);
00241 int ProcessAddAcceptIgnoreEntry(uint32_t ip,uint16_t port);
00242 int ProcessDeleteAcceptIgnoreEntry(uint32_t ip,uint16_t port);
00243 #ifdef RTP_SUPPORT_IPV4MULTICAST
00244 bool SetMulticastTTL(uint8_t ttl);
00245 #endif // RTP_SUPPORT_IPV4MULTICAST
00246 bool ShouldAcceptData(uint32_t srcip,uint16_t srcport);
00247 void ClearAcceptIgnoreInfo();
00248
00249 bool init;
00250 bool created;
00251 bool waitingfordata;
00252 #if (defined(WIN32) || defined(_WIN32_WCE))
00253 SOCKET rtpsock,rtcpsock;
00254 #else // not using winsock
00255 int rtpsock,rtcpsock;
00256 #endif // WIN32
00257 uint32_t bindIP, mcastifaceIP;
00258 std::list<uint32_t> localIPs;
00259 uint16_t portbase;
00260 uint8_t multicastTTL;
00261 RTPTransmitter::ReceiveMode receivemode;
00262
00263 uint8_t *localhostname;
00264 size_t localhostnamelength;
00265
00266 RTPHashTable<const RTPIPv4Destination,RTPUDPv4Trans_GetHashIndex_IPv4Dest,RTPUDPV4TRANS_HASHSIZE> destinations;
00267 #ifdef RTP_SUPPORT_IPV4MULTICAST
00268 RTPHashTable<const uint32_t,RTPUDPv4Trans_GetHashIndex_uint32_t,RTPUDPV4TRANS_HASHSIZE> multicastgroups;
00269 #endif // RTP_SUPPORT_IPV4MULTICAST
00270 std::list<RTPRawPacket*> rawpacketlist;
00271
00272 bool supportsmulticasting;
00273 size_t maxpacksize;
00274
00275 class PortInfo
00276 {
00277 public:
00278 PortInfo() { all = false; }
00279
00280 bool all;
00281 std::list<uint16_t> portlist;
00282 };
00283
00284 RTPKeyHashTable<const uint32_t,PortInfo*,RTPUDPv4Trans_GetHashIndex_uint32_t,RTPUDPV4TRANS_HASHSIZE> acceptignoreinfo;
00285
00286
00287 #if (defined(WIN32) || defined(_WIN32_WCE))
00288 SOCKET abortdesc[2];
00289 #else
00290 int abortdesc[2];
00291 #endif // WIN32
00292 int CreateAbortDescriptors();
00293 void DestroyAbortDescriptors();
00294 void AbortWaitInternal();
00295 #ifdef RTP_SUPPORT_THREAD
00296 JMutex mainmutex,waitmutex;
00297 int threadsafe;
00298 #endif // RTP_SUPPORT_THREAD
00299 };
00300
00301 #endif // RTPUDPV4TRANSMITTER_H
00302