public bool CreateCarriers(InboundRtpProtocol rtp, RtcpProtocol rtcp) { UDPCarrier pCarrier1 = null; UDPCarrier pCarrier2 = null; for (var i = 0; i < 10; i++) { if (pCarrier1 != null) { pCarrier1.Dispose(); pCarrier1 = null; } if (pCarrier2 != null) { pCarrier2.Dispose(); pCarrier2 = null; } pCarrier1 = UDPCarrier.Create("0.0.0.0", 0); if (pCarrier1 == null) { WARN("Unable to create UDP carrier for RTP"); continue; } pCarrier2 = (pCarrier1.NearPort % 2) == 0 ? UDPCarrier.Create("0.0.0.0", pCarrier1.NearPort + 1) : UDPCarrier.Create("0.0.0.0", pCarrier1.NearPort - 1); if (pCarrier2 == null) { WARN("Unable to create UDP carrier for RTCP"); continue; } if (pCarrier1.NearPort > pCarrier2.NearPort) { WARN("Switch carriers"); UDPCarrier pTemp = pCarrier1; pCarrier1 = pCarrier2; pCarrier2 = pTemp; } pCarrier1.Protocol = rtp.FarEndpoint; rtp.FarEndpoint.IOHandler = pCarrier1; pCarrier2.Protocol = rtcp.FarEndpoint; rtcp.FarEndpoint.IOHandler = pCarrier2; return(pCarrier1.StartAccept() | pCarrier2.StartAccept()); } if (pCarrier1 != null) { pCarrier1.Dispose(); pCarrier1 = null; } if (pCarrier2 != null) { pCarrier2.Dispose(); pCarrier2 = null; } return(false); }
public void Cleanup() { _audioTrack = null; _videoTrack = null; _protocols.Clear(); if (_rtpVideo != null) { _rtpVideo.SetStream(null, false); _rtpVideo.EnqueueForDelete(); _rtpVideo = null; } if (_rtpAudio != null) { _rtpAudio.SetStream(null, true); _rtpAudio.EnqueueForDelete(); _rtpAudio = null; } if (_rtcpVideo != null) { _rtcpVideo.EnqueueForDelete(); _rtcpVideo = null; } if (_rtcpAudio != null) { _rtcpAudio.EnqueueForDelete(); _rtcpAudio = null; } }
public bool AddTrack(Variant track, bool isAduio) { var _track = isAduio ? _audioTrack : _videoTrack; var _oppositeTrack = isAduio ? _videoTrack : _audioTrack; var rr = isAduio ? _audioRR : _videoRR; if (_track != null) { return(false); } var application = _rtsp.Application; if (application == null) { FATAL("RTSP protocol not yet assigned to an application"); return(false); } if (isAduio) { _audioTrack = track; } else { _videoTrack = track; } _track = track; if (_oppositeTrack != null) { if (_oppositeTrack["isTcp"] != _track["isTcp"]) { return(false); } } _forceTcp = _track["isTcp"]; var dummy = new Variant(); var rtp = (InboundRtpProtocol)ProtocolFactoryManager.CreateProtocolChain(Defines.CONF_PROTOCOL_INBOUND_UDP_RTP, dummy); if (rtp == null) { FATAL("Unable to create the protocol chain"); Cleanup(); return(false); } if (isAduio) { _rtpAudio = rtp; } else { _rtpVideo = rtp; } var rtcp = (RtcpProtocol)ProtocolFactoryManager.CreateProtocolChain(Defines.CONF_PROTOCOL_UDP_RTCP, dummy); if (rtcp == null) { FATAL("Unable to create the protocol chain"); Cleanup(); return(false); } if (isAduio) { _rtcpAudio = rtcp; } else { _rtcpVideo = rtcp; } if (_track["isTcp"]) { var dataIdx = 0u; var rtcpIdx = 0u; if (_track["portsOrChannels", "data"] && _track["portsOrChannels", "rtcp"]) { dataIdx = _track["portsOrChannels", "data"]; rtcpIdx = _track["portsOrChannels", "rtcp"]; } else { dataIdx = (uint)(_track["globalTrackIndex"] * 2); rtcpIdx = dataIdx + 1; } if ((dataIdx >= 256) || (rtcpIdx >= 256)) { FATAL("Invalid channel numbers"); return(false); } if (_protocols.ContainsKey(dataIdx) || _protocols.ContainsKey(rtcpIdx)) { FATAL("Invalid channel numbers"); return(false); } _protocols[dataIdx] = rtp; _protocols[rtcpIdx] = rtcp; rr.Write(8, rtp.SSRC); //SSRC of packet sender rr.Write(40, rtcp.SSRC); //SSRC of packet sender rr[1] = (byte)rtcpIdx; } else { if (!CreateCarriers(rtp, rtcp)) { FATAL("Unable to create carriers"); return(false); } } rtp.Application = application; rtcp.Application = application; return(true); }
public override BaseProtocol SpawnProtocol(ulong type, Variant parameters) { BaseProtocol pResult = null; switch (type) { case ProtocolTypes.PT_TCP: pResult = new TCPProtocol(); break; case ProtocolTypes.PT_UDP: pResult = new UDPProtocol(); break; case ProtocolTypes.PT_INBOUND_SSL: pResult = new InboundSSLProtocol(); break; case ProtocolTypes.PT_OUTBOUND_SSL: pResult = new OutboundSSLProtocol(); break; case ProtocolTypes.PT_INBOUND_RTMP: pResult = new InboundRTMPProtocol(); break; case ProtocolTypes.PT_INBOUND_RTMPS_DISC: break; case ProtocolTypes.PT_OUTBOUND_RTMP: pResult = new OutboundRTMPProtocol(); break; case ProtocolTypes.PT_INBOUND_RTMFP: pResult = new InboundRTMFPProtocol(); break; case ProtocolTypes.PT_INBOUND_CLUSTER: pResult = new InboundClusterProtocol(); break; case ProtocolTypes.PT_OUTBOUND_CLUSTER: pResult = new OutboundClusterProtocol(); break; case ProtocolTypes.PT_RTSP: pResult = new RtspProtocol(); break; case ProtocolTypes.PT_RTP_NAT_TRAVERSAL: pResult = new NATTraversalProtocol(); break; case ProtocolTypes.PT_INBOUND_RTP: pResult = new InboundRtpProtocol(); break; case ProtocolTypes.PT_RTCP: pResult = new RtcpProtocol(); break; case ProtocolTypes.PT_INBOUND_WEBSOCKET: pResult = new WebSocketProtocol(); break; case ProtocolTypes.PT_INBOUND_WEBRTC_SIGNAL: pResult = new WebRtcSignalProtocol(); break; case ProtocolTypes.PT_INBOUND_MP4: pResult = new Mp4Protocol(); break; default: Logger.FATAL("Spawning protocol {0} not yet implemented", type.TagToString()); break; } if (pResult != null) { if (!pResult.Initialize(parameters)) { Logger.FATAL("Unable to initialize protocol {0}", type.TagToString()); pResult = null; } } return pResult; }
public bool AddTrack(Variant track, bool isAduio) { var _track = isAduio ? _audioTrack : _videoTrack; var _oppositeTrack = isAduio ? _videoTrack : _audioTrack; var rr = isAduio ? _audioRR : _videoRR; if (_track != null) return false; var application = _rtsp.Application; if (application == null) { FATAL("RTSP protocol not yet assigned to an application"); return false; } if (isAduio) _audioTrack = track; else _videoTrack= track; _track = track; if (_oppositeTrack != null) { if (_oppositeTrack["isTcp"] != _track["isTcp"]) return false; } _forceTcp = _track["isTcp"]; var dummy = new Variant(); var rtp = (InboundRtpProtocol)ProtocolFactoryManager.CreateProtocolChain(Defines.CONF_PROTOCOL_INBOUND_UDP_RTP, dummy); if (rtp == null) { FATAL("Unable to create the protocol chain"); Cleanup(); return false; } if (isAduio) _rtpAudio = rtp; else _rtpVideo = rtp; var rtcp = (RtcpProtocol)ProtocolFactoryManager.CreateProtocolChain(Defines.CONF_PROTOCOL_UDP_RTCP, dummy); if (rtcp == null) { FATAL("Unable to create the protocol chain"); Cleanup(); return false; } if (isAduio) _rtcpAudio = rtcp; else _rtcpVideo = rtcp; if (_track["isTcp"]) { var dataIdx = 0u; var rtcpIdx = 0u; if (_track["portsOrChannels", "data"] && _track["portsOrChannels", "rtcp"]) { dataIdx = _track["portsOrChannels", "data"]; rtcpIdx = _track["portsOrChannels", "rtcp"]; } else { dataIdx =(uint) (_track["globalTrackIndex"]*2); rtcpIdx = dataIdx + 1; } if ((dataIdx >= 256) || (rtcpIdx >= 256)) { FATAL("Invalid channel numbers"); return false; } if (_protocols.ContainsKey(dataIdx) || _protocols.ContainsKey(rtcpIdx)) { FATAL("Invalid channel numbers"); return false; } _protocols[dataIdx] = rtp; _protocols[rtcpIdx] = rtcp; rr.Write(8, rtp.SSRC);//SSRC of packet sender rr.Write(40, rtcp.SSRC); //SSRC of packet sender rr[1] = (byte) rtcpIdx; } else { if (!CreateCarriers(rtp, rtcp)) { FATAL("Unable to create carriers"); return false; } } rtp.Application = application; rtcp.Application = application; return true; }
public bool CreateCarriers(InboundRtpProtocol rtp, RtcpProtocol rtcp) { UDPCarrier pCarrier1 = null; UDPCarrier pCarrier2 = null; for (var i = 0; i < 10; i++) { if (pCarrier1 != null) { pCarrier1.Dispose(); pCarrier1 = null; } if (pCarrier2 != null) { pCarrier2.Dispose(); pCarrier2 = null; } pCarrier1 = UDPCarrier.Create("0.0.0.0", 0); if (pCarrier1 == null) { WARN("Unable to create UDP carrier for RTP"); continue; } pCarrier2 = (pCarrier1.NearPort % 2) == 0 ? UDPCarrier.Create("0.0.0.0",pCarrier1.NearPort + 1) : UDPCarrier.Create("0.0.0.0", pCarrier1.NearPort - 1); if (pCarrier2 == null) { WARN("Unable to create UDP carrier for RTCP"); continue; } if (pCarrier1.NearPort > pCarrier2.NearPort) { WARN("Switch carriers"); UDPCarrier pTemp = pCarrier1; pCarrier1 = pCarrier2; pCarrier2 = pTemp; } pCarrier1.Protocol = rtp.FarEndpoint; rtp.FarEndpoint.IOHandler = pCarrier1; pCarrier2.Protocol = rtcp.FarEndpoint; rtcp.FarEndpoint.IOHandler = pCarrier2; return pCarrier1.StartAccept() | pCarrier2.StartAccept(); } if (pCarrier1 != null) { pCarrier1.Dispose(); pCarrier1 = null; } if (pCarrier2 != null) { pCarrier2.Dispose(); pCarrier2 = null; } return false; }