49 #ifndef CCXX_RTP_RTP_H_
50 #define CCXX_RTP_RTP_H_
55 #ifdef CCXX_NAMESPACES
101 tpport_t controlPort, uint32 membersSize,
103 ServiceQueue(membersSize,app)
104 { build(ia,dataPort,controlPort); }
118 const InetHostAddress& ia,
119 tpport_t dataPort, tpport_t controlPort,
121 ServiceQueue(ssrc,membersSize,app)
122 { build(ia,dataPort,controlPort); }
137 tpport_t controlPort, uint32 membersSize,
139 ServiceQueue(membersSize,app)
140 { build(ia,dataPort,controlPort,iface); }
157 const InetMcastAddress& ia, tpport_t dataPort,
158 tpport_t controlPort, uint32 membersSize,
160 ServiceQueue(ssrc,membersSize,app)
161 { build(ia,dataPort,controlPort,iface); }
163 virtual size_t dispatchBYE(
const std::string &str)
175 setMcastTTL(uint8 ttl)
177 Socket::Error error = dso->setMulticast(
true);
178 if ( error )
return error;
179 error = dso->setTimeToLive(ttl);
180 if ( error )
return error;
181 error = cso->setMulticast(
true);
182 if ( error )
return error;
183 return cso->setTimeToLive(ttl);
192 inline RTPDataChannel *getDSO(
void)
201 {
return dso->isPendingRecv(timeout); }
204 getDataSender(tpport_t *port = NULL)
const
205 {
return dso->getSender(port); }
208 getNextDataPacketSize()
const
209 {
return dso->getNextPacketSize(); }
221 recvData(
unsigned char* buffer,
size_t len,
222 InetHostAddress& na, tpport_t& tp)
223 { na = dso->getSender(tp);
return dso->recv(buffer, len); }
226 setDataPeer(
const InetAddress &host, tpport_t port)
227 { dso->setPeer(host,port); }
235 sendData(
const unsigned char*
const buffer,
size_t len)
236 {
return dso->send(buffer, len); }
238 inline SOCKET getDataRecvSocket()
const
239 {
return dso->getRecvSocket(); }
247 {
return cso->isPendingRecv(timeout); }
250 getControlSender(tpport_t *port = NULL)
const
251 {
return cso->getSender(port); }
263 recvControl(
unsigned char *buffer,
size_t len,
264 InetHostAddress& na, tpport_t& tp)
265 { na = cso->getSender(tp);
return cso->recv(buffer,len); }
268 setControlPeer(
const InetAddress &host, tpport_t port)
269 { cso->setPeer(host,port); }
277 sendControl(
const unsigned char*
const buffer,
size_t len)
278 {
return cso->send(buffer,len); }
280 inline SOCKET getControlRecvSocket()
const
281 {
return cso->getRecvSocket(); }
290 joinGroup(
const InetMcastAddress& ia, uint32 iface)
292 Socket::Error error = dso->setMulticast(
true);
293 if ( error )
return error;
294 error = dso->join(ia,iface);
295 if ( error )
return error;
296 error = cso->setMulticast(
true);
301 error = cso->join(ia,iface);
306 return Socket::errSuccess;
316 leaveGroup(
const InetMcastAddress& ia)
318 Socket::Error error = dso->setMulticast(
false);
319 if ( error )
return error;
320 error = dso->leaveGroup(ia);
321 if ( error )
return error;
322 error = cso->setMulticast(
false);
323 if ( error )
return error;
324 return cso->leaveGroup(ia);
344 build(
const InetHostAddress& ia, tpport_t dataPort,
345 tpport_t controlPort)
347 if ( 0 == controlPort ) {
348 dataBasePort = even_port(dataPort);
349 controlBasePort = dataBasePort + 1;
351 dataBasePort = dataPort;
352 controlBasePort = controlPort;
354 dso =
new RTPDataChannel(ia,dataBasePort);
355 cso =
new RTCPChannel(ia,controlBasePort);
359 build(
const InetMcastAddress& ia, tpport_t dataPort,
360 tpport_t controlPort, uint32 iface)
362 if ( 0 == controlPort ) {
363 dataBasePort = even_port(dataPort);
364 controlBasePort = dataBasePort + 1;
366 dataBasePort = dataPort;
367 controlBasePort = controlPort;
369 dso =
new RTPDataChannel(InetHostAddress(
"0.0.0.0"),dataBasePort);
370 cso =
new RTCPChannel(InetHostAddress(
"0.0.0.0"),controlBasePort);
382 odd_port(tpport_t port)
383 {
return (port & 0x01)? (port) : (port - 1); }
393 even_port(tpport_t port)
394 {
return (port & 0x01)? (port - 1) : (port); }
396 tpport_t dataBasePort;
397 tpport_t controlBasePort;
426 tpport_t controlPort = 0,
431 #
if defined(_MSC_VER) && _MSC_VER >= 1300
437 (ia,dataPort,controlPort,memberssize,app)
443 tpport_t controlPort = 0,
448 #
if defined(_MSC_VER) && _MSC_VER >= 1300
454 (ssrc, ia,dataPort,controlPort,memberssize,app)
460 tpport_t controlPort = 0,
466 #
if defined(_MSC_VER) && _MSC_VER >= 1300
472 (ia,dataPort,controlPort,memberssize,app,iface)
478 tpport_t controlPort = 0,
484 #
if defined(_MSC_VER) && _MSC_VER >= 1300
490 (ssrc,ia,dataPort,controlPort,memberssize,app,iface)
498 disableStack(); Thread::join();
502 #if defined(_MSC_VER) && _MSC_VER >= 1300
503 virtual void startRunning();
510 { enableStack(); Thread::start(); }
515 inline void disableStack(
void)
518 inline void enableStack(
void)
524 inline void controlReceptionService(
void)
527 inline void controlTransmissionService(
void)
530 inline timeval getRTCPCheckInterval(
void)
533 inline size_t dispatchDataPacket(
void)
536 #if defined(_MSC_VER) && _MSC_VER >= 1300
537 virtual void run(
void);
539 virtual void timerTick(
void);
544 virtual void timerTick(
void)
554 virtual void run(
void)
557 while ( ServiceQueue::isActive() ) {
558 if ( timeout < 1000 ){
559 timeout = getSchedulingTimeout();
561 setCancel(cancelDeferred);
562 controlReceptionService();
563 controlTransmissionService();
564 setCancel(cancelImmediate);
570 timeout = (timeout > maxWait)? maxWait : timeout;
571 if ( timeout < 1000 ) {
572 setCancel(cancelDeferred);
573 dispatchDataPacket();
574 setCancel(cancelImmediate);
577 if ( isPendingData(timeout/1000) ) {
578 setCancel(cancelDeferred);
579 if (ServiceQueue::isActive()) {
582 setCancel(cancelImmediate);
587 dispatchBYE(
"GNU ccRTP stack finishing.");
593 inline size_t takeInDataPacket(
void)
596 inline size_t dispatchBYE(
const std::string &str)
651 template <
class RTPDataChannel = DualRTPUDPIPv6Channel,
652 class RTCPChannel = DualRTPUDPIPv6Channel,
654 class __EXPORT TRTPSessionBaseIPV6 :
public ServiceQueue
666 TRTPSessionBaseIPV6(
const IPV6Host& ia, tpport_t dataPort,
667 tpport_t controlPort, uint32 membersSize,
669 ServiceQueue(membersSize,app)
670 { build(ia,dataPort,controlPort); }
683 TRTPSessionBaseIPV6(uint32 ssrc,
685 tpport_t dataPort, tpport_t controlPort,
687 ServiceQueue(ssrc,membersSize,app)
688 { build(ia,dataPort,controlPort); }
702 TRTPSessionBaseIPV6(
const IPV6Multicast& ia, tpport_t dataPort,
703 tpport_t controlPort, uint32 membersSize,
705 ServiceQueue(membersSize,app)
706 { build(ia,dataPort,controlPort,iface); }
722 TRTPSessionBaseIPV6(uint32 ssrc,
723 const IPV6Multicast& ia, tpport_t dataPort,
724 tpport_t controlPort, uint32 membersSize,
726 ServiceQueue(ssrc,membersSize,app)
727 { build(ia,dataPort,controlPort,iface); }
729 virtual size_t dispatchBYE(
const std::string &str)
735 ~TRTPSessionBaseIPV6()
740 inline RTPDataChannel *getDSO(
void)
749 {
return dso->isPendingRecv(timeout); }
752 getDataSender(tpport_t *port = NULL)
const
753 {
return dso->getSender(port); }
756 getNextDataPacketSize()
const
757 {
return dso->getNextPacketSize(); }
769 recvData(
unsigned char* buffer,
size_t len,
770 IPV6Host& na, tpport_t& tp)
771 { na = dso->getSender(tp);
return dso->recv(buffer, len); }
774 setDataPeerIPV6(
const IPV6Host &host, tpport_t port)
775 { dso->setPeer(host,port); }
782 sendDataIPV6(
const unsigned char*
const buffer,
size_t len)
783 {
return dso->send(buffer, len); }
785 inline SOCKET getDataRecvSocket()
const
786 {
return dso->getRecvSocket(); }
794 {
return cso->isPendingRecv(timeout); }
797 getControlSender(tpport_t *port = NULL)
const
798 {
return cso->getSender(port); }
810 recvControl(
unsigned char *buffer,
size_t len,
811 IPV6Host& na, tpport_t& tp)
812 { na = cso->getSender(tp);
return cso->recv(buffer,len); }
815 setControlPeerIPV6(
const IPV6Host &host, tpport_t port)
816 { cso->setPeer(host,port); }
824 sendControl(
const unsigned char*
const buffer,
size_t len)
825 {
return cso->send(buffer,len); }
827 inline SOCKET getControlRecvSocket()
const
828 {
return cso->getRecvSocket(); }
843 build(
const IPV6Host& ia, tpport_t dataPort,
844 tpport_t controlPort)
846 if ( 0 == controlPort ) {
847 dataBasePort = even_port(dataPort);
848 controlBasePort = dataBasePort + 1;
850 dataBasePort = dataPort;
851 controlBasePort = controlPort;
853 dso =
new RTPDataChannel(ia,dataBasePort);
854 cso =
new RTCPChannel(ia,controlBasePort);
858 build(
const IPV6Multicast& ia, tpport_t dataPort,
859 tpport_t controlPort, uint32 iface)
861 if ( 0 == controlPort ) {
862 dataBasePort = even_port(dataPort);
863 controlBasePort = dataBasePort + 1;
865 dataBasePort = dataPort;
866 controlBasePort = controlPort;
868 dso =
new RTPDataChannel(IPV6Host(
"0.0.0.0"),dataBasePort);
869 cso =
new RTCPChannel(IPV6Host(
"0.0.0.0"),controlBasePort);
880 joinGroup(
const IPV6Multicast& ia, uint32 iface)
882 Socket::Error error = dso->setMulticast(
true);
883 if ( error )
return error;
884 error = dso->join(ia,iface);
885 if ( error )
return error;
886 error = cso->setMulticast(
true);
891 error = cso->join(ia,iface);
896 return Socket::errSuccess;
906 leaveGroup(
const IPV6Multicast& ia)
908 Socket::Error error = dso->setMulticast(
false);
909 if ( error )
return error;
910 error = dso->leaveGroup(ia);
911 if ( error )
return error;
912 error = cso->setMulticast(
false);
913 if ( error )
return error;
914 return cso->leaveGroup(ia);
924 setMcastTTL(uint8 ttl)
926 Socket::Error error = dso->setMulticast(
true);
927 if ( error )
return error;
928 error = dso->setTimeToLive(ttl);
929 if ( error )
return error;
930 error = cso->setMulticast(
true);
931 if ( error )
return error;
932 return cso->setTimeToLive(ttl);
943 odd_port(tpport_t port)
944 {
return (port & 0x01)? (port) : (port - 1); }
954 even_port(tpport_t port)
955 {
return (port & 0x01)? (port - 1) : (port); }
957 tpport_t dataBasePort;
958 tpport_t controlBasePort;
977 <
class RTPDataChannel = DualRTPUDPIPv6Channel,
978 class RTCPChannel = DualRTPUDPIPv6Channel,
980 class __EXPORT SingleThreadRTPSessionIPV6 :
982 public TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
985 SingleThreadRTPSessionIPV6(
const IPV6Host& ia,
987 tpport_t controlPort = 0,
992 #
if defined(_MSC_VER) && _MSC_VER >= 1300
997 TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
998 (ia,dataPort,controlPort,memberssize,app)
1002 SingleThreadRTPSessionIPV6(
const IPV6Multicast& ia,
1004 tpport_t controlPort = 0,
1006 uint32 memberssize =
1010 #
if defined(_MSC_VER) && _MSC_VER >= 1300
1015 TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
1016 (ia,dataPort,controlPort,memberssize,app,iface)
1020 ~SingleThreadRTPSessionIPV6()
1023 disableStack(); Thread::join();
1027 #if defined(_MSC_VER) && _MSC_VER >= 1300
1028 virtual void startRunning();
1035 { enableStack(); Thread::start(); }
1040 inline void enableStack(
void)
1043 inline void disableStack(
void)
1049 inline void controlReceptionService(
void)
1052 inline void controlTransmissionService(
void)
1055 inline timeval getRTCPCheckInterval(
void)
1058 inline size_t dispatchDataPacket(
void)
1061 #if defined(_MSC_VER) && _MSC_VER >= 1300
1062 virtual void run(
void);
1064 virtual void timerTick(
void);
1069 virtual void timerTick(
void)
1079 virtual void run(
void)
1082 while ( ServiceQueue::isActive() ) {
1083 if ( timeout < 1000 ){
1084 timeout = getSchedulingTimeout();
1086 setCancel(cancelDeferred);
1087 controlReceptionService();
1088 controlTransmissionService();
1089 setCancel(cancelImmediate);
1095 timeout = (timeout > maxWait)? maxWait : timeout;
1096 if ( timeout < 1000 ) {
1097 setCancel(cancelDeferred);
1098 dispatchDataPacket();
1099 setCancel(cancelImmediate);
1102 if ( isPendingData(timeout/1000) ) {
1103 setCancel(cancelDeferred);
1105 setCancel(cancelImmediate);
1110 dispatchBYE(
"GNU ccRTP stack finishing.");
1116 inline size_t takeInDataPacket(
void)
1119 inline size_t dispatchBYE(
const std::string &str)
1131 typedef SingleThreadRTPSessionIPV6<> RTPSessionIPV6;
1138 typedef RTPSessionIPV6 RTPSocketIPV6;
1148 typedef SingleThreadRTPSessionIPV6<SymmetricRTPChannelIPV6,
1149 SymmetricRTPChannelIPV6> SymmetricRTPSessionIPV6;
1156 #ifdef CCXX_NAMESPACES
1160 #endif //CCXX_RTP_RTP_H_