Changeset 696
- Timestamp:
- 11/15/11 12:45:20 (6 months ago)
- Files:
-
- 4 added
- 14 edited
-
branches/1.0/constants/constants.lua (modified) (3 diffs)
-
branches/1.0/sources/common/include/defines.h (modified) (1 diff)
-
branches/1.0/sources/thelib/include/protocols/protocoltypes.h (modified) (1 diff)
-
branches/1.0/sources/thelib/include/protocols/rtp/connectivity/outboundconnectivity.h (modified) (3 diffs)
-
branches/1.0/sources/thelib/include/protocols/rtp/nattraversalprotocol.h (added)
-
branches/1.0/sources/thelib/src/protocols/defaultprotocolfactory.cpp (modified) (5 diffs)
-
branches/1.0/sources/thelib/src/protocols/rtp/basertspappprotocolhandler.cpp (modified) (2 diffs)
-
branches/1.0/sources/thelib/src/protocols/rtp/connectivity/outboundconnectivity.cpp (modified) (8 diffs)
-
branches/1.0/sources/thelib/src/protocols/rtp/nattraversalprotocol.cpp (added)
-
trunk/constants/constants.lua (modified) (3 diffs)
-
trunk/sources/common/include/defines.h (modified) (1 diff)
-
trunk/sources/thelib/include/protocols/protocoltypes.h (modified) (1 diff)
-
trunk/sources/thelib/include/protocols/rtp/connectivity/outboundconnectivity.h (modified) (3 diffs)
-
trunk/sources/thelib/include/protocols/rtp/nattraversalprotocol.h (added)
-
trunk/sources/thelib/src/protocols/defaultprotocolfactory.cpp (modified) (5 diffs)
-
trunk/sources/thelib/src/protocols/rtp/basertspappprotocolhandler.cpp (modified) (2 diffs)
-
trunk/sources/thelib/src/protocols/rtp/connectivity/outboundconnectivity.cpp (modified) (8 diffs)
-
trunk/sources/thelib/src/protocols/rtp/nattraversalprotocol.cpp (added)
Legend:
- Unmodified
- Added
- Removed
-
branches/1.0/constants/constants.lua
r658 r696 35 35 CONF_PROTOCOL_UDP_RTCP="inboundUdpRtcp", 36 36 CONF_PROTOCOL_INBOUND_RTSP="inboundRtsp", 37 CONF_PROTOCOL_RTP_NAT_TRAVERSAL="rtpNatTraversal", 37 38 38 39 -- HTTP protocols … … 614 615 file:write("public static class "..arg[4].."\r\n{\r\n") 615 616 for k,v in orderedPairs(constants) do 617 print (k,v) 616 618 if(type(v)=="string") then 617 619 file:write("public const string "..k.."=\""..v.."\";\n") … … 621 623 end 622 624 file:write("}\r\n}\r\n") 625 file:close() 623 626 end 624 627 -
branches/1.0/sources/common/include/defines.h
r658 r696 319 319 #define CONF_PROTOCOL_OUTBOUND_XML_VARIANT "outboundXmlVariant" 320 320 #define CONF_PROTOCOL_OUTBOUND_XML_VARIANT_LEN 18 321 #define CONF_PROTOCOL_RTP_NAT_TRAVERSAL "rtpNatTraversal" 322 #define CONF_PROTOCOL_RTP_NAT_TRAVERSAL_LEN 15 321 323 #define CONF_PROTOCOL_RTSP_RTCP "inboundRtspRtcp" 322 324 #define CONF_PROTOCOL_RTSP_RTCP_LEN 15 -
branches/1.0/sources/thelib/include/protocols/protocoltypes.h
r566 r696 68 68 #define PT_INBOUND_RTP MAKE_TAG4('I','R','T','P') 69 69 #define PT_OUTBOUND_RTP MAKE_TAG4('O','R','T','P') 70 #define PT_RTP_NAT_TRAVERSAL MAKE_TAG5('R','N','A','T','T') 70 71 71 72 //MMS -
branches/1.0/sources/thelib/include/protocols/rtp/connectivity/outboundconnectivity.h
r694 r696 26 26 class BaseOutNetRTPUDPStream; 27 27 class RTSPProtocol; 28 class NATTraversalProtocol; 28 29 29 30 struct RTPClient { … … 91 92 uint64_t _startupTime; 92 93 RTPClient _rtpClient; 93 bool _hasAudio; 94 94 95 bool _hasVideo; 95 96 96 int32_t _videoDataFd; 97 97 uint16_t _videoDataPort; 98 98 int32_t _videoRTCPFd; 99 99 uint16_t _videoRTCPPort; 100 NATTraversalProtocol *_pVideoNATData; 101 NATTraversalProtocol *_pVideoNATRTCP; 100 102 103 bool _hasAudio; 101 104 int32_t _audioDataFd; 102 105 uint16_t _audioDataPort; 103 106 int32_t _audioRTCPFd; 104 107 uint16_t _audioRTCPPort; 108 NATTraversalProtocol *_pAudioNATData; 109 NATTraversalProtocol *_pAudioNATRTCP; 105 110 public: 106 111 OutboundConnectivity(bool forceTcp, RTSPProtocol *pRTSPProtocol); … … 129 134 private: 130 135 bool InitializePorts(int32_t &dataFd, uint16_t &dataPort, 131 int32_t &RTCPFd, uint16_t &RTCPPort); 136 NATTraversalProtocol **ppNATData, int32_t &RTCPFd, uint16_t &RTCPPort, 137 NATTraversalProtocol **ppNATRTCP); 132 138 bool FeedData(msghdr &message, double absoluteTimestamp, bool isAudio); 133 139 }; -
branches/1.0/sources/thelib/src/protocols/defaultprotocolfactory.cpp
r566 r696 43 43 #include "protocols/mms/mmsprotocol.h" 44 44 #include "protocols/rawhttpstream/inboundrawhttpstreamprotocol.h" 45 #include "protocols/rtp/nattraversalprotocol.h" 45 46 46 47 DefaultProtocolFactory::DefaultProtocolFactory() … … 94 95 ADD_VECTOR_END(result, PT_RTCP); 95 96 ADD_VECTOR_END(result, PT_INBOUND_RTP); 97 ADD_VECTOR_END(result, PT_RTP_NAT_TRAVERSAL); 96 98 #endif /* HAS_PROTOCOL_RTP */ 97 99 #ifdef HAS_PROTOCOL_CLI … … 151 153 ADD_VECTOR_END(result, CONF_PROTOCOL_INBOUND_RTSP_RTP); 152 154 ADD_VECTOR_END(result, CONF_PROTOCOL_INBOUND_UDP_RTP); 155 ADD_VECTOR_END(result, CONF_PROTOCOL_RTP_NAT_TRAVERSAL); 153 156 #endif /* HAS_PROTOCOL_RTP */ 154 157 #ifdef HAS_PROTOCOL_CLI … … 229 232 ADD_VECTOR_END(result, PT_UDP); 230 233 ADD_VECTOR_END(result, PT_INBOUND_RTP); 234 } else if (name == CONF_PROTOCOL_RTP_NAT_TRAVERSAL) { 235 ADD_VECTOR_END(result, PT_UDP); 236 ADD_VECTOR_END(result, PT_RTP_NAT_TRAVERSAL); 231 237 } 232 238 #endif /* HAS_PROTOCOL_RTP */ … … 387 393 case PT_INBOUND_RTP: 388 394 pResult = new InboundRTPProtocol(); 395 break; 396 case PT_RTP_NAT_TRAVERSAL: 397 pResult = new NATTraversalProtocol(); 389 398 break; 390 399 #endif /* HAS_PROTOCOL_RTP */ -
branches/1.0/sources/thelib/src/protocols/rtp/basertspappprotocolhandler.cpp
r694 r696 732 732 //6. prepare the response 733 733 pFrom->PushResponseFirstLine(RTSP_VERSION_1_0, 200, "OK"); 734 pFrom->PushResponseHeader(RTSP_HEADERS_RANGE, "npt=0.0-");735 736 string rtpInfoVideo = "";737 string rtpInfoAudio = "";738 if (pFrom->GetCustomParameters().HasKey("videoTrackUri")) {739 rtpInfoVideo = format("url=%s;seq=%u;rtptime=%u",740 STR(pFrom->GetCustomParameters()["videoTrackUri"]),741 pOutboundConnectivity->GetLastVideoSequence(),742 0);743 }744 if (pFrom->GetCustomParameters().HasKey("audioTrackId")) {745 rtpInfoAudio = format("url=%s;seq=%u;rtptime=%u",746 STR(pFrom->GetCustomParameters()["audioTrackId"]),747 pOutboundConnectivity->GetLastAudioSequence(),748 0);749 }750 string rtpInfo = rtpInfoVideo;751 if (rtpInfo != "") {752 if (rtpInfoAudio != "") {753 rtpInfo += ", " + rtpInfoAudio;754 }755 } else {756 rtpInfo = rtpInfoAudio;757 }758 734 759 735 //7. Done … … 1670 1646 result += format("o=- %"PRIu32" 0 IN IP4 %s\r\n", pFrom->GetId(), STR(nearAddress)); 1671 1647 result += "s=" + targetStreamName + "\r\n"; 1672 result += "u=http://www. rtmpd.com/\r\n";1673 result += "e=c rtmpserver@gmail.com\r\n";1674 result += "c=IN IP4 " + farAddress + "\r\n";1648 result += "u=http://www.evostream.com\r\n"; 1649 result += "e=contact@evostream.com\r\n"; 1650 result += "c=IN IP4 " + nearAddress + "\r\n"; 1675 1651 result += "t=0 0\r\n"; 1676 1652 result += "a=recvonly\r\n"; -
branches/1.0/sources/thelib/src/protocols/rtp/connectivity/outboundconnectivity.cpp
r694 r696 24 24 #include "protocols/baseprotocol.h" 25 25 #include "protocols/rtp/rtspprotocol.h" 26 #include "protocols/rtp/nattraversalprotocol.h" 27 #include "netio/netio.h" 28 #include "protocols/udpprotocol.h" 26 29 27 30 OutboundConnectivity::OutboundConnectivity(bool forceTcp, RTSPProtocol *pRTSPProtocol) … … 52 55 _pRTCPSOC = ((uint8_t *) _rtcpMessage.msg_iov[0].iov_base) + 24; 53 56 54 _hasAudio = false;55 57 _hasVideo = false; 56 58 _videoDataFd = -1; … … 58 60 _videoRTCPFd = -1; 59 61 _videoRTCPPort = 0; 62 _pVideoNATData = NULL; 63 _pVideoNATRTCP = NULL; 64 65 _hasAudio = false; 60 66 _audioDataFd = -1; 61 67 _audioDataPort = 0; 62 68 _audioRTCPFd = -1; 63 69 _audioRTCPPort = 0; 70 _pAudioNATData = NULL; 71 _pAudioNATRTCP = NULL; 64 72 65 73 _startupTime = (uint64_t) time(NULL); … … 73 81 delete _pOutStream; 74 82 } 75 CLOSE_SOCKET(_videoDataFd); 76 CLOSE_SOCKET(_videoRTCPFd); 77 CLOSE_SOCKET(_audioDataFd); 78 CLOSE_SOCKET(_audioRTCPFd); 83 if (_pVideoNATData != NULL) { 84 _pVideoNATData->EnqueueForDelete(); 85 _pVideoNATData = NULL; 86 } 87 if (_pVideoNATRTCP != NULL) { 88 _pVideoNATRTCP->EnqueueForDelete(); 89 _pVideoNATRTCP = NULL; 90 } 91 if (_pAudioNATData != NULL) { 92 _pAudioNATData->EnqueueForDelete(); 93 _pAudioNATData = NULL; 94 } 95 if (_pAudioNATRTCP != NULL) { 96 _pAudioNATRTCP->EnqueueForDelete(); 97 _pAudioNATRTCP = NULL; 98 } 79 99 } 80 100 … … 86 106 _rtpClient.videoRtcpChannel = 3; 87 107 } else { 88 if (!InitializePorts(_videoDataFd, _videoDataPort, _videoRTCPFd, _videoRTCPPort)) { 108 if (!InitializePorts(_videoDataFd, _videoDataPort, &_pVideoNATData, 109 _videoRTCPFd, _videoRTCPPort, &_pVideoNATRTCP)) { 89 110 FATAL("Unable to initialize video ports"); 90 111 return false; 91 112 } 92 if (!InitializePorts(_audioDataFd, _audioDataPort, _audioRTCPFd, _audioRTCPPort)) { 113 if (!InitializePorts(_audioDataFd, _audioDataPort, &_pAudioNATData, 114 _audioRTCPFd, _audioRTCPPort, &_pAudioNATRTCP)) { 93 115 FATAL("Unable to initialize audio ports"); 94 116 return false; … … 161 183 _rtpClient.videoRtcpAddress = rtcp; 162 184 _rtpClient.protocolId = rtspProtocolId; 163 return true; 185 _pVideoNATData->SetOutboundAddress(&_rtpClient.videoDataAddress); 186 _pVideoNATRTCP->SetOutboundAddress(&_rtpClient.videoRtcpAddress); 187 return ((UDPCarrier *) _pVideoNATData->GetIOHandler())->StartAccept() 188 &((UDPCarrier *) _pVideoNATRTCP->GetIOHandler())->StartAccept(); 164 189 } 165 190 … … 175 200 _rtpClient.audioRtcpAddress = rtcp; 176 201 _rtpClient.protocolId = rtspProtocolId; 177 return true; 202 _pAudioNATData->SetOutboundAddress(&_rtpClient.audioDataAddress); 203 _pAudioNATRTCP->SetOutboundAddress(&_rtpClient.audioRtcpAddress); 204 return ((UDPCarrier *) _pAudioNATData->GetIOHandler())->StartAccept() 205 &((UDPCarrier *) _pAudioNATRTCP->GetIOHandler())->StartAccept(); 178 206 } 179 207 … … 233 261 234 262 bool OutboundConnectivity::InitializePorts(int32_t &dataFd, uint16_t &dataPort, 235 int32_t &RTCPFd, uint16_t &RTCPPort) { 236 for (int i = 0; i < 10; i++) { 237 CLOSE_SOCKET(dataFd); 238 CLOSE_SOCKET(RTCPFd); 239 240 dataFd = socket(AF_INET, SOCK_DGRAM, 0); 241 RTCPFd = socket(AF_INET, SOCK_DGRAM, 0); 242 243 sockaddr_in address; 244 memset(&address, 0, sizeof (address)); 245 address.sin_family = AF_INET; 246 address.sin_port = 0; 247 address.sin_addr.s_addr = INADDR_ANY; 248 if (bind(dataFd, (sockaddr *) & address, sizeof (address)) != 0) { 249 int err = errno; 250 WARN("Unable to bind. Error: %s (%d)", strerror(err), err); 263 NATTraversalProtocol **ppNATData, int32_t &RTCPFd, uint16_t &RTCPPort, 264 NATTraversalProtocol **ppNATRTCP) { 265 UDPCarrier *pCarrier1 = NULL; 266 UDPCarrier *pCarrier2 = NULL; 267 for (uint32_t i = 0; i < 10; i++) { 268 if (pCarrier1 != NULL) { 269 delete pCarrier1; 270 pCarrier1 = NULL; 271 } 272 if (pCarrier2 != NULL) { 273 delete pCarrier2; 274 pCarrier2 = NULL; 275 } 276 277 pCarrier1 = UDPCarrier::Create("0.0.0.0", 0); 278 if (pCarrier1 == NULL) { 279 WARN("Unable to create UDP carrier for RTP"); 251 280 continue; 252 281 } 253 socklen_t len = sizeof (sockaddr); 254 if (getsockname(dataFd, (sockaddr *) & address, &len) != 0) { 255 ASSERT("Unable to get peer's address"); 256 } 257 dataPort = ENTOHS(address.sin_port); 258 259 if ((dataPort % 2) != 0) { 260 address.sin_port = EHTONS(dataPort - 1); 282 283 if ((pCarrier1->GetNearEndpointPort() % 2) == 0) { 284 pCarrier2 = UDPCarrier::Create("0.0.0.0", 285 pCarrier1->GetNearEndpointPort() + 1); 261 286 } else { 262 address.sin_port = EHTONS(dataPort + 1);263 }264 if (bind(RTCPFd, (sockaddr *) & address, sizeof (address)) != 0) {265 int err = errno; 266 WARN("Unable to bind on port %"PRIu16". Error: %s (%d)",267 ENTOHS(address.sin_port), strerror(err), err);287 pCarrier2 = UDPCarrier::Create("0.0.0.0", 288 pCarrier1->GetNearEndpointPort() - 1); 289 } 290 291 if (pCarrier2 == NULL) { 292 WARN("Unable to create UDP carrier for RTP"); 268 293 continue; 269 294 } 270 RTCPPort = ENTOHS(address.sin_port); 271 272 if ((dataPort % 2) != 0) { 273 uint16_t temp16 = dataPort; 274 dataPort = RTCPPort; 275 RTCPPort = temp16; 276 277 int32_t temp32 = dataFd; 278 dataFd = RTCPFd; 279 RTCPFd = temp32; 280 WARN("Ports switch"); 281 } 282 295 296 if (pCarrier1->GetNearEndpointPort() > pCarrier2->GetNearEndpointPort()) { 297 WARN("Switch carriers"); 298 UDPCarrier *pTemp = pCarrier1; 299 pCarrier1 = pCarrier2; 300 pCarrier2 = pTemp; 301 } 302 303 Variant dummy; 304 //data 305 306 307 dataFd = pCarrier1->GetInboundFd(); 308 dataPort = pCarrier1->GetNearEndpointPort(); 309 *ppNATData = (NATTraversalProtocol *) ProtocolFactoryManager::CreateProtocolChain( 310 CONF_PROTOCOL_RTP_NAT_TRAVERSAL, dummy); 311 if (*ppNATData == NULL) { 312 FATAL("Unable to create the protocol chain %s", CONF_PROTOCOL_RTP_NAT_TRAVERSAL); 313 return false; 314 } 315 pCarrier1->SetProtocol(((*ppNATData)->GetFarEndpoint())); 316 (*ppNATData)->GetFarEndpoint()->SetIOHandler(pCarrier1); 317 318 //RTCP 319 RTCPFd = pCarrier2->GetInboundFd(); 320 RTCPPort = pCarrier2->GetNearEndpointPort(); 321 *ppNATRTCP = (NATTraversalProtocol *) ProtocolFactoryManager::CreateProtocolChain( 322 CONF_PROTOCOL_RTP_NAT_TRAVERSAL, dummy); 323 if (*ppNATRTCP == NULL) { 324 FATAL("Unable to create the protocol chain %s", CONF_PROTOCOL_RTP_NAT_TRAVERSAL); 325 (*ppNATData)->EnqueueForDelete(); 326 return false; 327 } 328 pCarrier2->SetProtocol((*ppNATRTCP)->GetFarEndpoint()); 329 (*ppNATRTCP)->GetFarEndpoint()->SetIOHandler(pCarrier2); 330 331 //return pCarrier1->StartAccept() & pCarrier2->StartAccept(); 283 332 return true; 284 333 } 285 334 286 FATAL("Unable to bind after 10 attempts"); 335 if (*ppNATData != NULL) { 336 (*ppNATData)->EnqueueForDelete(); 337 (*ppNATData) = NULL; 338 } 339 if (*ppNATRTCP != NULL) { 340 (*ppNATRTCP)->EnqueueForDelete(); 341 (*ppNATRTCP) = NULL; 342 } 343 287 344 return false; 288 345 } -
trunk/constants/constants.lua
r658 r696 35 35 CONF_PROTOCOL_UDP_RTCP="inboundUdpRtcp", 36 36 CONF_PROTOCOL_INBOUND_RTSP="inboundRtsp", 37 CONF_PROTOCOL_RTP_NAT_TRAVERSAL="rtpNatTraversal", 37 38 38 39 -- HTTP protocols … … 614 615 file:write("public static class "..arg[4].."\r\n{\r\n") 615 616 for k,v in orderedPairs(constants) do 617 print (k,v) 616 618 if(type(v)=="string") then 617 619 file:write("public const string "..k.."=\""..v.."\";\n") … … 621 623 end 622 624 file:write("}\r\n}\r\n") 625 file:close() 623 626 end 624 627 -
trunk/sources/common/include/defines.h
r658 r696 319 319 #define CONF_PROTOCOL_OUTBOUND_XML_VARIANT "outboundXmlVariant" 320 320 #define CONF_PROTOCOL_OUTBOUND_XML_VARIANT_LEN 18 321 #define CONF_PROTOCOL_RTP_NAT_TRAVERSAL "rtpNatTraversal" 322 #define CONF_PROTOCOL_RTP_NAT_TRAVERSAL_LEN 15 321 323 #define CONF_PROTOCOL_RTSP_RTCP "inboundRtspRtcp" 322 324 #define CONF_PROTOCOL_RTSP_RTCP_LEN 15 -
trunk/sources/thelib/include/protocols/protocoltypes.h
r566 r696 68 68 #define PT_INBOUND_RTP MAKE_TAG4('I','R','T','P') 69 69 #define PT_OUTBOUND_RTP MAKE_TAG4('O','R','T','P') 70 #define PT_RTP_NAT_TRAVERSAL MAKE_TAG5('R','N','A','T','T') 70 71 71 72 //MMS -
trunk/sources/thelib/include/protocols/rtp/connectivity/outboundconnectivity.h
r694 r696 26 26 class BaseOutNetRTPUDPStream; 27 27 class RTSPProtocol; 28 class NATTraversalProtocol; 28 29 29 30 struct RTPClient { … … 91 92 uint64_t _startupTime; 92 93 RTPClient _rtpClient; 93 bool _hasAudio; 94 94 95 bool _hasVideo; 95 96 96 int32_t _videoDataFd; 97 97 uint16_t _videoDataPort; 98 98 int32_t _videoRTCPFd; 99 99 uint16_t _videoRTCPPort; 100 NATTraversalProtocol *_pVideoNATData; 101 NATTraversalProtocol *_pVideoNATRTCP; 100 102 103 bool _hasAudio; 101 104 int32_t _audioDataFd; 102 105 uint16_t _audioDataPort; 103 106 int32_t _audioRTCPFd; 104 107 uint16_t _audioRTCPPort; 108 NATTraversalProtocol *_pAudioNATData; 109 NATTraversalProtocol *_pAudioNATRTCP; 105 110 public: 106 111 OutboundConnectivity(bool forceTcp, RTSPProtocol *pRTSPProtocol); … … 129 134 private: 130 135 bool InitializePorts(int32_t &dataFd, uint16_t &dataPort, 131 int32_t &RTCPFd, uint16_t &RTCPPort); 136 NATTraversalProtocol **ppNATData, int32_t &RTCPFd, uint16_t &RTCPPort, 137 NATTraversalProtocol **ppNATRTCP); 132 138 bool FeedData(msghdr &message, double absoluteTimestamp, bool isAudio); 133 139 }; -
trunk/sources/thelib/src/protocols/defaultprotocolfactory.cpp
r566 r696 43 43 #include "protocols/mms/mmsprotocol.h" 44 44 #include "protocols/rawhttpstream/inboundrawhttpstreamprotocol.h" 45 #include "protocols/rtp/nattraversalprotocol.h" 45 46 46 47 DefaultProtocolFactory::DefaultProtocolFactory() … … 94 95 ADD_VECTOR_END(result, PT_RTCP); 95 96 ADD_VECTOR_END(result, PT_INBOUND_RTP); 97 ADD_VECTOR_END(result, PT_RTP_NAT_TRAVERSAL); 96 98 #endif /* HAS_PROTOCOL_RTP */ 97 99 #ifdef HAS_PROTOCOL_CLI … … 151 153 ADD_VECTOR_END(result, CONF_PROTOCOL_INBOUND_RTSP_RTP); 152 154 ADD_VECTOR_END(result, CONF_PROTOCOL_INBOUND_UDP_RTP); 155 ADD_VECTOR_END(result, CONF_PROTOCOL_RTP_NAT_TRAVERSAL); 153 156 #endif /* HAS_PROTOCOL_RTP */ 154 157 #ifdef HAS_PROTOCOL_CLI … … 229 232 ADD_VECTOR_END(result, PT_UDP); 230 233 ADD_VECTOR_END(result, PT_INBOUND_RTP); 234 } else if (name == CONF_PROTOCOL_RTP_NAT_TRAVERSAL) { 235 ADD_VECTOR_END(result, PT_UDP); 236 ADD_VECTOR_END(result, PT_RTP_NAT_TRAVERSAL); 231 237 } 232 238 #endif /* HAS_PROTOCOL_RTP */ … … 387 393 case PT_INBOUND_RTP: 388 394 pResult = new InboundRTPProtocol(); 395 break; 396 case PT_RTP_NAT_TRAVERSAL: 397 pResult = new NATTraversalProtocol(); 389 398 break; 390 399 #endif /* HAS_PROTOCOL_RTP */ -
trunk/sources/thelib/src/protocols/rtp/basertspappprotocolhandler.cpp
r694 r696 732 732 //6. prepare the response 733 733 pFrom->PushResponseFirstLine(RTSP_VERSION_1_0, 200, "OK"); 734 pFrom->PushResponseHeader(RTSP_HEADERS_RANGE, "npt=0.0-");735 736 string rtpInfoVideo = "";737 string rtpInfoAudio = "";738 if (pFrom->GetCustomParameters().HasKey("videoTrackUri")) {739 rtpInfoVideo = format("url=%s;seq=%u;rtptime=%u",740 STR(pFrom->GetCustomParameters()["videoTrackUri"]),741 pOutboundConnectivity->GetLastVideoSequence(),742 0);743 }744 if (pFrom->GetCustomParameters().HasKey("audioTrackId")) {745 rtpInfoAudio = format("url=%s;seq=%u;rtptime=%u",746 STR(pFrom->GetCustomParameters()["audioTrackId"]),747 pOutboundConnectivity->GetLastAudioSequence(),748 0);749 }750 string rtpInfo = rtpInfoVideo;751 if (rtpInfo != "") {752 if (rtpInfoAudio != "") {753 rtpInfo += ", " + rtpInfoAudio;754 }755 } else {756 rtpInfo = rtpInfoAudio;757 }758 734 759 735 //7. Done … … 1670 1646 result += format("o=- %"PRIu32" 0 IN IP4 %s\r\n", pFrom->GetId(), STR(nearAddress)); 1671 1647 result += "s=" + targetStreamName + "\r\n"; 1672 result += "u=http://www. rtmpd.com/\r\n";1673 result += "e=c rtmpserver@gmail.com\r\n";1674 result += "c=IN IP4 " + farAddress + "\r\n";1648 result += "u=http://www.evostream.com\r\n"; 1649 result += "e=contact@evostream.com\r\n"; 1650 result += "c=IN IP4 " + nearAddress + "\r\n"; 1675 1651 result += "t=0 0\r\n"; 1676 1652 result += "a=recvonly\r\n"; -
trunk/sources/thelib/src/protocols/rtp/connectivity/outboundconnectivity.cpp
r694 r696 24 24 #include "protocols/baseprotocol.h" 25 25 #include "protocols/rtp/rtspprotocol.h" 26 #include "protocols/rtp/nattraversalprotocol.h" 27 #include "netio/netio.h" 28 #include "protocols/udpprotocol.h" 26 29 27 30 OutboundConnectivity::OutboundConnectivity(bool forceTcp, RTSPProtocol *pRTSPProtocol) … … 52 55 _pRTCPSOC = ((uint8_t *) _rtcpMessage.msg_iov[0].iov_base) + 24; 53 56 54 _hasAudio = false;55 57 _hasVideo = false; 56 58 _videoDataFd = -1; … … 58 60 _videoRTCPFd = -1; 59 61 _videoRTCPPort = 0; 62 _pVideoNATData = NULL; 63 _pVideoNATRTCP = NULL; 64 65 _hasAudio = false; 60 66 _audioDataFd = -1; 61 67 _audioDataPort = 0; 62 68 _audioRTCPFd = -1; 63 69 _audioRTCPPort = 0; 70 _pAudioNATData = NULL; 71 _pAudioNATRTCP = NULL; 64 72 65 73 _startupTime = (uint64_t) time(NULL); … … 73 81 delete _pOutStream; 74 82 } 75 CLOSE_SOCKET(_videoDataFd); 76 CLOSE_SOCKET(_videoRTCPFd); 77 CLOSE_SOCKET(_audioDataFd); 78 CLOSE_SOCKET(_audioRTCPFd); 83 if (_pVideoNATData != NULL) { 84 _pVideoNATData->EnqueueForDelete(); 85 _pVideoNATData = NULL; 86 } 87 if (_pVideoNATRTCP != NULL) { 88 _pVideoNATRTCP->EnqueueForDelete(); 89 _pVideoNATRTCP = NULL; 90 } 91 if (_pAudioNATData != NULL) { 92 _pAudioNATData->EnqueueForDelete(); 93 _pAudioNATData = NULL; 94 } 95 if (_pAudioNATRTCP != NULL) { 96 _pAudioNATRTCP->EnqueueForDelete(); 97 _pAudioNATRTCP = NULL; 98 } 79 99 } 80 100 … … 86 106 _rtpClient.videoRtcpChannel = 3; 87 107 } else { 88 if (!InitializePorts(_videoDataFd, _videoDataPort, _videoRTCPFd, _videoRTCPPort)) { 108 if (!InitializePorts(_videoDataFd, _videoDataPort, &_pVideoNATData, 109 _videoRTCPFd, _videoRTCPPort, &_pVideoNATRTCP)) { 89 110 FATAL("Unable to initialize video ports"); 90 111 return false; 91 112 } 92 if (!InitializePorts(_audioDataFd, _audioDataPort, _audioRTCPFd, _audioRTCPPort)) { 113 if (!InitializePorts(_audioDataFd, _audioDataPort, &_pAudioNATData, 114 _audioRTCPFd, _audioRTCPPort, &_pAudioNATRTCP)) { 93 115 FATAL("Unable to initialize audio ports"); 94 116 return false; … … 161 183 _rtpClient.videoRtcpAddress = rtcp; 162 184 _rtpClient.protocolId = rtspProtocolId; 163 return true; 185 _pVideoNATData->SetOutboundAddress(&_rtpClient.videoDataAddress); 186 _pVideoNATRTCP->SetOutboundAddress(&_rtpClient.videoRtcpAddress); 187 return ((UDPCarrier *) _pVideoNATData->GetIOHandler())->StartAccept() 188 &((UDPCarrier *) _pVideoNATRTCP->GetIOHandler())->StartAccept(); 164 189 } 165 190 … … 175 200 _rtpClient.audioRtcpAddress = rtcp; 176 201 _rtpClient.protocolId = rtspProtocolId; 177 return true; 202 _pAudioNATData->SetOutboundAddress(&_rtpClient.audioDataAddress); 203 _pAudioNATRTCP->SetOutboundAddress(&_rtpClient.audioRtcpAddress); 204 return ((UDPCarrier *) _pAudioNATData->GetIOHandler())->StartAccept() 205 &((UDPCarrier *) _pAudioNATRTCP->GetIOHandler())->StartAccept(); 178 206 } 179 207 … … 233 261 234 262 bool OutboundConnectivity::InitializePorts(int32_t &dataFd, uint16_t &dataPort, 235 int32_t &RTCPFd, uint16_t &RTCPPort) { 236 for (int i = 0; i < 10; i++) { 237 CLOSE_SOCKET(dataFd); 238 CLOSE_SOCKET(RTCPFd); 239 240 dataFd = socket(AF_INET, SOCK_DGRAM, 0); 241 RTCPFd = socket(AF_INET, SOCK_DGRAM, 0); 242 243 sockaddr_in address; 244 memset(&address, 0, sizeof (address)); 245 address.sin_family = AF_INET; 246 address.sin_port = 0; 247 address.sin_addr.s_addr = INADDR_ANY; 248 if (bind(dataFd, (sockaddr *) & address, sizeof (address)) != 0) { 249 int err = errno; 250 WARN("Unable to bind. Error: %s (%d)", strerror(err), err); 263 NATTraversalProtocol **ppNATData, int32_t &RTCPFd, uint16_t &RTCPPort, 264 NATTraversalProtocol **ppNATRTCP) { 265 UDPCarrier *pCarrier1 = NULL; 266 UDPCarrier *pCarrier2 = NULL; 267 for (uint32_t i = 0; i < 10; i++) { 268 if (pCarrier1 != NULL) { 269 delete pCarrier1; 270 pCarrier1 = NULL; 271 } 272 if (pCarrier2 != NULL) { 273 delete pCarrier2; 274 pCarrier2 = NULL; 275 } 276 277 pCarrier1 = UDPCarrier::Create("0.0.0.0", 0); 278 if (pCarrier1 == NULL) { 279 WARN("Unable to create UDP carrier for RTP"); 251 280 continue; 252 281 } 253 socklen_t len = sizeof (sockaddr); 254 if (getsockname(dataFd, (sockaddr *) & address, &len) != 0) { 255 ASSERT("Unable to get peer's address"); 256 } 257 dataPort = ENTOHS(address.sin_port); 258 259 if ((dataPort % 2) != 0) { 260 address.sin_port = EHTONS(dataPort - 1); 282 283 if ((pCarrier1->GetNearEndpointPort() % 2) == 0) { 284 pCarrier2 = UDPCarrier::Create("0.0.0.0", 285 pCarrier1->GetNearEndpointPort() + 1); 261 286 } else { 262 address.sin_port = EHTONS(dataPort + 1);263 }264 if (bind(RTCPFd, (sockaddr *) & address, sizeof (address)) != 0) {265 int err = errno; 266 WARN("Unable to bind on port %"PRIu16". Error: %s (%d)",267 ENTOHS(address.sin_port), strerror(err), err);287 pCarrier2 = UDPCarrier::Create("0.0.0.0", 288 pCarrier1->GetNearEndpointPort() - 1); 289 } 290 291 if (pCarrier2 == NULL) { 292 WARN("Unable to create UDP carrier for RTP"); 268 293 continue; 269 294 } 270 RTCPPort = ENTOHS(address.sin_port); 271 272 if ((dataPort % 2) != 0) { 273 uint16_t temp16 = dataPort; 274 dataPort = RTCPPort; 275 RTCPPort = temp16; 276 277 int32_t temp32 = dataFd; 278 dataFd = RTCPFd; 279 RTCPFd = temp32; 280 WARN("Ports switch"); 281 } 282 295 296 if (pCarrier1->GetNearEndpointPort() > pCarrier2->GetNearEndpointPort()) { 297 WARN("Switch carriers"); 298 UDPCarrier *pTemp = pCarrier1; 299 pCarrier1 = pCarrier2; 300 pCarrier2 = pTemp; 301 } 302 303 Variant dummy; 304 //data 305 306 307 dataFd = pCarrier1->GetInboundFd(); 308 dataPort = pCarrier1->GetNearEndpointPort(); 309 *ppNATData = (NATTraversalProtocol *) ProtocolFactoryManager::CreateProtocolChain( 310 CONF_PROTOCOL_RTP_NAT_TRAVERSAL, dummy); 311 if (*ppNATData == NULL) { 312 FATAL("Unable to create the protocol chain %s", CONF_PROTOCOL_RTP_NAT_TRAVERSAL); 313 return false; 314 } 315 pCarrier1->SetProtocol(((*ppNATData)->GetFarEndpoint())); 316 (*ppNATData)->GetFarEndpoint()->SetIOHandler(pCarrier1); 317 318 //RTCP 319 RTCPFd = pCarrier2->GetInboundFd(); 320 RTCPPort = pCarrier2->GetNearEndpointPort(); 321 *ppNATRTCP = (NATTraversalProtocol *) ProtocolFactoryManager::CreateProtocolChain( 322 CONF_PROTOCOL_RTP_NAT_TRAVERSAL, dummy); 323 if (*ppNATRTCP == NULL) { 324 FATAL("Unable to create the protocol chain %s", CONF_PROTOCOL_RTP_NAT_TRAVERSAL); 325 (*ppNATData)->EnqueueForDelete(); 326 return false; 327 } 328 pCarrier2->SetProtocol((*ppNATRTCP)->GetFarEndpoint()); 329 (*ppNATRTCP)->GetFarEndpoint()->SetIOHandler(pCarrier2); 330 331 //return pCarrier1->StartAccept() & pCarrier2->StartAccept(); 283 332 return true; 284 333 } 285 334 286 FATAL("Unable to bind after 10 attempts"); 335 if (*ppNATData != NULL) { 336 (*ppNATData)->EnqueueForDelete(); 337 (*ppNATData) = NULL; 338 } 339 if (*ppNATRTCP != NULL) { 340 (*ppNATRTCP)->EnqueueForDelete(); 341 (*ppNATRTCP) = NULL; 342 } 343 287 344 return false; 288 345 }
Note: See TracChangeset
for help on using the changeset viewer.
