W3C
Editor's
Draft
04
March
Copyright © 2024 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 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.
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
RTCRtpReceiver
interface
is
defined
in
[
WEBRTC
].
This
document
extends
that
interface
by
adding
an
additional
attribute
to
adjust
the
receiver's
jitter
buffer.
Let
RTCRtpReceiver
objects
have
a
[[JitterBufferTarget]]
internal
slot
initially
initialized
to
null
.
RTCRtpReceiver
interface
extensions
WebIDLpartial interface RTCRtpReceiver {
attribute DOMHighResTimeStamp? jitterBufferTarget;
};
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.
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:
Let
receiver
be
the
RTCRtpReceiver
object
on
which
the
setter
is
invoked.
Let target be the argument to the setter.
If
target
is
negative
or
larger
than
4000
milliseconds,
then
throw
a
RangeError
.
Set
receiver
's
[[JitterBufferTarget]]
to
target
.
Let
track
be
receiver
's
[[ReceiverTrack]]
.
In parallel, begin executing the following steps:
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 .
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.
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.
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.
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;
};
RTCRtpEncodingParameters
Members
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.
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.
Add the following steps to the setParameters validation steps :
Let
choosableCodecs
be
parameters.
codecs
.
If
choosableCodecs
is
an
empty
list,
set
choosableCodecs
to
transceiver.
[[PreferredCodecs]]
.
If choosableCodecs is still an empty list, set choosableCodecs to the list of implemented send codecs for transceiver's kind.
If
any
encoding
in
encodings
contains
a
codec
not
found
in
choosableCodecs
,
return
a
promise
rejected
with
a
newly
created
InvalidModificationError
.
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
.
Add the following steps to the addTransceiver sendEncodings validation steps :
If
any
codec
parameter
in
sendEncodings
does
not
match
any
codec
in
RTCRtpSender
.
getCapabilities
(
kind
)
.
codecs
,
throw
an
OperationError
.
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
.
Append the following steps to the set the session description algorithm:
For each transceiver in connection 's set of transceivers :
Let
codecs
be
transceiver
.
[[Sender]]
.
[[SendCodecs]]
.
If codecs is not an empty list:
Remove
any
codec
value
in
transceiver
.
[[Sender]]
.
[[SendEncodings]]
that
does
not
match
any
entry
in
codecs
.
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
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:
Initialize
channel
.
[[IsTransferable]]
to
true
.
Queue a task to run the following step:
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
.
Set
channel
.
[[IsTransferable]]
to
false
.
The
RTCDataChannel
transfer
steps
,
given
value
and
dataHolder
,
are:
If
value
.
[[IsTransferable]]
is
false
,
throw
a
"DataCloneError"
DOMException.
Set
dataHolder
.
[[ReadyState]]
to
value
.
[[ReadyState]]
.
Set
dataHolder
.
[[DataChannelLabel]]
to
value
.
[[DataChannelLabel]]
.
Set
dataHolder
.
[[Ordered]]
to
value
.
[[Ordered]]
.
Set
dataHolder
.
[[MaxPacketLifeTime]]
to
value
.
.
[[MaxPacketLifeTime]]
Set
dataHolder
.
[[MaxRetransmits]]
to
value
.
[[MaxRetransmits]]
.
Set
dataHolder
.
[[DataChannelProtocol]]
to
value
.
[[DataChannelProtocol]]
.
Set
dataHolder
.
[[Negotiated]]
to
value
.
[[Negotiated]]
.
Set
dataHolder
.
[[DataChannelId]]
to
value
.
[[DataChannelId]]
.
Set
dataHolder
.
[[underlyingDataTransport]]
to
value
underlying
data
transport
.
Set
value
.
[[IsTransferable]]
to
false
.
Set
value
.
[[ReadyState]]
to
"closed"
.
The
RTCDataChannel
transfer-receiving
steps
,
given
dataHolder
and
channel
,
are:
Initialize
channel
.
[[ReadyState]]
to
dataHolder
.
[[ReadyState]]
.
Initialize
channel
.
[[DataChannelLabel]]
to
dataHolder
.
[[\DataChannelLabel]]
.
Initialize
channel
.
[[Ordered]]
to
dataHolder
.
[[Ordered]]
.
Initialize
channel
.
[[MaxPacketLifeTime]]
to
dataHolder
.
[[MaxPacketLifeTime]]
.
Initialize
channel
.
[[MaxRetransmits]]
to
dataHolder
.
[[MaxRetransmits]]
.
Initialize
channel
.
[[DataChannelProtocol]]
to
dataHolder
.
[[DataChannelProtocol]]
.
Initialize
channel
.
[[Negotiated]]
to
dataHolder
.
[[Negotiated]]
.
Initialize
channel
.
[[DataChannelId]]
to
dataHolder
.
[[DataChannelId]]
.
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
.
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".
RTCRtpSenderEncodedSource
interface
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();
};
When
the
RTCRtpSenderEncodedSource
constructor
is
invoked
with
a
kind
argument,
the
user
agent
MUST
run
the
following
steps:
"audio"
nor
the
string
"video"
,
throw
a
TypeError
.
RTCRtpSenderEncodedSource
object
[[Handle]]
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.
stop
The User Agent MUST run the following steps:
[[IsStopped]]
is
true,
abort
these
steps.
[[IsStopped]]
to
true.
enqueue
The User Agent MUST run the following steps:
[[IsStopped]]
is
true,
throw
an
InvalidStateError
DOMException
,
and
abort
these
steps.
[[Kind]]
is
"video"
and
encodedFrame
is
not
an
RTCEncodedVideoFrame
,
throw
an
InvalidAccessError
DOMException
,
and
abort
these
steps.
[[Kind]]
is
"audio"
and
encodedFrame
is
not
an
RTCEncodedAudioFrame
,
throw
an
InvalidAccessError
DOMException
,
and
abort
these
steps.
[[data]]
[[Sender]]
is
null
,
throw
an
InvalidStateError
DOMException
,
and
abort
these
steps.
[[Sender]]
's
packetizer,
to
be
processed
in
parallel
.
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
:
RTCRtpSenderEncodedSourceHandle
object.
null
.
[[Kind]]
.
false
.
RTCRtpSenderEncodedSourceHandle
objects
are
transferable
.
Their
transfer
steps
,
given
value
,
and
dataHolder
,
are:
[[IsDetached]]
is
true
,
throw
a
DataCloneError
DOMException
.
[[Kind]]
to
value
.
[[Kind]]
[[Id]]
to
value
.
[[Id]]
[[IsDetached]]
to
true
.
The
RTCRtpSenderEncodedSourceHandle
transfer-receiving
steps
,
given
dataHolder
and
handle
,
are:
[[Kind]]
to
dataHolder
.
[[Kind]]
[[Id]]
to
dataHolder
.
[[Id]]
[[Sender]]
to
null
We
define
the
handle
associated
with
an
RTCRtpSenderEncodedSource
source
to
be
an
RTCRtpSenderEncodedSourceHandle
object
handle
for
which
the
following
holds:
[[Id]]
equals
source
.
[[Handle]]
.
[[Id]]
[[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.
WebIDL partial interface RTCRtpSender { undefined replaceTrack(RTCRtpSenderEncodedSourceHandle withSourceHandle);
readonly attribute RTCRtpSenderEncodedSourceHandle encodedSourceHandle;
};
encodedSourceHandle
of
type
RTCRtpSenderEncodedSourceHandle
,
readonly
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.
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:
RTCRtpSender
object
on
which
the
method
is
invoked.
RTCRtpTransceiver
object
associated
with
sender
.
RTCPeerConnection
object
associated
with
sender
.
[[Kind]]
differs
from
the
transceiver
kind
of
transceiver,
return
a
Promise
rejected
with
a
newly
created
TypeError
.
[[Stopping]]
is
true
,
return
a
Promise
rejected
with
a
newly
created
InvalidStateError
DOMException
.
Promise
.
true
if
transceiver
.
[[CurrentDirection]]
is
"sendrecv"
or
"sendonly",
and
false
otherwise.
true
,
and
withSourceHandle
is
null
,
have
the
sender
stop
sending.
[[IsClosed]]
is
true
,
abort
these
steps.
[[SenderTrack]]
to
null
.
[[SenderEncodedSourceHandle]]
to
withSourceHandle
.
[[Sender]]
to
sender
.
undefined
.
null
.
RTCPeerConnection
.
addTrack
()
:
[[SenderEncodedSourceHandle]]
to
null
RTCRtpSender
.
removeTrack()
:
[[SenderTrack]]
is
null
and
sender
.
[[SenderEncodedSourceHandle]]
is
null
,
abort
these
steps.
[[SenderEncodedSourceHandle]]
.
[[Sender]]
to
null
[[SenderEncodedSourceHandle]]
to
null
.
RTCRtpSender
.
setParameters
()
:
[[SenderTrack]]
or
sender
.
[[SenderEncodedSourceHandle]]
.
RTCRtpSender
.
replaceTrack()
:
[[SenderEncodedSourceHandle]]
.
[[Sender]]
to
null
.
[[SenderEncodedSourceHandle]]
to
null
.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
.
|
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:
Referenced in:
Referenced in:
Referenced in:
Referenced in: