summaryrefslogtreecommitdiffstats
path: root/src/rtpudpv4transmitter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtpudpv4transmitter.h')
-rw-r--r--src/rtpudpv4transmitter.h302
1 files changed, 302 insertions, 0 deletions
diff --git a/src/rtpudpv4transmitter.h b/src/rtpudpv4transmitter.h
new file mode 100644
index 0000000..d96d6ea
--- /dev/null
+++ b/src/rtpudpv4transmitter.h
@@ -0,0 +1,302 @@
+/*
+
+ This file is a part of JRTPLIB
+ Copyright (c) 1999-2007 Jori Liesenborgs
+
+ Contact: jori.liesenborgs@gmail.com
+
+ This library was developed at the "Expertisecentrum Digitale Media"
+ (http://www.edm.uhasselt.be), a research center of the Hasselt University
+ (http://www.uhasselt.be). The library is based upon work done for
+ my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ IN THE SOFTWARE.
+
+*/
+
+/**
+ * \file rtpudpv4transmitter.h
+ */
+
+#ifndef RTPUDPV4TRANSMITTER_H
+
+#define RTPUDPV4TRANSMITTER_H
+
+#include "rtpconfig.h"
+#include "rtptransmitter.h"
+#include "rtpipv4destination.h"
+#include "rtphashtable.h"
+#include "rtpkeyhashtable.h"
+#include <list>
+
+#ifdef RTP_SUPPORT_THREAD
+ #include <jmutex.h>
+#endif // RTP_SUPPORT_THREAD
+
+#define RTPUDPV4TRANS_HASHSIZE 8317
+#define RTPUDPV4TRANS_DEFAULTPORTBASE 5000
+
+#define RTPUDPV4TRANS_RTPRECEIVEBUFFER 32768
+#define RTPUDPV4TRANS_RTCPRECEIVEBUFFER 32768
+#define RTPUDPV4TRANS_RTPTRANSMITBUFFER 32768
+#define RTPUDPV4TRANS_RTCPTRANSMITBUFFER 32768
+
+/** Parameters for the UDP over IPv4 transmitter. */
+class RTPUDPv4TransmissionParams : public RTPTransmissionParams
+{
+public:
+ 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; }
+
+ /** Sets the IP address which is used to bind the sockets to \c ip. */
+ void SetBindIP(uint32_t ip) { bindIP = ip; }
+
+ /** Sets the multicast interface IP address. */
+ void SetMulticastInterfaceIP(uint32_t ip) { mcastifaceIP = ip; }
+
+ /** Sets the RTP portbase to \c pbase. This has to be an even number. */
+ void SetPortbase(uint16_t pbase) { portbase = pbase; }
+
+ /** Sets the multicast TTL to be used to \c mcastTTL. */
+ void SetMulticastTTL(uint8_t mcastTTL) { multicastTTL = mcastTTL; }
+
+ /** Passes a list of IP addresses which will be used as the local IP addresses. */
+ void SetLocalIPList(std::list<uint32_t> &iplist) { localIPs = iplist; }
+
+ /** Clears the list of local IP addresses.
+ * Clears the list of local IP addresses. An empty list will make the transmission
+ * component itself determine the local IP addresses.
+ */
+ void ClearLocalIPList() { localIPs.clear(); }
+
+ /** Returns the IP address which will be used to bind the sockets. */
+ uint32_t GetBindIP() const { return bindIP; }
+
+ /** Returns the multicast interface IP address. */
+ uint32_t GetMulticastInterfaceIP() const { return mcastifaceIP; }
+
+ /** Returns the RTP portbase which will be used (default is 5000). */
+ uint16_t GetPortbase() const { return portbase; }
+
+ /** Returns the multicast TTL which will be used (default is 1). */
+ uint8_t GetMulticastTTL() const { return multicastTTL; }
+
+ /** Returns the list of local IP addresses. */
+ const std::list<uint32_t> &GetLocalIPList() const { return localIPs; }
+
+ /** Sets the RTP socket's send buffer size. */
+ void SetRTPSendBuffer(int s) { rtpsendbuf = s; }
+
+ /** Sets the RTP socket's receive buffer size. */
+ void SetRTPReceiveBuffer(int s) { rtprecvbuf = s; }
+
+ /** Sets the RTCP socket's send buffer size. */
+ void SetRTCPSendBuffer(int s) { rtcpsendbuf = s; }
+
+ /** Sets the RTCP socket's receive buffer size. */
+ void SetRTCPReceiveBuffer(int s) { rtcprecvbuf = s; }
+
+ /** Returns the RTP socket's send buffer size. */
+ int GetRTPSendBuffer() const { return rtpsendbuf; }
+
+ /** Returns the RTP socket's receive buffer size. */
+ int GetRTPReceiveBuffer() const { return rtprecvbuf; }
+
+ /** Returns the RTCP socket's send buffer size. */
+ int GetRTCPSendBuffer() const { return rtcpsendbuf; }
+
+ /** Returns the RTCP socket's receive buffer size. */
+ int GetRTCPReceiveBuffer() const { return rtcprecvbuf; }
+private:
+ uint16_t portbase;
+ uint32_t bindIP, mcastifaceIP;
+ std::list<uint32_t> localIPs;
+ uint8_t multicastTTL;
+ int rtpsendbuf, rtprecvbuf;
+ int rtcpsendbuf, rtcprecvbuf;
+};
+
+/** Additional information about the UDP over IPv4 transmitter. */
+class RTPUDPv4TransmissionInfo : public RTPTransmissionInfo
+{
+public:
+#if ! (defined(WIN32) || defined(_WIN32_WCE))
+ RTPUDPv4TransmissionInfo(std::list<uint32_t> iplist,int rtpsock,int rtcpsock) : RTPTransmissionInfo(RTPTransmitter::IPv4UDPProto)
+#else
+ RTPUDPv4TransmissionInfo(std::list<uint32_t> iplist,SOCKET rtpsock,SOCKET rtcpsock) : RTPTransmissionInfo(RTPTransmitter::IPv4UDPProto)
+#endif // WIN32
+ { localIPlist = iplist; rtpsocket = rtpsock; rtcpsocket = rtcpsock; }
+
+ ~RTPUDPv4TransmissionInfo() { }
+
+ /** Returns the list of IPv4 addresses the transmitter considers to be the local IP addresses. */
+ std::list<uint32_t> GetLocalIPList() const { return localIPlist; }
+#if ! (defined(WIN32) || defined(_WIN32_WCE))
+ /** Returns the socket descriptor used for receiving and transmitting RTP packets. */
+ int GetRTPSocket() const { return rtpsocket; }
+
+ /** Returns the socket descriptor used for receiving and transmitting RTCP packets. */
+ int GetRTCPSocket() const { return rtcpsocket; }
+#else
+ SOCKET GetRTPSocket() const { return rtpsocket; }
+ SOCKET GetRTCPSocket() const { return rtcpsocket; }
+#endif // WIN32
+private:
+ std::list<uint32_t> localIPlist;
+#if ! (defined(WIN32) || defined(_WIN32_WCE))
+ int rtpsocket,rtcpsocket;
+#else
+ SOCKET rtpsocket,rtcpsocket;
+#endif // WIN32
+};
+
+class RTPUDPv4Trans_GetHashIndex_IPv4Dest
+{
+public:
+ static int GetIndex(const RTPIPv4Destination &d) { return d.GetIP()%RTPUDPV4TRANS_HASHSIZE; }
+};
+
+class RTPUDPv4Trans_GetHashIndex_uint32_t
+{
+public:
+ static int GetIndex(const uint32_t &k) { return k%RTPUDPV4TRANS_HASHSIZE; }
+};
+
+#define RTPUDPV4TRANS_HEADERSIZE (20+8)
+
+/** An UDP over IPv4 transmission component.
+ * This class inherits the RTPTransmitter interface and implements a transmission component
+ * which uses UDP over IPv4 to send and receive RTP and RTCP data. The component's parameters
+ * are described by the class RTPUDPv4TransmissionParams. The functions which have an RTPAddress
+ * argument require an argument of RTPIPv4Address. The GetTransmissionInfo member function
+ * returns an instance of type RTPUDPv4TransmissionInfo.
+ */
+class RTPUDPv4Transmitter : public RTPTransmitter
+{
+public:
+ RTPUDPv4Transmitter(RTPMemoryManager *mgr);
+ ~RTPUDPv4Transmitter();
+
+ int Init(bool treadsafe);
+ int Create(size_t maxpacksize,const RTPTransmissionParams *transparams);
+ void Destroy();
+ RTPTransmissionInfo *GetTransmissionInfo();
+
+ int GetLocalHostName(uint8_t *buffer,size_t *bufferlength);
+ bool ComesFromThisTransmitter(const RTPAddress *addr);
+ size_t GetHeaderOverhead() { return RTPUDPV4TRANS_HEADERSIZE; }
+
+ int Poll();
+ int WaitForIncomingData(const RTPTime &delay,bool *dataavailable = 0);
+ int AbortWait();
+
+ int SendRTPData(const void *data,size_t len);
+ int SendRTCPData(const void *data,size_t len);
+
+ int AddDestination(const RTPAddress &addr);
+ int DeleteDestination(const RTPAddress &addr);
+ void ClearDestinations();
+
+ bool SupportsMulticasting();
+ int JoinMulticastGroup(const RTPAddress &addr);
+ int LeaveMulticastGroup(const RTPAddress &addr);
+ void LeaveAllMulticastGroups();
+
+ int SetReceiveMode(RTPTransmitter::ReceiveMode m);
+ int AddToIgnoreList(const RTPAddress &addr);
+ int DeleteFromIgnoreList(const RTPAddress &addr);
+ void ClearIgnoreList();
+ int AddToAcceptList(const RTPAddress &addr);
+ int DeleteFromAcceptList(const RTPAddress &addr);
+ void ClearAcceptList();
+ int SetMaximumPacketSize(size_t s);
+
+ bool NewDataAvailable();
+ RTPRawPacket *GetNextPacket();
+#ifdef RTPDEBUG
+ void Dump();
+#endif // RTPDEBUG
+private:
+ int CreateLocalIPList();
+ bool GetLocalIPList_Interfaces();
+ void GetLocalIPList_DNS();
+ void AddLoopbackAddress();
+ void FlushPackets();
+ int PollSocket(bool rtp);
+ int ProcessAddAcceptIgnoreEntry(uint32_t ip,uint16_t port);
+ int ProcessDeleteAcceptIgnoreEntry(uint32_t ip,uint16_t port);
+#ifdef RTP_SUPPORT_IPV4MULTICAST
+ bool SetMulticastTTL(uint8_t ttl);
+#endif // RTP_SUPPORT_IPV4MULTICAST
+ bool ShouldAcceptData(uint32_t srcip,uint16_t srcport);
+ void ClearAcceptIgnoreInfo();
+
+ bool init;
+ bool created;
+ bool waitingfordata;
+#if (defined(WIN32) || defined(_WIN32_WCE))
+ SOCKET rtpsock,rtcpsock;
+#else // not using winsock
+ int rtpsock,rtcpsock;
+#endif // WIN32
+ uint32_t bindIP, mcastifaceIP;
+ std::list<uint32_t> localIPs;
+ uint16_t portbase;
+ uint8_t multicastTTL;
+ RTPTransmitter::ReceiveMode receivemode;
+
+ uint8_t *localhostname;
+ size_t localhostnamelength;
+
+ RTPHashTable<const RTPIPv4Destination,RTPUDPv4Trans_GetHashIndex_IPv4Dest,RTPUDPV4TRANS_HASHSIZE> destinations;
+#ifdef RTP_SUPPORT_IPV4MULTICAST
+ RTPHashTable<const uint32_t,RTPUDPv4Trans_GetHashIndex_uint32_t,RTPUDPV4TRANS_HASHSIZE> multicastgroups;
+#endif // RTP_SUPPORT_IPV4MULTICAST
+ std::list<RTPRawPacket*> rawpacketlist;
+
+ bool supportsmulticasting;
+ size_t maxpacksize;
+
+ class PortInfo
+ {
+ public:
+ PortInfo() { all = false; }
+
+ bool all;
+ std::list<uint16_t> portlist;
+ };
+
+ RTPKeyHashTable<const uint32_t,PortInfo*,RTPUDPv4Trans_GetHashIndex_uint32_t,RTPUDPV4TRANS_HASHSIZE> acceptignoreinfo;
+
+ // notification descriptors for AbortWait (0 is for reading, 1 for writing)
+#if (defined(WIN32) || defined(_WIN32_WCE))
+ SOCKET abortdesc[2];
+#else
+ int abortdesc[2];
+#endif // WIN32
+ int CreateAbortDescriptors();
+ void DestroyAbortDescriptors();
+ void AbortWaitInternal();
+#ifdef RTP_SUPPORT_THREAD
+ JMutex mainmutex,waitmutex;
+ int threadsafe;
+#endif // RTP_SUPPORT_THREAD
+};
+
+#endif // RTPUDPV4TRANSMITTER_H
+