WebRTC Extensions

W3C Editor's Draft 04 March

More details about this document
This version:
https://w3c.github.io/webrtc-extensions/
Latest published version:
https://www.w3.org/TR/webrtc-extensions/
Latest editor's draft:
https://w3c.github.io/webrtc-extensions/
History:
Commit history
Editor:
Bernard Aboba ( Microsoft Corporation )
Former editor:
Henrik Boström ( Google ) - Until
Feedback:
GitHub w3c/webrtc-extensions ( pull requests , new issue , open issues )
public-webrtc@w3.org with subject line [webrtc-extensions] ( archives )
Participate
Mailing list

Abstract

This document defines a set of ECMAScript APIs in WebIDL to extend the WebRTC 1.0 API.

Status of This Document

This is a preview

Do not attempt to implement this version of the specification. Do not reference this version as authoritative in any way. Instead, see https://w3c.github.io/webrtc-extensions/ for the Editor's draft.

This section describes the status of this document at the time of its publication. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.

The API is based on preliminary work done in the W3C WEBRTC Working Group.

This document was published by the Web Real-Time Communications Working Group as an Editor's Draft.

Publication as an Editor's Draft does not imply endorsement by W3C and its Members.

This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

This document was produced by a group operating under the W3C Patent Policy . W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy .

This document is governed by the 03 November 2023 W3C Process Document .

1. Introduction

This section is non-normative.

This document contains proposed extensions to the [ WEBRTC ] specification. Some of these extensions were originally included within the [ WEBRTC ] specification, but needed to be removed due to lack of implementation experience. Others were not sufficiently mature to be incorporated into that specification when they were developed, but were too small to warrant creation of a separate document.

This document contains some sections extending one specific interface or dictionary in the base specification; in this case the extension is only described in an individual section. Where an extension affects multiple interfaces or dictionaries, a subsection in the "Overviews" section describes the extension as a whole, while normative text is provided in sections relating to the individual interfaces.

As extensions mature and gain implementation experience, they may move from this document to the base specification if WG consensus emerges to do so.

2. Conformance

As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.

The key words MAY , MUST , MUST NOT , and SHOULD in this document are to be interpreted as described in BCP 14 [ RFC2119 ] [ RFC8174 ] when, and only when, they appear in all capitals, as shown here.

This specification defines conformance criteria that apply to a single product: the user agent that implements the interfaces that it contains.

Conformance requirements phrased as algorithms or specific steps may be implemented in any manner, so long as the end result is equivalent. (In particular, the algorithms defined in this specification are intended to be easy to follow, and not intended to be performant.)

Implementations that use ECMAScript to implement the APIs defined in this specification MUST implement them in a manner consistent with the ECMAScript Bindings defined in the Web IDL specification [ WEBIDL ], as this specification uses that specification and terminology.

3. Terminology

The following terms are defined in RTP Header Extension for Absolute Capture Time :

The process of chaining an operation to an operations chain is defined in [ WEBRTC ] Section 4.4.1.2.

The EventHandler interface, representing a callback used for event handlers, is defined in [ HTML ].

The concepts queue a task and networking task source are defined in [ HTML ].

The concept fire an event is defined in [ DOM ].

The terms event , event handlers and event handler event types are defined in [ HTML ].

The process of forming a candidate pair is defined in [ RFC8445 ] Section 6.1.2.2.

The process of nominating a candidate pair is defined in [ RFC8445 ] Section 8.1.1.

The process of freeing a candidate is defined in [ RFC8445 ] Section 8.3.

4. Filtering ICE candidates with Content-Security-Policy

The RTCPeerConnection interface is defined in [ WEBRTC ]. This document extends that interface by using Content-Security-Policy for ICE candidate filtering.

4.1 Modifications to existing procedures

Append the following paragraph to the administratively prohibited algorithm:

If should RTC connections be blocked for global? with the relevant global object of the RTCPeerConnection object in question returns "Blocked" , then all candidates MUST be administratively prohibited .

5. RTP header extension control

RTP header extension control is an extension to RTCRtpTransceiver that allows to set and query the RTP header extensions supported and negotiated in SDP.

The RTP header extension mechanism is defined in [ RFC8285 ], with the SDP negotiation mechanism defined in section 5. It goes into some detail on the meaning of "direction" with regard to RTP header extensions, and gives a detailed procedure for negotiating RTP header extension IDs.

This API extension gives the means to control the use and direction of RTP header extensions as documented in [ RFC8285 ]. It does not influence the ID negotiation mechanism, except for being able to control the number of extensions offered.

5.1 RTCRtpTransceiver interface extensions

The RTCRtpTransceiver interface is defined in [ WEBRTC ]. This document extends that interface by adding an additional method and attribute in order to control negotiation of RTP header extensions.

WebIDLpartial dictionary RTCRtpHeaderExtensionCapability {
  required RTCRtpTransceiverDirection direction;
};
partial interface RTCRtpTransceiver {
  sequence<RTCRtpHeaderExtensionCapability> getHeaderExtensionsToNegotiate();
  undefined setHeaderExtensionsToNegotiate(
      sequence<RTCRtpHeaderExtensionCapability> extensions);
  sequence<RTCRtpHeaderExtensionCapability> getNegotiatedHeaderExtensions();
};


Let [[HeaderExtensionsToNegotiate]] and [[NegotiatedHeaderExtensions]] be internal slots of the RTCRtpTransceiver , initialized as follows:

  1. Set [[HeaderExtensionsToNegotiate]] to the platform-specific list of implemented RTP header extensions. The direction attribute for all extensions that are mandatory to use MUST be initialized to an appropriate value other than " stopped ". The direction attribute for extensions that will not be offered by default in an initial offer MUST be initialized to " stopped ".

    Note

    The list of header extensions that MUST / SHOULD be supported is listed in [ RTCWEB-RTP ], section 5.2. The "mid" extension is mandatory to use when BUNDLE is in use, per [ BUNDLE ] section 9.1.

  2. Set [[NegotiatedHeaderExtensions]] to an empty list.

5.2 Modifications to existing procedures

Make the following modifications to the set a session description algorithm:

In the algorithms for generating initial offers in [ RTCWEB-JSEP ] section 5.2.1, replace "for each supported RTP header extension, an "a=extmap" line, as specified in [ RFC5285 ], section 5" " with "For each RTP header extension "e" listed in [[HeaderExtensionsToNegotiate]] where direction is not " stopped ", an "a=extmap" line, as specified in [ RFC5285 ], section 5, with direction taken from "e"'s direction attribute."

In the algorithm for generating subsequent offers in [ RTCWEB-JSEP ] section 5.2.2, replace "The RTP header extensions MUST only include those that are present in the most recent answer" with "For each RTP header extension listed in [[HeaderExtensionsToNegotiate]] , and where direction is not " stopped ", generate an appropriate "a=extmap" line with "direction" set according to the rules of [ RFC5285 ] section 6, considering the direction in [[HeaderExtensionsToNegotiate]] to indicate the answerer's desired usage".

In the algorithm for generating initial answers in [ RTCWEB-JSEP ] section 5.3.1, replace "For each supported RTP header extension that is present in the offer" with "For each supported RTP header extension that is present in the offer and is also present in [[HeaderExtensionsToNegotiate]] with a direction different from " stopped ", set the appropriate direction based on direction that does not exceed the direction in the offer".

Note

Since JSEP does not know about WebRTC internal slots, merging this change requires more work on a JSEP revision.

5.3 Methods

getHeaderExtensionsToNegotiate

Execute the following steps:

  1. Let transceiver be the RTCRtpTransceiver that this method was invoked on.

  2. Return transceiver . [[HeaderExtensionsToNegotiate]] .

setHeaderExtensionsToNegotiate

Execute the following steps:

  1. Let transceiver be the RTCRtpTransceiver that this method was invoked on.

  2. Let extensions be the first argument of this method.

  3. If the size of extensions does not match the size of transceiver . [[HeaderExtensionsToNegotiate]] throw an InvalidModificationError .

  4. For each index i of extensions , run the following steps:

    1. Let extension be the i -th element of extensions .

    2. If extension . uri is not equal to the uri of the i -th element of transceiver . [[HeaderExtensionsToNegotiate]] , throw an InvalidModificationError .

    3. If extension . direction is not " sendrecv " and uri indicates a mandatory-to-use attribute that is required to be both sent and received, throw an InvalidModificationError .

    4. If extension . direction is " stopped " and uri indicates a mandatory-to-implement extension, throw an InvalidModificationError .

    5. If necessary, restrict extension . direction as to not exceed the user agent's capabilities for this extension.

  5. Set transceiver . [[HeaderExtensionsToNegotiate]] to extensions .

getNegotiatedHeaderExtensions

Execute the following steps:

  1. Let transceiver be the RTCRtpTransceiver that this method was invoked on.

  2. Return transceiver . [[NegotiatedHeaderExtensions]] .

6. Adjusting the receiver's jitter buffer

The RTCRtpReceiver interface is defined in [ WEBRTC ]. This document extends that interface by adding an additional attribute to adjust the receiver's jitter buffer.

6.1 Modification to existing procedures

Let RTCRtpReceiver objects have a [[JitterBufferTarget]] internal slot initially initialized to null .

6.2 RTCRtpReceiver interface extensions

WebIDLpartial interface RTCRtpReceiver {
  attribute DOMHighResTimeStamp? jitterBufferTarget;
};


6.3 Attributes

jitterBufferTarget of type DOMHighResTimeStamp , nullable

This attribute allows the application to specify a target duration of time in milliseconds of media for the RTCRtpReceiver 's jitter buffer to hold. This influences the amount of buffering done by the user agent , which in turn affects retransmissions and packet loss recovery. Altering the target value allows applications to control the tradeoff between playout delay and the risk of running out of audio or video frames due to network jitter.

The user agent MUST have a minimum allowed target and a maximum allowed target reflecting what the user agent is able or willing to provide based on network conditions and memory constraints, which can change at any time.

Note

This is a target value. The resulting change in delay can be gradually observed over time. The receiver's average jitter buffer delay can be measured as the delta jitterBufferDelay divided by the delta jitterBufferEmittedCount .

An average delay is expected even if DTX is used. For example, if DTX is used and packets start flowing after silence, larger targets can influence the user agent to buffer these packets rather than playing them out.

On getting, this attribute MUST return the value of the [[JitterBufferTarget]] internal slot.

On setting, the user agent MUST run the following steps:

  1. Let receiver be the RTCRtpReceiver object on which the setter is invoked.

  2. Let target be the argument to the setter.

  3. If target is negative or larger than 4000 milliseconds, then throw a RangeError .

  4. Set receiver 's [[JitterBufferTarget]] to target .

  5. Let track be receiver 's [[ReceiverTrack]] .

  6. In parallel, begin executing the following steps:

    1. Update the underlying system about the new target , or that there is no application preference if target is null .

      If track is synchronized with another RTCRtpReceiver 's track for audio/video synchronization , then the user agent SHOULD use the larger of the two receivers' [[JitterBufferTarget]] for both receivers.

      When the underlying system is applying a jitter buffer target, it will continuously make sure that the actual jitter buffer target is clamped within the minimum allowed target and maximum allowed target .

      Note

      If the user agent ends up using a target different from the requested one (e.g. due to network conditions or physical memory constraints), this is not reflected in the [[JitterBufferTarget]] internal slot.

    2. Modifying the jitter buffer target of the underlying system SHOULD affect the internal audio or video buffering gradually in order not to hurt user experience. Audio samples or video frames SHOULD be accelerated or decelerated before playout, similarly to how it is done for audio/video synchronization or in response to congestion control.

      The acceleration or deceleration rate may vary depending on network conditions or the type of audio received (e.g. speech or background noise). It MAY take several seconds to achieve 1 second of buffering but SHOULD not take more than 30 seconds assuming packets are being received. The speed MAY be different for audio and video.

      Note

      For audio, acceleration and deceleration can be measured with insertedSamplesForDeceleration and removedSamplesForAcceleration . For video, this may result in the same frame being rendered multiple times or frames may be dropped.

7. RTCRtpEncodingParameters extensions

The RTCRtpEncodingParameters dictionary is defined in [ WEBRTC ]. This document extends that dictionary with additional members to control audio packetization.

WebIDLpartial dictionary RTCRtpEncodingParameters {
  unsigned long ptime;
  boolean adaptivePtime = false;
  RTCRtpCodec codec;
};


7.1 Dictionary RTCRtpEncodingParameters Members

ptime of type unsigned long

The preferred duration of media represented by a packet in milliseconds.

(Feature at Risk) Issue 1

ptime was moved from [ WEBRTC ] to this specification due to lack of support from implementers. It is therefore marked as a feature at risk.

adaptivePtime of type boolean , defaulting to false .

Indicates whether this encoding MAY dynamically change the frame length. If the value is true , the user agent MAY use any valid frame length for any of its frames, and MAY change this at any time. Valid values are multiples of 10ms. If the maxptime attribute (defined in [ RFC4566 ] Section 6) is specified, that maximum applies. If the value is false , the user agent MUST use a fixed frame length.

If adaptivePtime is set to true , ptime MUST NOT be set; otherwise, InvalidModificationError MUST be thrown .

Note

Using a longer frame length reduces the bandwidth consumption due to overhead, but does so at the cost of increased latency. Changing the frame length dynamically allows the user agent to adapt its bandwidth allocation strategy based on the current network conditions.

codec of type RTCRtpCodec

Optional value selecting which codec is used for this encoding's RTP stream. The RTCRtpCodec dictionary is defined in [ WEBRTC ]. If absent , the user agent can chose to use any negotiated codec.

7.2 Modifications to existing procedures

7.2.1 setParameters()

Add the following steps to the setParameters validation steps :

  1. Let choosableCodecs be parameters. codecs .

  2. If choosableCodecs is an empty list, set choosableCodecs to transceiver. [[PreferredCodecs]] .

  3. If choosableCodecs is still an empty list, set choosableCodecs to the list of implemented send codecs for transceiver's kind.

  4. If any encoding in encodings contains a codec not found in choosableCodecs , return a promise rejected with a newly created InvalidModificationError .

  5. If the user agent does not support setting the codec for any encoding or mixing different codec values on the different encodings, return a promise rejected with a newly created OperationError .

7.2.2 addTransceiver()

Add the following steps to the addTransceiver sendEncodings validation steps :

  1. If any codec parameter in sendEncodings does not match any codec in RTCRtpSender . getCapabilities ( kind ) . codecs , throw an OperationError .

  2. If the user agent does not support changing codecs without negotiation or does not support setting codecs for individual encodings, return a promise rejected with a newly created OperationError .

7.2.3 Set the session description

Append the following steps to the set the session description algorithm:

  1. For each transceiver in connection 's set of transceivers :

    1. Let codecs be transceiver . [[Sender]] . [[SendCodecs]] .

    2. If codecs is not an empty list:

      1. Remove any codec value in transceiver . [[Sender]] . [[SendEncodings]] that does not match any entry in codecs .

8. RTCRtpSender setParameters () extensions for requesting the generation of a key frame.

The RTCRtpSender 's setParameters () method is defined in [ WEBRTC ]. This document extends the optional second argument to request generation of a key frame by the encoder.

WebIDLpartial dictionary RTCSetParameterOptions {
  sequence<RTCEncodingOptions> encodingOptions = [];
};
dictionary RTCEncodingOptions {
  boolean keyFrame = false;
};


8.1 Dictionary RTCSetParameterOptions Members

The RTCSetParameterOptions are extended by a sequence of RTCEncodingOptions , one for each encoding.

encodingOptions of type sequence< RTCEncodingOptions > , defaulting to [] .

A sequence containing encoding options for each RTP encoding.

8.2 Dictionary RTCEncodingOptions Members

RTCEncodingOptions is the WebRTC equivalent of VideoEncoderEncodeOptions in [ WebCodecs ].

keyFrame of type boolean , defaulting to false .

When set to true, request that RTCRtpSender's encoder generates a keyframe for the encoding. The semantic of this boolean is similar to the RTCP FIR message described in [RFC5104], section 3.5.1.

8.3 RTCRtpSender setParameters () modifications to existing procedures

In the steps to call the setParameters () method, let parameters be the method's first argument and let setParameterOptions be the method's second argument.

Append the following steps after the steps to validate the parameters :

In the steps to configure the media stack to use parameters , append the following step:

Note

setParameters () does not wait for a key frame to be produced by the encoder.

9. RTCIceTransport extensions

The RTCIceTransport interface is defined in [ WEBRTC ]. This document extends that interface to allow an application to observe and affect certain actions that an ICE agent [ RFC5245 ] performs.

The ICE agent performs connectivity checks to identify valid candidate pairs on which it is possible to send and receive media and data. In order to conclude ICE processing, the ICE agent nominates a valid candidate pair as the selected candidate pair. Prior to nomination, any valid candidate pair may be used to send and receive data. Once a candidate pair is nominated successfully, only the selected candidate pair will be used to send and receive data. Changing the selected candidate pair after a successful nomination requires an ICE restart.

When the ICE agent has formed a candidate pair, the user agent MUST queue a task to add a candidate pair :

  1. Let connection be the RTCPeerConnection object associated with this ICE agent .

  2. If connection . [[IsClosed]] is true , abort these steps.

  3. Let candidatePair be a new RTCIceCandidatePair dictionary with its local and remote members initialized to new RTCIceCandidate s representing the local and remote part of the formed pair respectively.

  4. Let transport be the RTCIceTransport object associated with candidatePair .

  5. Assert : candidatePair does not match any item in transport . [[CandidatePairs]]

  6. Append candidatePair to [[CandidatePairs]] .

  7. Fire an event named icecandidatepairadd at transport , using RTCIceCandidatePairEvent , with the local and remote attributes initialized to the local and remote candidates, respectively, of candidatePair .

When the ICE agent has picked a candidate pair to nominate as the selected candidate pair, the user agent MUST queue a task to nominate a candidate pair :

  1. Let connection be the RTCPeerConnection object associated with this ICE agent .

  2. If connection . [[IsClosed]] is true , abort these steps.

  3. Let transport be the RTCIceTransport object associated with this candidate pair.

  4. Let candidatePair be the candidate pair which is being nominated .

  5. Set transport . [[ProposalPending]] to true .

  6. Let accepted be the result of firing an event named icecandidatepairnominate at transport , using RTCIceCandidatePairEvent , with the cancelable attribute initialized to true , and the local and remote attributes initialized to the local and remote candidates, respectively, of candidatePair .

  7. Set transport . [[ProposalPending]] to false .

  8. If accepted is false , abort these steps and instruct the ICE agent to continue to perform connectivity checks.

  9. Otherwise, instruct the ICE agent to nominate the candidate pair indicated by candidatePair .

Note

The ICE agent will continue to send data using candidatePair until instructed to use another candidate pair with selectCandidatePair .

When the ICE agent has picked a candidate pair to remove, the user agent MUST queue a task to remove a candidate pair :

  1. Let connection be the RTCPeerConnection object associated with this ICE agent .

  2. If connection . [[IsClosed]] is true , abort these steps.

  3. Let candidatePair be the candidate pair which is being removed.

  4. Let transport be the RTCIceTransport object associated with candidatePair .

  5. Let cancelable be true if the candidate pair is being removed in order to free an unused candidate, and false otherwise.

  6. Set transport . [[ProposalPending]] to true .

  7. Let accepted be the result of firing an event named icecandidatepairremove at transport , using RTCIceCandidatePairEvent , with the cancelable attribute initialized to cancelable , and the local and remote attributes initialized to the local and remote candidates, respectively, of candidatePair .

  8. Set transport . [[ProposalPending]] to false .

  9. If accepted is false , instruct the ICE agent to not remove the candidate pair indicated by candidatePair , and instead continue to send and respond to ICE connectivity checks on the candidate pair as before.

  10. Otherwise (if accepted is true ), run the following steps:

    1. Remove candidatePair from transport . [[CandidatePairs]] .

    2. Instruct the ICE agent to remove the candidate pair indicated by candidatePair .

The RTCIceTransport object is extended by adding the following internal slots:

WebIDLpartial interface RTCIceTransport {
  attribute EventHandler onicecandidatepairadd;
  attribute EventHandler onicecandidatepairremove;
  attribute EventHandler onicecandidatepairnominate;
  Promise<undefined> selectCandidatePair(RTCIceCandidatePair candidatePair);
  Promise<undefined> removeCandidatePair(RTCIceCandidatePair candidatePair);
};


9.1 Attributes

onicecandidatepairadd of type EventHandler

The event type of this event handler is icecandidatepairadd , and is fired as part of the add a candidate pair algorithm.

onicecandidatepairremove of type EventHandler

The event type of this event handler is icecandidatepairremove , and is fired as part of the remove a candidate pair algorithm.

onicecandidatepairnominate of type EventHandler

The event type of this event handler is icecandidatepairnominate , and is fired as part of the nominate a candidate pair algorithm.

9.2 Methods

selectCandidatePair

The selectCandidatePair method attempts to select a different candidate pair to send data over. If successful, data will be sent on the provided candidate pair. It is meant to be called after the application defers the nomination of a candidate pair by cancelling the icecandidatepairnominate event.

When this method is invoked, the user agent MUST run the following steps:

  1. Let connection be the RTCPeerConnection object associated with this .

  2. If connection . [[IsClosed]] is true , throw an InvalidStateError .

  3. If this . [[ProposalPending]] is true , throw an InvalidStateError .

  4. If this . [[IceTransportState]] is either of " new ", " failed " or " closed ", throw an InvalidStateError .

  5. Let candidatePair be the method's first argument.

  6. If candidatePair does not match any item in this . [[CandidatePairs]] , throw a NotFoundError .

  7. Let p be a new promise.

  8. In parallel, instruct the ICE agent to use candidatePair to send data.

    1. When the ICE agent has completed selecting candidatePair , queue a task to run the following steps:

      1. Run the change the selected candidate pair and state steps to update this . [[SelectedCandidatePair]] and this . [[IceTransportState]] as necessary and fire any associated events.

      2. Resolve p .

  9. Return p .

Note

After changing the selected candidate pair, the controlling ICE agent may attempt to nominate the candidate pair as well to conclude ICE processing. The application may cancel the nomination to allow further changes to the selected candidate pair.

removeCandidatePair

The removeCandidatePair method removes the provided candidate pair. The ICE agent will stop sending and responding to ICE connectivity checks on the removed candidate pair, and it can no longer be used to send data for this transport. This method is meant to be called when the application wants to allow the ICE agent to free candidates that it no longer needs.

When this method is invoked, the user agent MUST run the following steps:

  1. Let connection be the RTCPeerConnection object associated with this .

  2. If connection . [[IsClosed]] is true , throw an InvalidStateError .

  3. If this . [[ProposalPending]] is true , throw an InvalidStateError .

  4. If this . [[IceTransportState]] is either of " new ", " failed " or " closed ", throw an InvalidStateError .

  5. Let candidatePair be the method's first argument.

  6. If candidatePair does not match any item in this . [[CandidatePairs]] , throw a NotFoundError .

  7. Remove the item in this . [[CandidatePairs]] that matches candidatePair .

  8. Let p be a new promise.

  9. In parallel, instruct the ICE agent to remove the candidate pair indicated by candidatePair .

    1. When the ICE agent has completed the removal, queue a task to run the following steps:

      1. Fire an event named icecandidatepairremove at transport , using RTCIceCandidatePairEvent , with the cancelable attribute initialized to false , and the local and remote attributes initialized to the local and remote candidates, respectively, of candidatePair .

      2. Resolve p .

  10. Return p .

9.3 RTCIceCandidatePairEvent

The icecandidatepairadd and icecandidatepairremove events use the RTCIceCandidatePairEvent interface.

WebIDL[Exposed=Window]
  interface RTCIceCandidatePairEvent : Event {
    constructor(DOMString type, RTCIceCandidatePairEventInit eventInitDict);
    readonly attribute RTCIceCandidate local;
    readonly attribute RTCIceCandidate remote;
};


Constructors

RTCIceCandidatePairEvent.constructor()

Attributes

local of type RTCIceCandidate , readonly

The local attribute represents the local RTCIceCandidate of the candidate pair associated with the event.

remote of type RTCIceCandidate , readonly

The remote attribute represents the remote RTCIceCandidate of the candidate pair associated with the event.

WebIDLdictionary RTCIceCandidatePairEventInit : EventInit {
  required RTCIceCandidate local;
  required RTCIceCandidate remote;
};


Dictionary RTCIceCandidatePairEventInit Members

local of type RTCIceCandidate , required

The local RTCIceCandidate of the candidate pair announced by the event.

remote of type RTCIceCandidate , required

The remote RTCIceCandidate of the candidate pair announced by the event.

The candidate match algorithm given two RTCIceCandidate first and second is as follows:

  1. If first . candidate is not identical to second . candidate , return false .

  2. If either (but not both) of first . sdpMid and second . sdpMid is null , return false .

  3. If neither of first . sdpMid and second . sdpMid is null , and first . sdpMid is not identical to second . sdpMid , return false .

  4. If either (but not both) of first . sdpMLineIndex and second . sdpMLineIndex is null , return false .

  5. If neither of first . sdpMLineIndex and second . sdpMLineIndex is null and first . sdpMLineIndex is not equal to second . sdpMLineIndex , return false .

  6. If either (but not both) of first . usernameFragment and second . usernameFragment is null , return false .

  7. If neither of first . usernameFragment and second . usernameFragment is null and first . usernameFragment is not identical to second . usernameFragment , return false .

  8. Return true .

The candidate pair match algorithm given two RTCIceCandidatePair first and second is as follows:

  1. If first . local does not match second . local , return false .

  2. If first . remote does not match second . remote , return false .

  3. Return true .

10. RTCRtpContributingSource extensions

The RTCRtpContributingSource dictionary is defined in [ WEBRTC ]. This document extends that dictionary by adding two additional members.

In this section, the capture system refers to the system where media is sourced from and the sender system refers to the system that is sending RTP and RTCP packets to the receiver system where RTCRtpContributingSource data is populated.

In a direct connection, the capture system is the same as the sender system . But when one or more RTCP-terminating intermediate systems (e.g. mixers) are involved this is not the case. In such cases, media is sourced from the capture system , may be relayed through a number of intermediate systems and is then finally sent from the sender system to the receiver system . The sender system - receiver system path only represents the "last hop".

Despite RTCRemoteInboundRtpStreamStats . roundTripTime measurements only accounting for the "last hop", one-way delay from the capture system 's time of capture to the receiver system 's time of playout can be estimated if the RTP Header Extension for Absolute Capture Time is used all hops of the way, where each RTCP-terminating intermediate system appropriately updates the estimated capture clock offset .

WebIDLpartial dictionary RTCRtpContributingSource {
  DOMHighResTimeStamp captureTimestamp;
  DOMHighResTimeStamp senderCaptureTimeOffset;
};


10.1 Dictionary RTCRtpContributingSource Members

captureTimestamp of type DOMHighResTimeStamp .

The captureTimestamp is the timestamp that, the most recent frame (from an RTP packet originating from this source) delivered to the RTCRtpReceiver 's MediaStreamTrack , was originally captured. Its reference clock is the capture system 's NTP clock (same clock used to generate NTP timestamps for RTCP sender reports on that system).

On populating this member, the user agent MUST run the following steps:

  1. If the relevant RTP packet contains the RTP Header Extension for Absolute Capture Time , return the value of the absolute capture timestamp field and abort these steps.

  2. Otherwise, if the relevant RTP packet does not contain the RTP Header Extension for Absolute Capture Time but a previous RTP packet did, return the result of calculating the absolute capture timestamp according to timestamp interpolation and abort these steps.

  3. Otherwise, return undefined .
Note

If multiple receiving tracks are sourced from the same capture system , two captureTimestamp s can be used to accurately measure audio-video synchronization since both timestamps are based on the same system's clock.

senderCaptureTimeOffset of type DOMHighResTimeStamp .

The senderCaptureTimeOffset is the sender system 's estimate of the offset between its own NTP clock and the capture system 's NTP clock, for the same frame that the captureTimestamp was originated from.

On populating this member, the user agent MUST run the following steps:

  1. If the relevant RTP packet contains the RTP Header Extension for Absolute Capture Time and the estimated capture clock offset field is present, return the value of the estimated capture clock offset field and abort these steps.

  2. Otherwise, if the relevant RTP packet does not contain the RTP Header Extension for Absolute Capture Time 's estimated capture clock offset field, but a previous RTP packet did, return the most recent value that was present and abort these steps.

  3. Otherwise, return undefined .
Note

The time of capture can estimatedly be expressed in the sender system 's clock as follows: senderCaptureTimestamp = captureTimestamp + senderCaptureTimeOffset .

Note

The offset between the sender system 's clock and the receiver system 's clock can be estimated as follows: senderReceiverTimeOffset = RTCRemoteOutboundRtpStreamStats . timestamp }} - ( RTCRemoteOutboundRtpStreamStats . remoteTimestamp + RTCRemoteInboundRtpStreamStats . roundTripTime / 2).

Note

The time of capture can estimatedly be expressed in the receiver system 's clock as follows: receiverCaptureTimestamp = senderCaptureTimestamp + senderReceiverTimeOffset .

Note

The one-way delay between the capture system 's time of capture and the receiver system 's time of playout can be estimated as follows: RTCRtpContributingSource . timestamp - receiverCaptureTimestamp .

11. Data Channel Extensions

11.1 Transferable Data Channels

This section extends RTCDataChannel by making it transferable .

This allows sending and receiving messages outside the context the connection was created, for instance in workers or third-party iframes.

The WebIDL changes are the following:

WebIDL  [Exposed=(Window,Worker), Transferable]
  partial interface RTCDataChannel {
};


The create an RTCDataChannel algorithm is updated by adding the following steps after step 4 of the original algorithm:

  1. Initialize channel . [[IsTransferable]] to true .

  2. Queue a task to run the following step:

    1. Set channel . [[IsTransferable]] to false .

This task needs to run before any task enqueued by the receiving messages on a data channel algorithm for channel . This ensures that no message is lost during the transfer of a RTCDataChannel .

The send() algorithm is modified by adding the following step after step 1 of the original algorithm:
  1. Set channel . [[IsTransferable]] to false .

The RTCDataChannel transfer steps , given value and dataHolder , are:

  1. If value . [[IsTransferable]] is false , throw a "DataCloneError" DOMException.

  2. Set dataHolder . [[ReadyState]] to value . [[ReadyState]] .

  3. Set dataHolder . [[DataChannelLabel]] to value . [[DataChannelLabel]] .

  4. Set dataHolder . [[Ordered]] to value . [[Ordered]] .

  5. Set dataHolder . [[MaxPacketLifeTime]] to value . . [[MaxPacketLifeTime]]

  6. Set dataHolder . [[MaxRetransmits]] to value . [[MaxRetransmits]] .

  7. Set dataHolder . [[DataChannelProtocol]] to value . [[DataChannelProtocol]] .

  8. Set dataHolder . [[Negotiated]] to value . [[Negotiated]] .

  9. Set dataHolder . [[DataChannelId]] to value . [[DataChannelId]] .

  10. Set dataHolder . [[underlyingDataTransport]] to value underlying data transport .

  11. Set value . [[IsTransferable]] to false .

  12. Set value . [[ReadyState]] to "closed" .

The RTCDataChannel transfer-receiving steps , given dataHolder and channel , are:

  1. Initialize channel . [[ReadyState]] to dataHolder . [[ReadyState]] .

  2. Initialize channel . [[DataChannelLabel]] to dataHolder . [[\DataChannelLabel]] .

  3. Initialize channel . [[Ordered]] to dataHolder . [[Ordered]] .

  4. Initialize channel . [[MaxPacketLifeTime]] to dataHolder . [[MaxPacketLifeTime]] .

  5. Initialize channel . [[MaxRetransmits]] to dataHolder . [[MaxRetransmits]] .

  6. Initialize channel . [[DataChannelProtocol]] to dataHolder . [[DataChannelProtocol]] .

  7. Initialize channel . [[Negotiated]] to dataHolder . [[Negotiated]] .

  8. Initialize channel . [[DataChannelId]] to dataHolder . [[DataChannelId]] .

  9. Initialize channel underlying data transport to dataHolder . [[underlyingDataTransport]] .

The above steps do not need to transfer [[BufferedAmount]] as its value will always be equal to 0 . The reason is an RTCDataChannel can be transferred only if its send() algorithm was not called prior the transfer.

If the underlying data transport is closed at the time of the transfer-receiving steps , the RTCDataChannel object will be closed by running the announcing a data channel as closed algorithm immediately after the transfer-receiving steps .

12. RTP Header Extension Encryption

12.1 RTCRtpHeaderEncryptionPolicy Enum

RTP header extension encryption policy affects whether RTP header extension encryption is negotiated if the remote endpoint does not support [ RFC9335 ]. If the remote endpoint supports [ RFC9335 ], all media streams are sent utilizing [ RFC9335 ].

WebIDLenum RTCRtpHeaderEncryptionPolicy {
  "negotiate",
  "require"
};


Enumeration description (non-normative)
negotiate

Negotiate RTP header extension encryption as defined in [ RFC9335 ]. If encryption cannot be negotiated, RTP header extensions are sent in the clear.

require

Require RTP header extension encryption. In [ WEBRTC ] Section 4.4.1.5, add the following check after Step 4.4.4: If remote is true , the connection 's RTCRtpHeaderEncryptionPolicy is require and the description does not support [ RFC9335 ], then reject p with a newly created InvalidAccessError and abort these steps.

12.2 RTCRtpTransceiver interface extensions

rtpHeaderEncryptionNegotiated defines whether the transceiver is sending enrypted RTP header extensions as defined in [ RFC9335 ].

WebIDLpartial interface RTCRtpTransceiver {
  readonly attribute boolean rtpHeaderEncryptionNegotiated;
};


12.2.1 Attributes

rtpHeaderEncryptionNegotiated of type Boolean , readonly, nullable

The rtpHeaderEncryptionNegotiated attribute indicates whether [ RFC9335 ] has been negotiated. On getting, the attribute MUST return the value of the [[RtpHeaderEncryptionNegotiated]] slot. In [ WEBRTC ] Section 5.4, add the following step to "create an RTCRtpTransceiver ": Let transceiver have a [[RtpHeaderEncryptionNegotiated]] internal slot, initialized to false .

12.3 RTCConfiguration extensions

rtpHeaderEncryptionPolicy defines the policy for negotiation of RTP header encryption using [ RFC9335 ].

WebIDLpartial dictionary RTCConfiguration {
  RTCRtpHeaderEncryptionPolicy rtpHeaderEncryptionPolicy = "negotiate";
};


12.3.1 Dictionary RTCConfiguration Members

rtpHeaderEncryptionPolicy of type RTCRtpHeaderEncryptionPolicy

(Feature at Risk) Issue 2

rtpHeaderEncryptionPolicy is marked as a feature at risk, since there is no clear commitment from implementers.

13. Disabling hardware acceleration

While hardware acceleration of video encoding and decoding is generally desirable, it has proven to be operationally challenging to achieve in the environment of a browser with no detailed information about the underlying hardware. In some cases, falling back to software encoding yields better results.

Note

The methods specified in this section should be used sparingly and not for extended amounts of time.

Note

In privacy-sensitive contexts, browsers may disable hardware acceleration by default to reduce the fingerprinting surface.

13.1 RTCRtpReceiver extensions

The RTCRtpReceiver interface is defined in [ WEBRTC ]. This document extends this interface by adding a static method and internal slot [[HardwareDisabled]] initialized to false .

WebIDLpartial interface RTCRtpReceiver {
  static undefined disableHardwareDecoding();
};


When the RTCRtpReceiver 's disableHardwareDecoding method is called, the user agent MUST run the following steps:

  1. When the RTCPeerConnection.constructor() has been invoked abort these steps.

  2. Set the RTCRtpReceiver's [[HardwareDisabled]] slot to true .

13.2 RTCRtpSender extensions

The RTCRtpSender interface is defined in [ WEBRTC ]. This document extends this interface by adding a static method and internal slot [[HardwareDisabled]] initialized to false .

WebIDLpartial interface RTCRtpSender {
  static undefined disableHardwareEncoding();
};


When the RTCRtpSender 's disableHardwareEncoding method is called, the user agent MUST run the following steps:

  1. When the RTCPeerConnection.constructor() has been invoked abort these steps.

  2. Set the RTCRtpSender's [[HardwareDisabled]] slot to true .

13.3 Modifications to existing procedures

In the set a session description algorithm, add a step right after the step that sets transceiver.[[Receiver]].[[ReceiveCodecs]], saying "If the RTCRtpReceiver's [[HardwareDisabled]] slot is true , remove any codec from transceiver.[[Receiver]].[[ReceiveCodecs]] for which the underlying decoder is hardware-accelerated".

In the set a session description algorithm, add a step right after the step that sets transceiver.[[Sender]].[[SendCodecs]], saying "If the RTCRtpSender's [[HardwareDisabled]] slot is true , remove any codec from transceiver.[[Sender]].[[SendCodecs]] for which the underlying encoder is hardware-accelerated".

14. Encoded frame source for RTCRtpSender

The RTCRtpSenderEncodedSource interface allows applications to inject encoded frames into an RTCRtpSender . This is intended to support use cases where an application already has access to the encoded frames it wants to send. An example is forwarding encoded frames coming from one or more peer connections to another peer connection. In this case, the application can use an encoded transform on the RTCRtpReceivers of the input peer connections to get the encoded frames and inject them on the RTCRtpSender of the output peer connection without having to decode and reencode the frames.

WebIDL[Exposed=DedicatedWorker]
interface RTCRtpSenderEncodedSource {
  constructor(DOMString kind);
  readonly attribute RTCRtpSenderEncodedSourceHandle handle;
  undefined enqueue((RTCEncodedVideoFrame or RTCEncodedAudioFrame) encodedFrame);  undefined stop();
};

14.1.1 Constructor

When the RTCRtpSenderEncodedSource constructor is invoked with a kind argument, the user agent MUST run the following steps:

  1. If kind is neither the string "audio" nor the string "video" , throw a TypeError .
  2. Let source be the newly created RTCRtpSenderEncodedSource object
  3. Let source have an [[IsStopped]] internal slot, initialized to false.
  4. Let source have a [[Handle]] internal slot
  5. Create an RTCRtpSenderEncodedSourceHandle , given source as argument and assign it to source . [[Handle]]
  6. Let source have a [[Kind]] internal slot, initialized to kind .
  7. Let source have a [[Sender]] internal slot, initialized to null.

14.1.2 Attributes

handle of type RTCRtpSenderEncodedSourceHandle , readonly

This attribute is the handle associated with this RTCRtpSenderEncodedSource .

On getting, if [[Handle]] . [[IsDetached]] is true , the attribute MUST return null . Otherwise, it MUST return the value of the [[Handle]] slot.

14.1.3 Methods

stop

The User Agent MUST run the following steps:

  1. Let source be the object on which the method is invoked.
  2. If source . [[IsStopped]] is true, abort these steps.
  3. Set source . [[IsStopped]] to true.
enqueue

The User Agent MUST run the following steps:

  1. Let source be the object on which the method is invoked.
  2. Let encodedFrame be the argument given to this method
  3. If source . [[IsStopped]] is true, throw an InvalidStateError DOMException , and abort these steps.
  4. If source . [[Kind]] is "video" and encodedFrame is not an RTCEncodedVideoFrame , throw an InvalidAccessError DOMException , and abort these steps.
  5. If source . [[Kind]] is "audio" and encodedFrame is not an RTCEncodedAudioFrame , throw an InvalidAccessError DOMException , and abort these steps.
  6. Let data be encodedFrame . [[data]]
  7. Let handle be the handle associated with source . handle and source might exist in different realms.
  8. If handle . [[Sender]] is null , throw an InvalidStateError DOMException , and abort these steps.
  9. Let serializedFrame be StructuredSerializeWithTransfer ( encodedFrame , data ).
  10. Let frameCopy be StructuredDeserialize ( serializedFrame , handle ’s relevant realm ).
  11. Enqueue frameCopy to handle . [[Sender]] 's packetizer, to be processed in parallel .

14.2 RTCRtpSenderEncodedSourceHandle interface

An interface that acts as an opaque cross-realm reference to an RTCRtpSenderEncodedSource . It is transferable to the Window context and can be assigned to an RTCRtpSender using replaceTrack . An RTCRtpSenderEncodedSource always stays associated to its RTCRtpSenderEncodedSourceHandle regardless of the RTCRtpSenderEncodedSourceHandle 's realm, similar to the way a MediaStreamTrack source maintains references to the tracks it backs. The main difference is that an RTCRtpSenderEncodedSource has exactly one associated handle.

The advantage of separating the RTCRtpSenderEncodedSource from the RTCRtpSenderEncodedSourceHandle is that the realm that created the RTCRtpSenderEncodedSource can keep the RTCRtpSenderEncodedSource and send frames to it, while the realm that owns the RTCRtpSender can take care of the tasks related to managing the connection.

WebIDL[Exposed=(Window,DedicatedWorker), Transferable]
interface

RTCRtpSenderEncodedSourceHandle

{};

To create an RTCRtpSenderEncodedSourceHandle object, given an RTCRtpSenderEncodedSource source :

  1. Let handle be a new RTCRtpSenderEncodedSourceHandle object.
  2. Let handle have a [[Sender]] internal slot, initialized to null .
  3. Let handle have a [[Kind]] internal slot, initialized to source . [[Kind]] .
  4. Let handle have an [[IsDetached]] internal slot, initialized to false .
  5. Let handle have an [[Id]] internal slot, initialized to a unique string.
  6. Return handle .

RTCRtpSenderEncodedSourceHandle objects are transferable . Their transfer steps , given value , and dataHolder , are:

  1. If value . [[IsDetached]] is true , throw a DataCloneError DOMException .
  2. Set dataHolder . [[Kind]] to value . [[Kind]]
  3. Set dataHolder . [[Id]] to value . [[Id]]
  4. Set value . [[IsDetached]] to true .

The RTCRtpSenderEncodedSourceHandle transfer-receiving steps , given dataHolder and handle , are:

  1. Set handle . [[Kind]] to dataHolder . [[Kind]]
  2. Set handle . [[Id]] to dataHolder . [[Id]]
  3. Set handle . [[Sender]] to null

We define the handle associated with an RTCRtpSenderEncodedSource source to be an RTCRtpSenderEncodedSourceHandle object handle for which the following holds:

  1. handle . [[Id]] equals source . [[Handle]] . [[Id]]
  2. handle . [[IsDetached]] is false

Given that RTCRtpSenderEncodedSourceHandle is transferable , but not serializable , there is at most one handle associated with an RTCRtpSenderEncodedSource and it is possible that they exist in different realms. The user agent can use whatever mechanism works best to keep track of the potentially cross-realm association between an encoded source and its associated handle, similarly to the way a MediaStreamTrack and its corresponding source are connected.

14.3 RTCRtpSender interface extensions

WebIDL  partial interface RTCRtpSender {    undefined replaceTrack(RTCRtpSenderEncodedSourceHandle withSourceHandle);
    readonly attribute RTCRtpSenderEncodedSourceHandle encodedSourceHandle;
};

14.3.1 Attributes

encodedSourceHandle of type RTCRtpSenderEncodedSourceHandle , readonly
This attribute is the handle for the RTCRtpSenderEncodedSource associated with this RTCRtpSender object. If the encoded source is not null and is stopped, the RTCRtpSender SHOULD send one black (video) frame per second and MUST NOT send (audio). If encodedSourceHandle is null and track is null then the RTCRtpSender does not send. On getting, the attribute MUST return the value of the [[SenderEncodedSourceHandle]] slot.

14.3.2 Methods

replaceTrack

Attempts to replace the RTCRtpSender 's current track or encodedSourceHandle with another encoded source without renegotiation. When this method is invoked, the user agent MUST run the following steps:

  1. Let sender be the RTCRtpSender object on which the method is invoked.
  2. Let transceiver be the RTCRtpTransceiver object associated with sender .
  3. Let connection be the RTCPeerConnection object associated with sender .
  4. Let withSourceHandle be the argument to this method.
  5. If withSourceHandle is non-null and withSourceHandle . [[Kind]] differs from the transceiver kind of transceiver, return a Promise rejected with a newly created TypeError .
  6. Return the result of chaining the following steps to connection 's operations chain :
    1. If transceiver . [[Stopping]] is true , return a Promise rejected with a newly created InvalidStateError DOMException .
    2. Let p be a new Promise .
    3. Let sending be true if transceiver . [[CurrentDirection]] is "sendrecv" or "sendonly", and false otherwise.
    4. Run the following steps in parallel :
      1. If sending is true , and withSourceHandle is null , have the sender stop sending.
      2. Queue a task that runs the following steps:
        1. If connection . [[IsClosed]] is true , abort these steps.
        2. Set sender . [[SenderTrack]] to null .
        3. Set sender . [[SenderEncodedSourceHandle]] to withSourceHandle .
        4. set withSourceHandle . [[Sender]] to sender .
        5. Resolve p with undefined .
      3. Return p .

14.4 Modifications to existing procedures

15. Event summary

This section is non-normative.

The following events fire on RTCIceTransport objects:

Event name Interface Fired when...
icecandidatepairadd RTCIceCandidatePairEvent The ICE agent has formed a candidate pair and is making it available to the script.
icecandidatepairremove RTCIceCandidatePairEvent The ICE agent has picked a candidate pair to remove, and unless the operation is canceled by invoking the preventDefault() method on the event, it will be removed.
icecandidatepairnominate RTCIceCandidatePairEvent The ICE agent has picked a valid candidate pair to nominate , and unless the operation is canceled by invoking the preventDefault() method on the event, it will be nominated .

15. 16. Security Considerations

This section is non-normative.

This section is non-normative; it specifies no new behaviour. The overall security considerations of the general set of APIs and protocols used in WebRTC are described in [ RFC8827 ].

15.1 16.1 Impact on local network

The extensions defined in this document do not provide additional impact on the local network beyond what is described in [ WEBRTC ] Section 13.3.

15.2 16.2 Confidentiality of Communications

This document defines extensions for encryption of RTP Header Extensions which improve the confidentiality of communications by encrypting header extension IDs, as well as CSRCs.

16. 17. Privacy Considerations

This section is non-normative.

This section is non-normative; it specifies no new behaviour.

16.1 17.1 Revealing IP addresses

The extensions defined in this document do not reveal additional information on IP addresses beyond that already described in [ WEBRTC ] Section 13.2.

16.2 17.2 Persistent information exposed by WebRTC

The extensions defined in this document do not provide additional persistent information beyond that which is discussed in [ WEBRTC ] Section 13.5.

17. 18. Accessibility Considerations

This section is non-normative.

The WebRTC 1.0 specification exposes an API to control protocols (defined within the IETF) necessary to establish real-time audio, video and data exchange. Real-Time Text, defined in [ RFC4103 ], is supported via the data channel API as described in [ WEBRTC ] Section 14. The extensions defined in this document do not affect support for Real-Time Text.

A. Acknowledgements

The editors wish to thank the Working Group chairs and Team Contact, Dominique Hazaël-Massieux, for their support. Substantial text in this specification was provided by many people including Harald Alvestrand, Justin Uberti and Peter Thatcher.

The RTCRtpSender and RTCRtpReceiver objects were initially described in the W3C ORTC CG , and have been adapted for use in this specification.

B. References

B.1 Normative references

[CSP]
Content Security Policy Level 3 . Mike West; Antonio Sartori. W3C. 23 January 21 February 2024. W3C Working Draft. URL: https://www.w3.org/TR/CSP3/
[DOM]
DOM Standard . Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[hr-time]
High Resolution Time . Yoav Weiss. W3C. 19 July 2023. W3C Working Draft. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
HTML Standard . Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard . Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[mediacapture-streams]
Media Capture and Streams . Cullen Jennings; Bernard Aboba; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 20 November 2023. 7 March 2024. W3C Candidate Recommendation. URL: https://www.w3.org/TR/mediacapture-streams/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels . S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC4566]
SDP: Session Description Protocol . M. Handley; V. Jacobson; C. Perkins. IETF. July 2006. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4566
[RFC5245]
Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols . J. Rosenberg. IETF. April 2010. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5245
[RFC5285]
A General Mechanism for RTP Header Extensions . D. Singer; H. Desineni. IETF. July 2008. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5285
[RFC5888]
The Session Description Protocol (SDP) Grouping Framework . G. Camarillo; H. Schulzrinne. IETF. June 2010. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5888
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words . B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8285]
A General Mechanism for RTP Header Extensions . D. Singer; H. Desineni; R. Even, Ed.. IETF. October 2017. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8285
[RFC8445]
Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal . A. Keranen; C. Holmberg; J. Rosenberg. IETF. July 2018. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8445
[RFC9335]
Completely Encrypting RTP Header Extensions and Contributing Sources . J. Uberti; C. Jennings; S. Murillo. IETF. January 2023. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9335
[RTCWEB-JSEP]
JavaScript Session Establishment Protocol (JSEP) . J. Uberti; C. Jennings; E. Rescorla, Ed.. IETF. January 2021. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8829
[WebCodecs]
WebCodecs . Paul Adenot; Bernard Aboba; Eugene Zemtsov. W3C. 6 February 19 March 2024. W3C Working Draft. URL: https://www.w3.org/TR/webcodecs/
[WEBIDL]
Web IDL Standard . Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
WebRTC: Real-Time Communication in Browsers . Cullen Jennings; Florent Castelli; Henrik Boström; Jan-Ivar Bruaroey. W3C. 6 March 2023. W3C Recommendation. URL: https://www.w3.org/TR/webrtc/
[webrtc-encoded-transform]
WebRTC Encoded Transform . Harald Alvestrand; Guido Urdaneta; youenn fablet. W3C. 12 December 2023. W3C Working Draft. URL: https://www.w3.org/TR/webrtc-encoded-transform/
[webrtc-stats]
Identifiers for WebRTC's Statistics API . Harald Alvestrand; Varun Singh; Henrik Boström. W3C. 25 January 2024. W3C Candidate Recommendation. URL: https://www.w3.org/TR/webrtc-stats/

B.2 Informative references

[BUNDLE]
Negotiating Media Multiplexing Using the Session Description Protocol (SDP) . C. Holmberg; H. Alvestrand; C. Jennings. IETF. January 2021. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8843
[RFC4103]
RTP Payload for Text Conversation . G. Hellstrom; P. Jones. IETF. June 2005. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4103
[RFC8827]
WebRTC Security Architecture . E. Rescorla. IETF. January 2021. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8827
[RTCWEB-RTP]
Media Transport and Use of RTP in WebRTC . C. Perkins; M. Westerlund; J. Ott. IETF. January 2021. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8834