W3C
Editor's
Draft
18
December
2024
Copyright
©
2024
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 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 .
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 RTP Header Extension for Absolute 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:
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
".
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.
Set
extension
.
direction
to
answeredDirection
.
Set
transceiver
.
[[NegotiatedHeaderExtensions]]
to
negotiatedExtensions
.
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
Members
scaleResolutionDownTo
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
Members
maxWidth
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
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.
Let
transport
be
the
RTCIceTransport
object
associated
with
candidatePair
.
Assert
:
candidatePair
does
not
match
any
item
in
transport
.
[[CandidatePairs]]
Append
candidatePair
to
[[CandidatePairs]]
.
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
:
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
local
and
remote
attributes
initialized
to
the
local
and
remote
candidates,
respectively,
of
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 picked a candidate pair to remove, 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
local
and
remote
attributes
initialized
to
the
local
and
remote
candidates,
respectively,
of
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
candidatePair
does
not
match
any
item
in
this
.
[[CandidatePairs]]
,
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
candidatePair
does
not
match
any
item
in
this
.
[[CandidatePairs]]
,
throw
a
NotFoundError
.
Remove
the
item
in
this
.
[[CandidatePairs]]
that
matches
candidatePair
.
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
local
and
remote
attributes
initialized
to
the
local
and
remote
candidates,
respectively,
of
candidatePair
.
Resolve p .
Return p .
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
;
};
RTCIceCandidatePairEvent.constructor()
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
;
};
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:
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
.
The
candidate
pair
match
algorithm
given
two
RTCIceCandidatePair
first
and
second
is
as
follows:
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
;
};
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:
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.
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.
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 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.
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.
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.
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
user
agent
defines
a
frame
timestamp
being
the
same
as
the
capture
timestamp
of
the
frame
being
produced
on
the
RTCRtpSender
MediaStreamTrack
if
it
is
set.
If
it
is
unset
the
user
agent
MUST
estimate
a
timestamp
from
the
sent
frame's
presentation
timestamp
together
with
the
time
it
was
received
by
the
RTCRtpSender
.
This
estimate
MUST
NOT
be
based
on
RTP
timestamp
.
The
NTP
and
RTP
timestamps
of
the
encoded
frame
corresponding
to
the
frame
being
produced
on
the
RTCRtpSender
MediaStreamTrack
MUST
be
sourced
from
the
frame
timestamp
.
For
a
frame
produced
in
a
RTCRtpReceiver
track,
the
user
agent
computes
a
remote
capture
timestamp
.
It
is
a
best-effort
estimate
of
the
local
capture
time
on
the
sender
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.
Each frame's capture timestamp is set to the remote capture timestamp , if 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: