rfc9429.original.xml | rfc9429.xml | |||
---|---|---|---|---|
<?xml version='1.0' encoding='utf-8'?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | ||||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" | <!DOCTYPE rfc [ | |||
docName="draft-uberti-rtcweb-rfc8829bis-04" number="8829" consensus="true" | <!ENTITY nbsp " "> | |||
ipr="trust200902" obsoletes="8829" updates="" submissionType="IETF" | <!ENTITY zwsp "​"> | |||
xml:lang="en" tocInclude="true" symRefs="true" sortRefs="true" | <!ENTITY nbhy "‑"> | |||
tocDepth="4" version="3"> | <!ENTITY wj "⁠"> | |||
<!-- xml2rfc v2v3 conversion 2.34.0 --> | ]> | |||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" category=" | ||||
std" consensus="true" docName="draft-uberti-rtcweb-rfc8829bis-05" number="9429" | ||||
ipr="trust200902" obsoletes="8829" updates="" xml:lang="en" tocInclude="true" sy | ||||
mRefs="true" sortRefs="true" tocDepth="4" version="3"> | ||||
<!-- xml2rfc v2v3 conversion 2.34.0 --> | ||||
<front> | <front> | |||
<title abbrev="JSEP">JavaScript Session Establishment Protocol (JSEP)</title > | <title abbrev="JSEP">JavaScript Session Establishment Protocol (JSEP)</title > | |||
<seriesInfo name="RFC" value="8829"/> | <seriesInfo name="RFC" value="9429"/> | |||
<author fullname="Justin Uberti" initials="J." surname="Uberti"> | <author fullname="Justin Uberti" initials="J." surname="Uberti"> | |||
<address> | <address> | |||
<email>justin@uberti.name</email> | <email>justin@uberti.name</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Cullen Jennings" initials="C." surname="Jennings"> | <author fullname="Cullen Jennings" initials="C." surname="Jennings"> | |||
<organization>Cisco</organization> | <organization>Cisco</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>400 3rd Avenue SW</street> | <street>400 3rd Avenue SW</street> | |||
skipping to change at line 37 ¶ | skipping to change at line 40 ¶ | |||
</postal> | </postal> | |||
<email>fluffy@iii.ca</email> | <email>fluffy@iii.ca</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Eric Rescorla" initials="E." surname="Rescorla" role="edit or"> | <author fullname="Eric Rescorla" initials="E." surname="Rescorla" role="edit or"> | |||
<organization>Mozilla</organization> | <organization>Mozilla</organization> | |||
<address> | <address> | |||
<email>ekr@rtfm.com</email> | <email>ekr@rtfm.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date month="February" year="2024"/> | ||||
<date day="23" month="Jan" year="2023"/> | <area>art</area> | |||
<workgroup>rtcweb</workgroup> | ||||
<keyword>webrtc</keyword> | <keyword>webrtc</keyword> | |||
<keyword>sdp</keyword> | <keyword>sdp</keyword> | |||
<keyword>negotiation</keyword> | <keyword>negotiation</keyword> | |||
<keyword>signaling</keyword> | <keyword>signaling</keyword> | |||
<keyword>peerconnection</keyword> | <keyword>peerconnection</keyword> | |||
<keyword>api</keyword> | <keyword>api</keyword> | |||
<keyword>ice</keyword> | <keyword>ice</keyword> | |||
<keyword>rtp</keyword> | <keyword>rtp</keyword> | |||
<keyword>offer</keyword> | <keyword>offer</keyword> | |||
<keyword>answer</keyword> | <keyword>answer</keyword> | |||
skipping to change at line 206 ¶ | skipping to change at line 208 ¶ | |||
addressed by using a library like the one mentioned above, it | addressed by using a library like the one mentioned above, it | |||
basically forces the use of said library even for a simple | basically forces the use of said library even for a simple | |||
example. Providing createOffer/createAnswer avoids this | example. Providing createOffer/createAnswer avoids this | |||
problem.</t> | problem.</t> | |||
</section> | </section> | |||
<section> | <section> | |||
<name>Changes from RFC 8829</name> | <name>Changes from RFC 8829</name> | |||
<t> | <t> | |||
When <xref target="RFC8829"/> was published, inconsistencies regarding BUNDLE | When <xref target="RFC8829"/> was published, inconsistencies regarding BUNDLE | |||
<xref target="RFC8843"/> operation were identified with regard to | <xref target="RFC8843"/> operation were identified with regard to | |||
both the specification text as well as implementation behavior. The | both the specification text and implementation behavior. The | |||
former concern was addressed via an update to BUNDLE (see <xref target ="RFC9143"/>). | former concern was addressed via an update to BUNDLE (see <xref target ="RFC9143"/>). | |||
For the latter concern, it was observed that some implementations | For the latter concern, it was observed that some implementations | |||
implemented the "max-bundle" bundle policy defined in <xref target="RF C8829"/> | implemented the "max-bundle" bundle policy defined in <xref target="RF C8829"/> | |||
by assuming that bundling had already been negotiated, rather than mar king "m=" sections | by assuming that bundling had already been negotiated, rather than mar king "m=" sections | |||
as bundle-only as indicated by the BUNDLE specification. | as bundle-only as indicated by the BUNDLE specification. | |||
In order to prevent unexpected changes to applications relying | In order to prevent unexpected changes to applications relying | |||
on the pre-standard behavior, the decision | on the pre-standard behavior, the decision | |||
was made to deprecate "max-bundle" and instead | was made to deprecate "max-bundle" and instead | |||
introduce an identically defined "must-bundle" policy that, when selec ted, | introduce an identically defined "must-bundle" policy that, when selec ted, | |||
provides the behavior originally specified by <xref target="RFC8829"/> . | provides the behavior originally specified by <xref target="RFC8829"/> . | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.terminology" numbered="true" toc="default"> | <section anchor="sec.terminology" numbered="true" toc="default"> | |||
<name>Terminology</name> | <name>Terminology</name> | |||
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
"<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | |||
"<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | |||
"<bcp14>SHOULD NOT</bcp14>", | "<bcp14>SHOULD NOT</bcp14>", | |||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document | |||
to be interpreted as described in BCP 14 <xref target="RFC2119"/> | are to be interpreted as described in BCP 14 | |||
<xref target="RFC8174"/> when, and only when, they appear in all capitals, | <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only | |||
as shown here.</t> | when, they appear in all capitals, as shown here.</t> | |||
</section> | </section> | |||
<section anchor="sec.semantics-and-syntax" numbered="true" toc="default"> | <section anchor="sec.semantics-and-syntax" numbered="true" toc="default"> | |||
<name>Semantics and Syntax</name> | <name>Semantics and Syntax</name> | |||
<section anchor="sec.signaling-model" numbered="true" toc="default"> | <section anchor="sec.signaling-model" numbered="true" toc="default"> | |||
<name>Signaling Model</name> | <name>Signaling Model</name> | |||
<t>JSEP does not specify a particular signaling model or state | <t>JSEP does not specify a particular signaling model or state | |||
machine, other than the generic need to exchange session | machine, other than the generic need to exchange session | |||
descriptions in the fashion described by | descriptions in the fashion described by | |||
<xref target="RFC3264" format="default"/> (offer/answer) in order for bo th | <xref target="RFC3264" format="default"/> (offer/answer) in order for bo th | |||
sides of the session to know how to conduct the session. JSEP | sides of the session to know how to conduct the session. JSEP | |||
skipping to change at line 283 ¶ | skipping to change at line 285 ¶ | |||
<t>Whether a session description applies to the local side or | <t>Whether a session description applies to the local side or | |||
the remote side affects the meaning of that description. For | the remote side affects the meaning of that description. For | |||
example, the list of codecs sent to a remote party indicates | example, the list of codecs sent to a remote party indicates | |||
what the local side is willing to receive, which, when | what the local side is willing to receive, which, when | |||
intersected with the set of codecs the remote side supports, | intersected with the set of codecs the remote side supports, | |||
specifies what the remote side should send. However, not all | specifies what the remote side should send. However, not all | |||
parameters follow this rule; some parameters are declarative, | parameters follow this rule; some parameters are declarative, | |||
and the remote side must either accept them or reject them | and the remote side must either accept them or reject them | |||
altogether. An example of such a parameter is the TLS | altogether. An example of such a parameter is the TLS | |||
fingerprints <xref target="RFC8122" format="default"/> | fingerprints <xref target="RFC8122" format="default"/> | |||
as used in the context of DTLS <xref target="RFC6347" format="default"/> ; | as used in the context of DTLS <xref target="RFC6347" format="default"/> <xref target="RFC9147"/>; | |||
these fingerprints are calculated based on | these fingerprints are calculated based on | |||
the local certificate(s) offered and are not subject to | the local certificate(s) offered and are not subject to | |||
negotiation. | negotiation. | |||
</t> | </t> | |||
<t>In addition, various RFCs put different conditions on the | <t>In addition, various RFCs put different conditions on the | |||
format of offers versus answers. For example, an offer may | format of offers versus answers. For example, an offer may | |||
propose an arbitrary number of "m=" sections (i.e., media | propose an arbitrary number of "m=" sections (i.e., media | |||
descriptions as described in | descriptions as described in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.14"/>), but an a nswer must | <xref target="RFC4566" sectionFormat="comma" section="5.14"/>), but an a nswer must | |||
contain the exact same number as the offer.</t> | contain the exact same number as the offer.</t> | |||
skipping to change at line 449 ¶ | skipping to change at line 451 ¶ | |||
an RtpSender and an RtpReceiver, which an application can use | an RtpSender and an RtpReceiver, which an application can use | |||
to control the sending and receiving of RTP media. The | to control the sending and receiving of RTP media. The | |||
application may also modify the RtpTransceiver directly, for | application may also modify the RtpTransceiver directly, for | |||
instance, by stopping it.</t> | instance, by stopping it.</t> | |||
<t>RtpTransceivers generally have a 1:1 mapping with "m=" | <t>RtpTransceivers generally have a 1:1 mapping with "m=" | |||
sections, although there may be more RtpTransceivers than "m=" | sections, although there may be more RtpTransceivers than "m=" | |||
sections when RtpTransceivers are created but not yet | sections when RtpTransceivers are created but not yet | |||
associated with an "m=" section, or if RtpTransceivers have been | associated with an "m=" section, or if RtpTransceivers have been | |||
stopped and disassociated from "m=" sections. An RtpTransceiver | stopped and disassociated from "m=" sections. An RtpTransceiver | |||
is said to be associated with an "m=" section if its | is said to be associated with an "m=" section if its | |||
media identification (mid) property is non-null; otherwise, it is said | mid property is non-null, i.e., set to a valid Media Identification | |||
to be | (MID) value; otherwise, it is said to be | |||
disassociated. The associated "m=" section is determined using | disassociated. The associated "m=" section is determined using | |||
a mapping between transceivers and "m=" section indices, formed | a mapping between transceivers and "m=" section indices, formed | |||
when creating an offer or applying a remote offer.</t> | when creating an offer or applying a remote offer.</t> | |||
<t>An RtpTransceiver is never associated with more than one | <t>An RtpTransceiver is never associated with more than one | |||
"m=" section, and once a session description is applied, an "m=" | "m=" section, and once a session description is applied, an "m=" | |||
section is always associated with exactly one RtpTransceiver. | section is always associated with exactly one RtpTransceiver. | |||
However, in certain cases where an "m=" section has been | However, in certain cases where an "m=" section has been | |||
rejected, as discussed in | rejected, as discussed in | |||
<xref target="sec.subsequent-offers" format="default"/> below, that "m =" section | <xref target="sec.subsequent-offers" format="default"/> below, that "m =" section | |||
will be "recycled" and associated with a new RtpTransceiver | will be "recycled" and associated with a new RtpTransceiver | |||
skipping to change at line 709 ¶ | skipping to change at line 712 ¶ | |||
<section anchor="sec.creating-imageattr" numbered="true" toc="default"> | <section anchor="sec.creating-imageattr" numbered="true" toc="default"> | |||
<name>Creating an imageattr Attribute</name> | <name>Creating an imageattr Attribute</name> | |||
<t>The receiver will first combine any known local limits | <t>The receiver will first combine any known local limits | |||
(e.g., hardware decoder capabilities or local policy) to | (e.g., hardware decoder capabilities or local policy) to | |||
determine the absolute minimum and maximum sizes it can | determine the absolute minimum and maximum sizes it can | |||
receive. If there are no known local limits, the | receive. If there are no known local limits, the | |||
"a=imageattr" attribute <bcp14>SHOULD</bcp14> be omitted. If these loc al | "a=imageattr" attribute <bcp14>SHOULD</bcp14> be omitted. If these loc al | |||
limits preclude receiving any video, i.e., the degenerate | limits preclude receiving any video, i.e., the degenerate | |||
case of no permitted resolutions, the "a=imageattr" attribute | case of no permitted resolutions, the "a=imageattr" attribute | |||
<bcp14>MUST</bcp14> be omitted, and the "m=" section <bcp14>MUST</bcp1 4> be marked as | <bcp14>MUST</bcp14> be omitted, and the "m=" section <bcp14>MUST</bcp1 4> be marked as | |||
sendonly/inactive, as appropriate.</t> | "sendonly"/"inactive", as appropriate.</t> | |||
<t>Otherwise, an "a=imageattr" attribute is created with a | <t>Otherwise, an "a=imageattr" attribute is created with a | |||
"recv" direction, and the resulting resolution space formed | "recv" direction, and the resulting resolution space formed | |||
from the aforementioned intersection is used to specify its | from the aforementioned intersection is used to specify its | |||
minimum and maximum "x=" and "y=" values.</t> | minimum and maximum "x=" and "y=" values.</t> | |||
<t>The rules here express a single set of preferences, and | <t>The rules here express a single set of preferences, and | |||
therefore, the "a=imageattr" "q=" value is not important. It | therefore, the "a=imageattr" "q=" value is not important. It | |||
<bcp14>SHOULD</bcp14> be set to "1.0".</t> | <bcp14>SHOULD</bcp14> be set to "1.0".</t> | |||
<t>The "a=imageattr" field is payload type specific. When all | <t>The "a=imageattr" field is payload type specific. When all | |||
video codecs supported have the same capabilities, use of a | video codecs supported have the same capabilities, use of a | |||
single attribute, with the wildcard payload type (*), is | single attribute, with the wildcard payload type (*), is | |||
skipping to change at line 882 ¶ | skipping to change at line 885 ¶ | |||
encoding, as specified in | encoding, as specified in | |||
<xref target="RFC8851" sectionFormat="comma" section="4"/>; the use of | <xref target="RFC8851" sectionFormat="comma" section="4"/>; the use of | |||
Restriction Identifiers (RIDs, also called rid-ids or RtpStreamIds) | Restriction Identifiers (RIDs, also called rid-ids or RtpStreamIds) | |||
allows the individual encodings to be | allows the individual encodings to be | |||
disambiguated even though they are all part of the same "m=" | disambiguated even though they are all part of the same "m=" | |||
section.</t> | section.</t> | |||
</section> | </section> | |||
<section anchor="sec.interactions-with-forking" numbered="true" toc="defau lt"> | <section anchor="sec.interactions-with-forking" numbered="true" toc="defau lt"> | |||
<name>Interactions with Forking</name> | <name>Interactions with Forking</name> | |||
<t>Some call signaling systems allow various types of forking | <t>Some call signaling systems allow various types of forking | |||
where an SDP Offer may be provided to more than one device. For | where an SDP offer may be provided to more than one device. For | |||
example, SIP | example, SIP | |||
<xref target="RFC3261" format="default"/> defines both a "parallel searc h" | <xref target="RFC3261" format="default"/> defines both a "parallel searc h" | |||
and "sequential search". Although these are primarily signaling-level is sues that are outside the scope of JSEP, they do have | and "sequential search". Although these are primarily signaling-level is sues that are outside the scope of JSEP, they do have | |||
some impact on the configuration of the media plane that is | some impact on the configuration of the media plane that is | |||
relevant. When forking happens at the signaling layer, the | relevant. When forking happens at the signaling layer, the | |||
JavaScript application responsible for the signaling needs to | JavaScript application responsible for the signaling needs to | |||
make the decisions about what media should be sent or received | make the decisions about what media should be sent or received | |||
at any point in time, as well as which remote endpoint it | at any point in time, as well as which remote endpoint it | |||
should communicate with; JSEP is used to make sure the media | should communicate with; JSEP is used to make sure the media | |||
engine can make the RTP and media perform as required by the | engine can make the RTP and media perform as required by the | |||
skipping to change at line 1060 ¶ | skipping to change at line 1063 ¶ | |||
<dt>max-compat:</dt> | <dt>max-compat:</dt> | |||
<dd>All "m=" sections will contain | <dd>All "m=" sections will contain | |||
transport parameters; none will be marked as bundle-only. | transport parameters; none will be marked as bundle-only. | |||
This policy makes no assumptions about the remote endpoint and | This policy makes no assumptions about the remote endpoint and | |||
as such will allow all streams to be received by | as such will allow all streams to be received by | |||
non-bundle-aware endpoints, but as a result requires separate | non-bundle-aware endpoints, but as a result requires separate | |||
candidates to be gathered for each media stream.</dd> | candidates to be gathered for each media stream.</dd> | |||
<dt>must-bundle:</dt> | <dt>must-bundle:</dt> | |||
<dd>Only the first "m=" section will | <dd>Only the first "m=" section will | |||
contain transport parameters; all streams other than the | contain transport parameters; all streams other than the | |||
first will be marked as bundle-only. This policy presumes | first will be marked as bundle-only. This policy presumes that | |||
the remote endpoint supports multiplexing and accordingly aims to | the remote endpoint supports multiplexing and accordingly aims to | |||
minimize candidate gathering, at | minimize candidate gathering, at | |||
the cost of less compatibility with legacy endpoints. When | the cost of less compatibility with legacy endpoints. When | |||
acting as answerer, the implementation will reject any "m=" | acting as answerer, the implementation will reject any "m=" | |||
sections other than the first "m=" section, unless they are | sections other than the first "m=" section, unless they are | |||
in the same bundle group as that "m=" section.</dd> | in the same bundle group as that "m=" section.</dd> | |||
</dl> | </dl> | |||
<t>As it provides the best trade-off between performance and | <t>As it provides the best trade-off between performance and | |||
compatibility with legacy endpoints, the default bundle | compatibility with legacy endpoints, the default bundle | |||
policy <bcp14>MUST</bcp14> be set to "balanced".</t> | policy <bcp14>MUST</bcp14> be set to "balanced".</t> | |||
<t><xref target="RFC8829" format="default"/> defined a policy | <t><xref target="RFC8829" format="default"/> defined a policy | |||
known as "max-bundle", which, while defined identically to the | known as "max-bundle", which, while defined identically to the | |||
"must-bundle" policy described above, was implemented | "must-bundle" policy described above, was implemented | |||
by some implementations according to an earlier, pre-standard definiti on | by some implementations according to an earlier, pre-standard definiti on | |||
(in which, for example, no "m=" sections were marked as bundle-only). | (in which, for example, no "m=" sections were marked as bundle-only). | |||
As a result, "max-bundle" is considered deprecated, and implementation s | As a result, "max-bundle" is considered deprecated, and implementation s | |||
compliant with this specification SHOULD ignore attempts by the applic ation to select | compliant with this specification <bcp14>SHOULD</bcp14> ignore attempt s by the application to select | |||
this bundle policy (although some phase-out period may be necessary | this bundle policy (although some phase-out period may be necessary | |||
to avoid application breakage). | to avoid application breakage). | |||
</t> | </t> | |||
<t>The application can specify its preferred policy regarding | <t>The application can specify its preferred policy regarding the | |||
use of RTP/RTCP multiplexing | use of RTP/RTCP multiplexing | |||
<xref target="RFC5761" format="default"/> using one of the following | <xref target="RFC5761" format="default"/> using one of the following | |||
policies: | policies: | |||
</t> | </t> | |||
<dl newline="false" spacing="normal"> | <dl newline="false" spacing="normal"> | |||
<dt>negotiate:</dt> | <dt>negotiate:</dt> | |||
<dd>The JSEP implementation will | <dd>The JSEP implementation will | |||
gather both RTP and RTCP candidates but also will offer | gather both RTP and RTCP candidates but also will offer | |||
"a=rtcp-mux", thus allowing for compatibility with either | "a=rtcp-mux", thus allowing for compatibility with either | |||
multiplexing or non-multiplexing endpoints.</dd> | multiplexing or non-multiplexing endpoints.</dd> | |||
skipping to change at line 1131 ¶ | skipping to change at line 1134 ¶ | |||
will be created, as described in | will be created, as described in | |||
<xref target="sec.addTransceiver" format="default"/>.</t> | <xref target="sec.addTransceiver" format="default"/>.</t> | |||
</section> | </section> | |||
<section anchor="sec.removeTrack" numbered="true" toc="default"> | <section anchor="sec.removeTrack" numbered="true" toc="default"> | |||
<name>removeTrack</name> | <name>removeTrack</name> | |||
<t>The removeTrack method removes a MediaStreamTrack from the | <t>The removeTrack method removes a MediaStreamTrack from the | |||
PeerConnection, using the RtpSender argument to indicate | PeerConnection, using the RtpSender argument to indicate | |||
which sender should have its track removed. The sender's | which sender should have its track removed. The sender's | |||
track is cleared, and the sender stops sending. Future calls | track is cleared, and the sender stops sending. Future calls | |||
to createOffer will mark the "m=" section associated with the | to createOffer will mark the "m=" section associated with the | |||
sender as recvonly (if transceiver.direction is sendrecv) or | sender as "recvonly" (if transceiver.direction is "sendrecv") or | |||
as inactive (if transceiver.direction is sendonly).</t> | as "inactive" (if transceiver.direction is "sendonly").</t> | |||
</section> | </section> | |||
<section anchor="sec.addTransceiver" numbered="true" toc="default"> | <section anchor="sec.addTransceiver" numbered="true" toc="default"> | |||
<name>addTransceiver</name> | <name>addTransceiver</name> | |||
<t>The addTransceiver method adds a new RtpTransceiver to the | <t>The addTransceiver method adds a new RtpTransceiver to the | |||
PeerConnection. If a MediaStreamTrack argument is provided, | PeerConnection. If a MediaStreamTrack argument is provided, | |||
then the transceiver will be configured with that media type | then the transceiver will be configured with that media type | |||
and the track will be attached to the transceiver. Otherwise, | and the track will be attached to the transceiver. Otherwise, | |||
the application <bcp14>MUST</bcp14> explicitly specify the type; this mode | the application <bcp14>MUST</bcp14> explicitly specify the type; this mode | |||
is useful for creating recvonly transceivers as well as for | is useful for creating "recvonly" transceivers as well as for | |||
creating transceivers to which a track can be attached at | creating transceivers to which a track can be attached at | |||
some later point.</t> | some later point.</t> | |||
<t>At the time of creation, the application can also specify | <t>At the time of creation, the application can also specify | |||
a transceiver direction attribute, a set of MediaStreams | a transceiver direction attribute, a set of MediaStreams | |||
that the transceiver is associated with (allowing "LS" group | that the transceiver is associated with (allowing "LS" group | |||
assignments), and a set of encodings for the media (used for | assignments), and a set of encodings for the media (used for | |||
simulcast as described in | simulcast as described in | |||
<xref target="sec.simulcast" format="default"/>).</t> | <xref target="sec.simulcast" format="default"/>).</t> | |||
</section> | </section> | |||
<section anchor="sec.onaddtrack" numbered="true" toc="default"> | <section anchor="sec.onaddtrack" numbered="true" toc="default"> | |||
skipping to change at line 1185 ¶ | skipping to change at line 1188 ¶ | |||
<name>ondatachannel Event</name> | <name>ondatachannel Event</name> | |||
<t>The ondatachannel event is dispatched to the application when a | <t>The ondatachannel event is dispatched to the application when a | |||
new data channel has been negotiated by the remote side, which can | new data channel has been negotiated by the remote side, which can | |||
occur at any time after the underlying SCTP/DTLS association has been | occur at any time after the underlying SCTP/DTLS association has been | |||
established. The new data channel object is supplied in the event. | established. The new data channel object is supplied in the event. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.createoffer" numbered="true" toc="default"> | <section anchor="sec.createoffer" numbered="true" toc="default"> | |||
<name>createOffer</name> | <name>createOffer</name> | |||
<t>The createOffer method generates a blob of SDP that | <t>The createOffer method generates a blob of SDP that | |||
contains an offer per <xref target="RFC3264" format="default"/> with t | contains an offer per <xref target="RFC3264" format="default"/> with t | |||
he supported | he | |||
configurations for the session, including descriptions of the | configurations for the session that are supported by the application, | |||
including descriptions of the | ||||
media added to this PeerConnection, the codec, RTP, and RTCP | media added to this PeerConnection, the codec, RTP, and RTCP | |||
options supported by this implementation, and any candidates | options supported by this implementation, and any candidates | |||
that have been gathered by the ICE agent. An options | that have been gathered by the ICE agent. An options | |||
parameter may be supplied to provide additional control over | parameter may be supplied to provide additional control over | |||
the generated offer. This options parameter allows an | the generated offer. This options parameter allows an | |||
application to trigger an ICE restart, for the purpose of | application to trigger an ICE restart, for the purpose of | |||
reestablishing connectivity.</t> | reestablishing connectivity.</t> | |||
<t>In the initial offer, the generated SDP will contain all | <t>In the initial offer, the generated SDP will contain all | |||
desired functionality for the session (functionality that is | desired functionality for the session (functionality that is | |||
supported but not desired by default may be omitted); for | supported but not desired by default may be omitted); for | |||
skipping to change at line 1208 ¶ | skipping to change at line 1211 ¶ | |||
process defined for generating an initial offer from the | process defined for generating an initial offer from the | |||
specification that defines the given SDP line. The exact | specification that defines the given SDP line. The exact | |||
handling of initial offer generation is detailed in | handling of initial offer generation is detailed in | |||
<xref target="sec.initial-offers" format="default"/> below.</t> | <xref target="sec.initial-offers" format="default"/> below.</t> | |||
<t>In the event createOffer is called after the session is | <t>In the event createOffer is called after the session is | |||
established, createOffer will generate an offer to modify the | established, createOffer will generate an offer to modify the | |||
current session based on any changes that have been made to | current session based on any changes that have been made to | |||
the session, e.g., adding or stopping RtpTransceivers, or | the session, e.g., adding or stopping RtpTransceivers, or | |||
requesting an ICE restart. For each existing stream, the | requesting an ICE restart. For each existing stream, the | |||
generation of each SDP line <bcp14>MUST</bcp14> follow the process def ined | generation of each SDP line <bcp14>MUST</bcp14> follow the process def ined | |||
for generating an updated offer from the RFC that specifies | for generating an updated offer from the specification that defines | |||
the given SDP line. For each new stream, the generation of | the given SDP line. For each new stream, the generation of | |||
the SDP <bcp14>MUST</bcp14> follow the process of generating an initia l | the SDP <bcp14>MUST</bcp14> follow the process of generating an initia l | |||
offer, as mentioned above. If no changes have been made, or | offer, as mentioned above. The exact handling of subsequent | |||
for SDP lines that are unaffected by the requested changes, | ||||
the offer will only contain the parameters negotiated by the | ||||
last offer/answer exchange. The exact handling of subsequent | ||||
offer generation is detailed in | offer generation is detailed in | |||
<xref target="sec.subsequent-offers" format="default"/> below.</t> | <xref target="sec.subsequent-offers" format="default"/> below.</t> | |||
<t>Session descriptions generated by createOffer <bcp14>MUST</bcp14> b e | <t>Session descriptions generated by createOffer <bcp14>MUST</bcp14> b e | |||
immediately usable by setLocalDescription; if a system has | immediately usable by setLocalDescription; if a system has | |||
limited resources (e.g., a finite number of decoders), | limited resources (e.g., a finite number of decoders), | |||
createOffer <bcp14>SHOULD</bcp14> return an offer that reflects the cu rrent | createOffer <bcp14>SHOULD</bcp14> return an offer that reflects the cu rrent | |||
state of the system, so that setLocalDescription will succeed | state of the system, so that setLocalDescription will succeed | |||
when it attempts to acquire those resources.</t> | when it attempts to acquire those resources.</t> | |||
<t>Calling this method may do things such as generating new | <t>Calling this method may do things such as generating new | |||
ICE credentials, but it does not change the PeerConnection | ICE credentials, but it does not change the PeerConnection | |||
skipping to change at line 1239 ¶ | skipping to change at line 1239 ¶ | |||
</section> | </section> | |||
<section anchor="sec.createanswer" numbered="true" toc="default"> | <section anchor="sec.createanswer" numbered="true" toc="default"> | |||
<name>createAnswer</name> | <name>createAnswer</name> | |||
<t>The createAnswer method generates a blob of SDP that | <t>The createAnswer method generates a blob of SDP that | |||
contains an SDP answer per <xref target="RFC3264" format="default"/> w ith the supported | contains an SDP answer per <xref target="RFC3264" format="default"/> w ith the supported | |||
configuration for the session that is compatible with the | configuration for the session that is compatible with the | |||
parameters supplied in the most recent call to | parameters supplied in the most recent call to | |||
setRemoteDescription; setRemoteDescription <bcp14>MUST</bcp14> have be en called prior to | setRemoteDescription; setRemoteDescription <bcp14>MUST</bcp14> have be en called prior to | |||
calling createAnswer. Like createOffer, the returned blob | calling createAnswer. Like createOffer, the returned blob | |||
contains descriptions of the media added to this | contains descriptions of the media added to this | |||
PeerConnection, the codec/RTP/RTCP options negotiated for | PeerConnection; the codec, RTP, and RTCP options supported by the appl | |||
this session, and any candidates that have been gathered by | ication; and any candidates that have been gathered by | |||
the ICE agent. An options parameter may be supplied to | the ICE agent. An options parameter may be supplied to | |||
provide additional control over the generated answer.</t> | provide additional control over the generated answer.</t> | |||
<t>As an answer, the generated SDP will contain a specific | <t>As an answer, the generated SDP will contain a specific | |||
configuration that specifies how the media plane should be | configuration that specifies how the media plane should be | |||
established; for each SDP line, the generation of the SDP | established; for each SDP line, the generation of the SDP | |||
<bcp14>MUST</bcp14> follow the process defined for generating an answe r from | <bcp14>MUST</bcp14> follow the process defined for generating an answe r from | |||
the specification that defines the given SDP line. The exact | the specification that defines the given SDP line. The exact | |||
handling of answer generation is detailed in | handling of answer generation is detailed in | |||
<xref target="sec.generating-an-answer" format="default"/> below.</t> | <xref target="sec.generating-an-answer" format="default"/> below.</t> | |||
<t>Session descriptions generated by createAnswer <bcp14>MUST</bcp14> be | <t>Session descriptions generated by createAnswer <bcp14>MUST</bcp14> be | |||
skipping to change at line 1278 ¶ | skipping to change at line 1277 ¶ | |||
<t>"offer" indicates that a description <bcp14>MUST</bcp14> be parsed as | <t>"offer" indicates that a description <bcp14>MUST</bcp14> be parsed as | |||
an offer; said description may include many possible media | an offer; said description may include many possible media | |||
configurations. A description used as an "offer" may be | configurations. A description used as an "offer" may be | |||
applied any time the PeerConnection is in a "stable" state or | applied any time the PeerConnection is in a "stable" state or | |||
applied as an update to a previously supplied but unanswered | applied as an update to a previously supplied but unanswered | |||
"offer".</t> | "offer".</t> | |||
<t>"pranswer" indicates that a description <bcp14>MUST</bcp14> be pars ed | <t>"pranswer" indicates that a description <bcp14>MUST</bcp14> be pars ed | |||
as an answer, but not a final answer, and so <bcp14>MUST NOT</bcp14> | as an answer, but not a final answer, and so <bcp14>MUST NOT</bcp14> | |||
result in the freeing of allocated resources. It may result | result in the freeing of allocated resources. It may result | |||
in the start of media transmission, if the answer does not | in the start of media transmission, if the answer does not | |||
specify an inactive media direction. A description used as a | specify an "inactive" media direction. A description used as a | |||
"pranswer" may be applied as a response to an "offer" or as an | "pranswer" may be applied as a response to an "offer" or as an | |||
update to a previously sent "pranswer".</t> | update to a previously sent "pranswer".</t> | |||
<t>"answer" indicates that a description <bcp14>MUST</bcp14> be parsed as | <t>"answer" indicates that a description <bcp14>MUST</bcp14> be parsed as | |||
an answer, the offer/answer exchange <bcp14>MUST</bcp14> be considered | an answer, the offer/answer exchange <bcp14>MUST</bcp14> be considered | |||
complete, and any resources (decoders, candidates) that are | complete, and any resources (decoders, candidates) that are | |||
no longer needed <bcp14>SHOULD</bcp14> be released. A description used as an | no longer needed <bcp14>SHOULD</bcp14> be released. A description used as an | |||
"answer" may be applied as a response to an "offer" or as an | "answer" may be applied as a response to an "offer" or as an | |||
update to a previously sent "pranswer".</t> | update to a previously sent "pranswer".</t> | |||
<t>The only difference between a provisional and final answer | <t>The only difference between a provisional and final answer | |||
is that the final answer results in the freeing of any unused | is that the final answer results in the freeing of any unused | |||
skipping to change at line 1327 ¶ | skipping to change at line 1326 ¶ | |||
offer to update the previous offer/answer pair and start | offer to update the previous offer/answer pair and start | |||
bidirectional media flow. While this could also be done | bidirectional media flow. While this could also be done | |||
with a "sendonly" pranswer followed by a "sendrecv" | with a "sendonly" pranswer followed by a "sendrecv" | |||
answer, the initial pranswer leaves the offer/answer | answer, the initial pranswer leaves the offer/answer | |||
exchange open, which means that the caller cannot send an | exchange open, which means that the caller cannot send an | |||
updated offer during this time. </t> | updated offer during this time. </t> | |||
<t>As an example, consider a typical JSEP application that | <t>As an example, consider a typical JSEP application that | |||
wants to set up audio and video as quickly as possible. | wants to set up audio and video as quickly as possible. | |||
When the callee receives an offer with audio and video | When the callee receives an offer with audio and video | |||
MediaStreamTracks, it will send an immediate answer | MediaStreamTracks, it will send an immediate answer | |||
accepting these tracks as sendonly (meaning that the caller | accepting these tracks as "sendonly" (meaning that the caller | |||
will not send the callee any media yet, and because the | will not send the callee any media yet, and because the | |||
callee has not yet added its own MediaStreamTracks, the | callee has not yet added its own MediaStreamTracks, the | |||
callee will not send any media either). It will then ask | callee will not send any media either). It will then ask | |||
the user to accept the call and acquire the needed local | the user to accept the call and acquire the needed local | |||
tracks. Upon acceptance by the user, the application will | tracks. Upon acceptance by the user, the application will | |||
plug in the tracks it has acquired, which, because ICE handshaking | plug in the tracks it has acquired, which, because ICE handshaking | |||
and DTLS handshaking have likely completed by this point, can | and DTLS handshaking have likely completed by this point, can | |||
start transmitting immediately. The application will also | start transmitting immediately. The application will also | |||
send a new offer to the remote side indicating call | send a new offer to the remote side indicating call | |||
acceptance and moving the audio and video to be two-way | acceptance and moving the audio and video to be two-way | |||
skipping to change at line 1492 ¶ | skipping to change at line 1491 ¶ | |||
<xref target="sec.ice-candidate-trickling" format="default"/>, JSEP | <xref target="sec.ice-candidate-trickling" format="default"/>, JSEP | |||
implementations always provide candidates to the application | implementations always provide candidates to the application | |||
individually, consistent with what is needed for Trickle ICE. | individually, consistent with what is needed for Trickle ICE. | |||
However, applications can use the canTrickleIceCandidates | However, applications can use the canTrickleIceCandidates | |||
property to determine whether their peer can actually do | property to determine whether their peer can actually do | |||
Trickle ICE, i.e., whether it is safe to send an initial | Trickle ICE, i.e., whether it is safe to send an initial | |||
offer or answer followed later by candidates as they are | offer or answer followed later by candidates as they are | |||
gathered. As "true" is the only value that definitively | gathered. As "true" is the only value that definitively | |||
indicates remote Trickle ICE support, an application that | indicates remote Trickle ICE support, an application that | |||
compares canTrickleIceCandidates against "true" will by | compares canTrickleIceCandidates against "true" will by | |||
default attempt Half Trickle on initial offers and Full | default attempt half trickle on initial offers and full | |||
Trickle on subsequent interactions with a Trickle | trickle on subsequent interactions with a Trickle | |||
ICE-compatible agent.</t> | ICE-compatible agent.</t> | |||
</section> | </section> | |||
<section anchor="sec.setconfiguration" numbered="true" toc="default"> | <section anchor="sec.setconfiguration" numbered="true" toc="default"> | |||
<name>setConfiguration</name> | <name>setConfiguration</name> | |||
<t>The setConfiguration method allows the global | <t>The setConfiguration method allows the global | |||
configuration of the PeerConnection, which was initially set | configuration of the PeerConnection, which was initially set | |||
by constructor parameters, to be changed during the session. | by constructor parameters, to be changed during the session. | |||
The effects of calling this method depend on when it is invoked, | The effects of calling this method depend on when it is invoked, | |||
and they will differ, depending on which specific parameters are | and they will differ, depending on which specific parameters are | |||
changed: </t> | changed: </t> | |||
skipping to change at line 1568 ¶ | skipping to change at line 1567 ¶ | |||
ICE candidate generation. However, if both fields are null | ICE candidate generation. However, if both fields are null | |||
for a new remote candidate, this <bcp14>MUST</bcp14> be treated as an | for a new remote candidate, this <bcp14>MUST</bcp14> be treated as an | |||
invalid condition, as specified below.</t> | invalid condition, as specified below.</t> | |||
<t>If any IceCandidate fields contain invalid values or an | <t>If any IceCandidate fields contain invalid values or an | |||
error occurs during the processing of the IceCandidate | error occurs during the processing of the IceCandidate | |||
object, the supplied IceCandidate <bcp14>MUST</bcp14> be ignored and a n | object, the supplied IceCandidate <bcp14>MUST</bcp14> be ignored and a n | |||
error <bcp14>MUST</bcp14> be returned.</t> | error <bcp14>MUST</bcp14> be returned.</t> | |||
<t>Otherwise, the new remote candidate or end-of-candidates | <t>Otherwise, the new remote candidate or end-of-candidates | |||
indication is supplied to the ICE agent. In the case of a new | indication is supplied to the ICE agent. In the case of a new | |||
remote candidate, connectivity checks will be sent to the new | remote candidate, connectivity checks will be sent to the new | |||
candidate, assuming setLocalDescription has already been | candidate, assuming that setLocalDescription has already been | |||
called to initialize the ICE gathering process.</t> | called to initialize the ICE gathering process.</t> | |||
</section> | </section> | |||
<section anchor="sec.onicecandidate" numbered="true" toc="default"> | <section anchor="sec.onicecandidate" numbered="true" toc="default"> | |||
<name>onicecandidate Event</name> | <name>onicecandidate Event</name> | |||
<t>The onicecandidate event is dispatched to the application in two | <t>The onicecandidate event is dispatched to the application in two | |||
situations: (1) when the ICE agent has discovered a new allowed local | situations: (1) when the ICE agent has discovered a new allowed local | |||
ICE candidate during ICE gathering, as outlined in | ICE candidate during ICE gathering, as outlined in | |||
<xref target="sec.ice-gather-overview" format="default"></xref> and | <xref target="sec.ice-gather-overview" format="default"></xref> and | |||
subject to the restrictions discussed in | subject to the restrictions discussed in | |||
<xref target="sec.ice-candidate-policy" format="default"></xref>, or | <xref target="sec.ice-candidate-policy" format="default"></xref>, or | |||
skipping to change at line 1594 ¶ | skipping to change at line 1593 ¶ | |||
This candidate will also be added to the current and/or pending local | This candidate will also be added to the current and/or pending local | |||
description according to the rules defined for Trickle ICE.</t> | description according to the rules defined for Trickle ICE.</t> | |||
<t>In the second case, the event's IceCandidate object | <t>In the second case, the event's IceCandidate object | |||
<bcp14>MUST</bcp14> have its candidate field set to null to indicate | <bcp14>MUST</bcp14> have its candidate field set to null to indicate | |||
that the current gathering phase is complete, i.e., there will be no | that the current gathering phase is complete, i.e., there will be no | |||
further onicecandidate events in this phase. However, the | further onicecandidate events in this phase. However, the | |||
IceCandidate's ufrag field <bcp14>MUST</bcp14> be specified to | IceCandidate's ufrag field <bcp14>MUST</bcp14> be specified to | |||
indicate which ICE candidate generation is ending. The IceCandidate's | indicate which ICE candidate generation is ending. The IceCandidate's | |||
"m=" section index and MID fields <bcp14>MAY</bcp14> be specified to i ndicate that | "m=" section index and MID fields <bcp14>MAY</bcp14> be specified to i ndicate that | |||
the event applies to a specific "m=" section, or set to null to | the event applies to a specific "m=" section, or set to null to | |||
indicate it applies to all "m=" sections in the current ICE candidate | indicate that it applies to all "m=" sections in the current ICE candi date | |||
generation. This event can be used by the application to generate an | generation. This event can be used by the application to generate an | |||
end-of-candidates indication, as defined in | end-of-candidates indication, as defined in | |||
<xref target="RFC8838" sectionFormat="comma" section="13"/>.</t> | <xref target="RFC8838" sectionFormat="comma" section="13"/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.transceiver" numbered="true" toc="default"> | <section anchor="sec.transceiver" numbered="true" toc="default"> | |||
<name>RtpTransceiver</name> | <name>RtpTransceiver</name> | |||
<section anchor="sec.transceiver-stop" numbered="true" toc="default"> | <section anchor="sec.transceiver-stop" numbered="true" toc="default"> | |||
<name>stop</name> | <name>stop</name> | |||
<t>The stop method stops an RtpTransceiver. This will cause | <t>The stop method stops an RtpTransceiver. This will cause | |||
skipping to change at line 1634 ¶ | skipping to change at line 1633 ¶ | |||
createAnswer. The permitted values for direction are | createAnswer. The permitted values for direction are | |||
"recvonly", "sendrecv", "sendonly", and "inactive", mirroring | "recvonly", "sendrecv", "sendonly", and "inactive", mirroring | |||
the identically named direction attributes defined in | the identically named direction attributes defined in | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/>.</t> | <xref target="RFC4566" sectionFormat="comma" section="6"/>.</t> | |||
<t>When creating offers, the transceiver direction is | <t>When creating offers, the transceiver direction is | |||
directly reflected in the output, even for re-offers. When | directly reflected in the output, even for re-offers. When | |||
creating answers, the transceiver direction is intersected | creating answers, the transceiver direction is intersected | |||
with the offered direction, as explained in | with the offered direction, as explained in | |||
<xref target="sec.generating-an-answer" format="default"/> below.</t> | <xref target="sec.generating-an-answer" format="default"/> below.</t> | |||
<t>Note that while setDirection sets the direction property | <t>Note that while setDirection sets the direction property | |||
of the transceiver immediately (<xref target="sec.transceiver-directio n" format="default"/>), this property | (<xref target="sec.transceiver-direction" format="default"/>) of the t ransceiver immediately, this property | |||
does not immediately affect whether the transceiver's | does not immediately affect whether the transceiver's | |||
RtpSender will send or its RtpReceiver will receive. The | RtpSender will send or its RtpReceiver will receive. The | |||
direction in effect is represented by the currentDirection | direction in effect is represented by the currentDirection | |||
property, which is only updated when an answer is | property, which is only updated when an answer is | |||
applied.</t> | applied.</t> | |||
</section> | </section> | |||
<section anchor="sec.transceiver-direction" numbered="true" toc="default "> | <section anchor="sec.transceiver-direction" numbered="true" toc="default "> | |||
<name>direction</name> | <name>direction</name> | |||
<t>The direction property indicates the last value passed | <t>The direction property indicates the last value passed | |||
into setDirection. If setDirection has never been called, it | into setDirection. If setDirection has never been called, it | |||
is set to the direction the transceiver was initialized | is set to the direction the transceiver was initialized | |||
with.</t> | with.</t> | |||
</section> | </section> | |||
<section anchor="sec.transceiver-current-direction" numbered="true" toc= "default"> | <section anchor="sec.transceiver-current-direction" numbered="true" toc= "default"> | |||
<name>currentDirection</name> | <name>currentDirection</name> | |||
<t>The currentDirection property indicates the last | <t>The currentDirection property indicates the last | |||
negotiated direction for the transceiver's associated "m=" | negotiated direction for the transceiver's associated "m=" | |||
section. More specifically, it indicates the | section. More specifically, it indicates the | |||
direction attribute <xref target="RFC3264" format="default"/> of the | direction attribute <xref target="RFC3264" format="default"/> of the | |||
associated "m=" section in the last applied answer (including | associated "m=" section in the last applied answer (including | |||
provisional answers), with "send" and "recv" directions | provisional answers), with the direction | |||
reversed if it was a remote answer. For example, if the | reversed if it was a remote answer. For example, if the | |||
direction attribute for the associated "m=" section in a | direction attribute for the associated "m=" section in a | |||
remote answer is "recvonly", currentDirection is set to | remote answer is "recvonly", currentDirection is set to | |||
"sendonly".</t> | "sendonly".</t> | |||
<t>If an answer that references this transceiver has not yet | <t>If an answer that references this transceiver has not yet | |||
been applied or if the transceiver is stopped, | been applied or if the transceiver is stopped, | |||
currentDirection is set to "null".</t> | currentDirection is set to null.</t> | |||
</section> | </section> | |||
<section anchor="sec.transceiver-set-codec-preferences" numbered="true" toc="default"> | <section anchor="sec.transceiver-set-codec-preferences" numbered="true" toc="default"> | |||
<name>setCodecPreferences</name> | <name>setCodecPreferences</name> | |||
<t>The setCodecPreferences method sets the codec preferences | <t>The setCodecPreferences method sets the codec preferences | |||
of a transceiver, which in turn affect the presence and order | of a transceiver, which in turn affect the presence and order | |||
of codecs of the associated "m=" section on future calls to | of codecs of the associated "m=" section on future calls to | |||
createOffer and createAnswer. Note that setCodecPreferences | createOffer and createAnswer. Note that setCodecPreferences | |||
does not directly affect which codec the implementation | does not directly affect which codec the implementation | |||
decides to send. It only affects which codecs the | decides to send. It only affects which codecs the | |||
implementation indicates that it prefers to receive, via the | implementation indicates that it prefers to receive, via the | |||
skipping to change at line 1715 ¶ | skipping to change at line 1714 ¶ | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>ICE, as specified in | <li>ICE, as specified in | |||
<xref target="RFC8445" format="default"/>, <bcp14>MUST</bcp14> be us ed. Note that the | <xref target="RFC8445" format="default"/>, <bcp14>MUST</bcp14> be us ed. Note that the | |||
remote endpoint may use a lite implementation; | remote endpoint may use a lite implementation; | |||
implementations <bcp14>MUST</bcp14> properly handle remote endpoints that | implementations <bcp14>MUST</bcp14> properly handle remote endpoints that | |||
use ICE-lite. The remote endpoint may also use | use ICE-lite. The remote endpoint may also use | |||
an older version of ICE; implementations <bcp14>MUST</bcp14> properly handle rem ote endpoints that use ICE | an older version of ICE; implementations <bcp14>MUST</bcp14> properly handle rem ote endpoints that use ICE | |||
as specified in <xref target="RFC5245" format="default"/>.</li> | as specified in <xref target="RFC5245" format="default"/>.</li> | |||
<li>DTLS | <li>DTLS | |||
<xref target="RFC6347" format="default"/> or DTLS-SRTP | <xref target="RFC6347" format="default"/> <xref target="RFC9147"/> o r DTLS-SRTP | |||
<xref target="RFC5763" format="default"/> <bcp14>MUST</bcp14> be use d, as | <xref target="RFC5763" format="default"/> <bcp14>MUST</bcp14> be use d, as | |||
appropriate for the media type, as specified in | appropriate for the media type, as specified in | |||
<xref target="RFC8827" format="default"/>.</li> | <xref target="RFC8827" format="default"/>. | |||
Note: RFC 8827 requires implementations to support | ||||
DTLS 1.2 <xref target="RFC6347" format="default"/> and permits the use of DTLS 1 | ||||
.3 <xref target="RFC9147"/>.</li> | ||||
</ul> | </ul> | |||
<t>The SDP security descriptions mechanism for SRTP keying | <t>The SDP security descriptions mechanism for Secure Real-time Transp ort Protocol (SRTP) keying | |||
<xref target="RFC4568" format="default"/> <bcp14>MUST NOT</bcp14> be u sed, as discussed in | <xref target="RFC4568" format="default"/> <bcp14>MUST NOT</bcp14> be u sed, as discussed in | |||
<xref target="RFC8827" format="default"/>.</t> | <xref target="RFC8827" format="default"/>.</t> | |||
</section> | </section> | |||
<section anchor="sec.profile-names" numbered="true" toc="default"> | <section anchor="sec.profile-names" numbered="true" toc="default"> | |||
<name>Profile Names and Interoperability</name> | <name>Profile Names and Interoperability</name> | |||
<t>For media "m=" sections, JSEP implementations <bcp14>MUST</bcp14> s upport | <t>For media "m=" sections, JSEP implementations <bcp14>MUST</bcp14> s upport | |||
the "UDP/TLS/RTP/SAVPF" profile specified in | the "UDP/TLS/RTP/SAVPF" profile specified in | |||
<xref target="RFC5764" format="default"/> as well as the "TCP/DTLS/RTP /SAVPF" | <xref target="RFC5764" format="default"/> as well as the "TCP/DTLS/RTP /SAVPF" | |||
profile specified in <xref target="RFC7850" format="default"/> and <bc p14>MUST</bcp14> indicate | profile specified in <xref target="RFC7850" format="default"/> and <bc p14>MUST</bcp14> indicate | |||
one of these profiles for each media "m=" line they produce in an offe r. | one of these profiles for each media "m=" line they produce in an offe r. | |||
skipping to change at line 1893 ¶ | skipping to change at line 1894 ¶ | |||
values <bcp14>MUST</bcp14> be session-level attributes.</t> | values <bcp14>MUST</bcp14> be session-level attributes.</t> | |||
<t>Each "m=" section <bcp14>MUST</bcp14> be generated as specified in | <t>Each "m=" section <bcp14>MUST</bcp14> be generated as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.14"/>. For the "m=" line | <xref target="RFC4566" sectionFormat="comma" section="5.14"/>. For the "m=" line | |||
itself, the following rules <bcp14>MUST</bcp14> be followed: | itself, the following rules <bcp14>MUST</bcp14> be followed: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>If the "m=" section is marked as bundle-only, then the | <li>If the "m=" section is marked as bundle-only, then the | |||
<port> value <bcp14>MUST</bcp14> be set to zero. Otherwise, th e <port> value is | <port> value <bcp14>MUST</bcp14> be set to zero. Otherwise, th e <port> value is | |||
set to the port of the default ICE candidate for this "m=" | set to the port of the default ICE candidate for this "m=" | |||
section, but given that no candidates are available yet, | section, but given that no candidates are available yet, | |||
the default port value of 9 (Discard) <bcp14>MUST</bcp14> be used, a s | the default <port> value of 9 (Discard) <bcp14>MUST</bcp14> be used, as | |||
indicated in | indicated in | |||
<xref target="RFC8840" sectionFormat="comma" section="4.1.1"/>.</li> | <xref target="RFC8840" sectionFormat="comma" section="4.1.1"/>.</li> | |||
<li>To properly indicate use of DTLS, the <proto> | <li>To properly indicate use of DTLS, the <proto> | |||
field <bcp14>MUST</bcp14> be set to "UDP/TLS/RTP/SAVPF", as specifie d in | field <bcp14>MUST</bcp14> be set to "UDP/TLS/RTP/SAVPF", as specifie d in | |||
<xref target="RFC5764" sectionFormat="comma" section="8"/>.</li> | <xref target="RFC5764" sectionFormat="comma" section="8"/>.</li> | |||
<li>If codec preferences have been set for the associated | <li>If codec preferences have been set for the associated | |||
transceiver, media formats <bcp14>MUST</bcp14> be generated in the | transceiver, media formats <bcp14>MUST</bcp14> be generated in the | |||
corresponding order and <bcp14>MUST</bcp14> exclude any codecs not | corresponding order and <bcp14>MUST</bcp14> exclude any codecs not | |||
present in the codec preferences.</li> | present in the codec preferences.</li> | |||
<li>Unless excluded by the above restrictions, the media | <li>Unless excluded by the above restrictions, the media | |||
skipping to change at line 1953 ¶ | skipping to change at line 1954 ¶ | |||
associated transceiver.</li> | associated transceiver.</li> | |||
<li>For each media format on the "m=" line, "a=rtpmap" and "a=fmtp" lines, as specified in | <li>For each media format on the "m=" line, "a=rtpmap" and "a=fmtp" lines, as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/> and | <xref target="RFC4566" sectionFormat="comma" section="6"/> and | |||
<xref target="RFC3264" sectionFormat="comma" section="5.1"/>.</li> | <xref target="RFC3264" sectionFormat="comma" section="5.1"/>.</li> | |||
<li>For each primary codec where RTP retransmission should | <li>For each primary codec where RTP retransmission should | |||
be used, a corresponding "a=rtpmap" line indicating "rtx" | be used, a corresponding "a=rtpmap" line indicating "rtx" | |||
with the clock rate of the primary codec and an "a=fmtp" | with the clock rate of the primary codec and an "a=fmtp" | |||
line that references the payload type of the primary | line that references the payload type of the primary | |||
codec, as specified in | codec, as specified in | |||
<xref target="RFC4588" sectionFormat="comma" section="8.1"/>.</li> | <xref target="RFC4588" sectionFormat="comma" section="8.1"/>.</li> | |||
<li>For each supported Forward Error Correction (FEC) mechanism, "a= rtpmap" and | <li>For each Forward Error Correction (FEC) mechanism supported by t he application, "a=rtpmap" and | |||
"a=fmtp" lines, as specified in | "a=fmtp" lines, as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/>. The FE C | <xref target="RFC4566" sectionFormat="comma" section="6"/>. The FE C | |||
mechanisms that <bcp14>MUST</bcp14> be supported are specified in | mechanisms that <bcp14>MUST</bcp14> be supported are specified in | |||
<xref target="RFC8854" sectionFormat="comma" section="7"/>, | <xref target="RFC8854" sectionFormat="comma" section="7"/>, | |||
and specific usage for each media type is outlined in | and specific usage for each media type is outlined in | |||
Sections <xref target="sec.interface" format="counter"/> and <xref | Sections <xref target="RFC8854" section="4" | |||
target="sec.sdp-interaction-procedure" | sectionFormat="bare"/> and <xref target="RFC8854" section="5" | |||
format="counter"/>.</li> | sectionFormat="bare"/> of <xref target="RFC8854"/>.</li> | |||
<li>If this "m=" section is for media with configurable | <li>If this "m=" section is for media with configurable | |||
durations of media per packet, e.g., audio, an | durations of media per packet, e.g., audio, an | |||
"a=maxptime" line, indicating the maximum amount of | "a=maxptime" line, indicating the maximum amount of | |||
media, specified in milliseconds, that can be | media, specified in milliseconds, that can be | |||
encapsulated in each packet, as specified in | encapsulated in each packet, as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/>. This v alue is | <xref target="RFC4566" sectionFormat="comma" section="6"/>. This v alue is | |||
set to the smallest of the maximum duration values across | set to the smallest of the maximum duration values across | |||
all the codecs included in the "m=" section.</li> | all the codecs included in the "m=" section.</li> | |||
<li>If this "m=" section is for video media and there are | <li>If this "m=" section is for video media and there are | |||
known limitations on the size of images that can be | known limitations on the size of images that can be | |||
decoded, an "a=imageattr" line, as specified in | decoded, an "a=imageattr" line, as specified in | |||
<xref target="sec.imageattr" format="default"/>.</li> | <xref target="sec.imageattr" format="default"/>.</li> | |||
<li>For each supported RTP header extension, an "a=extmap" | <li>For each RTP header extension supported by the application, an " a=extmap" | |||
line, as specified in | line, as specified in | |||
<xref target="RFC5285" sectionFormat="comma" section="5"/>. | <xref target="RFC5285" sectionFormat="comma" section="5"/>. | |||
The list of | The list of | |||
header extensions that <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp14> b e supported is | header extensions that <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp14> b e supported is | |||
specified in | specified in | |||
<xref target="RFC8834" sectionFormat="comma" section="5.2"/>. Any header extensions that require encryption <bcp14>MUST</bcp14> | <xref target="RFC8834" sectionFormat="comma" section="5.2"/>. Any header extensions that require encryption <bcp14>MUST</bcp14> | |||
be specified as indicated in | be specified as indicated in | |||
<xref target="RFC6904" sectionFormat="comma" section="4"/>.</li> | <xref target="RFC6904" sectionFormat="comma" section="4"/>.</li> | |||
<li>For each supported RTCP feedback mechanism, an | <li>For each RTCP feedback mechanism supported by the application, a n | |||
"a=rtcp-fb" line, as specified in | "a=rtcp-fb" line, as specified in | |||
<xref target="RFC4585" sectionFormat="comma" section="4.2"/>. The list of | <xref target="RFC4585" sectionFormat="comma" section="4.2"/>. The list of | |||
RTCP feedback mechanisms that <bcp14>SHOULD</bcp14>/<bcp14>MUST</b cp14> be supported is | RTCP feedback mechanisms that <bcp14>SHOULD</bcp14>/<bcp14>MUST</b cp14> be supported is | |||
specified in | specified in | |||
<xref target="RFC8834" sectionFormat="comma" section="5.1"/>.</li> | <xref target="RFC8834" sectionFormat="comma" section="5.1"/>.</li> | |||
<li> | <li> | |||
<t>If the RtpTransceiver has a sendrecv or sendonly | <t>If the RtpTransceiver has a "sendrecv" or "sendonly" | |||
direction: | direction: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>For each MediaStream that was associated with the | <li>For each MediaStream that was associated with the | |||
transceiver when it was created via addTrack or | transceiver when it was created via addTrack or | |||
addTransceiver, an "a=msid" line, as specified in | addTransceiver, an "a=msid" line, as specified in | |||
<xref target="RFC8830" sectionFormat="comma" section="2"/>, | <xref target="RFC8830" sectionFormat="comma" section="2"/>, | |||
but omitting the "appdata" field.</li> | but omitting the "appdata" field.</li> | |||
</ul> | </ul> | |||
</li> | </li> | |||
<li>If the RtpTransceiver has a sendrecv or sendonly | <li>If the RtpTransceiver has a "sendrecv" or "sendonly" | |||
direction, and the application has specified a rid-id for an encod ing, | direction, and the application has specified a rid-id for an encod ing, | |||
or has specified more than one encoding in the | or has specified more than one encoding in the | |||
RtpSenders's parameters, an "a=rid" line for each | RtpSenders's parameters, an "a=rid" line for each | |||
encoding specified. The "a=rid" line is specified in | encoding specified. The "a=rid" line is specified in | |||
<xref target="RFC8851" format="default"/>, and its | <xref target="RFC8851" format="default"/>, and its | |||
direction <bcp14>MUST</bcp14> be "send". If the application has ch osen a | direction <bcp14>MUST</bcp14> be "send". If the application has ch osen a | |||
rid-id, it <bcp14>MUST</bcp14> be used; | rid-id, it <bcp14>MUST</bcp14> be used; | |||
otherwise, a rid-id <bcp14>MUST</bcp14> be generated by the | otherwise, a rid-id <bcp14>MUST</bcp14> be generated by the | |||
implementation. rid-ids <bcp14>MUST</bcp14> be generated in a fash ion | implementation. rid-ids <bcp14>MUST</bcp14> be generated in a fashion | |||
that does not leak user information, e.g., randomly or | that does not leak user information, e.g., randomly or | |||
using a per-PeerConnection counter (see guidance at the end | using a per-PeerConnection counter (see guidance at the end | |||
of <xref target="RFC8852" sectionFormat="comma" section="3.3"/>), and <bcp14>SHOULD</bcp14> be 3 bytes | of <xref target="RFC8852" sectionFormat="comma" section="3.3"/>), and <bcp14>SHOULD</bcp14> be 3 bytes | |||
or less, to allow them to efficiently fit into the RTP | or less, to allow them to efficiently fit into the RTP | |||
header extensions defined in | header extensions defined in | |||
<xref target="RFC8852" sectionFormat="comma" section="3.3"/>. | <xref target="RFC8852" sectionFormat="comma" section="3.3"/>. | |||
If no encodings have been specified, or only one encoding is | If no encodings have been specified, or only one encoding is | |||
specified but without a rid-id, then no "a=rid" lines | specified but without a rid-id, then no "a=rid" lines | |||
are generated.</li> | are generated.</li> | |||
<li>If the RtpTransceiver has a sendrecv or sendonly | <li>If the RtpTransceiver has a "sendrecv" or "sendonly" | |||
direction and more than one "a=rid" line has been | direction and more than one "a=rid" line has been | |||
generated, an "a=simulcast" line, with direction "send", | generated, an "a=simulcast" line, with direction "send", | |||
as defined in | as defined in | |||
<xref target="RFC8853" sectionFormat="comma" | <xref target="RFC8853" sectionFormat="comma" | |||
section="5.1"/>. The associated set of rid-ids <bcp14>MUST</bcp14> | section="5.1"/>. The associated set of rid-ids <bcp14>MUST</bcp14> | |||
include all of the rid-ids used in the "a=rid" lines for this "m=" | include all of the rid-ids used in the "a=rid" lines for this "m=" | |||
section.</li> | section.</li> | |||
<li>If (1) the bundle policy for this PeerConnection is set to | <li>If (1) the bundle policy for this PeerConnection is set to | |||
"must-bundle" and this is not the first "m=" section or (2) | "must-bundle" and this is not the first "m=" section or (2) | |||
the bundle policy is set to "balanced" and this is not | the bundle policy is set to "balanced" and this is not | |||
skipping to change at line 2071 ¶ | skipping to change at line 2073 ¶ | |||
<xref target="RFC8858" sectionFormat="comma" section="4"/>.</li> | <xref target="RFC8858" sectionFormat="comma" section="4"/>.</li> | |||
<li>An "a=rtcp-rsize" line, as specified in | <li>An "a=rtcp-rsize" line, as specified in | |||
<xref target="RFC5506" sectionFormat="comma" section="5"/>.</li> | <xref target="RFC5506" sectionFormat="comma" section="5"/>.</li> | |||
</ul> | </ul> | |||
<t>Lastly, if a data channel has been created, an "m=" section | <t>Lastly, if a data channel has been created, an "m=" section | |||
<bcp14>MUST</bcp14> be generated for data. The <media> field <bc p14>MUST</bcp14> be | <bcp14>MUST</bcp14> be generated for data. The <media> field <bc p14>MUST</bcp14> be | |||
set to "application", and the <proto> field <bcp14>MUST</bcp14> be set | set to "application", and the <proto> field <bcp14>MUST</bcp14> be set | |||
to "UDP/DTLS/SCTP" | to "UDP/DTLS/SCTP" | |||
<xref target="RFC8841" format="default"/>. The <fmt> | <xref target="RFC8841" format="default"/>. The <fmt> | |||
value <bcp14>MUST</bcp14> be set to "webrtc-datachannel" as specified in | value <bcp14>MUST</bcp14> be set to "webrtc-datachannel" as specified in | |||
<xref target="RFC8841" sectionFormat="comma" section="4.2.2"/>. | <xref target="RFC8841" sectionFormat="comma" section="4.4.2"/>.</t> | |||
</t> | ||||
<t>Within the data "m=" section, an "a=mid" line <bcp14>MUST</bcp14> b e | <t>Within the data "m=" section, an "a=mid" line <bcp14>MUST</bcp14> b e | |||
generated and included as described above, along with an | generated and included as described above, along with an | |||
"a=sctp-port" line referencing the SCTP port number, as | "a=sctp-port" line referencing the SCTP port number, as | |||
defined in | defined in | |||
<xref target="RFC8841" sectionFormat="comma" section="5.1"/>; | <xref target="RFC8841" sectionFormat="comma" section="5.1"/>; | |||
and, if appropriate, an "a=max-message-size" line, as defined | and, if appropriate, an "a=max-message-size" line, as defined | |||
in | in | |||
<xref target="RFC8841" sectionFormat="comma" section="6.1"/>.</t> | <xref target="RFC8841" sectionFormat="comma" section="6.1"/>.</t> | |||
<t>As discussed above, the following attributes of category | <t>As discussed above, the following attributes of category | |||
IDENTICAL or TRANSPORT are included only if the data "m=" | IDENTICAL or TRANSPORT are included only if the data "m=" | |||
skipping to change at line 2096 ¶ | skipping to change at line 2097 ¶ | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>"a=ice-ufrag"</li> | <li>"a=ice-ufrag"</li> | |||
<li>"a=ice-pwd"</li> | <li>"a=ice-pwd"</li> | |||
<li>"a=fingerprint"</li> | <li>"a=fingerprint"</li> | |||
<li>"a=setup"</li> | <li>"a=setup"</li> | |||
<li>"a=tls-id"</li> | <li>"a=tls-id"</li> | |||
</ul> | </ul> | |||
<t>Once all "m=" sections have been generated, a session-level | <t>Once all "m=" sections have been generated, a session-level | |||
"a=group" attribute <bcp14>MUST</bcp14> be added as specified in | "a=group" attribute <bcp14>MUST</bcp14> be added as specified in | |||
<xref target="RFC5888" format="default"/>. This attribute <bcp14>MUST< /bcp14> have | <xref target="RFC5888" format="default"/>. This attribute <bcp14>MUST< /bcp14> have | |||
semantics "BUNDLE" and <bcp14>MUST</bcp14> include the mid identifiers of | semantics "BUNDLE" and <bcp14>MUST</bcp14> include the MID identifiers of | |||
each "m=" section. The effect of this is that the JSEP | each "m=" section. The effect of this is that the JSEP | |||
implementation offers all "m=" sections as one bundle group. | implementation offers all "m=" sections as one bundle group. | |||
However, whether the "m=" sections are bundle-only or not | However, whether the "m=" sections are bundle-only or not | |||
depends on the bundle policy.</t> | depends on the bundle policy.</t> | |||
<t>The next step is to generate session-level lip sync groups | <t>The next step is to generate session-level lip sync groups | |||
as defined in | as defined in | |||
<xref target="RFC5888" sectionFormat="comma" section="7"/>. For each M ediaStream | <xref target="RFC5888" sectionFormat="comma" section="7"/>. For each M ediaStream | |||
referenced by more than one RtpTransceiver (by passing those | referenced by more than one RtpTransceiver (by passing those | |||
MediaStreams as arguments to the addTrack and addTransceiver | MediaStreams as arguments to the addTrack and addTransceiver | |||
methods), a group of type "LS" <bcp14>MUST</bcp14> be added that conta ins | methods), a group of type "LS" <bcp14>MUST</bcp14> be added that conta ins | |||
skipping to change at line 2275 ¶ | skipping to change at line 2276 ¶ | |||
transceiver and also <bcp14>MUST</bcp14> include all currently avail able | transceiver and also <bcp14>MUST</bcp14> include all currently avail able | |||
formats. Media formats that were previously offered but are | formats. Media formats that were previously offered but are | |||
no longer available (e.g., a shared hardware codec) <bcp14>MAY</bcp1 4> be | no longer available (e.g., a shared hardware codec) <bcp14>MAY</bcp1 4> be | |||
excluded.</li> | excluded.</li> | |||
<li>Unless codec preferences have been set for the | <li>Unless codec preferences have been set for the | |||
associated transceiver, the media formats on the "m=" line | associated transceiver, the media formats on the "m=" line | |||
<bcp14>MUST</bcp14> be generated in the same order as in the most re cent | <bcp14>MUST</bcp14> be generated in the same order as in the most re cent | |||
answer. Any media formats that were not present in the most | answer. Any media formats that were not present in the most | |||
recent answer <bcp14>MUST</bcp14> be added after all existing format s.</li> | recent answer <bcp14>MUST</bcp14> be added after all existing format s.</li> | |||
<li>The RTP header extensions <bcp14>MUST</bcp14> only include those that | <li>The RTP header extensions <bcp14>MUST</bcp14> only include those that | |||
are present in the most recent answer.</li> | are supported by the application on the associated transceiver.</li> | |||
<li>The RTCP feedback mechanisms <bcp14>MUST</bcp14> only include th ose | <li>The RTCP feedback mechanisms <bcp14>MUST</bcp14> only include th ose | |||
that are present in the most recent answer, except for the | that are supported by the application on the associated transceiver. | |||
case of format-specific mechanisms that are referencing a | </li> | |||
newly added media format.</li> | ||||
<li>The "a=rtcp" line <bcp14>MUST NOT</bcp14> be added if the most r ecent | <li>The "a=rtcp" line <bcp14>MUST NOT</bcp14> be added if the most r ecent | |||
answer included an "a=rtcp-mux" line.</li> | answer included an "a=rtcp-mux" line.</li> | |||
<li>The "a=rtcp-mux" line <bcp14>MUST</bcp14> be the same as that in the | <li>The "a=rtcp-mux" line <bcp14>MUST</bcp14> be the same as that in the | |||
most recent answer.</li> | most recent answer.</li> | |||
<li>The "a=rtcp-mux-only" line <bcp14>MUST NOT</bcp14> be added.</li > | <li>The "a=rtcp-mux-only" line <bcp14>MUST NOT</bcp14> be added.</li > | |||
<li>The "a=rtcp-rsize" line <bcp14>MUST NOT</bcp14> be added unless present | <li>The "a=rtcp-rsize" line <bcp14>MUST NOT</bcp14> be added unless present | |||
in the most recent answer.</li> | in the most recent answer.</li> | |||
<li>An "a=bundle-only" line, as defined in | <li>An "a=bundle-only" line, as defined in | |||
<xref target="RFC9143" sectionFormat="comma" section="6"/>, | <xref target="RFC9143" sectionFormat="comma" section="6"/>, | |||
<bcp14>MUST NOT</bcp14> be added. | <bcp14>MUST NOT</bcp14> be added. | |||
skipping to change at line 2314 ¶ | skipping to change at line 2313 ¶ | |||
into a preceding non-bundle-only media "m=" section.</li> | into a preceding non-bundle-only media "m=" section.</li> | |||
</ul> | </ul> | |||
<t>The "a=group:BUNDLE" attribute <bcp14>MUST</bcp14> include the MID | <t>The "a=group:BUNDLE" attribute <bcp14>MUST</bcp14> include the MID | |||
identifiers specified in the bundle group in the most recent | identifiers specified in the bundle group in the most recent | |||
answer, minus any "m=" sections that have been marked as | answer, minus any "m=" sections that have been marked as | |||
rejected, plus any newly added or re-enabled "m=" sections. In | rejected, plus any newly added or re-enabled "m=" sections. In | |||
other words, the bundle attribute <bcp14>MUST</bcp14> contain all "m=" | other words, the bundle attribute <bcp14>MUST</bcp14> contain all "m=" | |||
sections that were previously bundled, as long as they are | sections that were previously bundled, as long as they are | |||
still alive, as well as any new "m=" sections.</t> | still alive, as well as any new "m=" sections.</t> | |||
<t>Note that if bundling has been negotiated, unbundling is no longer | <t>Note that if bundling has been negotiated, unbundling is no longer | |||
possible, and media sections will not be marked as bundle-only. This i | possible, and media sections will not be marked as bundle-only. Althou | |||
s | gh this is | |||
by design, but could cause issues in the rare case of sending a | by design, it could cause issues in the rare case of sending a | |||
subsequent offer as an initial offer to a non-bundle-aware endpoint | subsequent offer as an initial offer to a non-bundle-aware endpoint | |||
via Third Party Call Control (3PCC), as discussed in <xref target="RFC 9143" sectionFormat="comma" section="7.6"/>.</t> | via Third Party Call Control (3PCC), as discussed in <xref target="RFC 9143" sectionFormat="comma" section="7.6"/>.</t> | |||
<t>"a=group:LS" attributes are generated in the same way as | <t>"a=group:LS" attributes are generated in the same way as | |||
for initial offers, with the additional stipulation that any | for initial offers, with the additional stipulation that any | |||
lip sync groups that were present in the most recent answer | lip sync groups that were present in the most recent answer | |||
<bcp14>MUST</bcp14> continue to exist and <bcp14>MUST</bcp14> contain any previously | <bcp14>MUST</bcp14> continue to exist and <bcp14>MUST</bcp14> contain any previously | |||
existing MID identifiers, as long as the identified "m=" | existing MID identifiers, as long as the identified "m=" | |||
sections still exist and are not rejected, and the group | sections still exist and are not rejected, and the group | |||
still contains at least two MID identifiers. This ensures | still contains at least two MID identifiers. This ensures | |||
that any synchronized "recvonly" "m=" sections continue to be | that any synchronized "recvonly" "m=" sections continue to be | |||
skipping to change at line 2340 ¶ | skipping to change at line 2339 ¶ | |||
<t>The createOffer method takes as a parameter an | <t>The createOffer method takes as a parameter an | |||
RTCOfferOptions object. Special processing is performed when | RTCOfferOptions object. Special processing is performed when | |||
generating an SDP description if the following options are | generating an SDP description if the following options are | |||
present.</t> | present.</t> | |||
<section anchor="sec.icerestart" numbered="true" toc="default"> | <section anchor="sec.icerestart" numbered="true" toc="default"> | |||
<name>IceRestart</name> | <name>IceRestart</name> | |||
<t>If the IceRestart option is specified, with a value of | <t>If the IceRestart option is specified, with a value of | |||
"true", the offer <bcp14>MUST</bcp14> indicate an ICE restart by | "true", the offer <bcp14>MUST</bcp14> indicate an ICE restart by | |||
generating new ICE ufrag and pwd attributes, as specified | generating new ICE ufrag and pwd attributes, as specified | |||
in | in | |||
<xref target="RFC8839" sectionFormat="comma" section="4.4.3.1.1"/>. If this | <xref target="RFC8839" sectionFormat="comma" section="4.4.1.1.1"/>. If this | |||
option is specified on an initial offer, it has no effect | option is specified on an initial offer, it has no effect | |||
(since a new ICE ufrag and pwd are already generated). | (since a new ICE ufrag and pwd are already generated). | |||
Similarly, if the ICE configuration has changed, this | Similarly, if the ICE configuration has changed, this | |||
option has no effect, since new ufrag and pwd attributes | option has no effect, since new ufrag and pwd attributes | |||
will be generated automatically. This option is primarily | will be generated automatically. This option is primarily | |||
useful for reestablishing connectivity in cases where | useful for reestablishing connectivity in cases where | |||
failures are detected by the application.</t> | failures are detected by the application.</t> | |||
</section> | </section> | |||
<section anchor="sec.voiceactivitydetection1" numbered="true" toc="def ault"> | <section anchor="sec.voiceactivitydetection1" numbered="true" toc="def ault"> | |||
<name>VoiceActivityDetection</name> | <name>VoiceActivityDetection</name> | |||
<t>Silence suppression, also known as discontinuous | <t>Silence suppression, also known as discontinuous | |||
transmission ("DTX"), can reduce the bandwidth used for | transmission ("DTX"), can reduce the bandwidth used for | |||
audio by switching to a special encoding when voice | audio by switching to a special encoding when voice | |||
activity is not detected, at the cost of some fidelity.</t> | activity is not detected, at the cost of some fidelity.</t> | |||
<t>If the "VoiceActivityDetection" option is specified, | <t>If the VoiceActivityDetection option is specified, | |||
with a value of "true", the offer <bcp14>MUST</bcp14> indicate suppo rt for | with a value of "true", the offer <bcp14>MUST</bcp14> indicate suppo rt for | |||
silence suppression in the audio it receives by including | silence suppression in the audio it receives by including | |||
comfort noise ("CN") codecs for each offered audio codec, | comfort noise ("CN") codecs for each offered audio codec, | |||
as specified in | as specified in | |||
<xref target="RFC3389" sectionFormat="comma" section="5.1"/>, except for | <xref target="RFC3389" sectionFormat="comma" section="5.1"/>, except for | |||
codecs that have their own internal silence suppression | codecs that have their own internal silence suppression | |||
support. For codecs that have their own internal silence | support. For codecs that have their own internal silence | |||
suppression support, the appropriate fmtp parameters for | suppression support, the appropriate fmtp parameters for | |||
that codec <bcp14>MUST</bcp14> be specified to indicate that silence | each such codec <bcp14>MUST</bcp14> be specified to indicate that si lence | |||
suppression for received audio is desired. For example, | suppression for received audio is desired. For example, | |||
when using the Opus codec | when using the Opus codec | |||
<xref target="RFC6716" format="default"/>, the "usedtx=1" parameter, | <xref target="RFC6716" format="default"/>, the "usedtx=1" parameter, | |||
specified in | specified in | |||
<xref target="RFC7587" format="default"/>, would be used in the offe r.</t> | <xref target="RFC7587" format="default"/>, would be used in the offe r.</t> | |||
<t>If the "VoiceActivityDetection" option is specified, | <t>If the VoiceActivityDetection option is specified, | |||
with a value of "false", the JSEP implementation <bcp14>MUST NOT</bc p14> | with a value of "false", the JSEP implementation <bcp14>MUST NOT</bc p14> | |||
emit "CN" codecs. For codecs that have their own internal | emit "CN" codecs. For codecs that have their own internal | |||
silence suppression support, the appropriate fmtp | silence suppression support, the appropriate fmtp | |||
parameters for that codec <bcp14>MUST</bcp14> be specified to indica te | parameters for each such codec <bcp14>MUST</bcp14> be specified to i ndicate | |||
that silence suppression for received audio is not desired. | that silence suppression for received audio is not desired. | |||
For example, when using the Opus codec, the "usedtx=0" | For example, when using the Opus codec, the "usedtx=0" | |||
parameter would be specified in the offer. In addition, the | parameter would be specified in the offer. In addition, the | |||
implementation <bcp14>MUST NOT</bcp14> use silence suppression for m edia | implementation <bcp14>MUST NOT</bcp14> use silence suppression for m edia | |||
it generates, regardless of whether the "CN" codecs or | it generates, regardless of whether the "CN" codecs or | |||
related fmtp parameters appear in the peer's description. | related fmtp parameters appear in the peer's description. | |||
The impact of these rules is that silence suppression in | The impact of these rules is that silence suppression in | |||
JSEP depends on mutual agreement of both sides, which | JSEP depends on mutual agreement of both sides, which | |||
ensures consistent handling regardless of which codec is | ensures consistent handling regardless of which codec is | |||
used.</t> | used.</t> | |||
<t>The "VoiceActivityDetection" option does not have any | <t>The VoiceActivityDetection option does not have any | |||
impact on the setting of the "vad" value in the signaling | impact on the setting of the "vad" value in the signaling | |||
of the client-to-mixer audio level header extension | of the client-to-mixer audio level header extension | |||
described in | described in | |||
<xref target="RFC6464" sectionFormat="comma" section="4"/>.</t> | <xref target="RFC6464" sectionFormat="comma" section="4"/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.generating-an-answer" numbered="true" toc="default"> | <section anchor="sec.generating-an-answer" numbered="true" toc="default"> | |||
<name>Generating an Answer</name> | <name>Generating an Answer</name> | |||
<t>When createAnswer is called, a new SDP description <bcp14>MUST</bcp14 > be | <t>When createAnswer is called, a new SDP description <bcp14>MUST</bcp14 > be | |||
skipping to change at line 2490 ¶ | skipping to change at line 2489 ¶ | |||
<sourcecode name="" type="sdp"><![CDATA[ | <sourcecode name="" type="sdp"><![CDATA[ | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 20000 UDP/TLS/RTP/SAVPF 0 | m=audio 20000 UDP/TLS/RTP/SAVPF 0 | |||
a=mid:a1 | a=mid:a1 | |||
a=recvonly | a=recvonly | |||
m=video 20001 UDP/TLS/RTP/SAVPF 96 | m=video 20001 UDP/TLS/RTP/SAVPF 96 | |||
a=mid:v1 | a=mid:v1 | |||
a=recvonly ]]></sourcecode> | a=recvonly ]]></sourcecode> | |||
<t>The example in <xref target="sec.detailed-example" format="default" /> shows a more involved case of "LS" group | <t>The example in <xref target="sec.detailed-example" format="default" /> shows a more involved case of "LS" group | |||
generation.</t> | generation.</t> | |||
<t>The next step is to generate a "m=" section for each "m=" | <t>The next step is to generate an "m=" section for each "m=" | |||
section that is present in the remote offer, as specified in | section that is present in the remote offer, as specified in | |||
<xref target="RFC3264" sectionFormat="comma" section="6"/>. For the pu rposes | <xref target="RFC3264" sectionFormat="comma" section="6"/>. For the pu rposes | |||
of this discussion, any session-level attributes in the offer | of this discussion, any session-level attributes in the offer | |||
that are also valid as media-level attributes are considered | that are also valid as media-level attributes are considered | |||
to be present in each "m=" section. Each offered "m=" section | to be present in each "m=" section. Each offered "m=" section | |||
will have an associated RtpTransceiver, as described in | will have an associated RtpTransceiver, as described in | |||
<xref target="sec.applying-a-remote-desc" format="default"/>. If there are | <xref target="sec.applying-a-remote-desc" format="default"/>. If there are | |||
more RtpTransceivers than there are "m=" sections, the | more RtpTransceivers than there are "m=" sections, the | |||
unmatched RtpTransceivers will need to be associated in a | unmatched RtpTransceivers will need to be associated in a | |||
subsequent offer.</t> | subsequent offer.</t> | |||
skipping to change at line 2591 ¶ | skipping to change at line 2590 ¶ | |||
"recvonly" direction.</li> | "recvonly" direction.</li> | |||
<li>For each media format on the "m=" line, "a=rtpmap" and "a=fmtp" lines, as specified in | <li>For each media format on the "m=" line, "a=rtpmap" and "a=fmtp" lines, as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/> and | <xref target="RFC4566" sectionFormat="comma" section="6"/> and | |||
<xref target="RFC3264" sectionFormat="comma" section="6.1"/>.</li> | <xref target="RFC3264" sectionFormat="comma" section="6.1"/>.</li> | |||
<li>If "rtx" is present in the offer, for each primary codec | <li>If "rtx" is present in the offer, for each primary codec | |||
where RTP retransmission should be used, a corresponding | where RTP retransmission should be used, a corresponding | |||
"a=rtpmap" line indicating "rtx" with the clock rate of the | "a=rtpmap" line indicating "rtx" with the clock rate of the | |||
primary codec and an "a=fmtp" line that references the | primary codec and an "a=fmtp" line that references the | |||
payload type of the primary codec, as specified in | payload type of the primary codec, as specified in | |||
<xref target="RFC4588" sectionFormat="comma" section="8.1"/>.</li> | <xref target="RFC4588" sectionFormat="comma" section="8.1"/>.</li> | |||
<li>For each supported FEC mechanism, "a=rtpmap" and | <li>For each FEC mechanism supported by the application, "a=rtpmap" and | |||
"a=fmtp" lines, as specified in | "a=fmtp" lines, as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/>. The FEC | <xref target="RFC4566" sectionFormat="comma" section="6"/>. The FEC | |||
mechanisms that <bcp14>MUST</bcp14> be supported are specified in | mechanisms that <bcp14>MUST</bcp14> be supported are specified in | |||
<xref target="RFC8854" sectionFormat="comma" section="7"/>, and | <xref target="RFC8854" sectionFormat="comma" section="7"/>, and | |||
specific usage for each media type is outlined in Sections | specific usage for each media type is outlined in | |||
<xref target="sec.interface" format="counter"/> and <xref | Sections <xref target="RFC8854" section="4" | |||
target="sec.sdp-interaction-procedure" format="counter"/>.</li> | sectionFormat="bare"/> and <xref target="RFC8854" section="5" | |||
sectionFormat="bare"/> of <xref target="RFC8854"/>.</li> | ||||
<li>If this "m=" section is for media with configurable | <li>If this "m=" section is for media with configurable | |||
durations of media per packet, e.g., audio, an "a=maxptime" | durations of media per packet, e.g., audio, an "a=maxptime" | |||
line, as described in | line, as described in | |||
<xref target="sec-create-offer" format="default"/>.</li> | <xref target="sec-create-offer" format="default"/>.</li> | |||
<li>If this "m=" section is for video media and there are | <li>If this "m=" section is for video media and there are | |||
known limitations on the size of images that can be | known limitations on the size of images that can be | |||
decoded, an "a=imageattr" line, as specified in | decoded, an "a=imageattr" line, as specified in | |||
<xref target="sec.imageattr" format="default"/>.</li> | <xref target="sec.imageattr" format="default"/>.</li> | |||
<li>For each supported RTP header extension that is present | <li>For each RTP header extension supported by the application and p resent | |||
in the offer, an "a=extmap" line, as specified in | in the offer, an "a=extmap" line, as specified in | |||
<xref target="RFC5285" sectionFormat="comma" section="5"/>. The list of | <xref target="RFC5285" sectionFormat="comma" section="5"/>. The list of | |||
header extensions that <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp14> be supported is | header extensions that <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp14> be supported is | |||
specified in | specified in | |||
<xref target="RFC8834" sectionFormat="comma" section="5.2"/>. Any he ader extensions that require encryption <bcp14>MUST</bcp14> be | <xref target="RFC8834" sectionFormat="comma" section="5.2"/>. Any he ader extensions that require encryption <bcp14>MUST</bcp14> be | |||
specified as indicated in | specified as indicated in | |||
<xref target="RFC6904" sectionFormat="comma" section="4"/>.</li> | <xref target="RFC6904" sectionFormat="comma" section="4"/>.</li> | |||
<li>For each supported RTCP feedback mechanism that is | <li>For each RTCP feedback mechanism supported by the application an d | |||
present in the offer, an "a=rtcp-fb" line, as specified in | present in the offer, an "a=rtcp-fb" line, as specified in | |||
<xref target="RFC4585" sectionFormat="comma" section="4.2"/>. The li st of | <xref target="RFC4585" sectionFormat="comma" section="4.2"/>. The li st of | |||
RTCP feedback mechanisms that <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp 14> be supported is | RTCP feedback mechanisms that <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp 14> be supported is | |||
specified in | specified in | |||
<xref target="RFC8834" sectionFormat="comma" section="5.1"/>.</li> | <xref target="RFC8834" sectionFormat="comma" section="5.1"/>.</li> | |||
<li> | <li> | |||
<t>If the RtpTransceiver has a sendrecv or sendonly | <t>If the RtpTransceiver has a "sendrecv" or "sendonly" | |||
direction: | direction: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>For each MediaStream that was associated with the | <li>For each MediaStream that was associated with the | |||
transceiver when it was created via addTrack or | transceiver when it was created via addTrack or | |||
addTransceiver, an "a=msid" line, as specified in | addTransceiver, an "a=msid" line, as specified in | |||
<xref target="RFC8830" sectionFormat="comma" section="2"/>, | <xref target="RFC8830" sectionFormat="comma" section="2"/>, | |||
but omitting the "appdata" field.</li> | but omitting the "appdata" field.</li> | |||
</ul> | </ul> | |||
</li> | </li> | |||
skipping to change at line 2696 ¶ | skipping to change at line 2696 ¶ | |||
<li>"a=ice-pwd"</li> | <li>"a=ice-pwd"</li> | |||
<li>"a=fingerprint"</li> | <li>"a=fingerprint"</li> | |||
<li>"a=setup"</li> | <li>"a=setup"</li> | |||
<li>"a=tls-id"</li> | <li>"a=tls-id"</li> | |||
</ul> | </ul> | |||
<t>Note that if media "m=" sections are bundled into a data "m=" | <t>Note that if media "m=" sections are bundled into a data "m=" | |||
section, then certain TRANSPORT and IDENTICAL attributes may | section, then certain TRANSPORT and IDENTICAL attributes may | |||
also appear in the data "m=" section even if they would | also appear in the data "m=" section even if they would | |||
otherwise only be appropriate for a media "m=" section (e.g., | otherwise only be appropriate for a media "m=" section (e.g., | |||
"a=rtcp-mux").</t> | "a=rtcp-mux").</t> | |||
<t>If "a=group" attributes with semantics of "BUNDLE" are | <t>If "a=group" attributes with semantics "BUNDLE" are | |||
offered, corresponding session-level "a=group" attributes | offered, corresponding session-level "a=group" attributes | |||
<bcp14>MUST</bcp14> be added as specified in | <bcp14>MUST</bcp14> be added as specified in | |||
<xref target="RFC5888" format="default"/>. These attributes <bcp14>MUS T</bcp14> have | <xref target="RFC5888" format="default"/>. These attributes <bcp14>MUS T</bcp14> have | |||
semantics "BUNDLE" and <bcp14>MUST</bcp14> include all mid identifiers | semantics "BUNDLE" and <bcp14>MUST</bcp14> include all MID identifiers | |||
from the offered bundle groups that have not been rejected. | from the offered bundle groups that have not been rejected. | |||
Note that regardless of the presence of "a=bundle-only" in | Note that regardless of the presence of "a=bundle-only" in | |||
the offer, all "m=" sections in the answer <bcp14>MUST NOT</bcp14> hav e an | the offer, all "m=" sections in the answer <bcp14>MUST NOT</bcp14> hav e an | |||
"a=bundle-only" line.</t> | "a=bundle-only" line.</t> | |||
<t>Attributes that are common between all "m=" sections <bcp14>MAY</bc p14> be | <t>Attributes that are common between all "m=" sections <bcp14>MAY</bc p14> be | |||
moved to the session level if explicitly defined to be valid at | moved to the session level if explicitly defined to be valid at | |||
the session level.</t> | the session level.</t> | |||
<t>The attributes prohibited in the creation of offers are | <t>The attributes prohibited in the creation of offers are | |||
also prohibited in the creation of answers.</t> | also prohibited in the creation of answers.</t> | |||
</section> | </section> | |||
skipping to change at line 2796 ¶ | skipping to change at line 2796 ¶ | |||
</ul> | </ul> | |||
</section> | </section> | |||
<section anchor="sec.options-handling2" numbered="true" toc="default"> | <section anchor="sec.options-handling2" numbered="true" toc="default"> | |||
<name>Options Handling</name> | <name>Options Handling</name> | |||
<t>The createAnswer method takes as a parameter an | <t>The createAnswer method takes as a parameter an | |||
RTCAnswerOptions object. The set of parameters for | RTCAnswerOptions object. The set of parameters for | |||
RTCAnswerOptions is different than those supported in | RTCAnswerOptions is different than those supported in | |||
RTCOfferOptions; the IceRestart option is unnecessary, as ICE | RTCOfferOptions; the IceRestart option is unnecessary, as ICE | |||
credentials will automatically be changed for all "m=" sections | credentials will automatically be changed for all "m=" sections | |||
where the offerer chose to perform ICE restart.</t> | where the offerer chose to perform ICE restart.</t> | |||
<t>The following options are supported in | <t>The following option is supported in | |||
RTCAnswerOptions.</t> | RTCAnswerOptions.</t> | |||
<section anchor="sec.voiceactivitydetection2" numbered="true" toc="def ault"> | <section anchor="sec.voiceactivitydetection2" numbered="true" toc="def ault"> | |||
<name>VoiceActivityDetection</name> | <name>VoiceActivityDetection</name> | |||
<t>Silence suppression in the answer is handled as | <t>Silence suppression in the answer is handled as | |||
described in | described in | |||
<xref target="sec.voiceactivitydetection1" format="default"/>, with | <xref target="sec.voiceactivitydetection1" format="default"/>, with | |||
one exception: if support for silence suppression was not | one exception: if support for silence suppression was not | |||
indicated in the offer, the VoiceActivityDetection | indicated in the offer, the VoiceActivityDetection | |||
parameter has no effect, and the answer <bcp14>MUST</bcp14> be gener ated | parameter has no effect, and the answer <bcp14>MUST</bcp14> be gener ated | |||
as if VoiceActivityDetection was set to "false". This is done | as if VoiceActivityDetection was set to "false". This is done | |||
on a per-codec basis (e.g., if the offerer somehow offered | on a per-codec basis (e.g., if the offerer somehow offered | |||
support for CN but set "usedtx=0" for Opus, setting | support for CN but set "usedtx=0" for Opus, setting | |||
VoiceActivityDetection to "true" would result in an answer | VoiceActivityDetection to "true" would result in an answer | |||
with CN codecs and "usedtx=0"). The impact of this rule is | with "CN" codecs and "usedtx=0"). The impact of this rule is | |||
that an answerer will not try to use silence suppression | that an answerer will not try to use silence suppression | |||
with any endpoint that does not offer it, making silence | with any endpoint that does not offer it, making silence | |||
suppression support bilateral even with non-JSEP | suppression support bilateral even with non-JSEP | |||
endpoints.</t> | endpoints.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.modifying-sdp" numbered="true" toc="default"> | <section anchor="sec.modifying-sdp" numbered="true" toc="default"> | |||
<name>Modifying an Offer or Answer</name> | <name>Modifying an Offer or Answer</name> | |||
<t>The SDP returned from createOffer or createAnswer <bcp14>MUST NOT</bc p14> | <t>The SDP returned from createOffer or createAnswer <bcp14>MUST NOT</bc p14> | |||
skipping to change at line 2932 ¶ | skipping to change at line 2932 ¶ | |||
once the answerer has performed setLocalDescription with its | once the answerer has performed setLocalDescription with its | |||
answer, this cannot be rolled back.</t> | answer, this cannot be rolled back.</t> | |||
<t>The effect of rollback <bcp14>MUST</bcp14> be the same regardless of | <t>The effect of rollback <bcp14>MUST</bcp14> be the same regardless of | |||
whether setLocalDescription or setRemoteDescription is | whether setLocalDescription or setRemoteDescription is | |||
called.</t> | called.</t> | |||
<t>In order to process rollback, a JSEP implementation abandons | <t>In order to process rollback, a JSEP implementation abandons | |||
the current offer/answer transaction, sets the signaling state | the current offer/answer transaction, sets the signaling state | |||
to "stable", and sets the pending local and/or remote | to "stable", and sets the pending local and/or remote | |||
description (see Sections | description (see Sections | |||
<xref target="sec.pendinglocaldescription" format="counter"/> and | <xref target="sec.pendinglocaldescription" format="counter"/> and | |||
<xref target="sec.pendingremotedescription" format="counter"/>) to "null ". Any | <xref target="sec.pendingremotedescription" format="counter"/>) to null. Any | |||
resources or candidates that were allocated by the abandoned | resources or candidates that were allocated by the abandoned | |||
local description are discarded; any media that is received is | local description are discarded; any media that is received is | |||
processed according to the previous local and remote | processed according to the previous local and remote | |||
descriptions.</t> | descriptions.</t> | |||
<t>A rollback disassociates any RtpTransceivers that were | <t>A rollback disassociates any RtpTransceivers that were | |||
associated with "m=" sections by the application of the | associated with "m=" sections by the application of the | |||
rolled-back session description (see Sections | rolled-back session description (see Sections | |||
<xref target="sec.applying-a-remote-desc" format="counter"/> and | <xref target="sec.applying-a-remote-desc" format="counter"/> and | |||
<xref target="sec.applying-a-local-desc" format="counter"/>). | <xref target="sec.applying-a-local-desc" format="counter"/>). | |||
This means that | This means that | |||
some RtpTransceivers that were previously associated will no | some RtpTransceivers that were previously associated will no | |||
longer be associated with any "m=" section; in such cases, the | longer be associated with any "m=" section; in such cases, the | |||
value of the RtpTransceiver's mid property <bcp14>MUST</bcp14> be set to "null", | value of the RtpTransceiver's mid property <bcp14>MUST</bcp14> be set to null, | |||
and the mapping between the transceiver and its "m=" section | and the mapping between the transceiver and its "m=" section | |||
index <bcp14>MUST</bcp14> be discarded. RtpTransceivers that were create d by | index <bcp14>MUST</bcp14> be discarded. RtpTransceivers that were create d by | |||
applying a remote offer that was subsequently rolled back <bcp14>MUST</b cp14> | applying a remote offer that was subsequently rolled back <bcp14>MUST</b cp14> | |||
be stopped and removed from the PeerConnection. However, an | be stopped and removed from the PeerConnection. However, an | |||
RtpTransceiver <bcp14>MUST NOT</bcp14> be removed if a track was attache d to | RtpTransceiver <bcp14>MUST NOT</bcp14> be removed if a track was attache d to | |||
the RtpTransceiver via the addTrack method. This is so that an | the RtpTransceiver via the addTrack method. This is so that an | |||
application may call addTrack, then call setRemoteDescription | application may call addTrack, then call setRemoteDescription | |||
with an offer, then roll back that offer, then call createOffer | with an offer, then roll back that offer, then call createOffer | |||
and have an "m=" section for the added track appear in the | and have an "m=" section for the added track appear in the | |||
generated offer.</t> | generated offer.</t> | |||
skipping to change at line 3020 ¶ | skipping to change at line 3020 ¶ | |||
<xref target="RFC4566" sectionFormat="comma" section="5.8"/>, and th e bwtype and | <xref target="RFC4566" sectionFormat="comma" section="5.8"/>, and th e bwtype and | |||
bandwidth values stored.</li> | bandwidth values stored.</li> | |||
</ul> | </ul> | |||
<t>Finally, the attribute lines are processed. Specific | <t>Finally, the attribute lines are processed. Specific | |||
processing <bcp14>MUST</bcp14> be applied for the following session-le vel | processing <bcp14>MUST</bcp14> be applied for the following session-le vel | |||
attribute ("a=") lines: | attribute ("a=") lines: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>Any "a=group" lines are parsed as specified in | <li>Any "a=group" lines are parsed as specified in | |||
<xref target="RFC5888" sectionFormat="comma" section="5"/>, and the group's | <xref target="RFC5888" sectionFormat="comma" section="5"/>, and the group's | |||
semantics and mids are stored.</li> | semantics and MID values are stored.</li> | |||
<li>If present, a single "a=ice-lite" line is parsed as | <li>If present, a single "a=ice-lite" line is parsed as | |||
specified in | specified in | |||
<xref target="RFC8839" sectionFormat="comma" section="5.3"/>, and a value | <xref target="RFC8839" sectionFormat="comma" section="5.3"/>, and a value | |||
indicating the presence of ice-lite is stored.</li> | indicating the presence of an "a=ice-lite" line is stored.</li> | |||
<li>If present, a single "a=ice-ufrag" line is parsed as | <li>If present, a single "a=ice-ufrag" line is parsed as | |||
specified in | specified in | |||
<xref target="RFC8839" sectionFormat="comma" section="5.4"/>, and th e ufrag value is stored.</li> | <xref target="RFC8839" sectionFormat="comma" section="5.4"/>, and th e ufrag value is stored.</li> | |||
<li>If present, a single "a=ice-pwd" line is parsed as | <li>If present, a single "a=ice-pwd" line is parsed as | |||
specified in | specified in | |||
<xref target="RFC8839" sectionFormat="comma" section="5.4"/>, and th e password value is stored.</li> | <xref target="RFC8839" sectionFormat="comma" section="5.4"/>, and th e password value is stored.</li> | |||
<li>If present, a single "a=ice-options" line is parsed as | <li>If present, a single "a=ice-options" line is parsed as | |||
specified in | specified in | |||
<xref target="RFC8839" sectionFormat="comma" section="5.6"/>, and th e set of specified options is stored.</li> | <xref target="RFC8839" sectionFormat="comma" section="5.6"/>, and th e set of specified options is stored.</li> | |||
<li>Any "a=fingerprint" lines are parsed as specified in | <li>Any "a=fingerprint" lines are parsed as specified in | |||
skipping to change at line 3426 ¶ | skipping to change at line 3426 ¶ | |||
<li>If an "a=end-of-candidates" attribute is present, process | <li>If an "a=end-of-candidates" attribute is present, process | |||
the end-of-candidates indication as described in | the end-of-candidates indication as described in | |||
<xref target="RFC8838" sectionFormat="comma" section="14"/>.</li> | <xref target="RFC8838" sectionFormat="comma" section="14"/>.</li> | |||
<li> | <li> | |||
<t>If the "m=" section <proto> value indicates use of RTP: | <t>If the "m=" section <proto> value indicates use of RTP: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>If the "m=" section is being recycled (see | <li>If the "m=" section is being recycled (see | |||
<xref target="sec.subsequent-offers" format="default"/>), disassoci ate | <xref target="sec.subsequent-offers" format="default"/>), disassoci ate | |||
the currently associated RtpTransceiver by setting its mid | the currently associated RtpTransceiver by setting its mid | |||
property to "null", and discard the mapping between the | property to null, and discard the mapping between the | |||
transceiver and its "m=" section index.</li> | transceiver and its "m=" section index.</li> | |||
<li> | <li> | |||
<t>If the "m=" section is not associated with any | <t>If the "m=" section is not associated with any | |||
RtpTransceiver (possibly because it was disassociated in the | RtpTransceiver (possibly because it was disassociated in the | |||
previous step), either find an RtpTransceiver or create one | previous step), either find an RtpTransceiver or create one | |||
according to the following steps: | according to the following steps: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>If the "m=" section is sendrecv or recvonly, and there | <li>If the "m=" section is "sendrecv" or "recvonly", and ther e | |||
are RtpTransceivers of the same type that were added to | are RtpTransceivers of the same type that were added to | |||
the PeerConnection by addTrack and are not associated | the PeerConnection by addTrack and are not associated | |||
with any "m=" section and are not stopped, find the first | with any "m=" section and are not stopped, find the first | |||
(according to the canonical order described in | (according to the canonical order described in | |||
<xref target="sec.initial-offers" format="default"/>) such | <xref target="sec.initial-offers" format="default"/>) such | |||
RtpTransceiver.</li> | RtpTransceiver.</li> | |||
<li>If no RtpTransceiver was found in the previous step, | <li>If no RtpTransceiver was found in the previous step, | |||
create one with a recvonly direction.</li> | create one with a "recvonly" direction.</li> | |||
<li>Associate the found or created RtpTransceiver with the | <li>Associate the found or created RtpTransceiver with the | |||
"m=" section by setting the value of the RtpTransceiver's | "m=" section by setting the value of the RtpTransceiver's | |||
mid property to the MID of the "m=" section, and establish | mid property to the MID of the "m=" section, and establish | |||
a mapping between the transceiver and the index of the "m=" | a mapping between the transceiver and the index of the "m=" | |||
section. If the "m=" section does not include a MID (i.e., | section. If the "m=" section does not include a MID (i.e., | |||
the remote endpoint does not support the MID extension), | the remote endpoint does not support the MID extension), | |||
generate a value for the RtpTransceiver mid property, | generate a value for the RtpTransceiver mid property, | |||
following the guidance for "a=mid" mentioned in | following the guidance for "a=mid" mentioned in | |||
<xref target="sec.initial-offers" format="default"/>.</li> | <xref target="sec.initial-offers" format="default"/>.</li> | |||
</ul> | </ul> | |||
</li> | </li> | |||
<li>For each specified media format that is also supported | <li>For each specified media format that is also supported | |||
by the local implementation, establish a mapping between | by the local application, establish a mapping between | |||
the specified payload type and the media format, as | the specified payload type and the media format, as | |||
described in | described in | |||
<xref target="RFC3264" sectionFormat="comma" section="6.1"/>. Speci fically, this | <xref target="RFC3264" sectionFormat="comma" section="6.1"/>. Speci fically, this | |||
means that the implementation records the payload type to | means that the implementation records the payload type to | |||
be used in outgoing RTP packets when sending each specified | be used in outgoing RTP packets when sending each specified | |||
media format, as well as the relative preference for each | media format, as well as the relative preference for each | |||
format that is indicated in their ordering. If any | format that is indicated in their ordering. If any | |||
indicated media format is not supported by the local | indicated media format is not supported by the local | |||
implementation, it <bcp14>MUST</bcp14> be ignored.</li> | application, it <bcp14>MUST</bcp14> be ignored.</li> | |||
<li>For each specified "rtx" media format, establish a | <li>For each specified "rtx" media format, establish a | |||
mapping between the RTX payload type and its associated | mapping between the RTX payload type and its associated | |||
primary payload type, as described in | primary payload type, as described in | |||
<xref target="RFC4588" sectionFormat="comma" section="4"/>. If any referenced | <xref target="RFC4588" sectionFormat="comma" section="4"/>. If any referenced | |||
primary payload types are not present, this <bcp14>MUST</bcp14> res ult in | primary payload types are not present, this <bcp14>MUST</bcp14> res ult in | |||
an error. Note that RTX payload types may refer to primary | an error. Note that RTX payload types may refer to primary | |||
payload types that are not supported by the local media | payload types that are not supported by the local media | |||
implementation, in which case the RTX payload type <bcp14>MUST</bcp 14> | implementation, in which case the RTX payload type <bcp14>MUST</bcp 14> | |||
also be ignored.</li> | also be ignored.</li> | |||
<li>For each specified fmtp parameter that is supported by | <li>For each specified fmtp parameter that is supported by | |||
the local implementation, enable them on the associated | the local application, enable them on the associated | |||
media formats.</li> | media formats.</li> | |||
<li>For each specified Synchronization Source (SSRC) that is sign aled in the "m=" | <li>For each specified Synchronization Source (SSRC) that is sign aled in the "m=" | |||
section, prepare to demux RTP streams intended for this "m=" | section, prepare to demux RTP streams intended for this "m=" | |||
section using that SSRC, as described in | section using that SSRC, as described in | |||
<xref target="RFC9143" sectionFormat="comma" section="9.2"/>.</li> | <xref target="RFC9143" sectionFormat="comma" section="9.2"/>.</li> | |||
<li>For each specified RTP header extension that is also | <li>For each specified RTP header extension that is also | |||
supported by the local implementation, establish a mapping | supported by the local application, establish a mapping | |||
between the extension ID and URI, as described in | between the extension ID and URI, as described in | |||
<xref target="RFC5285" sectionFormat="comma" section="5"/>. Specifi cally, this | <xref target="RFC5285" sectionFormat="comma" section="5"/>. Specifi cally, this | |||
means that the implementation records the extension ID to | means that the implementation records the extension ID to | |||
be used in outgoing RTP packets when sending each specified | be used in outgoing RTP packets when sending each specified | |||
header extension. If any indicated RTP header extension is | header extension. If any indicated RTP header extension is | |||
not supported by the local implementation, it <bcp14>MUST</bcp14> b e | not supported by the local application, it <bcp14>MUST</bcp14> be | |||
ignored.</li> | ignored.</li> | |||
<li>For each specified RTCP feedback mechanism that is | <li>For each specified RTCP feedback mechanism that is also | |||
supported by the local implementation, enable them on the | supported by the local application, enable them on the | |||
associated media formats.</li> | associated media formats.</li> | |||
<li> | <li> | |||
<t>For any specified "TIAS" ("Transport | <t>For any specified "TIAS" ("Transport | |||
Independent Application Specific Maximum") bandwidth value, set this value | Independent Application Specific (maximum)") bandwidth value, set this valu e | |||
as a constraint on the maximum RTP bitrate to be used when | as a constraint on the maximum RTP bitrate to be used when | |||
sending media, as specified in | sending media, as specified in | |||
<xref target="RFC3890" format="default"/>. If a "TIAS" value is not | <xref target="RFC3890" format="default"/>. If a "TIAS" value is not | |||
present but an "AS" value is specified, generate a "TIAS" | present but an "AS" value is specified, generate a "TIAS" | |||
value using this formula: | value using this formula: | |||
</t> | </t> | |||
<ul empty="true"> | <t indent="3"> | |||
<li>TIAS = AS * 1000 * 0.95 - (50 * 40 * 8)</li> | TIAS = AS * 1000 * 0.95 - (50 * 40 * 8) | |||
</ul> | </t> | |||
<t> | <t> | |||
The 1000 changes the unit from kbps to bps (as required | The 1000 changes the unit from kbps to bps (as required | |||
by TIAS), and the 0.95 is to allocate 5% to RTCP. | by TIAS), and the 0.95 is to allocate 5% to RTCP. | |||
An estimate of header overhead is then subtracted out, in which | An estimate of header overhead is then subtracted out, in which | |||
the 50 is based on 50 packets per second, the 40 is based on | the 50 is based on 50 packets per second, the 40 is based on | |||
typical header size (in bytes), and the 8 converts bytes to bits. | typical header size (in bytes), and the 8 converts bytes to bits. | |||
Note that "TIAS" is preferred over | Note that "TIAS" is preferred over | |||
"AS" because it provides more accurate | "AS" because it provides more accurate | |||
control of bandwidth.</t> | control of bandwidth.</t> | |||
</li> | </li> | |||
skipping to change at line 3567 ¶ | skipping to change at line 3567 ¶ | |||
local or remote description, the following steps are performed | local or remote description, the following steps are performed | |||
when processing a description of type "pranswer" or | when processing a description of type "pranswer" or | |||
"answer".</t> | "answer".</t> | |||
<t>For each "m=" section, the following steps <bcp14>MUST</bcp14> be pe rformed: | <t>For each "m=" section, the following steps <bcp14>MUST</bcp14> be pe rformed: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>If the "m=" section has been rejected (i.e., the <port> val ue is set to | <li>If the "m=" section has been rejected (i.e., the <port> val ue is set to | |||
zero in the answer), stop any reception or transmission of | zero in the answer), stop any reception or transmission of | |||
media for this section, and, unless a non-rejected "m=" section | media for this section, and, unless a non-rejected "m=" section | |||
is bundled with this "m=" section, discard any associated ICE | is bundled with this "m=" section, discard any associated ICE | |||
components, as described in | components, as described in the second bullet item in | |||
<xref target="RFC8839" sectionFormat="comma" section="4.4.3.1"/>.</li > | <xref target="RFC8839" sectionFormat="comma" section="4.4.3.1"/>.</li > | |||
<li>If the remote DTLS fingerprint has been changed or the | <li>If the remote DTLS fingerprint has been changed or the | |||
value of the "a=tls-id" attribute has changed, tear down the DTLS co nnection. This | value of the "a=tls-id" attribute has changed, tear down the DTLS co nnection. This | |||
includes the case when the PeerConnection state is | includes the case when the PeerConnection state is | |||
"have-remote-pranswer". If a DTLS connection needs to be torn | "have-remote-pranswer". If a DTLS connection needs to be torn | |||
down but the answer does not indicate an ICE restart or, in | down but the answer does not indicate an ICE restart or, in | |||
the case of "have-remote-pranswer", new ICE credentials, an | the case of "have-remote-pranswer", new ICE credentials, an | |||
error <bcp14>MUST</bcp14> be generated. If an ICE restart is perform ed | error <bcp14>MUST</bcp14> be generated. If an ICE restart is perform ed | |||
without a change in the tls-id value or fingerprint, then the same D TLS | without a change in the tls-id value or fingerprint, then the same D TLS | |||
connection is continued over the new ICE channel. Note that | connection is continued over the new ICE channel. Note that | |||
skipping to change at line 3724 ¶ | skipping to change at line 3724 ¶ | |||
"m=" section is defined in | "m=" section is defined in | |||
<xref target="RFC9143" sectionFormat="comma" section="9.2"/>. When not b undling, the proper "m=" section is clear from the | <xref target="RFC9143" sectionFormat="comma" section="9.2"/>. When not b undling, the proper "m=" section is clear from the | |||
ICE component over which the RTP/RTCP is received.</t> | ICE component over which the RTP/RTCP is received.</t> | |||
<t>Once the proper "m=" section or sections are known, RTP/RTCP is deliv ered | <t>Once the proper "m=" section or sections are known, RTP/RTCP is deliv ered | |||
to the RtpTransceiver(s) associated with the "m=" section(s) and | to the RtpTransceiver(s) associated with the "m=" section(s) and | |||
further processing of the RTP/RTCP is done at the RtpTransceiver | further processing of the RTP/RTCP is done at the RtpTransceiver | |||
level. This includes using the RID mechanism | level. This includes using the RID mechanism | |||
<xref target="RFC8851" format="default"/> and its associated RtpStreamId and | <xref target="RFC8851" format="default"/> and its associated RtpStreamId and | |||
RepairedRtpStreamId identifiers to distinguish between | RepairedRtpStreamId identifiers to distinguish between | |||
multiple encoded streams and determine which Source RTP | multiple encoded streams and determine which Source RTP | |||
stream should be repaired by a given redundancy RTP stream.</t> | Stream should be repaired by a given redundancy RTP stream.</t> | |||
</section> | </section> | |||
<section anchor="sec.examples" numbered="true" toc="default"> | <section anchor="sec.examples" numbered="true" toc="default"> | |||
<name>Examples</name> | <name>Examples</name> | |||
<t>Note that this example section shows several SDP fragments. To | <t>Note that this example section shows several SDP fragments. To | |||
accommodate RFC line-length restrictions, some of the SDP lines have bee n split | accommodate RFC line-length restrictions, some of the SDP lines have bee n split | |||
into multiple lines, where leading whitespace indicates that a | into multiple lines, where leading whitespace indicates that a | |||
line is a continuation of the previous line. In addition, some | line is a continuation of the previous line. In addition, some | |||
blank lines have been added to improve readability but are not | blank lines have been added to improve readability but are not | |||
valid in SDP.</t> | valid in SDP.</t> | |||
<t>More examples of SDP for WebRTC call flows, including examples | <t>More examples of SDP for WebRTC call flows, including examples | |||
with IPv6 addresses, can be found in | with IPv6 addresses, can be found in | |||
<xref target="I-D.ietf-rtcweb-sdp" format="default"/>.</t> | <xref target="SDP4WebRTC" format="default"/>.</t> | |||
<section anchor="sec.simple-examples" numbered="true" toc="default"> | <section anchor="sec.simple-examples" numbered="true" toc="default"> | |||
<name>Simple Example</name> | <name>Simple Example</name> | |||
<t>This section shows a very simple example that sets up a | <t>This section shows a very simple example that sets up a | |||
minimal audio/video call between two JSEP endpoints without | minimal audio/video call between two JSEP endpoints without | |||
using Trickle ICE. The example in the following section | using Trickle ICE. The example in the following section | |||
provides a more detailed example of what could happen in a JSEP | provides a more detailed example of what could happen in a JSEP | |||
session.</t> | session.</t> | |||
<t>The code flow below shows Alice's endpoint initiating the | <t>The code flow below shows Alice's endpoint initiating the | |||
session to Bob's endpoint. The messages from the JavaScript | session to Bob's endpoint. The messages from the JavaScript | |||
application in Alice's browser to the JavaScript in Bob's | application in Alice's browser to the JavaScript in Bob's | |||
skipping to change at line 3936 ¶ | skipping to change at line 3936 ¶ | |||
<name>Detailed Example</name> | <name>Detailed Example</name> | |||
<t>This section shows a more involved example of a session | <t>This section shows a more involved example of a session | |||
between two JSEP endpoints. Trickle ICE is used in full trickle | between two JSEP endpoints. Trickle ICE is used in full trickle | |||
mode, with a bundle policy of "must-bundle", an RTCP mux policy | mode, with a bundle policy of "must-bundle", an RTCP mux policy | |||
of "require", and a single TURN server. Initially, both Alice | of "require", and a single TURN server. Initially, both Alice | |||
and Bob establish an audio channel and a data channel. Later, | and Bob establish an audio channel and a data channel. Later, | |||
Bob adds two video flows -- one for his video feed and one for | Bob adds two video flows -- one for his video feed and one for | |||
screen sharing, both supporting FEC -- with the video feed | screen sharing, both supporting FEC -- with the video feed | |||
configured for simulcast. Alice accepts these video flows but | configured for simulcast. Alice accepts these video flows but | |||
does not add video flows of her own, so they are handled as | does not add video flows of her own, so they are handled as | |||
recvonly. Alice also specifies a maximum video decoder | "recvonly". Alice also specifies a maximum video decoder | |||
resolution.</t> | resolution.</t> | |||
<artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | <artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | |||
// set up local media state | // set up local media state | |||
AliceJS->AliceUA: create new PeerConnection | AliceJS->AliceUA: create new PeerConnection | |||
AliceJS->AliceUA: addTrack with an audio track | AliceJS->AliceUA: addTrack with an audio track | |||
AliceJS->AliceUA: createDataChannel to get data channel | AliceJS->AliceUA: createDataChannel to get data channel | |||
AliceJS->AliceUA: createOffer to get |offer-B1| | AliceJS->AliceUA: createOffer to get |offer-B1| | |||
AliceJS->AliceUA: setLocalDescription with |offer-B1| | AliceJS->AliceUA: setLocalDescription with |offer-B1| | |||
skipping to change at line 4164 ¶ | skipping to change at line 4164 ¶ | |||
ufrag 7sFv | ufrag 7sFv | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 255 192.0.2.200 12200 typ relay | attr candidate:1 1 udp 255 192.0.2.200 12200 typ relay | |||
raddr 198.51.100.200 rport 11200 ]]></sourcecode> | raddr 198.51.100.200 rport 11200 ]]></sourcecode> | |||
<t>The SDP for |offer-B2| is shown below. In addition to the | <t>The SDP for |offer-B2| is shown below. In addition to the | |||
new "m=" sections for video, both of which are offering FEC and | new "m=" sections for video, both of which are offering FEC and | |||
one of which is offering simulcast, note the increment of the | one of which is offering simulcast, note the increment of the | |||
version number in the "o=" line; changes to the "c=" line, | version number in the "o=" line; changes to the "c=" line, | |||
indicating the local candidate that was selected; and the | indicating the local candidate that was selected; and the | |||
inclusion of gathered candidates as a=candidate lines.</t> | inclusion of gathered candidates as "a=candidate" lines.</t> | |||
<sourcecode name="offer-B2" type="sdp"><![CDATA[ | <sourcecode name="offer-B2" type="sdp"><![CDATA[ | |||
v=0 | v=0 | |||
o=- 7729291447651054566 2 IN IP4 0.0.0.0 | o=- 7729291447651054566 2 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 d1 v1 v2 | a=group:BUNDLE a1 d1 v1 v2 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 12200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 12200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
skipping to change at line 4254 ¶ | skipping to change at line 4254 ¶ | |||
a=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=rtpmap:104 flexfec/90000 | a=rtpmap:104 flexfec/90000 | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
a=msid:81317484-2ed4-49d7-9eb7-1414322a7aae ]]></sourcecode> | a=msid:81317484-2ed4-49d7-9eb7-1414322a7aae ]]></sourcecode> | |||
<t>The SDP for |answer-B2| is shown below. In addition to the | <t>The SDP for |answer-B2| is shown below. In addition to the | |||
acceptance of the video "m=" sections, the use of a=recvonly to | acceptance of the video "m=" sections, the use of "a=recvonly" to | |||
indicate one-way video, and the use of a=imageattr to limit the | indicate one-way video, and the use of "a=imageattr" to limit the | |||
received resolution, note the use of setup:passive to maintain | received resolution, note the use of "a=setup:passive" to maintain | |||
the existing DTLS roles.</t> | the existing DTLS roles.</t> | |||
<sourcecode name="answer-B2" type="sdp"><![CDATA[ | <sourcecode name="answer-B2" type="sdp"><![CDATA[ | |||
v=0 | v=0 | |||
o=- 4962303333179871723 2 IN IP4 0.0.0.0 | o=- 4962303333179871723 2 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 d1 v1 v2 | a=group:BUNDLE a1 d1 v1 v2 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
skipping to change at line 4348 ¶ | skipping to change at line 4348 ¶ | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli ]]></sourcecode> | a=rtcp-fb:100 nack pli ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="sec.warmup-example" numbered="true" toc="default"> | <section anchor="sec.warmup-example" numbered="true" toc="default"> | |||
<name>Early Transport Warmup Example</name> | <name>Early Transport Warmup Example</name> | |||
<t>This example demonstrates the early-warmup technique | <t>This example demonstrates the early-warmup technique | |||
described in | described in | |||
<xref target="sec.use-of-provisional-answer" format="default"/>. Here, Alice's | <xref target="sec.use-of-provisional-answer" format="default"/>. Here, Alice's | |||
endpoint sends an offer to Bob's endpoint to start an | endpoint sends an offer to Bob's endpoint to start an | |||
audio/video call. Bob immediately responds with an answer that | audio/video call. Bob immediately responds with an answer that | |||
accepts the audio/video "m=" sections but marks them as sendonly | accepts the audio/video "m=" sections but marks them as "sendonly" | |||
(from his perspective), meaning that Alice will not yet send | (from his perspective), meaning that Alice will not yet send | |||
media. This allows the JSEP implementation to start negotiating | media. This allows the JSEP implementation to start negotiating | |||
ICE and DTLS immediately. Bob's endpoint then prompts him to | ICE and DTLS immediately. Bob's endpoint then prompts him to | |||
answer the call, and when he does, his endpoint sends a second | answer the call, and when he does, his endpoint sends a second | |||
offer, which enables the audio and video "m=" sections, and | offer, which enables the audio and video "m=" sections, and | |||
thereby bidirectional media transmission. The advantage of such | thereby bidirectional media transmission. The advantage of such | |||
a flow is that as soon as the first answer is received, the | a flow is that as soon as the first answer is received, the | |||
implementation can proceed with ICE and DTLS negotiation and | implementation can proceed with ICE and DTLS negotiation and | |||
establish the session transport. If the transport setup | establish the session transport. If the transport setup | |||
completes before the second offer is sent, then media can be | completes before the second offer is sent, then media can be | |||
skipping to change at line 4702 ¶ | skipping to change at line 4702 ¶ | |||
derived from createOffer or createAnswer, there is no | derived from createOffer or createAnswer, there is no | |||
guarantee that applications do so. The JSEP implementation <bcp14>MUST</ bcp14> | guarantee that applications do so. The JSEP implementation <bcp14>MUST</ bcp14> | |||
be prepared for the JavaScript to pass in bogus data instead.</t> | be prepared for the JavaScript to pass in bogus data instead.</t> | |||
<t>Conversely, the application programmer needs to be aware that | <t>Conversely, the application programmer needs to be aware that | |||
the JavaScript does not have complete control of endpoint | the JavaScript does not have complete control of endpoint | |||
behavior. One case that bears particular mention is that editing | behavior. One case that bears particular mention is that editing | |||
ICE candidates out of the SDP or suppressing trickled candidates | ICE candidates out of the SDP or suppressing trickled candidates | |||
does not have the expected behavior: implementations will still | does not have the expected behavior: implementations will still | |||
perform checks from those candidates even if they are not sent to | perform checks from those candidates even if they are not sent to | |||
the other side. Thus, for instance, it is not possible to prevent | the other side. Thus, for instance, it is not possible to prevent | |||
the remote peer from learning your public IP address by removing | the remote peer from learning an application's public IP address by remo ving | |||
server-reflexive candidates. Applications that wish to conceal | server-reflexive candidates. Applications that wish to conceal | |||
their public IP address <bcp14>MUST</bcp14> instead configure the ICE ag ent to | their public IP address <bcp14>MUST</bcp14> instead configure the ICE ag ent to | |||
use only relay candidates.</t> | use only relay candidates.</t> | |||
</section> | </section> | |||
<section anchor="sec.iana-considerations" numbered="true" toc="default"> | <section anchor="sec.iana-considerations" numbered="true" toc="default"> | |||
<name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
<t>This document has no IANA actions.</t> | <t>This document has no IANA actions.</t> | |||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<displayreference target="I-D.ietf-rtcweb-sdp" to="SDP4WebRTC"/> | ||||
<references> | <references> | |||
<name>References</name> | <name>References</name> | |||
<references> | <references> | |||
<name>Normative References</name> | <name>Normative References</name> | |||
<reference anchor="RFC8840" target="https://www.rfc-editor.org/info/rf | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8840.xml" | |||
c8840"> | /> | |||
<front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8852.xml" | |||
<title>A Session Initiation Protocol (SIP) Usage for Incremental | /> | |||
Provisioning of Candidates for the Interactive Connectivity | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8838.xml" | |||
Establishment (Trickle ICE)</title> | /> | |||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8842.xml" | ||||
<author initials="E" surname="Ivov" fullname="Emil Ivov"> | /> | |||
<organization/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8839.xml" | |||
</author> | /> | |||
<author initials="T" surname="Stach" fullname="Thomas Stach"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8830.xml" | |||
<organization/> | /> | |||
</author> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8858.xml" | |||
<author initials="E" surname="Marocco" fullname="Enrico Marocco"> | /> | |||
<organization/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8851.xml" | |||
</author> | /> | |||
<author initials="C" surname="Holmberg" fullname="Christer Holmber | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8841.xml" | |||
g"> | /> | |||
<organization/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8859.xml" | |||
</author> | /> | |||
<date month="January" year="2021"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8853.xml" | |||
</front> | /> | |||
<seriesInfo name="RFC" value="8840"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8854.xml" | |||
<seriesInfo name="DOI" value="10.17487/RFC8840"/> | /> | |||
</reference> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8834.xml" | |||
/> | ||||
<reference anchor="RFC8852" target="https://www.rfc-editor.org/info/rfc8852"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8826.xml" | |||
<front> | /> | |||
<title>RTP Stream Identifier Source Description (SDES)</title> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8827.xml" | |||
<author initials="A.B." surname="Roach" fullname="Adam Roach"/> | /> | |||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar"/> | ||||
<author initials="P" surname="Thatcher" fullname="Peter Thatcher"/> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8852"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8852"/> | ||||
</reference> | ||||
<reference anchor="RFC8838" target="https://www.rfc-editor.org/info/rfc8838"> | ||||
<front> | ||||
<title>Trickle ICE: Incremental Provisioning of Candidates for the | ||||
Interactive Connectivity Establishment (ICE) Protocol</title> | ||||
<author initials="E" surname="Ivov" fullname="Emil Ivov"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="J" surname="Uberti" fullname="Justin Uberti"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="P" surname="Saint-Andre" fullname="Peter Saint-Andre"> | ||||
<organization /> | ||||
</author> | ||||
<date month="January" year="2021" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8838" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8838"/> | ||||
</reference> | ||||
<reference anchor="RFC8842" target="https://www.rfc-editor.org/info/rfc8842"> | ||||
<front> | ||||
<title>Session Description Protocol (SDP) Offer/Answer Considerations for | ||||
Datagram Transport Layer Security (DTLS) and Transport Layer Security (TLS)</tit | ||||
le> | ||||
<author initials="C." surname="Holmberg" fullname="Christer Holmberg"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="R." surname="Shpount" fullname="Roman Shpount"> | ||||
<organization /> | ||||
</author> | ||||
<date month="January" year="2021" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8842" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8842"/> | ||||
</reference> | ||||
<reference anchor='RFC8839' target="https://www.rfc-editor.org/info/rfc8839"> | ||||
<front> | ||||
<title>Session Description Protocol (SDP) Offer/Answer Procedures for Interactiv | ||||
e Connectivity Establishment (ICE)</title> | ||||
<author initials='M' surname='Petit-Huguenin' fullname='Marc Petit-Huguenin'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='S' surname='Nandakumar' fullname='Suhas Nandakumar'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='C' surname='Holmberg' fullname='Christer Holmberg'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='A' surname='Keränen' fullname='Ari Keränen'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='R' surname='Shpount' fullname='Roman Shpount'> | ||||
<organization /> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8839"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8839"/> | ||||
</reference> | ||||
<reference anchor="RFC8830" target="https://www.rfc-editor.org/info/rfc8830"> | ||||
<front> | ||||
<title>WebRTC MediaStream Identification in the Session Description Protocol | ||||
</title> | ||||
<author initials="H" surname="Alvestrand" fullname="Harald Alvestrand"> | ||||
<organization /> | ||||
</author> | ||||
<date month="January" year="2021" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8830" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8830"/> | ||||
</reference> | ||||
<reference anchor='RFC8858' target="https://www.rfc-editor.org/info/rfc8858"> | ||||
<front> | ||||
<title>Indicating Exclusive Support of RTP and RTP Control Protocol (RTCP) | ||||
Multiplexing Using the Session Description Protocol (SDP)</title> | ||||
<author initials='C.' surname='Holmberg' fullname='Christer Holmberg'> | ||||
<organization /> | ||||
</author> | ||||
<date month="January" year='2021' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8858' /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8858"/> | ||||
</reference> | ||||
<reference anchor="RFC8851" target="https://www.rfc-editor.org/info/rfc8851"> | ||||
<front> | ||||
<title>RTP Payload Format Restrictions</title> | ||||
<author initials="A.B." surname="Roach" fullname="Adam Roach" role="editor"> | ||||
<organization/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8851"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8851"/> | ||||
</reference> | ||||
<reference anchor="RFC8841" target="https://www.rfc-editor.org/info/rfc8841"> | ||||
<front> | ||||
<title>Session Description Protocol (SDP) Offer/Answer Procedures for | ||||
Stream Control Transmission Protocol (SCTP) over Datagram Transport Layer | ||||
Security (DTLS) Transport</title> | ||||
<author initials="C." surname="Holmberg" fullname="Christer Holmberg"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="R." surname="Shpount" fullname="Roman Shpount"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="S." surname="Loreto" fullname="Salvatore Loreto"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="G." surname="Camarillo" fullname="Gonzalo Camarillo"> | ||||
<organization /> | ||||
</author> | ||||
<date month="January" year="2021" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8841" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8841"/> | ||||
</reference> | ||||
<reference anchor="RFC8859" target="https://www.rfc-editor.org/info/rfc8859"> | ||||
<front> | ||||
<title>A Framework for Session Description Protocol (SDP) | ||||
Attributes When Multiplexing</title> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar"> | ||||
<organization/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8859"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8859"/> | ||||
</reference> | ||||
<reference anchor="RFC8853" target="https://www.rfc-editor.org/info/rfc8853"> | ||||
<front> | ||||
<title>Using Simulcast in Session Description Protocol (SDP) and RTP | ||||
Sessions</title> | ||||
<author initials="B" surname="Burman" fullname="Bo Burman"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="M" surname="Westerlund" fullname="Magnus Westerlund"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="M" surname="Zanaty" fullname="Mo Zanaty"> | ||||
<organization/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8853"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8853"/> | ||||
</reference> | ||||
<reference anchor="RFC8854" target="https://www.rfc-editor.org/info/rfc8854"> | ||||
<front> | ||||
<title>WebRTC Forward Error Correction Requirements</title> | ||||
<author initials="J." surname="Uberti" fullname="Justin Uberti"> | ||||
<organization/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8854"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8854"/> | ||||
</reference> | ||||
<reference anchor="RFC8834" target="https://www.rfc-editor.org/info/rfc8834"> | ||||
<front> | ||||
<title>Media Transport and Use of RTP in WebRTC</title> | ||||
<author initials="C." surname="Perkins" fullname="Colin Perkins"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="M." surname="Westerlund" fullname="Magnus Westerlund"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="J." surname="Ott" fullname="Jörg Ott"> | ||||
<organization /> | ||||
</author> | ||||
<date month="January" year="2021" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8834" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8834"/> | ||||
</reference> | ||||
<reference anchor="RFC8826" target="https://www.rfc-editor.org/info/rfc8826"> | ||||
<front> | ||||
<title>Security Considerations for WebRTC</title> | ||||
<author initials='E.' surname='Rescorla' fullname='Eric Rescorla'> | ||||
<organization/> | ||||
</author> | ||||
<date month='January' year='2021'/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8826"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8826"/> | ||||
</reference> | ||||
<reference anchor="RFC8827" target="https://www.rfc-editor.org/info/rfc8827"> | ||||
<front> | ||||
<title>WebRTC Security Architecture</title> | ||||
<author initials='E.' surname='Rescorla' fullname='Eric Rescorla'> | ||||
<organization/> | ||||
</author> | ||||
<date month='January' year='2021'/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8827"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8827"/> | ||||
</reference> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3261. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3261.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3264. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3264.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3552. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3552.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3605. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3605.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3890. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3890.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4145. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4145.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4566. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4566.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4585. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4585.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5124. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5124.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5285. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5285.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5761. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5761.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5888. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5888.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6236. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6236.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6347. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6347.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6716. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6716.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6904. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6904.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7160. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7160.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7587. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7587.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7742. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7742.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7850. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7850.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7874. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7874.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8108. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8108.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8122. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8122.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8445. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8445.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3711. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3711.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8829. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8829.xml" | |||
xml"/> | /> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9143. | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9143.xml" | |||
xml"/> | /> | |||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9147.xml" | ||||
/> | ||||
</references> | </references> | |||
<references> | <references> | |||
<name>Informative References</name> | <name>Informative References</name> | |||
<reference anchor="RFC8828" target="https://www.rfc-editor.org/info/rfc8828"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8828.xml" | |||
/> | ||||
<!-- draft-ietf-rtcweb-sdp (Expired (IESG: Dead)) ("long way" to fix author | ||||
initials) --> | ||||
<reference anchor="SDP4WebRTC"> | ||||
<front> | <front> | |||
<title>WebRTC IP Address Handling Requirements</title> | <title>Annotated Example SDP for WebRTC</title> | |||
<author initials="J" surname="Uberti" fullname="Justin Uberti"> | <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar"> | |||
<organization /> | <organization>Cisco</organization> | |||
</author> | </author> | |||
<author initials="G" surname="Shieh" fullname="Guo-wei Shieh"> | <author fullname="Cullen Jennings" initials="C. F." surname="Jennings"> | |||
<organization /> | <organization>Cisco</organization> | |||
</author> | </author> | |||
<date day="17" month="December" year="2020"/> | ||||
<date month="January" year="2021" /> | ||||
</front> | </front> | |||
<seriesInfo name="RFC" value="8828" /> | <seriesInfo name="Internet-Draft" value="draft-ietf-rtcweb-sdp-14"/> | |||
<seriesInfo name="DOI" value="10.17487/RFC8828"/> | ||||
</reference> | </reference> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3389.xml" | |||
-rtcweb-sdp.xml"/> | /> | |||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4568.xml" | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3389. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4588.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4568. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4733.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4588. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5245.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4733. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5506.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5245. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5576.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5506. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5763.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5576. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5764.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5763. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6120.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5764. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6464.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6120. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3556.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6464. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3960.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3556. | /> | |||
xml"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8843.xml" | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3960. | /> | |||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8843. | ||||
xml"/> | ||||
<reference anchor="W3C.webrtc" | <reference anchor="W3C.webrtc" | |||
target="https://www.w3.org/TR/2021/REC-webrtc-20210126/"> | target="https://www.w3.org/TR/2023/REC-webrtc-20230306/"> | |||
<front> | <front> | |||
<title>WebRTC 1.0: Real-time Communication Between Browsers</title> | <title>WebRTC: Real-time Communication Between Browsers</title> | |||
<author fullname="Cullen Jennings" initials="C." | <author fullname="Cullen Jennings" initials="C." | |||
surname="Jennings" role="editor"> | surname="Jennings" role="editor"> | |||
<organization>Cisco</organization> | <organization>Cisco</organization> | |||
</author> | </author> | |||
<author fullname="Florent Castelli" initials="F." surname="Castelli" | ||||
role="editor"> | ||||
<organization>Google</organization> | ||||
</author> | ||||
<author | <author | |||
fullname="Henrik Boström" | fullname="Henrik Boström" | |||
asciiFullname="Henrik Bostrom" | asciiFullname="Henrik Bostrom" | |||
initials="H." | initials="H." | |||
surname="Boström" | surname="Boström" | |||
asciiSurname="Bostrom" | asciiSurname="Bostrom" | |||
role="editor"> | role="editor"> | |||
<organization>Google</organization> | <organization>Google</organization> | |||
</author> | </author> | |||
<author fullname="Jan-Ivar Bruaroey" initials="J." | <author fullname="Jan-Ivar Bruaroey" initials="J-I." | |||
surname="Bruaroey" role="editor"> | surname="Bruaroey" role="editor"> | |||
<organization>Mozilla</organization> | <organization>Mozilla</organization> | |||
</author> | </author> | |||
<date month="Jan" year="2021"/> | <date month="March" year="2023"/> | |||
</front> | </front> | |||
<refcontent>World Wide Web Consortium Recommendation</refcontent> | <refcontent>W3C Recommendation</refcontent> | |||
</reference> | </reference> | |||
<reference anchor="TS26.114" target="https://www.3gpp.org/DynaReport/261 14.htm"> | <reference anchor="TS26.114" target="https://www.3gpp.org/DynaReport/261 14.htm"> | |||
<front> | <front> | |||
<title>3rd Generation Partnership Project; Technical | <title>3rd Generation Partnership Project; Technical Specification G | |||
Specification Group Services and System Aspects; IP | roup Services and System Aspects; IP Multimedia Subsystem (IMS); Multimedia Tele | |||
Multimedia Subsystem (IMS); Multimedia Telephony; Media | phony; Media handling and interaction (Release 18)</title> | |||
handling and interaction (Release 16)</title> | ||||
<seriesInfo name="3GPP TS" value="26.114 V16.3.0"/> | ||||
<author> | <author> | |||
<organization>3GPP</organization> | <organization>3GPP</organization> | |||
</author> | </author> | |||
<date year="2019" month="September"/> | <date year="2023" month="September"/> | |||
</front> | </front> | |||
<refcontent>3GPP TS 26.114 V18.4.0</refcontent> | ||||
</reference> | </reference> | |||
</references> | </references> | |||
</references> | </references> | |||
<section anchor="sec.appendix-a" numbered="true" toc="default"> | <section anchor="sec.appendix-a" numbered="true" toc="default"> | |||
<name>SDP ABNF Syntax</name> | <name>SDP ABNF Syntax</name> | |||
<t>For the syntax validation performed in | <t>For the syntax validation performed in | |||
<xref target="sec.parsing-a-desc" format="default"/>, the following list o f ABNF | <xref target="sec.parsing-a-desc" format="default"/>, the following list o f ABNF | |||
definitions is used:</t> | definitions is used:</t> | |||
<table anchor="sdp-abnf" align="center"> | <table anchor="sdp-abnf" align="center"> | |||
skipping to change at line 5130 ¶ | skipping to change at line 4876 ¶ | |||
<xref target="RFC4566" sectionFormat="of" section="6"/></td> | <xref target="RFC4566" sectionFormat="of" section="6"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">rtpmap</td> | <td align="left">rtpmap</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC4566" sectionFormat="of" section="6"/></td> | <xref target="RFC4566" sectionFormat="of" section="6"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">recvonly</td> | <td align="left">recvonly</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC4566" sectionFormat="of" section="9"/></td> | Sections <xref target="RFC4566" section="6" sectionFormat="bare"/> | |||
and <xref target="RFC4566" section="9" sectionFormat="bare"/> of <xref | ||||
target="RFC4566"/> | ||||
</td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">sendrecv</td> | <td align="left">sendrecv</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC4566" sectionFormat="of" section="9"/></td> | Sections <xref target="RFC4566" section="6" sectionFormat="bare"/> | |||
and <xref target="RFC4566" section="9" sectionFormat="bare"/> of <xref | ||||
target="RFC4566"/> | ||||
</td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">sendonly</td> | <td align="left">sendonly</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC4566" sectionFormat="of" section="9"/></td> | Sections <xref target="RFC4566" section="6" sectionFormat="bare"/> | |||
and <xref target="RFC4566" section="9" sectionFormat="bare"/> of <xref | ||||
target="RFC4566"/> | ||||
</td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">inactive</td> | <td align="left">inactive</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC4566" sectionFormat="of" section="9"/></td> | Sections <xref target="RFC4566" section="6" sectionFormat="bare"/> | |||
and <xref target="RFC4566" section="9" sectionFormat="bare"/> of <xref | ||||
target="RFC4566"/> | ||||
</td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">fmtp</td> | <td align="left">fmtp</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC4566" sectionFormat="of" section="9"/></td> | Sections <xref target="RFC4566" section="6" sectionFormat="bare"/> | |||
and <xref target="RFC4566" section="9" sectionFormat="bare"/> of <xref | ||||
target="RFC4566"/> | ||||
</td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">rtcp</td> | <td align="left">rtcp</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC3605" sectionFormat="of" section="2.1"/></td> | <xref target="RFC3605" sectionFormat="of" section="2.1"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">setup</td> | <td align="left">setup</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC4145" section="4" sectionFormat="of"/></td> | <xref target="RFC4145" section="4" sectionFormat="of"/></td> | |||
skipping to change at line 5249 ¶ | skipping to change at line 5010 ¶ | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC8853" sectionFormat="of" section="5.1"/></td> | <xref target="RFC8853" sectionFormat="of" section="5.1"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">tls-id</td> | <td align="left">tls-id</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC8842" sectionFormat="of" section="4"/></td> | <xref target="RFC8842" sectionFormat="of" section="4"/></td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
<section anchor="sec.acknowledgements" numbered="false" toc="default"> | <section anchor="sec.acknowledgements" numbered="false" toc="default"> | |||
<name>Acknowledgements</name> | <name>Acknowledgements</name> | |||
<t><contact fullname="Harald Alvestrand"/>, <contact fullname="Taylor | <t><contact fullname="Harald Alvestrand"/>, <contact fullname="Taylor | |||
Brandstetter"/>, <contact fullname="Suhas Nandakumar"/>, and | Brandstetter"/>, <contact fullname="Suhas Nandakumar"/>, and | |||
<contact fullname="Peter Thatcher"/> provided significant text for this | <contact fullname="Peter Thatcher"/> provided significant text for | |||
document. <contact fullname="Bernard Aboba"/>, <contact fullname="Adam | RFC 8829 (and thereby this document). <contact fullname="Bernard Aboba"/>, | |||
<contact fullname="Adam | ||||
Bergkvist"/>, <contact fullname="Jan-Ivar Bruaroey"/>, | Bergkvist"/>, <contact fullname="Jan-Ivar Bruaroey"/>, | |||
<contact fullname="Dan Burnett"/>, <contact fullname="Ben | <contact fullname="Dan Burnett"/>, <contact fullname="Ben | |||
Campbell"/>, <contact fullname="Alissa Cooper"/>, | Campbell"/>, <contact fullname="Alissa Cooper"/>, | |||
<contact fullname="Richard Ejzak"/>, <contact fullname="Stefan | <contact fullname="Richard Ejzak"/>, <contact fullname="Stefan | |||
Håkansson"/>, <contact fullname="Ted Hardie"/>, <contact fullname="Christe r Holmberg"/>, | Håkansson"/>, <contact fullname="Ted Hardie"/>, <contact fullname="Christe r Holmberg"/>, | |||
<contact fullname="Andrew Hutton"/>, <contact fullname="Randell | <contact fullname="Andrew Hutton"/>, <contact fullname="Randell | |||
Jesup"/>, <contact fullname="Matthew Kaufman"/>, <contact fullname="Anant Narayanan"/>, | Jesup"/>, <contact fullname="Matthew Kaufman"/>, <contact fullname="Anant Narayanan"/>, | |||
<contact fullname="Adam Roach"/>, <contact fullname="Robert Sparks"/>, | <contact fullname="Adam Roach"/>, <contact fullname="Robert Sparks"/>, | |||
<contact fullname="Neil Stratford"/>, <contact fullname="Martin | <contact fullname="Neil Stratford"/>, <contact fullname="Martin | |||
Thomson"/>, <contact fullname="Sean | Thomson"/>, <contact fullname="Sean | |||
Turner"/>, and <contact fullname="Magnus Westerlund"/> all provided valuab le feedback on | Turner"/>, and <contact fullname="Magnus Westerlund"/> all provided valuab le feedback on | |||
this document.</t> | RFC 8829 (and thereby this document).</t> | |||
</section> | </section> | |||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 108 change blocks. | ||||
517 lines changed or deleted | 300 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |