Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
This document defines a set of ECMAScript APIs in WebIDL to extend the WebRTC 1.0 API.
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 standards and drafts index.
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 a 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 that 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 18 August 2025 W3C Process Document.
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.
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.
The following terms are defined in Absolute Capture Timestamp RTP header extension [RTP-EXT-CAPTURE-TIME]:
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.
The following terms are defined in mediacapture-extensions video timestamp concepts
The RTCPeerConnection
interface is defined in [WEBRTC]. This document
extends that interface by using Content-Security-Policy for ICE candidate
filtering.
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.
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.
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:
If transceivers of the same kind exist in the current PeerConnection,
copy [[HeaderExtensionsToNegotiate]]
from
the first such transceiver, in the order defined by the CollectTransceivers algorithm.
This ensures consistency across transceivers if they are added
after initial negotiation.
If no such transceiver exists, 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
".
If there are header extensions whose state needs to be consistent across all transceivers
in a bundle,
and any other transceiver exists that will be included in the same bundle,
copy the direction
attribute
for that extension from that other transceiver.
An example of header extensions that need to be identical across all media sections is the key management extensions from [RFC4567], as described in section 5.35 of [RFC8859], where they have category IDENTICAL. If this is supported and negotiated as "sendrecv", and a new transceiver is added, that transceiver needs to also have the extension as "sendrecv".
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.
Set [[NegotiatedHeaderExtensions]]
to an empty
list.
Make the following modifications to the set a session description algorithm:
In the step for processing a description of type
"answer
" that runs for both local and remote
descriptions, insert the following steps:
For each media description and corresponding
transceiver, let negotiatedExtensions be the
value of
transceiver.[[HeaderExtensionsToNegotiate]]
.
For each extension in negotiatedExtensions, run the following steps:
Let answeredDirection be the direction attribute
of the "a=extmap" line in the answer's
media description that correspond to this
extension if one exists, otherwise set
answeredDirection to
"stopped
".
If description is a remote description, reverse answeredDirection to represent the peer's point of view.
If this extension cannot be used because of other options
negotiated in the answer, set answeredDirection
to "stopped
".
Set
extension.direction
to answeredDirection.
Set
transceiver.[[NegotiatedHeaderExtensions]]
to negotiatedExtensions.
Set transceiver.[[HeaderExtensionsToNegotiate]]
to negotiatedExtensions.
This ensures that unless further calls to setHeaderExtensionsToNegotiate
are done,
subsequent offer/answer will not alter the list of extensions.
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".
Since JSEP does not know about WebRTC internal slots, merging this change requires more work on a JSEP revision.
getHeaderExtensionsToNegotiate
Execute the following steps:
Let transceiver be the RTCRtpTransceiver
that
this method was invoked on.
Return
transceiver.[[HeaderExtensionsToNegotiate]]
.
setHeaderExtensionsToNegotiate
Execute the following steps:
Let transceiver be the RTCRtpTransceiver
that
this method was invoked on.
Let extensions be the first argument of this method.
If the size of extensions does not match the size of
transceiver.[[HeaderExtensionsToNegotiate]]
throw an InvalidModificationError
.
For each index i of extensions, run the following steps:
Let extension be the i-th element of extensions.
If
extension.uri
is not equal to the uri
of
the i-th element of
transceiver.[[HeaderExtensionsToNegotiate]]
,
throw an InvalidModificationError
.
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
.
If
extension.direction
is "stopped
" and
uri
indicates a
mandatory-to-implement extension, throw an
InvalidModificationError
.
If necessary, restrict
extension.direction
as to not exceed the user agent's capabilities for this
extension.
Set
transceiver.[[HeaderExtensionsToNegotiate]]
to extensions.
getNegotiatedHeaderExtensions
Execute the following steps:
Let transceiver be the RTCRtpTransceiver
that
this method was invoked on.
Return
transceiver.[[NegotiatedHeaderExtensions]]
.
The RTCRtpEncodingParameters
dictionary is defined in
[WEBRTC]. This document extends that dictionary with
additional members to control audio packetization.
WebIDLpartial dictionary RTCRtpEncodingParameters {
RTCResolutionRestriction
scaleResolutionDownTo
;
unsigned long ptime
;
boolean adaptivePtime
= false;
};
RTCRtpEncodingParameters
MembersscaleResolutionDownTo
of type RTCResolutionRestriction
The maximum dimensions at which to restrict this encoding.
When scaleResolutionDownTo
is specified, the
scaleResolutionDownBy
value MUST be
ignored. Instead, frames are sent according to the specified
resolution restrictions: frames MUST NOT be upscaled.
When configuring parameters, the following validation MUST be
performed if scaleResolutionDownTo
is specified on any encoding or
else addTransceiver
()
throws a
newly created OperationError
and
setParameters
()
rejects with a newly
created InvalidModificationError
:
scaleResolutionDownTo
is specified on all
active
encodings.
For each scaleResolutionDownTo
value, both dimensions have
a value greater than 0.
ptime
of type unsigned long
The preferred duration of media represented by a packet in milliseconds.
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.
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.
RTCResolutionRestriction
dictionary.
WebIDLdictionary RTCResolutionRestriction
{
unsigned long maxWidth
;
unsigned long maxHeight
;
};
RTCResolutionRestriction
MembersmaxWidth
of type unsigned long
The maximum width that frames will be encoded with. The restrictions are orientation agnostic, see note below. When scaling is applied, both dimensions of the frame MUST be downscaled using the same factor.
maxHeight
of type unsigned long
The maximum height that frames will be encoded with. The restrictions are orientation agnostic, see note below. When scaling is applied, both dimensions of the frame MUST be downscaled using the same factor.
The restrictions being orientation agnostic means that they will automatically be adjusted to the orientation of the frame being restricted (portrait mode or landscape mode) by swapping width and height if necessary. This means that it does not matter if 1280x720 or 720x1280 is specified, both always result in the exact same scaling factor regardless of the orientation of the frame.
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;
};
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.
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.
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:
If the transceiver kind of the associated kind is "audio"
, set
setParameterOptions.encodingOptions to the empty list.
If setParameterOptions.encodingOptions is not empty and
setParameterOptions.encodingOptions.length
is
different from parameters.encodings.length
,
return a promise rejected with a newly created InvalidModificationError
.
In the steps to configure the media stack to use parameters, append the following step:
For each setParameterOptions.encodingOptions indexed by i,
if setParameterOptions.encodingOptions[i].keyFrame
is set to true
,
request that the encoder associated with parameters.encodings[i]
generates a key frame.
setParameters
()
does not wait for a key frame to be produced by the encoder.
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:
Let connection be the RTCPeerConnection
object associated with this ICE agent.
If connection.[[IsClosed]]
is
true
, abort these steps.
Let candidatePair be the result of creating an RTCIceCandidatePair with local and remote, representing the local and remote candidates of the formed pair respectively.
Let transport be the RTCIceTransport
object associated with candidatePair.
Assert: transport.[[CandidatePairs]]
does not contain candidatePair.
Append candidatePair to transport.[[CandidatePairs]]
.
Fire an event named
icecandidatepairadd
at transport, using RTCIceCandidatePairEvent
,
with the candidatePair
attribute
initialized to 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:
Let connection be the RTCPeerConnection
object associated with this ICE agent.
If connection.[[IsClosed]]
is
true
, abort these steps.
Let transport be the RTCIceTransport
object associated with this candidate pair.
Let candidatePair be the candidate pair which is being nominated
.
Set transport.[[ProposalPending]]
to true
.
Let accepted be the result of firing an event named
icecandidatepairnominate
at transport, using RTCIceCandidatePairEvent
, with the
cancelable
attribute initialized to true
, and the candidatePair
attribute
initialized to candidatePair.
Set transport.[[ProposalPending]]
to false
.
If accepted is false
, abort these steps and instruct the ICE agent to continue to perform connectivity checks.
Otherwise, instruct the ICE agent to nominate
the candidate pair indicated by candidatePair.
The ICE agent will continue to send data using candidatePair until instructed to use another candidate pair with selectCandidatePair
.
When the ICE agent has decided to remove a candidate pair, the user agent MUST queue a task to remove a candidate pair:
Let connection be the RTCPeerConnection
object associated with this ICE agent.
If connection.[[IsClosed]]
is
true
, abort these steps.
Let candidatePair be the candidate pair which is being removed.
Let transport be the RTCIceTransport
object associated with candidatePair.
Let cancelable be true
if the candidate pair is being removed in order to free an unused
candidate, and
false
otherwise.
Set transport.[[ProposalPending]]
to true
.
Let accepted be the result of firing an event named
icecandidatepairremove
at transport, using RTCIceCandidatePairEvent
, with the
cancelable
attribute initialized to cancelable, and the candidatePair
attribute
initialized to candidatePair.
Set transport.[[ProposalPending]]
to false
.
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.
Otherwise (if accepted is true
), run the following steps:
Remove candidatePair from transport.[[CandidatePairs]]
.
Instruct the ICE agent to remove the candidate pair indicated by candidatePair.
The RTCIceTransport
object is extended by adding the following internal slots:
false
.
WebIDLpartial interface RTCIceTransport {
attribute EventHandler onicecandidatepairadd
;
attribute EventHandler onicecandidatepairremove
;
attribute EventHandler onicecandidatepairnominate
;
Promise<undefined> selectCandidatePair
(RTCIceCandidatePair candidatePair);
Promise<undefined> removeCandidatePair
(RTCIceCandidatePair candidatePair);
};
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.
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:
Let connection be the RTCPeerConnection
object associated with this.
If connection.[[IsClosed]]
is
true
, throw an InvalidStateError
.
If this.[[ProposalPending]]
is true
, throw an InvalidStateError
.
If this.[[IceTransportState]]
is either of
"new
", "failed
" or "closed
", throw
an InvalidStateError
.
Let candidatePair be the method's first argument.
If this.[[CandidatePairs]]
does not contain candidatePair, throw a NotFoundError
.
Let p be a new promise.
In parallel, instruct the ICE agent to use candidatePair to send data.
When the ICE agent has completed selecting candidatePair, queue a task to run the following steps:
Run the change the selected candidate pair and state steps to update this.[[SelectedCandidatePair]]
and this.[[IceTransportState]]
as necessary and fire any associated events.
Resolve p.
Return p.
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:
Let connection be the RTCPeerConnection
object associated with this.
If connection.[[IsClosed]]
is
true
, throw an
InvalidStateError
.
If this.[[ProposalPending]]
is true
, throw an
InvalidStateError
.
If this.[[IceTransportState]]
is either of "new
", "failed
" or "closed
", throw an InvalidStateError
.
Let candidatePair be the method's first argument.
If this.[[CandidatePairs]]
does not contain candidatePair, throw a NotFoundError
.
Remove candidatePair from
this.[[CandidatePairs]]
.
Let p be a new promise.
In parallel, instruct the ICE agent to remove the candidate pair indicated by candidatePair.
When the ICE agent has completed the removal, queue a task to run the following steps:
Fire an event named icecandidatepairremove
at transport, using RTCIceCandidatePairEvent
, with the cancelable
attribute initialized to false
, and the candidatePair
attribute initialized to candidatePair.
Resolve p.
Return p.
The icecandidatepairadd
, icecandidatepairnominate
and
icecandidatepairremove
events use the
RTCIceCandidatePairEvent
interface.
WebIDL[Exposed=Window]
interface RTCIceCandidatePairEvent
: Event {
constructor
(DOMString type, RTCIceCandidatePairEventInit
eventInitDict);
readonly attribute RTCIceCandidatePair candidatePair
;
};
RTCIceCandidatePairEvent.constructor()
candidatePair
of type RTCIceCandidatePair
, readonly
The candidatePair
attribute represents the candidate pair associated with the event.
WebIDLdictionary RTCIceCandidatePairEventInit
: EventInit {
required RTCIceCandidatePair candidatePair
;
};
candidatePair
of type RTCIceCandidatePair
, required
The candidate pair announced by the event.
In the steps to change the selected candidate pair and state, if the selected candidate pair was changed, modify the first step to the following:
[[CandidatePairs]]
whose local
and remote
attributes respectively match the local and remote candidates of the indicated pair if one is selected, and null
otherwise.
The candidate match algorithm given two RTCIceCandidate
first and
second is as follows:
If first.candidate
is not identical to second.candidate
, return false
.
If either (but not both) of first.sdpMid
and second.sdpMid
is
null
, return false
.
If neither of first.sdpMid
and second.sdpMid
is null
, and first.sdpMid
is not identical to
second.sdpMid
, return false
.
If either (but not both) of first.sdpMLineIndex
and second.sdpMLineIndex
is
null
, return false
.
If neither of first.sdpMLineIndex
and second.sdpMLineIndex
is null
and first.sdpMLineIndex
is not equal to
second.sdpMLineIndex
, return false
.
If either (but not both) of first.usernameFragment
and second.usernameFragment
is
null
, return false
.
If neither of first.usernameFragment
and second.usernameFragment
is null
and first.usernameFragment
is not identical to
second.usernameFragment
, return false
.
Return true
.
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
Absolute Capture Timestamp RTP header extension 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
;
};
RTCRtpContributingSource
MemberscaptureTimestamp
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:
If the relevant RTP packet contains the Absolute Capture Timestamp RTP header extension, return the value of the absolute capture timestamp field and abort these steps.
Otherwise, if the relevant RTP packet does not contain the Absolute Capture Timestamp RTP header extension but a previous RTP packet did, return the result of calculating the absolute capture timestamp according to timestamp interpolation and abort these steps.
undefined
.
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:
If the relevant RTP packet contains the Absolute Capture Timestamp RTP header extension and the estimated capture clock offset field is present, return the value of the estimated capture clock offset field and abort these steps.
Otherwise, if the relevant RTP packet does not contain the Absolute Capture Timestamp RTP header extension's estimated capture clock offset field, but a previous RTP packet did, return the most recent value that was present and abort these steps.
undefined
.
The time of capture can estimatedly be expressed in the
sender system's clock as follows:
senderCaptureTimestamp = captureTimestamp
+
senderCaptureTimeOffset
.
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).
The time of capture can estimatedly be expressed in the receiver system's clock as follows: receiverCaptureTimestamp = senderCaptureTimestamp + senderReceiverTimeOffset.
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.
This section extends RTCDataChannel
by exposing it to any type of Worker
(not just DedicatedWorker
).
The WebIDL changes are the following:
WebIDL [Exposed=(Window,Worker), Transferable]
partial interface RTCDataChannel {
};
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 |
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
;
};
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
.
RTCConfiguration
extensions
rtpHeaderEncryptionPolicy
defines the
policy for negotiation of RTP header encryption using
[RFC9335].
WebIDLpartial dictionary RTCConfiguration {
RTCRtpHeaderEncryptionPolicy
rtpHeaderEncryptionPolicy
= "negotiate";
};
RTCConfiguration
Members
rtpHeaderEncryptionPolicy
of type RTCRtpHeaderEncryptionPolicy
rtpHeaderEncryptionPolicy
is marked
as a feature at risk, since there is no clear commitment
from implementers.
RTCRtpReceiver
extensions
The RTCRtpReceiver
interface and RTCRtpContributingSource
and RTCRtpSynchronizationSource
dictionaries are defined in [WEBRTC]. This document extends this interface by
adding two event handlers that fire when the source
of
getSynchronizationSources
()
or getContributingSources
()
changes.
By listening to these events, apps can react more quickly to source changes than if they were polling these APIs, enabling the UX to be updated more quickly in response to virtual SSRCs changing which is a common way for apps to keep track of which participant's media is currently being played out.
WebIDLpartial interface RTCRtpReceiver {
attribute EventHandler onssrcchange
;
attribute EventHandler oncsrcchange
;
};
Whenever the latest source
identifier is updated based on the contents of
an RTP packet, the user agent MUST queue a task to fire an event named
ssrcchange
if the SSRC changed and an event named csrcchange
if
the CSRC changed. If both identifiers are changed based on the same RTP packet, both events fire in
the same queued task ensuring both SSRC and CSRC information is exposed to the app at the same time.
onssrcchange
of type EventHandler
Fired when the source
in getSynchronizationSources
()
changes, see above.
oncsrcchange
of type EventHandler
Fired when the source
in getContributingSources
()
changes, see above.
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.
The methods specified in this section should be used sparingly and not for extended amounts of time.
In privacy-sensitive contexts, browsers may disable hardware acceleration by default to reduce the fingerprinting surface.
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:
When the RTCPeerConnection.constructor()
has been invoked abort these steps.
Set the RTCRtpReceiver's [[HardwareDisabled]]
slot to true
.
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:
When the RTCPeerConnection.constructor()
has been invoked abort these steps.
Set the RTCRtpSender's [[HardwareDisabled]]
slot to true
.
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".
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 .
|
The following events fire on RTCRtpReceiver
objects:
Event name | Interface | Fired when... |
---|---|---|
ssrcchange | Event |
The SSRC identifier changed in response to an RTP packet. |
csrcchange | Event |
The CSRC identifier changed in response to an RTP packet. |
For a frame produced in a RTCRtpReceiver
track, it is possible for the user agent to compute a
remote capture timestamp. It is a best-effort estimate of the capture
time of the frame translated to the receiver clock, and can use methods like using RTCP SR
as specified in [RFC3550] Section 6.4.1, or by other alternative means if use by RTCP SR
isn't feasible.
The capture time of an incoming frame is available if its constituent RTP packets contain the
Absolute Capture Timestamp RTP header extension.
Each frame's capture timestamp MUST be set to the remote capture timestamp, if the information required to compute it is available.
For a video frame produced in a RTCRtpReceiver
track, the frame's RTP timestamp MUST be set
from the RTP timestamp of constituent packets of the corresponding received encoded frame.
For a frame produced in a RTCRtpReceiver
track, the receive timestamp MUST be set
as the time the corresponding encoded frame was received by the platform, i.e. the time at which the
last packet belonging to this frame was received over the network.
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].
The extensions defined in this document do not provide additional impact on the local network beyond what is described in [WEBRTC] Section 13.3.
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.
This section is non-normative.
This section is non-normative; it specifies no new behaviour.
The extensions defined in this document do not reveal additional information on IP addresses beyond that already described in [WEBRTC] Section 13.2.
The extensions defined in this document do not provide additional persistent information beyond that which is discussed in [WEBRTC] Section 13.5.
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.
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.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: