- From: Bernard Aboba <Bernard.Aboba@microsoft.com>
- Date: Wed, 6 Aug 2014 20:01:09 +0000
- To: "public-ortc@w3.org" <public-ortc@w3.org>
- Message-ID: <b6aa31fd92fd4accaa43d71705e2c2bf@SN2PR03MB031.namprd03.prod.outlook.com>
After much cogitation, RFC and draft reading and re-reading, and general gnashing of teeth, we may have a proposed resolution to Issue 93. One of the related questions was when a change to the ICE gather policy takes effect. The proposed resolution is to cause an ICE restart to occur when a new gatherPolicy is installed via gather() and RTCIceTransport.start is called. Since a gather policy needs to apply to all RTCIceTransport objects using an RTCIceListener, the proposal is to move the gather() method to the RTCIceListener. The RTCIceTransport.start method also takes a new (optional) iceListener argument. Find below a summary of all the potential changes. Section 3.3 [Constructor(RTCIceListener iceListener), Constructor(RTCIceOptions options)] partial interface RTCIceTransport : RTCStatsProvider { readonly attribute RTCIceListener iceListener; readonly attribute RTCIceRole role; readonly attribute RTCIceComponent component; readonly attribute RTCIceTransportState state; readonly attribute RTCIceGatheringState iceGatheringState; void start (RTCIceParameters remoteParameters, optional RTCIceRole role, optional RTCIceListener iceListener); void stop (); RTCIceParameters getLocalParameters (); RTCIceParameters? getRemoteParameters (); // (removed) void gather (RTCIceGatherPolicy gatherPolicy); attribute EventHandler? onlocalcandidate; attribute EventHandler? onicestatechange; attribute EventHandler? onicegatheringstatechange; }; start Starts candidate connectivity checks and attempts to connect to the remote RTCIceTransport. If listener.gather() has not been called, start gathering with a default gatherPolicy of "all". If start is called with invalid parameters, throw an InvalidParameters exception. Parameter Type Nullable Optional Description remoteParameters RTCIceParameters ✘ ✘ role RTCIceRole ✘ ✔ listener RTCIceListener ✘ ✔ Return type: void Section 5.3 [Constructor(optional RTCIceOptions options)] interface RTCIceListener { void gather (RTCIceGatherPolicy gatherPolicy); RTCIceParameters getLocalParameters (); RTCIceOptions getOptions (); void setOptions (RTCIceOptions options); attribute EventHandler? onerror; }; gather Set the gather policy. Gathering does not begin until RTCIceTransport.start() is called. If gatherPolicy is invalid, throw an InvalidParameter exception. Parameter Type Nullable Optional Description gatherPolicy RTCIceGatherPolicy ✘ ✘ Return type: void getLocalParameters Obtain the ICE parameters of the RTCIceListener. No parameters. Return type: RTCIceParameters Section 5.4 enum RTCIceGatherPolicy { "all", "nohost", "relay" }; Examples Assuming that the getLocalParameters() and onlocalcandidate() methods are retained in the RTCIceTransport object, it does not appear to me that any changes are required to Section 3.15 (Examples 3 and 4). Similarly, it does not appear that changes are needed to Section 4.4 (Example 5). In order to illustrate the use of a custom gatherPolicy, I propose changing Section 5.5 Example 6 to the following: EXAMPLE 6 // Example to demonstrate forking when RTP and RTCP are not multiplexed. var iceOptions = ...; var iceRtpListener = new RTCIceListener(iceOptions); var iceBaseRtpTransport = new RTCIceTransport(iceRtpListener); //create the RTCP ICE transport var iceBaseRtcpTransport = iceBaseRtpTransport.createAssociatedTransport(); // Set the ICE listener gather policy to "relay", presumably for privacy reasons. iceBaseRtpTransport.iceListener.gather(RTCIceGatherPolicy.relay); iceBaseRtcpTransport.iceListener.gather(RTCIceGatherPolicy.relay); mySendInitiate( { "icertp": iceBaseRtpTransport.getLocalParameters(), "icertcp": iceBaseRtcpTransport.getLocalParameters() }, function(response) { // We may get N responses var iceRtpTransport = new RTCIceTransport(iceRtpListener); // Create new ice RTCP transport based on the (implicitly created) iceListener var iceRtcpTransport = iceRtpTransport.createAssociatedTransport(); // check to make sure the RTCRtpIceListener objects are set up as expected. assert(iceRtpTransport.iceListener == iceBaseRtpTransport.iceListener); assert(iceRtcpTransport.iceListener == iceBaseRtcpTransport.iceListener); // Create the ICE Transport Controller object var controller = new RTCIceTransportController(); controller.addTransport(iceRtpTransport); controller.addTransport(iceRtcpTransport); // Start the ICE transports (using the "relay" gather policy inherited from the iceListener) iceRtpTransport.start(response.icertp, RTCIceRole.controlling); iceRtcpTransport.start(response.icertcp, RTCIceRole.controlling); // ... setup DTLS, RTP, SCTP, etc. }); iceBaseRtpTransport.onlocalcandidate = mySendLocalRtpCandidate; iceBaseRtcpTransport.onlocalcandidate = mySendLocalRtcpCandidate;
Received on Wednesday, 6 August 2014 20:01:45 UTC