This is an archived snapshot of W3C's public bugzilla bug tracker, decommissioned in April 2019. Please see the home page for more details.
The proposal for RTCRtpSender /Receiver sent to the mailing list on April 28 is reproduced below. The April 28 meeting seemed to agree that this is a sensible direction, but details may need adjusting before integrating. I suggest we call the SendDoohickeys RTCRtpSenders and the corresponding receive-side objects RTCRtpReceivers. These objects allow control of how a MediaStreamTrack is encoded and sent on the wire, including "hold" state, prioritization, and multiple encodings (e.g. simulcast). You get a RTCRtpSender as a return value from AddTrack (which replaces AddStream). You get a RTCRtpReceiver as an argument to the new onaddtrack callback (which replaces onaddstream). The actual track object can be obtained as a property from the RTCRtpReceiver (see below). For getting access to ICE/DTLS info, both RTCRtpSenders and RTCRtpReceivers can also have a reference to a RTCDtlsTransport object, which will have its own state variables, including the RTCIceConnectionState of that particular transport, and the .remoteCertificates for the DTLS connection. This allows applications to monitor the state of individual transports, as well as inspect the certificates for individual transports. The actual interface is as follows: // used with RTCRtpSender interface RTCDtlsTransport { attribute RTCIceConnectionState state; sequence<ArrayBuffer> getRemoteCertificates(); //... more stuff as needed }; // used with RTCRtpSender interface RTCRtpEncodingParams { double priority = 1.0; // relative priority of this encoding unsigned int maxBitrate = null; // maximum bits to use for this encoding boolean active; // sending or "paused/onhold" }; // the "send" doohickey interface RTCRtpSender { readonly attribute MediaStreamTrack track; readonly attribute RTCDtlsTransport transport; // 1-N encodings; in the future, N can be > 1, for simulcast or layered coding // Each EncodingParams specifies the details of what to send (e.g. bitrate) sequence<RTCRtpEncodingParams> getEncodings(); }; // the "receive" doohickey interface RTCRtpReceiver { readonly attribute RTCDtlsTransport transport; readonly attribute MediaStreamTrack track; // more stuff as needed }; // parameter to the onaddtrack event interface RemoteTrackEvent : Event { readonly attribute RtpReceiver receiver; readonly attribute MediaStreamTrack track; readonly attribute MediaStream stream; }; partial interface RTCPeerConnection { // because a track can be part of multiple streams, the id parameter // indicates which particular stream should be referenced in signaling RtpSender addTrack(track, streamId); // replaces addStream void removeTrack(RtpSender); // replaces removeStream sequence<RtpSender> getSenders(); sequence<RtpReceiver> getReceivers(); EventHandler onaddtrack; // replaces onaddstream; event object is RemoteTrackEvent. // note that onremovestream is not needed, since tracks are 'removed' // simply by progressing to the ENDED state }; For backcompat, addStream, removeStream, getLocalStreams, getRemoteStreams, and onaddstream can be trivially polyfilled in JS, so there is minimal impact on current applications. All together, the pipeline looks like this: Source ---> MST ---> RtpSender ---> DtlsTransport ---> (The Internet) ---> DtlsTransport ---> RtpReceiver ---> MST ---> <video/> Each RtpSender/Receiver references a single MST, although a single RtpSender/Receiver can send/receive multiple encodings (e.g. simulcast). There are N RtpSenders/Receivers per DtlsTransport; N is controlled by the policy specified for BUNDLE.
Summary from Justin Uberti, May 8: Trying to bring this discussion to a conclusion... I sense consensus around the following: - General concept of doohickeys, i.e. RTCRtpSender, RTPRtpReceiver. - addTrack(track, streamId)/removeTrack and onaddtrack. - Implicit cloning never occurs. This means that if you want to add a track twice to a PC, you need to first clone it. More discussion is still needed on: - RTCRtpEncodingParams - RTCDtlsTransport Therefore I would like to advance the initial, uncontroversial parts of this proposal, i.e. what I describe below. We can then discuss the exact nature of the encodings and transport objects separately on the list, and at the interim meeting. // the "send" doohickey interface RTCRtpSender { readonly attribute MediaStreamTrack track; }; // the "receive" doohickey interface RTCRtpReceiver { readonly attribute MediaStreamTrack track; }; // parameter to the onaddtrack event interface AddTrackEvent : Event { readonly attribute RtpReceiver receiver; readonly attribute MediaStreamTrack track; readonly attribute MediaStream stream; }; partial interface RTCPeerConnection { // because a track can be part of multiple streams, the id parameter // indicates which particular stream should be referenced in signaling RTCRtpSender addTrack(track, streamId); // replaces addStream; fails if |track| has already been added void removeTrack(RTCRtpSender); // replaces removeStream sequence<RTCRtpSender> getSenders(); sequence<RTCRtpReceiver> getReceivers(); EventHandler onaddtrack; // replaces onaddstream; event object is RemoteTrackEvent. // note that onremovestream is not needed, since tracks are 'removed' // simply by progressing to the ENDED state };
Reference to basic solution as of Oct 2014: https://www.w3.org/2011/04/webrtc/wiki/images/6/6c/WebRTC_RTCSender-Receiver%2C_TPAC_2014.pdf Slide 5 gives the basic structure. This has consensus, and should be integrated.
WebRTC API bugs have been moved to github issues: https://github.com/w3c/webrtc-pc/issues Please subscribe to the issues you want to keep watching.