rtp.h
Go to the documentation of this file.
// Copyright (C) 1999-2005 Open Source Telecom Corporation.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
// ccRTP, as the General Public License permits, the exception does
// not apply to the code that you add in this way. To avoid misleading
// anyone as to the status of such modified files, you must delete
// this exception notice from them.
//
// If you write modifications of your own for GNU ccRTP, it is your choice
// whether to permit this exception to apply to your modifications.
// If you do not wish that, delete this exception notice.
//
#ifndef CCXX_RTP_RTP_H_
#define CCXX_RTP_RTP_H_
#include <ccrtp/cqueue.h>
#include <ccrtp/channel.h>
NAMESPACE_COMMONCPP
template <class RTPDataChannel = DualRTPUDPIPv4Channel,
class RTCPChannel = DualRTPUDPIPv4Channel,
class ServiceQueue = AVPQueue>
class __EXPORT TRTPSessionBase : public ServiceQueue
{
public:
TRTPSessionBase(const InetHostAddress& ia, tpport_t dataPort,
tpport_t controlPort, uint32 membersSize,
RTPApplication& app) :
ServiceQueue(membersSize,app)
{ build(ia,dataPort,controlPort); }
TRTPSessionBase(uint32 ssrc,
const InetHostAddress& ia,
tpport_t dataPort, tpport_t controlPort,
uint32 membersSize, RTPApplication& app):
ServiceQueue(ssrc,membersSize,app)
{ build(ia,dataPort,controlPort); }
TRTPSessionBase(const InetMcastAddress& ia, tpport_t dataPort,
tpport_t controlPort, uint32 membersSize,
RTPApplication& app, uint32 iface) :
ServiceQueue(membersSize,app)
{ build(ia,dataPort,controlPort,iface); }
TRTPSessionBase(uint32 ssrc,
const InetMcastAddress& ia, tpport_t dataPort,
tpport_t controlPort, uint32 membersSize,
RTPApplication& app, uint32 iface) :
ServiceQueue(ssrc,membersSize,app)
{ build(ia,dataPort,controlPort,iface); }
virtual size_t dispatchBYE(const std::string &str)
{
return QueueRTCPManager::dispatchBYE(str);
}
inline Socket::Error
setMcastTTL(uint8 ttl)
{
Socket::Error error = dso->setMulticast(true);
if ( error ) return error;
error = dso->setTimeToLive(ttl);
if ( error ) return error;
error = cso->setMulticast(true);
if ( error ) return error;
return cso->setTimeToLive(ttl);
}
inline virtual
~TRTPSessionBase()
{
endSocket();
}
inline RTPDataChannel *getDSO(void)
{return dso;}
protected:
inline bool
isPendingData(microtimeout_t timeout)
{ return dso->isPendingRecv(timeout); }
InetHostAddress
getDataSender(tpport_t *port = NULL) const
{ return dso->getSender(port); }
inline size_t
getNextDataPacketSize() const
{ return dso->getNextPacketSize(); }
inline size_t
recvData(unsigned char* buffer, size_t len,
InetHostAddress& na, tpport_t& tp)
{ na = dso->getSender(tp); return dso->recv(buffer, len); }
inline void
setDataPeer(const InetAddress &host, tpport_t port)
{ dso->setPeer(host,port); }
inline size_t
sendData(const unsigned char* const buffer, size_t len)
{ return dso->send(buffer, len); }
inline SOCKET getDataRecvSocket() const
{ return dso->getRecvSocket(); }
inline bool
isPendingControl(microtimeout_t timeout)
{ return cso->isPendingRecv(timeout); }
InetHostAddress
getControlSender(tpport_t *port = NULL) const
{ return cso->getSender(port); }
inline size_t
recvControl(unsigned char *buffer, size_t len,
InetHostAddress& na, tpport_t& tp)
{ na = cso->getSender(tp); return cso->recv(buffer,len); }
inline void
setControlPeer(const InetAddress &host, tpport_t port)
{ cso->setPeer(host,port); }
inline size_t
sendControl(const unsigned char* const buffer, size_t len)
{ return cso->send(buffer,len); }
inline SOCKET getControlRecvSocket() const
{ return cso->getRecvSocket(); }
inline Socket::Error
joinGroup(const InetMcastAddress& ia, uint32 iface)
{
Socket::Error error = dso->setMulticast(true);
if ( error ) return error;
error = dso->join(ia,iface);
if ( error ) return error;
error = cso->setMulticast(true);
if ( error ) {
dso->drop(ia);
return error;
}
error = cso->join(ia,iface);
if ( error ) {
dso->drop(ia);
return error;
}
return Socket::errSuccess;
}
inline Socket::Error
leaveGroup(const InetMcastAddress& ia)
{
Socket::Error error = dso->setMulticast(false);
if ( error ) return error;
error = dso->leaveGroup(ia);
if ( error ) return error;
error = cso->setMulticast(false);
if ( error ) return error;
return cso->leaveGroup(ia);
}
inline void
endSocket()
{
if (dso) {
dso->endSocket();
delete dso;
}
dso = NULL;
if (cso) {
cso->endSocket();
delete cso;
}
cso = NULL;
}
private:
void
build(const InetHostAddress& ia, tpport_t dataPort,
tpport_t controlPort)
{
if ( 0 == controlPort ) {
dataBasePort = even_port(dataPort);
controlBasePort = dataBasePort + 1;
} else {
dataBasePort = dataPort;
controlBasePort = controlPort;
}
dso = new RTPDataChannel(ia,dataBasePort);
cso = new RTCPChannel(ia,controlBasePort);
}
void
build(const InetMcastAddress& ia, tpport_t dataPort,
tpport_t controlPort, uint32 iface)
{
if ( 0 == controlPort ) {
dataBasePort = even_port(dataPort);
controlBasePort = dataBasePort + 1;
} else {
dataBasePort = dataPort;
controlBasePort = controlPort;
}
dso = new RTPDataChannel(InetHostAddress("0.0.0.0"),dataBasePort);
cso = new RTCPChannel(InetHostAddress("0.0.0.0"),controlBasePort);
joinGroup(ia,iface);
}
inline tpport_t
odd_port(tpport_t port)
{ return (port & 0x01)? (port) : (port - 1); }
inline tpport_t
even_port(tpport_t port)
{ return (port & 0x01)? (port - 1) : (port); }
tpport_t dataBasePort;
tpport_t controlBasePort;
protected:
RTPDataChannel* dso;
RTCPChannel* cso;
friend class RTPSessionBaseHandler;
};
template
<class RTPDataChannel = DualRTPUDPIPv4Channel,
class RTCPChannel = DualRTPUDPIPv4Channel,
class ServiceQueue = AVPQueue>
class __EXPORT SingleThreadRTPSession :
protected Thread,
public TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
{
public:
SingleThreadRTPSession(const InetHostAddress& ia,
tpport_t dataPort = DefaultRTPDataPort,
tpport_t controlPort = 0,
int pri = 0,
uint32 memberssize =
MembershipBookkeeping::defaultMembersHashSize,
RTPApplication& app = defaultApplication()
#if defined(_MSC_VER) && _MSC_VER >= 1300
);
#else
):
Thread(pri),
TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
(ia,dataPort,controlPort,memberssize,app)
{ }
#endif
SingleThreadRTPSession(uint32 ssrc, const InetHostAddress& ia,
tpport_t dataPort = DefaultRTPDataPort,
tpport_t controlPort = 0,
int pri = 0,
uint32 memberssize =
MembershipBookkeeping::defaultMembersHashSize,
RTPApplication& app = defaultApplication()
#if defined(_MSC_VER) && _MSC_VER >= 1300
);
#else
):
Thread(pri),
TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
(ssrc, ia,dataPort,controlPort,memberssize,app)
{ }
#endif
SingleThreadRTPSession(const InetMcastAddress& ia,
tpport_t dataPort = DefaultRTPDataPort,
tpport_t controlPort = 0,
int pri = 0,
uint32 memberssize =
MembershipBookkeeping::defaultMembersHashSize,
RTPApplication& app = defaultApplication(),
uint32 iface = 0
#if defined(_MSC_VER) && _MSC_VER >= 1300
);
#else
):
Thread(pri),
TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
(ia,dataPort,controlPort,memberssize,app,iface)
{ }
#endif
SingleThreadRTPSession(uint32 ssrc, const InetMcastAddress& ia,
tpport_t dataPort = DefaultRTPDataPort,
tpport_t controlPort = 0,
int pri = 0,
uint32 memberssize =
MembershipBookkeeping::defaultMembersHashSize,
RTPApplication& app = defaultApplication(),
uint32 iface = 0
#if defined(_MSC_VER) && _MSC_VER >= 1300
);
#else
):
Thread(pri),
TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
(ssrc,ia,dataPort,controlPort,memberssize,app,iface)
{ }
#endif
~SingleThreadRTPSession()
{
if (isRunning()) {
disableStack(); Thread::join();
}
}
#if defined(_MSC_VER) && _MSC_VER >= 1300
virtual void startRunning();
#else
void
startRunning()
{ enableStack(); Thread::start(); }
#endif
protected:
inline void disableStack(void)
{TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::disableStack();}
inline void enableStack(void)
{TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::enableStack();}
inline microtimeout_t getSchedulingTimeout(void)
{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::getSchedulingTimeout();}
inline void controlReceptionService(void)
{TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::controlReceptionService();}
inline void controlTransmissionService(void)
{TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::controlTransmissionService();}
inline timeval getRTCPCheckInterval(void)
{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::getRTCPCheckInterval();}
inline size_t dispatchDataPacket(void)
{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::dispatchDataPacket();}
#if defined(_MSC_VER) && _MSC_VER >= 1300
virtual void run(void);
virtual void timerTick(void);
virtual bool isPendingData(microtimeout_t timeout);
#else
virtual void timerTick(void)
{return;}
virtual bool isPendingData(microtimeout_t timeout)
{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::isPendingData(timeout);}
virtual void run(void)
{
microtimeout_t timeout = 0;
while ( ServiceQueue::isActive() ) {
if ( timeout < 1000 ){ // !(timeout/1000)
timeout = getSchedulingTimeout();
}
controlReceptionService();
controlTransmissionService();
microtimeout_t maxWait =
timeval2microtimeout(getRTCPCheckInterval());
// make sure the scheduling timeout is
// <= the check interval for RTCP
// packets
timeout = (timeout > maxWait)? maxWait : timeout;
if ( timeout < 1000 ) { // !(timeout/1000)
dispatchDataPacket();
timerTick();
} else {
if ( isPendingData(timeout/1000) ) {
if (ServiceQueue::isActive()) { // take in only if active
takeInDataPacket();
}
}
timeout = 0;
}
}
dispatchBYE("GNU ccRTP stack finishing.");
// Thread::exit();
}
#endif
inline size_t takeInDataPacket(void)
{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::takeInDataPacket();}
inline size_t dispatchBYE(const std::string &str)
{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::dispatchBYE(str);}
};
typedef SingleThreadRTPSession<> RTPSession;
typedef RTPSession RTPSocket;
typedef SingleThreadRTPSession<SymmetricRTPChannel,
SymmetricRTPChannel> SymmetricRTPSession;
#ifdef CCXX_IPV6
template <class RTPDataChannel = DualRTPUDPIPv6Channel,
class RTCPChannel = DualRTPUDPIPv6Channel,
class ServiceQueue = AVPQueue>
class __EXPORT TRTPSessionBaseIPV6 : public ServiceQueue
{
public:
TRTPSessionBaseIPV6(const IPV6Host& ia, tpport_t dataPort,
tpport_t controlPort, uint32 membersSize,
RTPApplication& app) :
ServiceQueue(membersSize,app)
{ build(ia,dataPort,controlPort); }
TRTPSessionBaseIPV6(uint32 ssrc,
const IPV6Host& ia,
tpport_t dataPort, tpport_t controlPort,
uint32 membersSize, RTPApplication& app):
ServiceQueue(ssrc,membersSize,app)
{ build(ia,dataPort,controlPort); }
TRTPSessionBaseIPV6(const IPV6Multicast& ia, tpport_t dataPort,
tpport_t controlPort, uint32 membersSize,
RTPApplication& app, uint32 iface) :
ServiceQueue(membersSize,app)
{ build(ia,dataPort,controlPort,iface); }
TRTPSessionBaseIPV6(uint32 ssrc,
const IPV6Multicast& ia, tpport_t dataPort,
tpport_t controlPort, uint32 membersSize,
RTPApplication& app, uint32 iface) :
ServiceQueue(ssrc,membersSize,app)
{ build(ia,dataPort,controlPort,iface); }
virtual size_t dispatchBYE(const std::string &str)
{
return QueueRTCPManager::dispatchBYE(str);
}
inline virtual
~TRTPSessionBaseIPV6()
{
endSocket();
}
inline RTPDataChannel *getDSO(void)
{return dso;}
protected:
inline bool
isPendingData(microtimeout_t timeout)
{ return dso->isPendingRecv(timeout); }
inline IPV6Host
getDataSender(tpport_t *port = NULL) const
{ return dso->getSender(port); }
inline size_t
getNextDataPacketSize() const
{ return dso->getNextPacketSize(); }
inline size_t
recvData(unsigned char* buffer, size_t len,
IPV6Host& na, tpport_t& tp)
{ na = dso->getSender(tp); return dso->recv(buffer, len); }
inline void
setDataPeerIPV6(const IPV6Host &host, tpport_t port)
{ dso->setPeer(host,port); }
inline size_t
sendDataIPV6(const unsigned char* const buffer, size_t len)
{ return dso->send(buffer, len); }
inline SOCKET getDataRecvSocket() const
{ return dso->getRecvSocket(); }
inline bool
isPendingControl(microtimeout_t timeout)
{ return cso->isPendingRecv(timeout); }
inline IPV6Host
getControlSender(tpport_t *port = NULL) const
{ return cso->getSender(port); }
inline size_t
recvControl(unsigned char *buffer, size_t len,
IPV6Host& na, tpport_t& tp)
{ na = cso->getSender(tp); return cso->recv(buffer,len); }
inline void
setControlPeerIPV6(const IPV6Host &host, tpport_t port)
{ cso->setPeer(host,port); }
inline size_t
sendControl(const unsigned char* const buffer, size_t len)
{ return cso->send(buffer,len); }
inline SOCKET getControlRecvSocket() const
{ return cso->getRecvSocket(); }
inline void
endSocket()
{
dso->endSocket();
cso->endSocket();
if (dso) delete dso;
dso = NULL;
if (cso) delete cso;
cso = NULL;
}
private:
void
build(const IPV6Host& ia, tpport_t dataPort,
tpport_t controlPort)
{
if ( 0 == controlPort ) {
dataBasePort = even_port(dataPort);
controlBasePort = dataBasePort + 1;
} else {
dataBasePort = dataPort;
controlBasePort = controlPort;
}
dso = new RTPDataChannel(ia,dataBasePort);
cso = new RTCPChannel(ia,controlBasePort);
}
void
build(const IPV6Multicast& ia, tpport_t dataPort,
tpport_t controlPort, uint32 iface)
{
if ( 0 == controlPort ) {
dataBasePort = even_port(dataPort);
controlBasePort = dataBasePort + 1;
} else {
dataBasePort = dataPort;
controlBasePort = controlPort;
}
dso = new RTPDataChannel(IPV6Host("0.0.0.0"),dataBasePort);
cso = new RTCPChannel(IPV6Host("0.0.0.0"),controlBasePort);
joinGroup(ia,iface);
}
inline Socket::Error
joinGroup(const IPV6Multicast& ia, uint32 iface)
{
Socket::Error error = dso->setMulticast(true);
if ( error ) return error;
error = dso->join(ia,iface);
if ( error ) return error;
error = cso->setMulticast(true);
if ( error ) {
dso->drop(ia);
return error;
}
error = cso->join(ia,iface);
if ( error ) {
dso->drop(ia);
return error;
}
return Socket::errSuccess;
}
inline Socket::Error
leaveGroup(const IPV6Multicast& ia)
{
Socket::Error error = dso->setMulticast(false);
if ( error ) return error;
error = dso->leaveGroup(ia);
if ( error ) return error;
error = cso->setMulticast(false);
if ( error ) return error;
return cso->leaveGroup(ia);
}
inline Socket::Error
setMcastTTL(uint8 ttl)
{
Socket::Error error = dso->setMulticast(true);
if ( error ) return error;
error = dso->setTimeToLive(ttl);
if ( error ) return error;
error = cso->setMulticast(true);
if ( error ) return error;
return cso->setTimeToLive(ttl);
}
inline tpport_t
odd_port(tpport_t port)
{ return (port & 0x01)? (port) : (port - 1); }
inline tpport_t
even_port(tpport_t port)
{ return (port & 0x01)? (port - 1) : (port); }
tpport_t dataBasePort;
tpport_t controlBasePort;
protected:
RTPDataChannel* dso;
RTCPChannel* cso;
friend class RTPSessionBaseHandler;
};
template
<class RTPDataChannel = DualRTPUDPIPv6Channel,
class RTCPChannel = DualRTPUDPIPv6Channel,
class ServiceQueue = AVPQueue>
class __EXPORT SingleThreadRTPSessionIPV6 :
protected Thread,
public TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
{
public:
SingleThreadRTPSessionIPV6(const IPV6Host& ia,
tpport_t dataPort = DefaultRTPDataPort,
tpport_t controlPort = 0,
int pri = 0,
uint32 memberssize =
MembershipBookkeeping::defaultMembersHashSize,
RTPApplication& app = defaultApplication()
#if defined(_MSC_VER) && _MSC_VER >= 1300
);
#else
):
Thread(pri),
TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
(ia,dataPort,controlPort,memberssize,app)
{ }
#endif
SingleThreadRTPSessionIPV6(const IPV6Multicast& ia,
tpport_t dataPort = DefaultRTPDataPort,
tpport_t controlPort = 0,
int pri = 0,
uint32 memberssize =
MembershipBookkeeping::defaultMembersHashSize,
RTPApplication& app = defaultApplication(),
uint32 iface = 0
#if defined(_MSC_VER) && _MSC_VER >= 1300
);
#else
):
Thread(pri),
TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
(ia,dataPort,controlPort,memberssize,app,iface)
{ }
#endif
~SingleThreadRTPSessionIPV6()
{
if (isRunning()) {
disableStack(); Thread::join();
}
}
#if defined(_MSC_VER) && _MSC_VER >= 1300
virtual void startRunning();
#else
void
startRunning()
{ enableStack(); Thread::start(); }
#endif
protected:
inline void enableStack(void)
{TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::enableStack();}
inline void disableStack(void)
{TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::disableStack();}
inline microtimeout_t getSchedulingTimeout(void)
{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::getSchedulingTimeout();}
inline void controlReceptionService(void)
{TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::controlReceptionService();}
inline void controlTransmissionService(void)
{TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::controlTransmissionService();}
inline timeval getRTCPCheckInterval(void)
{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::getRTCPCheckInterval();}
inline size_t dispatchDataPacket(void)
{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::dispatchDataPacket();}
#if defined(_MSC_VER) && _MSC_VER >= 1300
virtual void run(void);
virtual void timerTick(void);
virtual bool isPendingData(microtimeout_t timeout);
#else
virtual void timerTick(void)
{return;}
virtual bool isPendingData(microtimeout_t timeout)
{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::isPendingData(timeout);}
virtual void run(void)
{
microtimeout_t timeout = 0;
while ( ServiceQueue::isActive() ) {
if ( timeout < 1000 ){ // !(timeout/1000)
timeout = getSchedulingTimeout();
}
controlReceptionService();
controlTransmissionService();
microtimeout_t maxWait =
timeval2microtimeout(getRTCPCheckInterval());
// make sure the scheduling timeout is
// <= the check interval for RTCP
// packets
timeout = (timeout > maxWait)? maxWait : timeout;
if ( timeout < 1000 ) { // !(timeout/1000)
dispatchDataPacket();
timerTick();
} else {
if ( isPendingData(timeout/1000) ) {
takeInDataPacket();
}
timeout = 0;
}
}
dispatchBYE("GNU ccRTP stack finishing.");
Thread::exit();
}
#endif
inline size_t takeInDataPacket(void)
{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::takeInDataPacket();}
inline size_t dispatchBYE(const std::string &str)
{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::dispatchBYE(str);}
};
typedef SingleThreadRTPSessionIPV6<> RTPSessionIPV6;
typedef RTPSessionIPV6 RTPSocketIPV6;
typedef SingleThreadRTPSessionIPV6<SymmetricRTPChannelIPV6,
SymmetricRTPChannelIPV6> SymmetricRTPSessionIPV6;
#endif
// sessions
END_NAMESPACE
#endif //CCXX_RTP_RTP_H_
SingleThreadRTPSession::isPendingData
virtual bool isPendingData(microtimeout_t timeout)
Definition: rtp.h:545
TRTPSessionBase::getControlRecvSocket
SOCKET getControlRecvSocket() const
Definition: rtp.h:278
TRTPSessionBase::isPendingData
bool isPendingData(microtimeout_t timeout)
Definition: rtp.h:198
SingleThreadRTPSession::SingleThreadRTPSession
SingleThreadRTPSession(const InetMcastAddress &ia, tpport_t dataPort=DefaultRTPDataPort, tpport_t controlPort=0, int pri=0, uint32 memberssize=MembershipBookkeeping::defaultMembersHashSize, RTPApplication &app=defaultApplication(), uint32 iface=0)
Definition: rtp.h:456
TRTPSessionBase::dispatchBYE
virtual size_t dispatchBYE(const std::string &str)
Definition: rtp.h:161
RTPSocket
RTPSession RTPSocket
Alias for RTPSession.
Definition: rtp.h:607
TRTPSessionBase::setMcastTTL
Socket::Error setMcastTTL(uint8 ttl)
Set the value of the TTL field in the sent packets.
Definition: rtp.h:173
DualRTPUDPIPv4Channel
DualRTPChannel< RTPBaseUDPIPv4Socket > DualRTPUDPIPv4Channel
Definition: channel.h:445
microtimeout_t
uint32 microtimeout_t
Time interval expressed in microseconds.
Definition: base.h:68
SingleThreadRTPSession::dispatchDataPacket
size_t dispatchDataPacket(void)
Definition: rtp.h:531
SingleThreadRTPSession::run
virtual void run(void)
Single runnable method for this RTP stacks, schedules outgoing and incoming RTP data and RTCP packets...
Definition: rtp.h:552
TRTPSessionBase::TRTPSessionBase
TRTPSessionBase(const InetMcastAddress &ia, tpport_t dataPort, tpport_t controlPort, uint32 membersSize, RTPApplication &app, uint32 iface)
Builds a session waiting for packets in a multicast address.
Definition: rtp.h:134
timeval2microtimeout
microtimeout_t timeval2microtimeout(const timeval &t)
Convert a time interval, expressed as a timeval value into a microseconds counter.
Definition: base.h:91
TRTPSessionBase::cso
RTCPChannel * cso
Definition: rtp.h:399
SingleThreadRTPSession::controlReceptionService
void controlReceptionService(void)
Definition: rtp.h:522
SingleThreadRTPSession::takeInDataPacket
size_t takeInDataPacket(void)
Definition: rtp.h:585
SingleThreadRTPSession
This template class adds the threading aspect to the RTPSessionBase template in one of the many possi...
Definition: rtp.h:417
TRTPSessionBase::getDataRecvSocket
SOCKET getDataRecvSocket() const
Definition: rtp.h:236
SymmetricRTPChannel
SingleRTPChannel SymmetricRTPChannel
Actually, RTP with a single channel can be called &#39;Symmetric RTP&#39;.
Definition: channel.h:456
SingleThreadRTPSession::timerTick
virtual void timerTick(void)
Definition: rtp.h:542
SingleThreadRTPSession::enableStack
void enableStack(void)
Definition: rtp.h:516
TRTPSessionBase::TRTPSessionBase
TRTPSessionBase(const InetHostAddress &ia, tpport_t dataPort, tpport_t controlPort, uint32 membersSize, RTPApplication &app)
Builds a session waiting for packets in a host address.
Definition: rtp.h:98
AVPQueue
This class, an RTP/RTCP queue, adds audio/video profile (AVP) specific methods to the generic RTCP se...
Definition: cqueue.h:709
RTPSessionBaseHandler
Definition: pool.h:54
SingleThreadRTPSession::controlTransmissionService
void controlTransmissionService(void)
Definition: rtp.h:525
channel.h
Definition of socket classes for different underlying transport and/or network protocols that can be ...
TRTPSessionBase::dso
RTPDataChannel * dso
Definition: rtp.h:398
TRTPSessionBase::setControlPeer
void setControlPeer(const InetAddress &host, tpport_t port)
Definition: rtp.h:266
SingleThreadRTPSession::getRTCPCheckInterval
timeval getRTCPCheckInterval(void)
Definition: rtp.h:528
RTPSession
SingleThreadRTPSession RTPSession
Uses two pairs of sockets for RTP data and RTCP transmission/reception.
Definition: rtp.h:600
TRTPSessionBase::getControlSender
InetHostAddress getControlSender(tpport_t *port=NULL) const
Definition: rtp.h:248
QueueRTCPManager::dispatchBYE
size_t dispatchBYE(const std::string &reason)
This method is used to send an RTCP BYE packet.
SingleThreadRTPSession::disableStack
void disableStack(void)
Definition: rtp.h:513
TRTPSessionBase::sendControl
size_t sendControl(const unsigned char *const buffer, size_t len)
Definition: rtp.h:275
cqueue.h
Generic RTCP control queues.
RTPApplication
An RTP application, holding identifying RTCP SDES item values.
Definition: sources.h:366
TRTPSessionBase::getDataSender
InetHostAddress getDataSender(tpport_t *port=NULL) const
Definition: rtp.h:202
DefaultRTPDataPort
const tpport_t DefaultRTPDataPort
registered default RTP data transport port
Definition: base.h:110
TRTPSessionBase::getNextDataPacketSize
size_t getNextDataPacketSize() const
Definition: rtp.h:206
MembershipBookkeeping::defaultMembersHashSize
static const size_t defaultMembersHashSize
Definition: iqueue.h:855
TRTPSessionBase::joinGroup
Socket::Error joinGroup(const InetMcastAddress &ia, uint32 iface)
Join a multicast group.
Definition: rtp.h:288
TRTPSessionBase::sendData
size_t sendData(const unsigned char *const buffer, size_t len)
Definition: rtp.h:233
TRTPSessionBase::TRTPSessionBase
TRTPSessionBase(uint32 ssrc, const InetHostAddress &ia, tpport_t dataPort, tpport_t controlPort, uint32 membersSize, RTPApplication &app)
Builds a session with the specified ssrc identifier for the local source.
Definition: rtp.h:115
TRTPSessionBase::getDSO
RTPDataChannel * getDSO(void)
Definition: rtp.h:190
TRTPSessionBase::leaveGroup
Socket::Error leaveGroup(const InetMcastAddress &ia)
Leave a multicast group.
Definition: rtp.h:314
TRTPSessionBase::recvData
size_t recvData(unsigned char *buffer, size_t len, InetHostAddress &na, tpport_t &tp)
Receive data from the data channel/socket.
Definition: rtp.h:219
SingleThreadRTPSession::dispatchBYE
size_t dispatchBYE(const std::string &str)
Definition: rtp.h:588
TRTPSessionBase::recvControl
size_t recvControl(unsigned char *buffer, size_t len, InetHostAddress &na, tpport_t &tp)
Receive data from the control channel/socket.
Definition: rtp.h:261
SingleThreadRTPSession::SingleThreadRTPSession
SingleThreadRTPSession(uint32 ssrc, const InetMcastAddress &ia, tpport_t dataPort=DefaultRTPDataPort, tpport_t controlPort=0, int pri=0, uint32 memberssize=MembershipBookkeeping::defaultMembersHashSize, RTPApplication &app=defaultApplication(), uint32 iface=0)
Definition: rtp.h:474
SymmetricRTPSession
SingleThreadRTPSession< SymmetricRTPChannel, SymmetricRTPChannel > SymmetricRTPSession
Uses one pair of sockets, (1) for RTP data and (2) for RTCP transmission/reception.
Definition: rtp.h:618
SingleThreadRTPSession::SingleThreadRTPSession
SingleThreadRTPSession(uint32 ssrc, const InetHostAddress &ia, tpport_t dataPort=DefaultRTPDataPort, tpport_t controlPort=0, int pri=0, uint32 memberssize=MembershipBookkeeping::defaultMembersHashSize, RTPApplication &app=defaultApplication())
Definition: rtp.h:439
SingleThreadRTPSession::getSchedulingTimeout
microtimeout_t getSchedulingTimeout(void)
Definition: rtp.h:519
TRTPSessionBase
Definition: rtp.h:86
TRTPSessionBase::endSocket
void endSocket()
Definition: rtp.h:326
TRTPSessionBase::TRTPSessionBase
TRTPSessionBase(uint32 ssrc, const InetMcastAddress &ia, tpport_t dataPort, tpport_t controlPort, uint32 membersSize, RTPApplication &app, uint32 iface)
Builds a session waiting for packets in a multicast address, with the specified ssrc identifier for t...
Definition: rtp.h:154
SingleThreadRTPSession::startRunning
void startRunning()
Activate stack and start service thread.
Definition: rtp.h:507
defaultApplication
__EXPORT RTPApplication & defaultApplication()
Get the RTPApplication object for the "default" application (the only one used by common applications...
TRTPSessionBase::~TRTPSessionBase
virtual ~TRTPSessionBase()
Definition: rtp.h:185
TRTPSessionBase::setDataPeer
void setDataPeer(const InetAddress &host, tpport_t port)
Definition: rtp.h:224
SingleThreadRTPSession::~SingleThreadRTPSession
~SingleThreadRTPSession()
Definition: rtp.h:493
TRTPSessionBase::isPendingControl
bool isPendingControl(microtimeout_t timeout)
Definition: rtp.h:244
SingleThreadRTPSession::SingleThreadRTPSession
SingleThreadRTPSession(const InetHostAddress &ia, tpport_t dataPort=DefaultRTPDataPort, tpport_t controlPort=0, int pri=0, uint32 memberssize=MembershipBookkeeping::defaultMembersHashSize, RTPApplication &app=defaultApplication())
Definition: rtp.h:422