- From: Bernard Aboba <Bernard.Aboba@microsoft.com>
- Date: Tue, 22 Sep 2015 16:14:10 +0000
- To: "public-ortc@w3.org" <public-ortc@w3.org>
- Message-ID: <BLUPR03MB14975FC033B1D4D88888589EC450@BLUPR03MB149.namprd03.prod.outlook.com>
Issues 235 and 237 relate to examples 5, 6 and 7. They have now been updated as follows: EXAMPLE 5 // Example to demonstrate forking when RTP and RTCP are not multiplexed, // so that both RTP and RTCP IceGatherer and IceTransport objects are needed. // Include some helper functions import "helper.js"; // Create ICE gather options var gatherOptions = new RTCIceGatherOptions(); gatherOptions.gatherPolicy = RTCIceGatherPolicy.relay; gatherOptions.iceServers = [ { urls: "stun:stun1.example.net" }, { urls: "turn:turn.example.org", username: "user", credential: "myPassword" } ]; // Create ICE gatherer objects var iceRtpGatherer = new RTCIceGatherer(gatherOptions); var iceRtcpGatherer = iceRtpGatherer.createAssociatedGatherer(); // Prepare to signal local candidates iceRtpGatherer.onlocalcandidate = function(event) { mySendLocalCandidate(event.candidate, RTCIceComponent.RTP, "audio", iceRtpGatherer.getLocalParameters()); }; iceRtcpGatherer.onlocalcandidate = function(event) { mySendLocalCandidate(event.candidate, RTCIceComponent.RTCP, "audio", iceRtpGatherer.getLocalParameters()); }; // Initialize the ICE transport arrays var iceRtpTransports = []; var iceRtcpTransports = []; // Set up response function mySignaller.onResponse = function(responseSignaller, response) { // We may get N responses // Create the ICE RTP and RTCP transports var iceRtpTransport = new RTCIceTransport(iceRtpGatherer); var iceRtcpTransport = iceRtpTransport.createAssociatedTransport(); // Start the RTP and RTCP ICE transports so that outgoing ICE connectivity checks can begin // The RTP and RTCP ICE parameters are the same, so only the RTP parameters are used iceRtpTransport.start(iceRtpGatherer, response.icertp, RTCIceRole.controlling); iceRtcpTransport.start(iceRtcpGatherer, response.icertp, RTCIceRole.controlling); iceRtpTransports.push(iceRtpTransport); iceRtcpTransports.push(iceRtcpTransport); // Prepare to add ICE candidates signalled by the remote peer responseSignaller.onRemoteCandidate = function(remote) { // Locate the ICE transport that the signaled candidate relates to by matching the userNameFragment. var transports; if (remote.component === RTCIceComponent.RTP) { transports = iceRtpTransports; } else { transports = iceRtcpTransports; } for (var j = 0; j < iceTransport.length; j++) { var transport = transports[j]; if (transport.getRemoteParameters().userNameFragment === remote.parameters.userNameFragment) transport.addRemoteCandidate(remote.candidate); } } }; }; mySignaller.send({ // The RTP and RTCP parameters are identical, so no need to send both "icertp": iceRtpGatherer.getLocalParameters() }); EXAMPLE 6 // This is an example of how to offer ICE and DTLS parameters and // ICE candidates and get back ICE and DTLS parameters and ICE candidates, // and start both ICE and DTLS, when RTP and RTCP are multiplexed. // Assume that we have a way to signal (mySignaller). // Include some helper functions import "helper.js"; function initiate(mySignaller) { // Prepare the ICE gatherer var gatherOptions = new RTCIceGatherOptions(); gatherOptions.gatherPolicy = RTCIceGatherPolicy.all; gatherOptions.iceServers = [ { urls: "stun:stun1.example.net" }, { urls: "turn:turn.example.org", username: "user", credential: "myPassword" } ]; var iceGatherer = new RTCIceGatherer(gatherOptions); iceGatherer.onlocalcandidate = function(event) { mySignaller.mySendLocalCandidate(event.candidate); }; // Initialize the ICE and DTLS transport arrays var iceTransports = []; var dtlsTransports = []; // Create the DTLS certificate and parameters var dtlsParameters = new RTCDtlsParameters(); var keygenAlgorithm = { name: "ECDSA", namedCurve: "P-256" }; RTCCertificate.generateCertificate(keygenAlgorithm).then(function(certificate){ var cert = certificate; // Obtain the fingerprint of the created certificate dtlsParameters.fingerprints[0] = cert.fingerprint; }, function(){ trace('Certificate could not be created'); }); // Prepare to handle remote ICE candidates mySignaller.onRemoteCandidate = function(remote) { // Figure out which IceTranport a remote candidate relates to by matching the userNameFragment/password var j = 0; for (j = 0; j < iceTransport.length; j++) { var transport = iceTransports[j]; if (transport.getRemoteParameters().userNameFragment === remote.parameters.userNameFragment) transport.addRemoteCandidate(remote.candidate); } } }; // ... create RtpSender/RtpReceiver objects as illustrated in Section 6.5 Example 9. mySignaller.mySendInitiate({ "ice": iceGatherer.getLocalParameters(), "dtls": dtlsParameters, // ... marshall RtpSender/RtpReceiver capabilities as illustrated in Section 6.5 Example 9. }, function(remote) { // Create the ICE and DTLS transports var iceTransport = new RTCIceTransport(iceGatherer); iceTransport.start(iceGatherer, remote.ice, RTCIceRole.controlling); iceTransports.push(iceTransport); // Construct a RTCDtlsTransport object with the same certificate and fingerprint as in the Offer // so that the remote peer can verify it. var dtlsTransport = new RTCDtlsTransport(iceTransport, cert); dtlsTransport.start(remote.dtls); dtlsTransports.push(dtlsTransport); // ... configure RtpSender/RtpReceiver objects as illustrated in Section 6.5 Example 9. }); } EXAMPLE 7 // This is an example of how to answer with ICE and DTLS // and DTLS parameters and ICE candidates and start both ICE and DTLS, // assuming that RTP and RTCP are multiplexed. // Include some helper functions import "helper.js"; // Assume that remote info is signalled to us. function accept(mySignaller, remote) { var gatherOptions = new RTCIceGatherOptions(); gatherOptions.gatherPolicy = RTCIceGatherPolicy.all; gatherOptions.iceServers = [ { urls: "stun:stun1.example.net" }, { urls: "turn:turn.example.org", username: "user", credential: "myPassword" } ]; var iceGatherer = new RTCIceGatherer(gatherOptions); iceGatherer.onlocalcandidate = function(event) { mySignaller.mySendLocalCandidate(event.candidate); }; // Create the DTLS certificate var keygenAlgorithm = { name: "ECDSA", namedCurve: "P-256" }; RTCCertificate.generateCertificate(keygenAlgorithm).then(function(certificate){ var cert = certificate; }, function(){ trace('Certificate could not be created'); }); // Create ICE and DTLS transports var ice = new RTCIceTransport(iceGatherer); var dtls = new RTCDtlsTransport(ice, cert); // Prepare to handle remote candidates mySignaller.onRemoteCandidate = function(remote) { ice.addRemoteCandidate(remote.candidate); }; // ... create RtpSender/RtpReceiver objects as illustrated in Section 6.5 Example 9. mySignaller.mySendAccept({ "ice": iceGatherer.getLocalParameters(), "dtls": dtls.getLocalParameters() // ... marshall RtpSender/RtpReceiver capabilities as illustrated in Section 6.5 Example 9. }); // Start the ICE transport with an implicit gather policy of "all" ice.start(iceGatherer, remote.ice, RTCIceRole.controlled); // Start the DTLS transport dtls.start(remote.dtls); // ... configure RtpSender/RtpReceiver objects as illustrated in Section 6.5 Example 9. }
Received on Tuesday, 22 September 2015 16:14:49 UTC