rfc8829.form.xml | rfc8829.xml | |||
---|---|---|---|---|
<?xml version='1.0' encoding='utf-8'?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" | |||
docName="draft-ietf-rtcweb-jsep-26" number="0000" consensus="true" | docName="draft-ietf-rtcweb-jsep-26" number="8829" consensus="true" | |||
ipr="trust200902" obsoletes="" updates="" submissionType="IETF" | ipr="trust200902" obsoletes="" updates="" submissionType="IETF" | |||
xml:lang="en" tocInclude="true" symRefs="true" sortRefs="true" | xml:lang="en" tocInclude="true" symRefs="true" sortRefs="true" | |||
tocDepth="4" version="3"> | tocDepth="4" version="3"> | |||
<!-- xml2rfc v2v3 conversion 2.34.0 --> | <!-- xml2rfc v2v3 conversion 2.34.0 --> | |||
<front> | <front> | |||
<title abbrev="JSEP">JavaScript Session Establishment | <title abbrev="JSEP">JavaScript Session Establishment Protocol (JSEP)</title | |||
Protocol</title> | > | |||
<seriesInfo name="RFC" value="0000"/> | <seriesInfo name="RFC" value="8829"/> | |||
<!-- [rfced] Please insert any keywords (beyond those that appear in the | ||||
title) for use on https://www.rfc-editor.org/search --> | ||||
<!-- [rfced] We have updated the title to include "JSEP"; please let us know | ||||
any objections. | ||||
Original: | ||||
JavaScript Session Establishment Protocol | ||||
Currently: | ||||
JavaScript Session Establishment Protocol (JSEP) --> | ||||
<author fullname="Justin Uberti" initials="J." surname="Uberti"> | <author fullname="Justin Uberti" initials="J." surname="Uberti"> | |||
<organization>Google</organization> | <organization>Google</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>747 6th St S</street> | <street>747 6th Street South</street> | |||
<city>Kirkland</city> | <city>Kirkland</city> | |||
<region>WA</region> | <region>WA</region> | |||
<code>98033</code> | <code>98033</code> | |||
<country>United States of America</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<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> | |||
skipping to change at line 39 ¶ | skipping to change at line 51 ¶ | |||
<postal> | <postal> | |||
<street>400 3rd Avenue SW</street> | <street>400 3rd Avenue SW</street> | |||
<city>Calgary</city> | <city>Calgary</city> | |||
<region>AB</region> | <region>AB</region> | |||
<code>T2P 4H2</code> | <code>T2P 4H2</code> | |||
<country>Canada</country> | <country>Canada</country> | |||
</postal> | </postal> | |||
<email>fluffy@iii.ca</email> | <email>fluffy@iii.ca</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Eric Rescorla" initials="E.K." surname="Rescorla" role="ed itor"> | <author fullname="Eric Rescorla" initials="E." surname="Rescorla" role="edit or"> | |||
<organization>Mozilla</organization> | <organization>Mozilla</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>331 Evelyn Ave</street> | <street>331 E. Evelyn Ave.</street> | |||
<city>Mountain View</city> | <city>Mountain View</city> | |||
<region>CA</region> | <region>CA</region> | |||
<code>94041</code> | <code>94041</code> | |||
<country>United States of America</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<email>ekr@rtfm.com</email> | <email>ekr@rtfm.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date month="May" year="2020"/> | ||||
<!-- [rfced] Eric, we note that Mozilla and RTFM are listed as your | ||||
affiliation in various documents within the cluster. Please review and let us | ||||
know if any updates are needed. | ||||
--> | ||||
<date month="July" year="2020"/> | ||||
<abstract> | <abstract> | |||
<t>This document describes the mechanisms for allowing a | <t>This document describes the mechanisms for allowing a | |||
JavaScript application to control the signaling plane of a | JavaScript application to control the signaling plane of a | |||
multimedia session via the interface specified in the W3C | multimedia session via the interface specified in the W3C | |||
RTCPeerConnection API, and discusses how this relates to existing | RTCPeerConnection API and discusses how this relates to existing | |||
signaling protocols.</t> | signaling protocols.</t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<!-- [rfced] Adam Roach previously requested that "All other documents in | ||||
Cluster 238 that currently reference RFC 5245 should be updated to | ||||
reference RFC 8445. ... any other references to RFC 5245 that I may | ||||
have overlooked should also be updated." | ||||
We believe this document intentionally refers to both RFCs. Please let us | ||||
know if any updates are needed. | ||||
--> | ||||
<section anchor="sec.introduction" numbered="true" toc="default"> | <section anchor="sec.introduction" numbered="true" toc="default"> | |||
<name>Introduction</name> | <name>Introduction</name> | |||
<t>This document describes how the W3C WEBRTC RTCPeerConnection | <t>This document describes how the W3C Web Real-Time Communication (WebRTC ) RTCPeerConnection | |||
interface | interface | |||
<xref target="W3C.webrtc" format="default"/> is used to control the setup, | <xref target="W3C.webrtc" format="default"/> is used to control the setup, | |||
management and teardown of a multimedia session.</t> | management, and teardown of a multimedia session.</t> | |||
<section anchor="sec.general-design-of-jsep" numbered="true" toc="default" > | <section anchor="sec.general-design-of-jsep" numbered="true" toc="default" > | |||
<name>General Design of JSEP</name> | <name>General Design of JSEP</name> | |||
<t>WebRTC call setup has been designed to focus on controlling | <t>WebRTC call setup has been designed to focus on controlling | |||
the media plane, leaving signaling plane behavior up to the | the media plane, leaving signaling-plane behavior up to the | |||
application as much as possible. The rationale is that | application as much as possible. The rationale is that | |||
different applications may prefer to use different protocols, | different applications may prefer to use different protocols, | |||
such as the existing SIP call signaling protocol, or something | such as the existing SIP call signaling protocol, or something | |||
custom to the particular application, perhaps for a novel use | custom to the particular application, perhaps for a novel use | |||
case. In this approach, the key information that needs to be | case. In this approach, the key information that needs to be | |||
exchanged is the multimedia session description, which | exchanged is the multimedia session description, which | |||
specifies the necessary transport and media configuration | specifies the transport and media configuration | |||
information necessary to establish the media plane.</t> | information necessary to establish the media plane.</t> | |||
<t>With these considerations in mind, this document describes | <t>With these considerations in mind, this document describes | |||
the JavaScript Session Establishment Protocol (JSEP) that | the JavaScript Session Establishment Protocol (JSEP), which | |||
allows for full control of the signaling state machine from | allows for full control of the signaling state machine from | |||
JavaScript. As described above, JSEP assumes a model in which a | JavaScript. As described above, JSEP assumes a model in which a | |||
JavaScript application executes inside a runtime containing | JavaScript application executes inside a runtime containing | |||
WebRTC APIs (the "JSEP implementation"). The JSEP | WebRTC APIs (the "JSEP implementation"). The JSEP | |||
implementation is almost entirely divorced from the core | implementation is almost entirely divorced from the core | |||
signaling flow, which is instead handled by the JavaScript | signaling flow, which is instead handled by the JavaScript | |||
making use of two interfaces: (1) passing in local and remote | making use of two interfaces: (1) passing in local and remote | |||
session descriptions and (2) interacting with the ICE state | session descriptions and (2) interacting with the Interactive | |||
machine. The combination of the JSEP implementation and the | Connectivity Establishment (ICE) state | |||
machine <xref target="RFC8445"/>. The combination of the JSEP implementa | ||||
tion and the | ||||
JavaScript application is referred to throughout this document | JavaScript application is referred to throughout this document | |||
as a "JSEP endpoint".</t> | as a "JSEP endpoint".</t> | |||
<t>In this document, the use of JSEP is described as if it | <t>In this document, the use of JSEP is described as if it | |||
always occurs between two JSEP endpoints. Note though in many | always occurs between two JSEP endpoints. Note, though, that in many | |||
cases it will actually be between a JSEP endpoint and some kind | cases it will actually be between a JSEP endpoint and some kind | |||
of server, such as a gateway or MCU. This distinction is | of server, such as a gateway or Multipoint Control Unit (MCU). This dist inction is | |||
invisible to the JSEP endpoint; it just follows the | invisible to the JSEP endpoint; it just follows the | |||
instructions it is given via the API.</t> | instructions it is given via the API.</t> | |||
<t>JSEP's handling of session descriptions is simple and | <t>JSEP's handling of session descriptions is simple and | |||
straightforward. Whenever an offer/answer exchange is needed, | straightforward. Whenever an offer/answer exchange is needed, | |||
the initiating side creates an offer by calling a createOffer() | the initiating side creates an offer by calling a createOffer() | |||
API. The application then uses that offer to set up its local | API. The application then uses that offer to set up its local | |||
config via the setLocalDescription() API. The offer is finally | config via the setLocalDescription() API. The offer is finally | |||
sent off to the remote side over its preferred signaling | sent off to the remote side over its preferred signaling | |||
mechanism (e.g., WebSockets); upon receipt of that offer, the | mechanism (e.g., WebSockets); upon receipt of that offer, the | |||
remote party installs it using the setRemoteDescription() | remote party installs it using the setRemoteDescription() | |||
skipping to change at line 128 ¶ | skipping to change at line 157 ¶ | |||
<xref target="RFC8445" format="default"/>, JSEP decouples the ICE state | <xref target="RFC8445" format="default"/>, JSEP decouples the ICE state | |||
machine from the overall signaling state machine, as the ICE | machine from the overall signaling state machine, as the ICE | |||
state machine must remain in the JSEP implementation, because | state machine must remain in the JSEP implementation, because | |||
only the implementation has the necessary knowledge of | only the implementation has the necessary knowledge of | |||
candidates and other transport information. Performing this | candidates and other transport information. Performing this | |||
separation provides additional flexibility in protocols that | separation provides additional flexibility in protocols that | |||
decouple session descriptions from transport. For instance, in | decouple session descriptions from transport. For instance, in | |||
traditional SIP, each offer or answer is self-contained, | traditional SIP, each offer or answer is self-contained, | |||
including both the session descriptions and the transport | including both the session descriptions and the transport | |||
information. However, | information. However, | |||
<xref target="RFCYYY8" format="default"/> allows SIP to | <xref target="RFC8840" format="default"/> allows SIP to | |||
be used with trickle ICE | be used with Trickle ICE | |||
<xref target="RFCYYY6" format="default"/>, in which the session | <xref target="RFC8838" format="default"/>, in which the session | |||
description can be sent immediately and the transport | description can be sent immediately and the transport | |||
information can be sent when available. Sending transport | information can be sent when available. Sending transport | |||
information separately can allow for faster ICE and DTLS | information separately can allow for faster ICE and DTLS | |||
startup, since ICE checks can start as soon as any transport | startup, since ICE checks can start as soon as any transport | |||
information is available rather than waiting for all of it. | information is available rather than waiting for all of it. | |||
JSEP's decoupling of the ICE and signaling state machines | JSEP's decoupling of the ICE and signaling state machines | |||
allows it to accommodate either model.</t> | allows it to accommodate either model.</t> | |||
<t>Through its abstraction of signaling, the JSEP approach does | <t>Through its abstraction of signaling, the JSEP approach does | |||
require the application to be aware of the signaling process. | require the application to be aware of the signaling process. | |||
While the application does not need to understand the contents | While the application does not need to understand the contents | |||
of session descriptions to set up a call, the application must | of session descriptions to set up a call, the application must | |||
call the right APIs at the right times, convert the session | call the right APIs at the right times, convert the session | |||
descriptions and ICE information into the defined messages of | descriptions and ICE information into the defined messages of | |||
its chosen signaling protocol, and perform the reverse | its chosen signaling protocol, and perform the reverse | |||
conversion on the messages it receives from the other side.</t> | conversion on the messages it receives from the other side.</t> | |||
<t>One way to make life easier for the application is to | <t>One way to make life easier for the application is to | |||
provide a JavaScript library that hides this complexity from | provide a JavaScript library that hides this complexity from | |||
the developer; said library would implement a given signaling | the developer; said library would implement a given signaling | |||
protocol along with its state machine and serialization code, | protocol along with its state machine and serialization code, | |||
presenting a higher level call-oriented interface to the | presenting a higher-level call-oriented interface to the | |||
application developer. For example, libraries exist to adapt | application developer. For example, libraries exist to adapt | |||
the JSEP API into an API suitable for a SIP or XMPP. Thus, JSEP | the JSEP API into an API suitable for a SIP interface or an Extensible M | |||
essaging | ||||
and Presence Protocol (XMPP) interface <xref target="RFC6120"/>. | ||||
<!-- [rfced] Section 1.1: For ease of the reader, and per other | ||||
documents in this cluster (cluster C238), we expanded "XMPP," cited | ||||
RFC 6120, and added RFC 6120 to the list of Informative References. | ||||
Please let us know any concerns. | ||||
Original: | ||||
For example, | ||||
libraries exist to adapt the JSEP API into an API suitable for a SIP | ||||
or XMPP. | ||||
Currently: | ||||
For example, | ||||
libraries exist to adapt the JSEP API into an API suitable for a SIP | ||||
interface or an Extensible Messaging and Presence Protocol (XMPP) | ||||
interface [RFC6120]. | ||||
... | ||||
[RFC6120] Saint-Andre, P., "Extensible Messaging and Presence | ||||
Protocol (XMPP): Core", RFC 6120, DOI 10.17487/RFC6120, | ||||
March 2011, <https://www.rfc-editor.org/info/rfc6120>. --> | ||||
Thus, JSEP | ||||
provides greater control for the experienced developer without | provides greater control for the experienced developer without | |||
forcing any additional complexity on the novice developer.</t> | forcing any additional complexity on the novice developer.</t> | |||
</section> | </section> | |||
<section anchor="sec.other-approaches-consider" numbered="true" toc="defau lt"> | <section anchor="sec.other-approaches-consider" numbered="true" toc="defau lt"> | |||
<name>Other Approaches Considered</name> | <name>Other Approaches Considered</name> | |||
<t>One approach that was considered instead of JSEP was to | <t>One approach that was considered instead of JSEP was to | |||
include a lightweight signaling protocol. Instead of providing | include a lightweight signaling protocol. Instead of providing | |||
session descriptions to the API, the API would produce and | session descriptions to the API, the API would produce and | |||
consume messages from this protocol. While providing a more | consume messages from this protocol. While providing a more | |||
high-level API, this put more control of signaling within the | high-level API, this put more control of signaling within the | |||
skipping to change at line 175 ¶ | skipping to change at line 227 ¶ | |||
<xref target="RFC3264" sectionFormat="comma" section="4"/>).</t> | <xref target="RFC3264" sectionFormat="comma" section="4"/>).</t> | |||
<t>A second approach that was considered but not chosen was to | <t>A second approach that was considered but not chosen was to | |||
decouple the management of the media control objects from | decouple the management of the media control objects from | |||
session descriptions, instead offering APIs that would control | session descriptions, instead offering APIs that would control | |||
each component directly. This was rejected based on the | each component directly. This was rejected based on the | |||
argument that requiring exposure of this level of complexity to | argument that requiring exposure of this level of complexity to | |||
the application programmer would not be beneficial; it would | the application programmer would not be beneficial; it would | |||
result in an API where even a simple example would require a | result in an API where even a simple example would require a | |||
significant amount of code to orchestrate all the needed | significant amount of code to orchestrate all the needed | |||
interactions, as well as creating a large API surface that | interactions, as well as creating a large API surface that | |||
needed to be agreed upon and documented. In addition, these API | needed to be agreed upon and documented. | |||
<!-- [rfced] Section 1.2: We had trouble parsing this sentence. | ||||
If the suggested text is not correct, please clarify "as well as | ||||
creating ..." | ||||
Original (the previous sentence is included for context): | ||||
A second approach that was considered but not chosen was to decouple | ||||
the management of the media control objects from session | ||||
descriptions, instead offering APIs that would control each component | ||||
directly. This was rejected based on the argument that requiring | ||||
exposure of this level of complexity to the application programmer | ||||
would not be beneficial; it would result in an API where even a | ||||
simple example would require a significant amount of code to | ||||
orchestrate all the needed interactions, as well as creating a large | ||||
API surface that needed to be agreed upon and documented. | ||||
Suggested: | ||||
This was rejected based on the argument that requiring | ||||
exposure of this level of complexity to the application programmer | ||||
would not be beneficial; it would (1) result in an API where even a | ||||
simple example would require a significant amount of code to | ||||
orchestrate all the needed interactions and (2) create a large | ||||
API surface that needed to be agreed upon and documented. --> | ||||
In addition, these API | ||||
points could be called in any order, resulting in a more | points could be called in any order, resulting in a more | |||
complex set of interactions with the media subsystem than the | complex set of interactions with the media subsystem than the | |||
JSEP approach, which specifies how session descriptions are to | JSEP approach, which specifies how session descriptions are to | |||
be evaluated and applied.</t> | be evaluated and applied.</t> | |||
<t>One variation on JSEP that was considered was to keep the | <t>One variation on JSEP that was considered was to keep the | |||
basic session description-oriented API, but to move the | basic session-description-oriented API but to move the | |||
mechanism for generating offers and answers out of the JSEP | mechanism for generating offers and answers out of the JSEP | |||
implementation. Instead of providing createOffer/createAnswer | implementation. Instead of providing createOffer/createAnswer | |||
methods within the implementation, this approach would instead | methods within the implementation, this approach would instead | |||
expose a getCapabilities API which would provide the | expose a getCapabilities API, which would provide the | |||
application with the information it needed in order to generate | application with the information it needed in order to generate | |||
its own session descriptions. This increases the amount of work | its own session descriptions. This increases the amount of work | |||
that the application needs to do; it needs to know how to | that the application needs to do; it needs to know how to | |||
generate session descriptions from capabilities, and especially | generate session descriptions from capabilities, and especially | |||
how to generate the correct answer from an arbitrary offer and | how to generate the correct answer from an arbitrary offer and | |||
the supported capabilities. While this could certainly be | the supported capabilities. While this could certainly be | |||
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> | |||
skipping to change at line 257 ¶ | skipping to change at line 334 ¶ | |||
that is received. These parameters are determined by the | that is received. These parameters are determined by the | |||
exchange of session descriptions in offers and answers, and | exchange of session descriptions in offers and answers, and | |||
there are certain details to this process that must be handled | there are certain details to this process that must be handled | |||
in the JSEP APIs.</t> | in the JSEP APIs.</t> | |||
<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 <bcp14>MUST</bcp14> either accept them or reject the m | and the remote side <bcp14>MUST</bcp14> either accept them or reject the m | |||
altogether. An example of such a parameter is the DTLS | altogether. An example of such a parameter is the DTLS | |||
fingerprints | fingerprints | |||
<xref target="RFC8122" format="default"/>, which are calculated based on | <xref target="RFC8122" format="default"/>, which 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.</t> | negotiation. | |||
<!-- [rfced] Section 3.2: We do not see any mention of DTLS in | ||||
RFC 8122; we only see "TLS." Will this citation be clear to | ||||
readers? | ||||
Original: | ||||
An example of such a parameter is the DTLS | ||||
fingerprints [RFC8122], which are calculated based on the local | ||||
certificate(s) offered, and are not subject to negotiation. | ||||
Possibly: | ||||
An example of such a parameter is the TLS | ||||
fingerprints [RFC8122] as used in the context of DTLS [RFC6347]; | ||||
these fingerprints are calculated based on the local certificate(s) | ||||
offered and are not subject to negotiation. --> | ||||
</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> | |||
<t>Lastly, while the exact media parameters are only known only | <t>Lastly, while the exact media parameters are known only | |||
after an offer and an answer have been exchanged, the offerer | after an offer and an answer have been exchanged, the offerer | |||
may receive ICE checks, and possibly media (e.g., in the case | may receive ICE checks, and possibly media (e.g., in the case | |||
of a re-offer after a connection has been established) before | of a re-offer after a connection has been established) before | |||
it receives an answer. To properly process incoming media in | it receives an answer. To properly process incoming media in | |||
this case, the offerer's media handler must be aware of the | this case, the offerer's media handler must be aware of the | |||
details of the offer before the answer arrives.</t> | details of the offer before the answer arrives.</t> | |||
<t>Therefore, in order to handle session descriptions properly, | <t>Therefore, in order to handle session descriptions properly, | |||
the JSEP implementation needs: | the JSEP implementation needs: | |||
</t> | </t> | |||
<ol spacing="normal" type="1"> | <ol spacing="normal" type="1"> | |||
skipping to change at line 294 ¶ | skipping to change at line 388 ¶ | |||
answer.</li> | answer.</li> | |||
<li>To allow the offer to be specified independently of the | <li>To allow the offer to be specified independently of the | |||
answer.</li> | answer.</li> | |||
</ol> | </ol> | |||
<t>JSEP addresses this by adding both setLocalDescription | <t>JSEP addresses this by adding both setLocalDescription | |||
and setRemoteDescription methods and having session description | and setRemoteDescription methods and having session description | |||
objects contain a type field indicating the type of session | objects contain a type field indicating the type of session | |||
description being supplied. This satisfies the requirements | description being supplied. This satisfies the requirements | |||
listed above for both the offerer, who first calls | listed above for both the offerer, who first calls | |||
setLocalDescription(sdp [offer]) and then later | setLocalDescription(sdp [offer]) and then later | |||
setRemoteDescription(sdp [answer]), as well as for the | setRemoteDescription(sdp [answer]), and the | |||
answerer, who first calls setRemoteDescription(sdp [offer]) and | answerer, who first calls setRemoteDescription(sdp [offer]) and | |||
then later setLocalDescription(sdp [answer]).</t> | then later setLocalDescription(sdp [answer]).</t> | |||
<t>During the offer/answer exchange, the outstanding offer is | <t>During the offer/answer exchange, the outstanding offer is | |||
considered to be "pending" at the offerer and the answerer, as | considered to be "pending" at the offerer and the answerer, as | |||
it may either be accepted or rejected. If this is a re-offer, | it may be either accepted or rejected. If this is a re-offer, | |||
each side will also have "current" local and remote | each side will also have "current" local and remote | |||
descriptions, which reflect the result of the last offer/answer | descriptions, which reflect the result of the last offer/answer | |||
exchange. Sections | exchange. Sections | |||
<xref target="sec.pendinglocaldescription" format="counter"/>, | <xref target="sec.pendinglocaldescription" format="counter"/>, | |||
<xref target="sec.pendingremotedescription" format="counter"/>, | <xref target="sec.pendingremotedescription" format="counter"/>, | |||
<xref target="sec.currentlocaldescription" format="counter"/>, and | <xref target="sec.currentlocaldescription" format="counter"/>, and | |||
<xref target="sec.currentremotedescription" format="counter"/>, provide more | <xref target="sec.currentremotedescription" format="counter"/> provide m ore | |||
detail on pending and current descriptions.</t> | detail on pending and current descriptions.</t> | |||
<t>JSEP also allows for an answer to be treated as provisional | <t>JSEP also allows for an answer to be treated as provisional | |||
by the application. Provisional answers provide a way for an | by the application. Provisional answers provide a way for an | |||
answerer to communicate initial session parameters back to the | answerer to communicate initial session parameters back to the | |||
offerer, in order to allow the session to begin, while allowing | offerer, in order to allow the session to begin, while allowing | |||
a final answer to be specified later. This concept of a final | a final answer to be specified later. This concept of a final | |||
answer is important to the offer/answer model; when such an | answer is important to the offer/answer model; when such an | |||
answer is received, any extra resources allocated by the caller | answer is received, any extra resources allocated by the caller | |||
can be released, now that the exact session configuration is | can be released, now that the exact session configuration is | |||
known. These "resources" can include things like extra ICE | known. These "resources" can include things like extra ICE | |||
components, TURN candidates, or video decoders. Provisional | components, Traversal Using Relays around NAT (TURN) candidates, or vide o decoders. Provisional | |||
answers, on the other hand, do no such deallocation; as a | answers, on the other hand, do no such deallocation; as a | |||
result, multiple dissimilar provisional answers, with their own | result, multiple dissimilar provisional answers, with their own | |||
codec choices, transport parameters, etc., can be received and | codec choices, transport parameters, etc., can be received and | |||
applied during call setup. Note that the final answer itself | applied during call setup. Note that the final answer itself | |||
may be different than any received provisional answers.</t> | may be different than any received provisional answers.</t> | |||
<t>In | <t>In | |||
<xref target="RFC3264" format="default"/>, the constraint at the signali ng | <xref target="RFC3264" format="default"/>, the constraint at the signali ng | |||
level is that only one offer can be outstanding for a given | level is that only one offer can be outstanding for a given | |||
session, but at the media stack level, a new offer can be | session, but at the media stack level, a new offer can be | |||
generated at any point. For example, when using SIP for | generated at any point. For example, when using SIP for | |||
signaling, if one offer is sent, then cancelled using a SIP | signaling, if one offer is sent and is then canceled using a SIP | |||
CANCEL, another offer can be generated even though no answer | CANCEL, another offer can be generated even though no answer | |||
was received for the first offer. To support this, the JSEP | was received for the first offer. To support this, the JSEP | |||
media layer can provide an offer via the createOffer() method | media layer can provide an offer via the createOffer() method | |||
whenever the JavaScript application needs one for the | whenever the JavaScript application needs one for the | |||
signaling. The answerer can send back zero or more provisional | signaling. The answerer can send back zero or more provisional | |||
answers, and finally end the offer-answer exchange by sending a | answers and then finally end the offer/answer exchange by sending a | |||
final answer. The state machine for this is as follows:</t> | final answer. The state machine for this is as follows:</t> | |||
<figure anchor="fig-state-machine"> | <figure anchor="fig-state-machine"> | |||
<name>JSEP State Machine</name> | <name>JSEP State Machine</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
setRemote(OFFER) setLocal(PRANSWER) | setRemote(OFFER) setLocal(PRANSWER) | |||
/-----\ /-----\ | /-----\ /-----\ | |||
| | | | | | | | | | |||
v | v | | v | v | | |||
+---------------+ | +---------------+ | | +---------------+ | +---------------+ | | |||
| |----/ | |----/ | | |----/ | |----/ | |||
skipping to change at line 377 ¶ | skipping to change at line 471 ¶ | |||
| have- | setRemote(PRANSWER) |have- | | | have- | setRemote(PRANSWER) |have- | | |||
| local-offer |------------------- >|remote-pranswer| | | local-offer |------------------- >|remote-pranswer| | |||
| | | | | | | | | | |||
| |----\ | |----\ | | |----\ | |----\ | |||
+---------------+ | +---------------+ | | +---------------+ | +---------------+ | | |||
^ | ^ | | ^ | ^ | | |||
| | | | | | | | | | |||
\-----/ \-----/ | \-----/ \-----/ | |||
setLocal(OFFER) setRemote(PRANSWER) ]]></artwo rk> | setLocal(OFFER) setRemote(PRANSWER) ]]></artwo rk> | |||
</figure> | </figure> | |||
<t>Aside from these state transitions there is no other | <t>Aside from these state transitions, there is no other | |||
difference between the handling of provisional ("pranswer") and | difference between the handling of provisional ("pranswer") and | |||
final ("answer") answers.</t> | final ("answer") answers.</t> | |||
</section> | </section> | |||
<section anchor="sec.session-description-forma" numbered="true" toc="defau lt"> | <section anchor="sec.session-description-forma" numbered="true" toc="defau lt"> | |||
<name>Session Description Format</name> | <name>Session Description Format</name> | |||
<t>JSEP's session descriptions use SDP syntax for their | <t>JSEP's session descriptions use Session Description Protocol (SDP) sy ntax for their | |||
internal representation. While this format is not optimal for | internal representation. While this format is not optimal for | |||
manipulation from JavaScript, it is widely accepted, and | manipulation from JavaScript, it is widely accepted and is | |||
frequently updated with new features; any alternate encoding of | frequently updated with new features; any alternate encoding of | |||
session descriptions would have to keep pace with the changes | session descriptions would have to keep pace with the changes | |||
to SDP, at least until the time that this new encoding eclipsed | to SDP, at least until the time that this new encoding eclipsed | |||
SDP in popularity.</t> | SDP in popularity.</t> | |||
<t>However, to provide for future flexibility, the SDP syntax | <t>However, to provide for future flexibility, the SDP syntax | |||
is encapsulated within a SessionDescription object, which can | is encapsulated within a SessionDescription object, which can | |||
be constructed from SDP, and be serialized out to SDP. If | be constructed from SDP and be serialized out to SDP. If | |||
future specifications agree on a JSON format for session | future specifications agree on a JSON format for session | |||
descriptions, we could easily enable this object to generate | descriptions, we could easily enable this object to generate | |||
and consume that JSON.</t> | and consume that JSON.</t> | |||
<t>As detailed below, most applications should be able to treat | <t>As detailed below, most applications should be able to treat | |||
the SessionDescriptions produced and consumed by these various | the SessionDescriptions produced and consumed by these various | |||
API calls as opaque blobs; that is, the application will not | API calls as opaque blobs; that is, the application will not | |||
need to read or change them.</t> | need to read or change them.</t> | |||
</section> | </section> | |||
<section anchor="sec.session-description-ctrl" numbered="true" toc="defaul t"> | <section anchor="sec.session-description-ctrl" numbered="true" toc="defaul t"> | |||
<name>Session Description Control</name> | <name>Session Description Control</name> | |||
<t>In order to give the application control over various common | <t>In order to give the application control over various common | |||
session parameters, JSEP provides control surfaces which tell | session parameters, JSEP provides control surfaces that tell | |||
the JSEP implementation how to generate session descriptions. | the JSEP implementation how to generate session descriptions. | |||
This avoids the need for JavaScript to modify session | This avoids the need for JavaScript to modify session | |||
descriptions in most cases.</t> | descriptions in most cases.</t> | |||
<t>Changes to these objects result in changes to the session | <t>Changes to these objects result in changes to the session | |||
descriptions generated by subsequent createOffer/Answer | descriptions generated by subsequent createOffer/createAnswer | |||
calls.</t> | calls.</t> | |||
<section anchor="sec.rtptransceivers" numbered="true" toc="default"> | <section anchor="sec.rtptransceivers" numbered="true" toc="default"> | |||
<name>RtpTransceivers</name> | <name>RtpTransceivers</name> | |||
<t>RtpTransceivers allow the application to control the RTP | <t>RtpTransceivers allow the application to control the RTP | |||
media associated with one m= section. Each RtpTransceiver has | media associated with one "m=" section. Each RtpTransceiver has | |||
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 a 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 mid | is said to be associated with an "m=" section if its | |||
property is non-null; otherwise it is said to be | media identification (mid) property is non-null; otherwise, it is said | |||
disassociated. The associated m= section is determined using | to be | |||
a mapping between transceivers and m= section indices, formed | disassociated. The associated "m=" section is determined using | |||
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, a 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 a 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 | |||
with a new mid value.</t> | with a new mid value.</t> | |||
<t>RtpTransceivers can be created explicitly by the | <t>RtpTransceivers can be created explicitly by the | |||
application or implicitly by calling setRemoteDescription | application or implicitly by calling setRemoteDescription | |||
with an offer that adds new m= sections.</t> | with an offer that adds new "m=" sections.</t> | |||
</section> | </section> | |||
<section anchor="sec.rtpsenders" numbered="true" toc="default"> | <section anchor="sec.rtpsenders" numbered="true" toc="default"> | |||
<name>RtpSenders</name> | <name>RtpSenders</name> | |||
<t>RtpSenders allow the application to control how RTP media | <t>RtpSenders allow the application to control how RTP media | |||
is sent. An RtpSender is conceptually responsible for the | is sent. An RtpSender is conceptually responsible for the | |||
outgoing RTP stream(s) described by an m= section. This | outgoing RTP stream(s) described by an "m=" section. This | |||
includes encoding the attached MediaStreamTrack, sending RTP | includes encoding the attached MediaStreamTrack, sending RTP | |||
media packets, and generating/processing RTCP for the | media packets, and generating/processing the RTP Control Protocol (RTC P) for the | |||
outgoing RTP streams(s).</t> | outgoing RTP streams(s).</t> | |||
</section> | </section> | |||
<section anchor="sec.rtpreceivers" numbered="true" toc="default"> | <section anchor="sec.rtpreceivers" numbered="true" toc="default"> | |||
<name>RtpReceivers</name> | <name>RtpReceivers</name> | |||
<t>RtpReceivers allow the application to inspect how RTP | <t>RtpReceivers allow the application to inspect how RTP | |||
media is received. An RtpReceiver is conceptually responsible | media is received. An RtpReceiver is conceptually responsible | |||
for the incoming RTP stream(s) described by an m= section. | for the incoming RTP stream(s) described by an "m=" section. | |||
This includes processing received RTP media packets, decoding | This includes processing received RTP media packets, decoding | |||
the incoming stream(s) to produce a remote MediaStreamTrack, | the incoming stream(s) to produce a remote MediaStreamTrack, | |||
and generating/processing RTCP for the incoming RTP | and generating/processing RTCP for the incoming RTP | |||
stream(s).</t> | stream(s).</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.ice" numbered="true" toc="default"> | <section anchor="sec.ice" numbered="true" toc="default"> | |||
<name>ICE</name> | <name>ICE</name> | |||
<section anchor="sec.ice-gather-overview" numbered="true" toc="default"> | <section anchor="sec.ice-gather-overview" numbered="true" toc="default"> | |||
<name>ICE Gathering Overview</name> | <name>ICE Gathering Overview</name> | |||
<t>JSEP gathers ICE candidates as needed by the application. | <t>JSEP gathers ICE candidates as needed by the application. | |||
Collection of ICE candidates is referred to as a gathering | Collection of ICE candidates is referred to as a gathering | |||
phase, and this is triggered either by the addition of a new | phase, and this is triggered either by the addition of a new | |||
or recycled m= section to the local session description, or | or recycled "m=" section to the local session description or by | |||
new ICE credentials in the description, indicating an ICE | new ICE credentials in the description, indicating an ICE | |||
restart. Use of new ICE credentials can be triggered | restart. Use of new ICE credentials can be triggered | |||
explicitly by the application, or implicitly by the JSEP | explicitly by the application or implicitly by the JSEP | |||
implementation in response to changes in the ICE | implementation in response to changes in the ICE | |||
configuration.</t> | configuration.</t> | |||
<t>When the ICE configuration changes in a way that requires | <t>When the ICE configuration changes in a way that requires | |||
a new gathering phase, a 'needs-ice-restart' bit is set. When | a new gathering phase, a 'needs-ice-restart' bit is set. When | |||
this bit is set, calls to the createOffer API will generate | this bit is set, calls to the createOffer API will generate | |||
new ICE credentials. This bit is cleared by a call to the | new ICE credentials. This bit is cleared by a call to the | |||
setLocalDescription API with new ICE credentials from either | setLocalDescription API with new ICE credentials from either | |||
an offer or an answer, i.e., from either a local- or | an offer or an answer, i.e., from either a locally or | |||
remote-initiated ICE restart.</t> | remotely initiated ICE restart.</t> | |||
<t>When a new gathering phase starts, the ICE agent will | <t>When a new gathering phase starts, the ICE agent will | |||
notify the application that gathering is occurring through an | notify the application that gathering is occurring through an | |||
event. Then, when each new ICE candidate becomes available, | event. Then, when each new ICE candidate becomes available, | |||
the ICE agent will supply it to the application via an | the ICE agent will supply it to the application via an | |||
additional event; these candidates will also automatically be | additional event; these candidates will also automatically be | |||
added to the current and/or pending local session | added to the current and/or pending local session | |||
description. Finally, when all candidates have been gathered, | description. Finally, when all candidates have been gathered, | |||
an event will be dispatched to signal that the gathering | an event will be dispatched to signal that the gathering | |||
process is complete.</t> | process is complete.</t> | |||
<t>Note that gathering phases only gather the candidates | <t>Note that gathering phases only gather the candidates | |||
needed by new/recycled/restarting m= sections; other m= | needed by new/recycled/restarting "m=" sections; other "m=" | |||
sections continue to use their existing candidates. Also, if | sections continue to use their existing candidates. Also, if | |||
an m= section is bundled (either by a successful bundle | an "m=" section is bundled (either by a successful bundle | |||
negotiation or by being marked as bundle-only), then | negotiation or by being marked as bundle-only), then | |||
candidates will be gathered and exchanged for that m= section | candidates will be gathered and exchanged for that "m=" section | |||
if and only if its MID is a BUNDLE-tag, as described in | if and only if its MID item is a BUNDLE-tag, as described in | |||
<xref target="RFCYYYB" format="default"/>.</t> | <xref target="RFC8843" format="default"/>.</t> | |||
</section> | </section> | |||
<section anchor="sec.ice-candidate-trickling" numbered="true" toc="defau lt"> | <section anchor="sec.ice-candidate-trickling" numbered="true" toc="defau lt"> | |||
<name>ICE Candidate Trickling</name> | <name>ICE Candidate Trickling</name> | |||
<t>Candidate trickling is a technique through which a caller | <t>Candidate trickling is a technique through which a caller | |||
may incrementally provide candidates to the callee after the | may incrementally provide candidates to the callee after the | |||
initial offer has been dispatched; the semantics of "Trickle | initial offer has been dispatched; the semantics of "Trickle | |||
ICE" are defined in | ICE" are defined in | |||
<xref target="RFCYYY6" format="default"/>. This process | <xref target="RFC8838" format="default"/>. This process | |||
allows the callee to begin acting upon the call and setting | allows the callee to begin acting upon the call and setting | |||
up the ICE (and perhaps DTLS) connections immediately, | up the ICE (and perhaps DTLS) connections immediately, | |||
without having to wait for the caller to gather all possible | without having to wait for the caller to gather all possible | |||
candidates. This results in faster media setup in cases where | candidates. This results in faster media setup in cases where | |||
gathering is not performed prior to initiating the call.</t> | gathering is not performed prior to initiating the call.</t> | |||
<t>JSEP supports optional candidate trickling by providing | <t>JSEP supports optional candidate trickling by providing | |||
APIs, as described above, that provide control and feedback | APIs, as described above, that provide control and feedback | |||
on the ICE candidate gathering process. Applications that | on the ICE candidate gathering process. Applications that | |||
support candidate trickling can send the initial offer | support candidate trickling can send the initial offer | |||
immediately and send individual candidates when they get the | immediately and send individual candidates when they get | |||
notified of a new candidate; applications that do not support | notified of a new candidate; applications that do not support | |||
this feature can simply wait for the indication that | this feature can simply wait for the indication that | |||
gathering is complete, and then create and send their offer, | gathering is complete, and then create and send their offer, | |||
with all the candidates, at this time.</t> | with all the candidates, at that time.</t> | |||
<t>Upon receipt of trickled candidates, the receiving | <t>Upon receipt of trickled candidates, the receiving | |||
application will supply them to its ICE agent. This triggers | application will supply them to its ICE agent. This triggers | |||
the ICE agent to start using the new remote candidates for | the ICE agent to start using the new remote candidates for | |||
connectivity checks.</t> | connectivity checks.</t> | |||
<section anchor="sec.ice-candidate-format" numbered="true" toc="defaul t"> | <section anchor="sec.ice-candidate-format" numbered="true" toc="defaul t"> | |||
<name>ICE Candidate Format</name> | <name>ICE Candidate Format</name> | |||
<t>In JSEP, ICE candidates are abstracted by an | <t>In JSEP, ICE candidates are abstracted by an | |||
IceCandidate object, and as with session descriptions, SDP | IceCandidate object, and as with session descriptions, SDP | |||
syntax is used for the internal representation.</t> | syntax is used for the internal representation.</t> | |||
<t>The candidate details are specified in an IceCandidate | <t>The candidate details are specified in an IceCandidate | |||
field, using the same SDP syntax as the | field, using the same SDP syntax as the | |||
"candidate-attribute" field defined in | "candidate-attribute" field defined in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="4.1"/>. Note t hat this | <xref target="RFC8839" sectionFormat="comma" section="5.1"/>. Note t hat this | |||
field does not contain an "a=" prefix, as indicated in the | field does not contain an "a=" prefix, as indicated in the | |||
following example:</t> | following example:</t> | |||
<sourcecode name="" type="sdp"><![CDATA[ | <sourcecode name="" type="sdp"><![CDATA[ | |||
candidate:1 1 UDP 1694498815 192.0.2.33 10000 typ host ]]></sourcecode> | candidate:1 1 UDP 1694498815 192.0.2.33 10000 typ host ]]></sourcecode> | |||
<t>The IceCandidate object contains a field to indicate | <t>The IceCandidate object contains a field to indicate | |||
which ICE ufrag it is associated with, as defined in | which ICE ufrag it is associated with, as defined in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="4.4"/>. This v alue is used | <xref target="RFC8839" sectionFormat="comma" section="5.4"/>. This v alue is used | |||
to determine which session description (and thereby which | to determine which session description (and thereby which | |||
gathering phase) this IceCandidate belongs to, which helps | gathering phase) this IceCandidate belongs to, which helps | |||
resolve ambiguities during ICE restarts. If this field is | resolve ambiguities during ICE restarts. If this field is | |||
absent in a received IceCandidate (perhaps when | absent in a received IceCandidate (perhaps when | |||
communicating with a non-JSEP endpoint), the most recently | communicating with a non-JSEP endpoint), the most recently | |||
received session description is assumed.</t> | received session description is assumed.</t> | |||
<t>The IceCandidate object also contains fields to indicate | <t>The IceCandidate object also contains fields to indicate | |||
which m= section it is associated with, which can be | which "m=" section it is associated with, which can be | |||
identified in one of two ways, either by a m= section | identified in one of two ways: either by an "m=" section | |||
index, or a MID. The m= section index is a zero-based | index or by a MID. The "m=" section index is a zero-based | |||
index, with index N referring to the N+1th m= section in | index, with index N referring to the N+1th "m=" section in | |||
the session description referenced by this IceCandidate. | the session description referenced by this IceCandidate. | |||
The MID is a "media stream identification" value, as | The MID is a "media stream identification" value, as | |||
defined in | defined in | |||
<xref target="RFC5888" sectionFormat="comma" section="4"/>, which pr ovides a | <xref target="RFC5888" sectionFormat="comma" section="4"/>, which pr ovides a | |||
more robust way to identify the m= section in the session | more robust way to identify the "m=" section in the session | |||
description, using the MID of the associated RtpTransceiver | description, using the MID of the associated RtpTransceiver | |||
object (which may have been locally generated by the | object (which may have been locally generated by the | |||
answerer when interacting with a non-JSEP endpoint that | answerer when interacting with a non-JSEP endpoint that | |||
does not support the MID attribute, as discussed in | does not support the MID attribute, as discussed in | |||
<xref target="sec.applying-a-remote-desc" format="default"/> below). If the | <xref target="sec.applying-a-remote-desc" format="default"/> below). If the | |||
MID field is present in a received IceCandidate, it <bcp14>MUST</bcp 14> be | MID field is present in a received IceCandidate, it <bcp14>MUST</bcp 14> be | |||
used for identification; otherwise, the m= section index is | used for identification; otherwise, the "m=" section index is | |||
used instead.</t> | used instead.</t> | |||
<t>When creating an IceCandidate object, JSEP | <t>When creating an IceCandidate object, JSEP | |||
implementations <bcp14>MUST</bcp14> populate each of the candidate, ufrag, | implementations <bcp14>MUST</bcp14> populate each of the candidate, ufrag, | |||
m= section index, and MID fields. Implementations <bcp14>MUST</bcp14 > also | "m=" section index, and MID fields. Implementations <bcp14>MUST</bcp 14> also | |||
be prepared to receive objects with some fields missing, as | be prepared to receive objects with some fields missing, as | |||
mentioned above.</t> | mentioned above.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.ice-candidate-policy" numbered="true" toc="default" > | <section anchor="sec.ice-candidate-policy" numbered="true" toc="default" > | |||
<name>ICE Candidate Policy</name> | <name>ICE Candidate Policy</name> | |||
<t>Typically, when gathering ICE candidates, the JSEP | <t>Typically, when gathering ICE candidates, the JSEP | |||
implementation will gather all possible forms of initial | implementation will gather all possible forms of initial | |||
candidates - host, server reflexive, and relay. However, in | candidates -- host, server-reflexive, and relay. | |||
<!-- [rfced] Sections 3.5.3 and 8: Per author feedback for | ||||
RFC 8839 and per other documents in this cluster, we hyphenated the | ||||
term "server reflexive". Please let us know any objections. | ||||
Original: | ||||
Typically, when gathering ICE candidates, the JSEP implementation | ||||
will gather all possible forms of initial candidates - host, server | ||||
reflexive, and relay. | ||||
... | ||||
Thus, | ||||
for instance, it is not possible to prevent the remote peer from | ||||
learning your public IP address by removing server reflexive | ||||
candidates. | ||||
Currently: | ||||
Typically, when gathering ICE candidates, the JSEP implementation | ||||
will gather all possible forms of initial candidates - host, server- | ||||
reflexive, and relay. | ||||
... | ||||
Thus, | ||||
for instance, it is not possible to prevent the remote peer from | ||||
learning your public IP address by removing server-reflexive | ||||
candidates. --> | ||||
However, in | ||||
certain cases, applications may want to have more specific | certain cases, applications may want to have more specific | |||
control over the gathering process, due to privacy or related | control over the gathering process, due to privacy or related | |||
concerns. For example, one may want to only use relay | concerns. For example, one may want to only use relay | |||
candidates, to leak as little location information as | candidates, to leak as little location information as | |||
possible (keeping in mind that this choice comes with | possible (keeping in mind that this choice comes with | |||
corresponding operational costs). To accomplish this, JSEP | corresponding operational costs). To accomplish this, JSEP | |||
allows the application to restrict which ICE candidates are | allows the application to restrict which ICE candidates are | |||
used in a session. Note that this filtering is applied on top | used in a session. Note that this filtering is applied on top | |||
of any restrictions the implementation chooses to enforce | of any restrictions the implementation chooses to enforce | |||
regarding which IP addresses are permitted for the | regarding which IP addresses are permitted for the | |||
application, as discussed in | application, as discussed in | |||
<xref target="RFCYYY3" format="default"/>.</t> | <xref target="RFC8828" format="default"/>.</t> | |||
<t>There may also be cases where the application wants to | <t>There may also be cases where the application wants to | |||
change which types of candidates are used while the session | change which types of candidates are used while the session | |||
is active. A prime example is where a callee may initially | is active. A prime example is where a callee may initially | |||
want to use only relay candidates, to avoid leaking location | want to use only relay candidates, to avoid leaking location | |||
information to an arbitrary caller, but then change to use | information to an arbitrary caller, but then change to use | |||
all candidates (for lower operational cost) once the user has | all candidates (for lower operational cost) once the user has | |||
indicated they want to take the call. For this scenario, the | indicated that they want to take the call. For this scenario, the | |||
JSEP implementation <bcp14>MUST</bcp14> allow the candidate policy to be | JSEP implementation <bcp14>MUST</bcp14> allow the candidate policy to be | |||
changed in mid-session, subject to the aforementioned | changed in mid-session, subject to the aforementioned | |||
interactions with local policy.</t> | interactions with local policy.</t> | |||
<t>To administer the ICE candidate policy, the JSEP | <t>To administer the ICE candidate policy, the JSEP | |||
implementation will determine the current setting at the | implementation will determine the current setting at the | |||
start of each gathering phase. Then, during the gathering | start of each gathering phase. Then, during the gathering | |||
phase, the implementation <bcp14>MUST NOT</bcp14> expose candidates | phase, the implementation <bcp14>MUST NOT</bcp14> expose candidates | |||
disallowed by the current policy to the application, use them | disallowed by the current policy to the application, use them | |||
as the source of connectivity checks, or indirectly expose | as the source of connectivity checks, or indirectly expose | |||
them via other fields, such as the raddr/rport attributes for | them via other fields, such as the raddr/rport attributes for | |||
other ICE candidates. Later, if a different policy is | other ICE candidates. Later, if a different policy is | |||
specified by the application, the application can apply it by | specified by the application, the application can apply it by | |||
kicking off a new gathering phase via an ICE restart.</t> | kicking off a new gathering phase via an ICE restart.</t> | |||
</section> | </section> | |||
<section anchor="sec.ice-candidate-pool" numbered="true" toc="default"> | <section anchor="sec.ice-candidate-pool" numbered="true" toc="default"> | |||
<name>ICE Candidate Pool</name> | <name>ICE Candidate Pool</name> | |||
<t>JSEP applications typically inform the JSEP implementation | <t>JSEP applications typically inform the JSEP implementation | |||
to begin ICE gathering via the information supplied to | to begin ICE gathering via the information supplied to | |||
setLocalDescription, as the local description indicates the | setLocalDescription, as the local description indicates the | |||
number of ICE components which will be needed and for which | number of ICE components that will be needed and for which | |||
candidates must be gathered. However, to accelerate cases | candidates must be gathered. However, to accelerate cases | |||
where the application knows the number of ICE components to | where the application knows the number of ICE components to | |||
use ahead of time, it may ask the implementation to gather a | use ahead of time, it may ask the implementation to gather a | |||
pool of potential ICE candidates to help ensure rapid media | pool of potential ICE candidates to help ensure rapid media | |||
setup.</t> | setup.</t> | |||
<t>When setLocalDescription is eventually called, and the | <!-- [rfced] We suggest clarifying "goes to gather" - perhaps "gathers", | |||
"starts to gather", "prepares to gather", etc. "goes to gather" may be | ||||
confusing for some readers. | ||||
Original: | ||||
When setLocalDescription is eventually called, and the JSEP | ||||
implementation goes to gather the needed ICE candidates, it SHOULD | ||||
start by checking if any candidates are available in the pool. | ||||
--> | ||||
<t>When setLocalDescription is eventually called and the | ||||
JSEP implementation goes to gather the needed ICE candidates, | JSEP implementation goes to gather the needed ICE candidates, | |||
it <bcp14>SHOULD</bcp14> start by checking if any candidates are avail able | it <bcp14>SHOULD</bcp14> start by checking if any candidates are avail able | |||
in the pool. If there are candidates in the pool, they <bcp14>SHOULD</ bcp14> | in the pool. If there are candidates in the pool, they <bcp14>SHOULD</ bcp14> | |||
be handed to the application immediately via the ICE | be handed to the application immediately via the ICE | |||
candidate event. If the pool becomes depleted, either because | candidate event. If the pool becomes depleted, either because | |||
a larger-than-expected number of ICE components is used, or | a larger-than-expected number of ICE components are used or | |||
because the pool has not had enough time to gather | because the pool has not had enough time to gather | |||
candidates, the remaining candidates are gathered as usual. | candidates, the remaining candidates are gathered as usual. | |||
This only occurs for the first offer/answer exchange, after | This only occurs for the first offer/answer exchange, after | |||
which the candidate pool is emptied and no longer used.</t> | which the candidate pool is emptied and no longer used.</t> | |||
<t>One example of where this concept is useful is an | <t>One example of where this concept is useful is an | |||
application that expects an incoming call at some point in | application that expects an incoming call at some point in | |||
the future, and wants to minimize the time it takes to | the future, and wants to minimize the time it takes to | |||
establish connectivity, to avoid clipping of initial media. | establish connectivity, to avoid clipping of initial media. | |||
By pre-gathering candidates into the pool, it can exchange | By pre-gathering candidates into the pool, it can exchange | |||
and start sending connectivity checks from these candidates | and start sending connectivity checks from these candidates | |||
almost immediately upon receipt of a call. Note though that | almost immediately upon receipt of a call. Note, though, that | |||
by holding on to these pre-gathered candidates, which will be | by holding on to these pre-gathered candidates, which will be | |||
kept alive as long as they may be needed, the application | kept alive as long as they may be needed, the application | |||
will consume resources on the STUN/TURN servers it is | will consume resources on the STUN/TURN servers it is | |||
using.</t> | using. ("STUN" stands for "Session Traversal Utilities for NAT".)</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>ICE Versions</name> | <name>ICE Versions</name> | |||
<t>While this specification formally relies on <xref target="RFC8445" format="default"/>, at the time of its publication, the | <t>While this specification formally relies on <xref target="RFC8445" format="default"/>, at the time of its publication, the | |||
majority of WebRTC implementations support the version | majority of WebRTC implementations support the version | |||
of ICE described in <xref target="RFC5245" format="default"/>. The use | of ICE described in <xref target="RFC5245" format="default"/>. The "ic | |||
of | e2" attribute defined in <xref target="RFC8445" format="default"/> | |||
the "ice2" attribute defined in <xref target="RFC8445" format="default | ||||
"/> | ||||
can be used to detect the version in use by a remote endpoint | can be used to detect the version in use by a remote endpoint | |||
and to provide a smooth transition from the older specification | and to provide a smooth transition from the older specification | |||
to the newer one. Implementations <bcp14>MUST</bcp14> be able to acce pt remote | to the newer one. Implementations <bcp14>MUST</bcp14> be able to acce pt remote | |||
descriptions that do not have the "ice2" attribute.</t> | descriptions that do not have the "ice2" attribute.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.imageattr" numbered="true" toc="default"> | <section anchor="sec.imageattr" numbered="true" toc="default"> | |||
<name>Video Size Negotiation</name> | <name>Video Size Negotiation</name> | |||
<t>Video size negotiation is the process through which a | <t>Video size negotiation is the process through which a | |||
receiver can use the "a=imageattr" SDP attribute | receiver can use the "a=imageattr" SDP attribute | |||
skipping to change at line 672 ¶ | skipping to change at line 800 ¶ | |||
what its video decoder can process, or it may have some maximum | what its video decoder can process, or it may have some maximum | |||
set by policy. By specifying these limits in an "a=imageattr" | set by policy. By specifying these limits in an "a=imageattr" | |||
attribute, JSEP endpoints can attempt to ensure that the remote | attribute, JSEP endpoints can attempt to ensure that the remote | |||
sender transmits video at an acceptable resolution. However, | sender transmits video at an acceptable resolution. However, | |||
when communicating with a non-JSEP endpoint that does not | when communicating with a non-JSEP endpoint that does not | |||
understand this attribute, any signaled limits may be exceeded, | understand this attribute, any signaled limits may be exceeded, | |||
and the JSEP implementation <bcp14>MUST</bcp14> handle this gracefully, e.g., | and the JSEP implementation <bcp14>MUST</bcp14> handle this gracefully, e.g., | |||
by discarding the video.</t> | by discarding the video.</t> | |||
<t>Note that certain codecs support transmission of samples | <t>Note that certain codecs support transmission of samples | |||
with aspect ratios other than 1.0 (i.e., non-square pixels). | with aspect ratios other than 1.0 (i.e., non-square pixels). | |||
JSEP implementations will not transmit non-square pixels, but | JSEP implementations will not transmit non-square pixels but | |||
<bcp14>SHOULD</bcp14> receive and render such video with the correct asp ect | <bcp14>SHOULD</bcp14> receive and render such video with the correct asp ect | |||
ratio. However, sample aspect ratio has no impact on the size | ratio. However, sample aspect ratio has no impact on the size | |||
negotiation described below; all dimensions are measured in | negotiation described below; all dimensions are measured in | |||
pixels, whether square or not.</t> | pixels, whether square or not.</t> | |||
<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 intersect any known local limits | <t>The receiver will first intersect any known local limits | |||
(e.g., hardware decoder capababilities, local policy) to | (e.g., hardware decoder capabilities, 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</bcp14> 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 | <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 | |||
<bcp14>RECOMMENDED</bcp14>. However, when the supported video codecs h ave | <bcp14>RECOMMENDED</bcp14>. However, when the supported video codecs h ave | |||
different limitations, specific "a=imageattr" attributes <bcp14>MUST</ bcp14> | different limitations, specific "a=imageattr" attributes <bcp14>MUST</ bcp14> | |||
be inserted for each payload type.</t> | be inserted for each payload type.</t> | |||
<t>As an example, consider a system with a multiformat video | <t>As an example, consider a system with a multiformat video | |||
decoder, which is capable of decoding any resolution from | decoder, which is capable of decoding any resolution from | |||
48x48 to 720p, In this case, the implementation would | 48x48 to 720p. In this case, the implementation would | |||
generate this attribute:</t> | generate this attribute:</t> | |||
<t>a=imageattr:* recv [x=[48:1280],y=[48:720],q=1.0]</t> | <t>a=imageattr:* recv [x=[48:1280],y=[48:720],q=1.0]</t> | |||
<t>This declaration indicates that the receiver is capable of | <t>This declaration indicates that the receiver is capable of | |||
decoding any image resolution from 48x48 up to 1280x720 | decoding any image resolution from 48x48 up to 1280x720 | |||
pixels.</t> | pixels.</t> | |||
</section> | </section> | |||
<section anchor="sec.interpreting-imageattr" numbered="true" toc="defaul t"> | <section anchor="sec.interpreting-imageattr" numbered="true" toc="defaul t"> | |||
<name>Interpreting imageattr Attributes</name> | <name>Interpreting imageattr Attributes</name> | |||
<t> | <t> | |||
<xref target="RFC6236" format="default"/> defines "a=imageattr" to be an | <xref target="RFC6236" format="default"/> defines "a=imageattr" to be an | |||
advisory field. This means that it does not absolutely | advisory field. This means that it does not absolutely | |||
constrain the video formats that the sender can use, but | constrain the video formats that the sender can use but | |||
gives an indication of the preferred values.</t> | gives an indication of the preferred values.</t> | |||
<t>This specification prescribes more specific behavior. When | <t>This specification prescribes behavior that is more specific. When | |||
a MediaStreamTrack, which is producing video of a certain | a MediaStreamTrack, which is producing video of a certain | |||
resolution (the "track resolution"), is attached to a | resolution (the "track resolution"), is attached to an | |||
RtpSender, which is encoding the track video at the same or | RtpSender, which is encoding the track video at the same or | |||
lower resolution(s) (the "encoder resolutions"), and a remote | lower resolution(s) (the "encoder resolutions"), and a remote | |||
description is applied that references the sender and | description is applied that references the sender and | |||
contains valid "a=imageattr recv" attributes, it <bcp14>MUST</bcp14> f ollow | contains valid "a=imageattr recv" attributes, it <bcp14>MUST</bcp14> f ollow | |||
the rules below to ensure the sender does not transmit a | the rules below to ensure that the sender does not transmit a | |||
resolution that would exceed the size criteria specified in | resolution that would exceed the size criteria specified in | |||
the attributes. These rules <bcp14>MUST</bcp14> be followed as long as the | the attributes. These rules <bcp14>MUST</bcp14> be followed as long as the | |||
attributes remain present in the remote description, | attributes remain present in the remote description, | |||
including cases in which the track changes its resolution, or | including cases in which the track changes its resolution or | |||
is replaced with a different track.</t> | is replaced with a different track.</t> | |||
<t>Depending on how the RtpSender is configured, it may be | <t>Depending on how the RtpSender is configured, it may be | |||
producing a single encoding at a certain resolution, or, if | producing a single encoding at a certain resolution or, if | |||
simulcast | simulcast | |||
<xref target="sec.simulcast" format="default"/> has been negotiated, m ultiple | (<xref target="sec.simulcast" format="default"/>) has been negotiated, multiple | |||
encodings, each at their own specific resolution. In | encodings, each at their own specific resolution. In | |||
addition, depending on the configuration, each encoding may | addition, depending on the configuration, each encoding may | |||
have the flexibility to reduce resolution when needed, or may | have the flexibility to reduce resolution when needed or may | |||
be locked to a specific output resolution.</t> | be locked to a specific output resolution.</t> | |||
<t>For each encoding being produced by the RtpSender, the set | <t>For each encoding being produced by the RtpSender, the set | |||
of "a=imageattr recv" attributes in the corresponding m= | of "a=imageattr recv" attributes in the corresponding "m=" | |||
section of the remote description is processed to determine | section of the remote description is processed to determine | |||
what should be transmitted. Only attributes that reference | what should be transmitted. Only attributes that reference | |||
the media format selected for the encoding are considered; | the media format selected for the encoding are considered; | |||
each such attribute is evaluated individually, starting with | each such attribute is evaluated individually, starting with | |||
the attribute with the highest "q=" value. If multiple | the attribute with the highest "q=" value. If multiple | |||
attributes have the same "q=" value, they are evaluated in | attributes have the same "q=" value, they are evaluated in | |||
the order they appear in their containing m= section. Note | the order they appear in their containing "m=" section. Note | |||
that while JSEP endpoints will include at most one | that while JSEP endpoints will include at most one | |||
"a=imageattr recv" attribute per media format, JSEP endpoints | "a=imageattr recv" attribute per media format, JSEP endpoints | |||
may receive session descriptions from non-JSEP endpoints with | may receive session descriptions from non-JSEP endpoints with | |||
m= sections that contain multiple such attributes.</t> | "m=" sections that contain multiple such attributes.</t> | |||
<t>For each "a=imageattr recv" attribute, the following rules | <t>For each "a=imageattr recv" attribute, the following rules | |||
are applied. If this processing is successful, the encoding | are applied. If this processing is successful, the encoding | |||
is transmitted accordingly, and no further attributes are | is transmitted accordingly, and no further attributes are | |||
considered for that encoding. Otherwise, the next attribute | considered for that encoding. Otherwise, the next attribute | |||
is evaluated, in the aforementioned order. If none of the | is evaluated, in the aforementioned order. If none of the | |||
supplied attributes can be processed successfully, the | supplied attributes can be processed successfully, the | |||
encoding <bcp14>MUST NOT</bcp14> be transmitted, and an error <bcp14>S HOULD</bcp14> be | encoding <bcp14>MUST NOT</bcp14> be transmitted, and an error <bcp14>S HOULD</bcp14> be | |||
raised to the application. | raised to the application. | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The limits from the attribute are compared to the | <li>The limits from the attribute are compared to the | |||
encoder resolution. Only the specific limits mentioned | encoder resolution. Only the specific limits mentioned | |||
below are considered; any other values, such as picture | below are considered; any other values, such as picture | |||
aspect ratio, <bcp14>MUST</bcp14> be ignored. When considering a | aspect ratio, <bcp14>MUST</bcp14> be ignored. When considering a | |||
MediaStreamTrack that is producing rotated video, the | MediaStreamTrack that is producing rotated video, the | |||
unrotated resolution <bcp14>MUST</bcp14> be used for the checks. Thi s is | unrotated resolution <bcp14>MUST</bcp14> be used for the checks. Thi s is | |||
required regardless of whether the receiver supports | required regardless of whether the receiver supports | |||
performing receive-side rotation (e.g., through CVO | performing receive-side rotation (e.g., through Coordination of | |||
Video Orientation (CVO) | ||||
<xref target="TS26.114" format="default"/>), as it significantly sim plifies | <xref target="TS26.114" format="default"/>), as it significantly sim plifies | |||
the matching logic.</li> | the matching logic.</li> | |||
<li>If the attribute includes a "sar=" (sample aspect ratio) | <li>If the attribute includes a "sar=" (sample aspect ratio) | |||
value set to something other than "1.0", indicating the | value set to something other than "1.0", indicating that the | |||
receiver wants to receive non-square pixels, this cannot be | receiver wants to receive non-square pixels, this cannot be | |||
satisfied and the attribute <bcp14>MUST NOT</bcp14> be used.</li> | satisfied and the attribute <bcp14>MUST NOT</bcp14> be used.</li> | |||
<li>If the encoder resolution exceeds the maximum size | <li>If the encoder resolution exceeds the maximum size | |||
permitted by the attribute, and the encoder is allowed to | permitted by the attribute and the encoder is allowed to | |||
adjust its resolution, the encoder <bcp14>SHOULD</bcp14> apply downs caling | adjust its resolution, the encoder <bcp14>SHOULD</bcp14> apply downs caling | |||
in order to satisfy the limits. Downscaling <bcp14>MUST NOT</bcp14> change | in order to satisfy the limits. Downscaling <bcp14>MUST NOT</bcp14> change | |||
the picture aspect ratio of the encoding, ignoring any | the picture aspect ratio of the encoding, ignoring any | |||
trivial differences due to rounding. For example, if the | trivial differences due to rounding. For example, if the | |||
encoder resolution is 1280x720, and the attribute specified | encoder resolution is 1280x720 and the attribute specified | |||
a maximum of 640x480, the expected output resolution would | a maximum of 640x480, the expected output resolution would | |||
be 640x360. If downscaling cannot be applied, the attribute | be 640x360. If downscaling cannot be applied, the attribute | |||
<bcp14>MUST NOT</bcp14> be used.</li> | <bcp14>MUST NOT</bcp14> be used.</li> | |||
<li>If the encoder resolution is less than the minimum size | <li>If the encoder resolution is less than the minimum size | |||
permitted by the attribute, the attribute <bcp14>MUST NOT</bcp14> be used; | permitted by the attribute, the attribute <bcp14>MUST NOT</bcp14> be used; | |||
the encoder <bcp14>MUST NOT</bcp14> apply upscaling. JSEP implementa tions | the encoder <bcp14>MUST NOT</bcp14> apply upscaling. JSEP implementa tions | |||
<bcp14>SHOULD</bcp14> avoid this situation by allowing receipt of | <bcp14>SHOULD</bcp14> avoid this situation by allowing receipt of | |||
arbitrarily small resolutions, perhaps via fallback to a | arbitrarily small resolutions, perhaps via fallback to a | |||
software decoder.</li> | software decoder.</li> | |||
<li>If the encoder resolution is within the maximum and | <li>If the encoder resolution is within the maximum and | |||
minimum sizes, no action is needed.</li> | minimum sizes, no action is needed.</li> | |||
</ul> | </ul> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.simulcast" numbered="true" toc="default"> | <section anchor="sec.simulcast" numbered="true" toc="default"> | |||
<name>Simulcast</name> | <name>Simulcast</name> | |||
<t>JSEP supports simulcast transmission of a MediaStreamTrack, | <t>JSEP supports simulcast transmission of a MediaStreamTrack, | |||
where multiple encodings of the source media can be transmitted | where multiple encodings of the source media can be transmitted | |||
within the context of a single m= section. The current JSEP API | within the context of a single "m=" section. The current JSEP API | |||
is designed to allow applications to send simulcasted media but | is designed to allow applications to send simulcasted media but | |||
only to receive a single encoding. This allows for multi-user | only to receive a single encoding. This allows for multi-user | |||
scenarios where each sending client sends multiple encodings to | scenarios where each sending client sends multiple encodings to | |||
a server, which then, for each receiving client, chooses the | a server, which then, for each receiving client, chooses the | |||
appropriate encoding to forward.</t> | appropriate encoding to forward.</t> | |||
<t>Applications request support for simulcast by configuring | <t>Applications request support for simulcast by configuring | |||
multiple encodings on an RtpSender. Upon generation of an offer | multiple encodings on an RtpSender. Upon generation of an offer | |||
or answer, these encodings are indicated via SDP markings on | or answer, these encodings are indicated via SDP markings on | |||
the corresponding m= section, as described below. Receivers | the corresponding "m=" section, as described below. Receivers | |||
that understand simulcast and are willing to receive it will | that understand simulcast and are willing to receive it will | |||
also include SDP markings to indicate their support, and JSEP | also include SDP markings to indicate their support, and JSEP | |||
endpoints will use these markings to determine whether | endpoints will use these markings to determine whether | |||
simulcast is permitted for a given RtpSender. If simulcast | simulcast is permitted for a given RtpSender. If simulcast | |||
support is not negotiated, the RtpSender will only use the | support is not negotiated, the RtpSender will only use the | |||
first configured encoding.</t> | first configured encoding.</t> | |||
<t>Note that the exact simulcast parameters are up to the | <t>Note that the exact simulcast parameters are up to the | |||
sending application. While the aforementioned SDP markings are | sending application. While the aforementioned SDP markings are | |||
provided to ensure the remote side can receive and demux | provided to ensure that the remote side can receive and demux | |||
multiple simulcast encodings, the specific resolutions and | multiple simulcast encodings, the specific resolutions and | |||
bitrates to be used for each encoding are purely a send-side | bitrates to be used for each encoding are purely a send-side | |||
decision in JSEP.</t> | decision in JSEP.</t> | |||
<t>JSEP currently does not provide a mechanism to configure | <t>JSEP currently does not provide a mechanism to configure | |||
receipt of simulcast. This means that if simulcast is offered | receipt of simulcast. This means that if simulcast is offered | |||
by the remote endpoint, the answer generated by a JSEP endpoint | by the remote endpoint, the answer generated by a JSEP endpoint | |||
will not indicate support for receipt of simulcast, and as such | will not indicate support for receipt of simulcast, and as such | |||
the remote endpoint will only send a single encoding per m= | the remote endpoint will only send a single encoding per "m=" | |||
section.</t> | section.</t> | |||
<t>In addition, JSEP does not provide a mechanism to handle an | <t>In addition, JSEP does not provide a mechanism to handle an | |||
incoming offer requesting simulcast from the JSEP endpoint. | incoming offer requesting simulcast from the JSEP endpoint. | |||
This means that setting up simulcast in the case where the JSEP | This means that setting up simulcast in the case where the JSEP | |||
endpoint receives the initial offer requires out-of-band | endpoint receives the initial offer requires out-of-band | |||
signaling or SDP inspection. However, in the case where the | signaling or SDP inspection. However, in the case where the | |||
JSEP endpoint sets up simulcast in its in initial offer, any | JSEP endpoint sets up simulcast in its initial offer, any | |||
established simulcast streams will continue to work upon | established simulcast streams will continue to work upon | |||
receipt of an incoming re-offer. Future versions of this | receipt of an incoming re-offer. Future versions of this | |||
specification may add additional APIs to handle the incoming | specification may add additional APIs to handle the incoming | |||
initial offer scenario.</t> | initial offer scenario.</t> | |||
<t>When using JSEP to transmit multiple encodings from a | <t>When using JSEP to transmit multiple encodings from an | |||
RtpSender, the techniques from | RtpSender, the techniques from | |||
<xref target="RFCYYYE" format="default"/> and | <xref target="RFC8853" format="default"/> and | |||
<xref target="RFCYYYC" format="default"/> are used. Specifically, | <xref target="RFC8851" format="default"/> are used. Specifically, | |||
when multiple encodings have been configured for a RtpSender, | when multiple encodings have been configured for an RtpSender, | |||
the m= section for the RtpSender will include an "a=simulcast" | the "m=" section for the RtpSender will include an "a=simulcast" | |||
attribute, as defined in | attribute, as defined in | |||
<xref target="RFCYYYE" sectionFormat="comma" section="6.2"/>, | <xref target="RFC8853" sectionFormat="comma" section="6.2"/>, | |||
with a "send" simulcast stream description that lists each | with a "send" simulcast stream description that lists each | |||
desired encoding, and no "recv" simulcast stream description. | desired encoding, and no "recv" simulcast stream description. | |||
The m= section will also include an "a=rid" attribute for each | ||||
<!-- [rfced] Sections 3.7 and 5.2.1: We do not see "a=simulcast" or | ||||
"send" mentioned anywhere in Section 6.2 of | ||||
RFC 8853 [I-D.ietf-mmusic-sdp-simulcast]. Please confirm that these citations | ||||
are correct and will be clear to readers. | ||||
Original: | ||||
Specifically, when multiple | ||||
encodings have been configured for a RtpSender, the m= section for | ||||
the RtpSender will include an "a=simulcast" attribute, as defined in | ||||
[I-D.ietf-mmusic-sdp-simulcast], Section 6.2, with a "send" simulcast | ||||
stream description that lists each desired encoding, and no "recv" | ||||
simulcast stream description. | ||||
... | ||||
o If the RtpTransceiver has a sendrecv or sendonly direction and | ||||
more than one "a=rid" line has been generated, an "a=simulcast" | ||||
line, with direction "send", as defined in | ||||
[I-D.ietf-mmusic-sdp-simulcast], Section 6.2. --> | ||||
The "m=" section will also include an "a=rid" attribute for each | ||||
encoding, as specified in | encoding, as specified in | |||
<xref target="RFCYYYC" sectionFormat="comma" section="4"/>; the use of | <xref target="RFC8851" sectionFormat="comma" section="4"/>; the use of | |||
RID identifiers allows the individual encodings to be | Restriction Identifiers (RIDs) 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 | <xref target="RFC3261" format="default"/> defines both a "parallel searc | |||
h" | h" | |||
and "Sequential Search". Although these are primarily signaling | and "sequential search". Although these are primarily signaling-level is | |||
level issues that are outside the scope of JSEP, they do have | 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 of 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 | |||
application. The basic operations that the applications can | application. The basic operations that the applications can | |||
have the media engine do are: | have the media engine do are as follows: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>Start exchanging media with a given remote peer, but keep | <li>Start exchanging media with a given remote peer, but keep | |||
all the resources reserved in the offer.</li> | all the resources reserved in the offer.</li> | |||
<li>Start exchanging media with a given remote peer, and free | <li>Start exchanging media with a given remote peer, and free | |||
any resources in the offer that are not being used.</li> | any resources in the offer that are not being used.</li> | |||
</ul> | </ul> | |||
<section anchor="sec.sequential-forking" numbered="true" toc="default"> | <section anchor="sec.sequential-forking" numbered="true" toc="default"> | |||
<name>Sequential Forking</name> | <name>Sequential Forking</name> | |||
<t>Sequential forking involves a call being dispatched to | <t>Sequential forking involves a call being dispatched to | |||
multiple remote callees, where each callee can accept the | multiple remote callees, where each callee can accept the | |||
call, but only one active session ever exists at a time; no | call, but only one active session ever exists at a time; no | |||
mixing of received media is performed.</t> | mixing of received media is performed.</t> | |||
<t>JSEP handles sequential forking well, allowing the | <t>JSEP handles sequential forking well, allowing the | |||
application to easily control the policy for selecting the | application to easily control the policy for selecting the | |||
desired remote endpoint. When an answer arrives from one of | desired remote endpoint. When an answer arrives from one of | |||
the callees, the application can choose to apply it either as | the callees, the application can choose to apply it as either | |||
a provisional answer, leaving open the possibility of using a | (1) a provisional answer, leaving open the possibility of using a | |||
different answer in the future, or apply it as a final | different answer in the future or (2) a final | |||
answer, ending the setup flow.</t> | answer, ending the setup flow.</t> | |||
<t>In a "first-one-wins" situation, the first answer will be | <t>In a "first-one-wins" situation, the first answer will be | |||
applied as a final answer, and the application will reject | applied as a final answer, and the application will reject | |||
any subsequent answers. In SIP parlance, this would be ACK + | any subsequent answers. In SIP parlance, this would be ACK + | |||
BYE.</t> | BYE.</t> | |||
<t>In a "last-one-wins" situation, all answers would be | <t>In a "last-one-wins" situation, all answers would be | |||
applied as provisional answers, and any previous call leg | applied as provisional answers, and any previous call leg | |||
will be terminated. At some point, the application will end | will be terminated. At some point, the application will end | |||
the setup process, perhaps with a timer; at this point, the | the setup process, perhaps with a timer; at this point, the | |||
application could reapply the pending remote description as a | application could reapply the pending remote description as a | |||
final answer.</t> | final answer.</t> | |||
</section> | </section> | |||
<section anchor="sec.parallel-forking" numbered="true" toc="default"> | <section anchor="sec.parallel-forking" numbered="true" toc="default"> | |||
<name>Parallel Forking</name> | <name>Parallel Forking</name> | |||
<t>Parallel forking involves a call being dispatched to | <t>Parallel forking involves a call being dispatched to | |||
multiple remote callees, where each callee can accept the | multiple remote callees, where each callee can accept the | |||
call, and multiple simultaneous active signaling sessions can | call and multiple simultaneous active signaling sessions can | |||
be established as a result. If multiple callees send media at | be established as a result. If multiple callees send media at | |||
the same time, the possibilities for handling this are | the same time, the possibilities for handling this are | |||
described in | described in | |||
<xref target="RFC3960" sectionFormat="comma" section="3.1"/>. Most SIP devices | <xref target="RFC3960" sectionFormat="comma" section="3.1"/>. Most SIP devices | |||
today only support exchanging media with a single device at a | today only support exchanging media with a single device at a | |||
time, and do not try to mix multiple early media audio | time and do not try to mix multiple early media audio | |||
sources, as that could result in a confusing situation. For | sources, as that could result in a confusing situation. For | |||
example, consider having a European ringback tone mixed | example, consider having a European ringback tone mixed | |||
together with the North American ringback tone - the | together with the North American ringback tone -- the | |||
resulting sound would not be like either tone, and would | resulting sound would not be like either tone and would | |||
confuse the user. If the signaling application wishes to only | confuse the user. If the signaling application wishes to only | |||
exchange media with one of the remote endpoints at a time, | exchange media with one of the remote endpoints at a time, | |||
then from a media engine point of view, this is exactly like | then from a media engine point of view, this is exactly like | |||
the sequential forking case.</t> | the sequential forking case.</t> | |||
<t>In the parallel forking case where the JavaScript | <t>In the parallel forking case where the JavaScript | |||
application wishes to simultaneously exchange media with | application wishes to simultaneously exchange media with | |||
multiple peers, the flow is slightly more complex, but the | multiple peers, the flow is slightly more complex, but the | |||
JavaScript application can follow the strategy that | JavaScript application can follow the strategy that | |||
<xref target="RFC3960" format="default"/> describes using UPDATE. The | <xref target="RFC3960" format="default"/> describes, using UPDATE. The | |||
UPDATE approach allows the signaling to set up a separate | UPDATE approach allows the signaling to set up a separate | |||
media flow for each peer that it wishes to exchange media | media flow for each peer that it wishes to exchange media | |||
with. In JSEP, this offer used in the UPDATE would be formed | with. In JSEP, this offer used in the UPDATE would be formed | |||
by simply creating a new PeerConnection (see | by simply creating a new PeerConnection (see | |||
<xref target="sec.peerconnection" format="default"/>) and making sure that | <xref target="sec.peerconnection" format="default"/>) and making sure that | |||
the same local media streams have been added into this new | the same local media streams have been added into this new | |||
PeerConnection. Then the new PeerConnection object would | PeerConnection. Then the new PeerConnection object would | |||
produce a SDP offer that could be used by the signaling to | produce an SDP offer that could be used by the signaling to | |||
perform the UPDATE strategy discussed in | perform the UPDATE strategy discussed in | |||
<xref target="RFC3960" format="default"/>.</t> | <xref target="RFC3960" format="default"/>.</t> | |||
<t>As a result of sharing the media streams, the application | <t>As a result of sharing the media streams, the application | |||
will end up with N parallel PeerConnection sessions, each | will end up with N parallel PeerConnection sessions, each | |||
with a local and remote description and their own local and | with a local and remote description and their own local and | |||
remote addresses. The media flow from these sessions can be | remote addresses. The media flow from these sessions can be | |||
managed using setDirection (see | managed using setDirection (see | |||
<xref target="sec.transceiver-set-direction" format="default"/>), or t he | <xref target="sec.transceiver-set-direction" format="default"/>), or t he | |||
application can choose to play out the media from all | application can choose to play out the media from all | |||
sessions mixed together. Of course, if the application wants | sessions mixed together. Of course, if the application wants | |||
to only keep a single session, it can simply terminate the | to only keep a single session, it can simply terminate the | |||
sessions that it no longer needs.</t> | sessions that it no longer needs.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.interface" numbered="true" toc="default"> | <section anchor="sec.interface" numbered="true" toc="default"> | |||
<name>Interface</name> | <name>Interface</name> | |||
<t>This section details the basic operations that must be present | <t>This section details the basic operations that must be present | |||
to implement JSEP functionality. The actual API exposed in the | to implement JSEP functionality. The actual API exposed in the | |||
W3C API may have somewhat different syntax, but should map easily | W3C API may have somewhat different syntax but should map easily | |||
to these concepts.</t> | to these concepts. | |||
<!-- [rfced] Sections 4 and 7: For ease of the reader, please let | ||||
us know if we may cite [W3C.webrtc] as a reminder regarding | ||||
"addTrack," "removeTrack," etc. (Section 4) as well as | ||||
"onicecandidate," "addIceCandidate," and "ontrack" (Section 7), | ||||
as follows. | ||||
Original: | ||||
The actual API exposed in the W3C API | ||||
may have somewhat different syntax, but should map easily to these | ||||
concepts. | ||||
... | ||||
More examples of SDP for WebRTC call flows, including examples with | ||||
IPv6 addresses, can be found in [I-D.ietf-rtcweb-sdp]. | ||||
Suggested: | ||||
The actual API exposed in the W3C API [W3C.webrtc] | ||||
may have somewhat different syntax but should map easily to these | ||||
concepts. | ||||
... | ||||
More examples of SDP for WebRTC call flows, including examples with | ||||
IPv6 addresses, can be found in [SDP4WebRTC]. See [W3C.webrtc] for | ||||
information regarding "onicecandidate," "addIceCandidate," and | ||||
"ontrack". --> | ||||
</t> | ||||
<section anchor="sec.peerconnection" numbered="true" toc="default"> | <section anchor="sec.peerconnection" numbered="true" toc="default"> | |||
<name>PeerConnection</name> | <name>PeerConnection</name> | |||
<section anchor="sec.pc-constructor" numbered="true" toc="default"> | <section anchor="sec.pc-constructor" numbered="true" toc="default"> | |||
<name>Constructor</name> | <name>Constructor</name> | |||
<t>The PeerConnection constructor allows the application to | <t>The PeerConnection constructor allows the application to | |||
specify global parameters for the media session, such as the | specify global parameters for the media session, such as the | |||
STUN/TURN servers and credentials to use when gathering | STUN/TURN servers and credentials to use when gathering | |||
candidates, as well as the initial ICE candidate policy and | candidates, as well as the initial ICE candidate policy and | |||
pool size, and also the bundle policy to use.</t> | pool size, and also the bundle policy to use.</t> | |||
<t>If an ICE candidate policy is specified, it functions as | <t>If an ICE candidate policy is specified, it functions as | |||
described in | described in | |||
<xref target="sec.ice-candidate-policy" format="default"/>, causing th e JSEP | <xref target="sec.ice-candidate-policy" format="default"/>, causing th e JSEP | |||
implementation to only surface the permitted candidates | implementation to only surface the permitted candidates | |||
(including any implementation-internal filtering) to the | (including any implementation-internal filtering) to the | |||
application, and only use those candidates for connectivity | application and only use those candidates for connectivity | |||
checks. The set of available policies is as follows: | checks. The set of available policies is as follows: | |||
</t> | </t> | |||
<dl newline="false" spacing="normal"> | <dl newline="false" spacing="normal"> | |||
<dt>all:</dt> | <dt>all:</dt> | |||
<dd>All candidates permitted by | <dd>All candidates permitted by | |||
implementation policy will be gathered and used.</dd> | implementation policy will be gathered and used.</dd> | |||
<dt>relay:</dt> | <dt>relay:</dt> | |||
<dd>All candidates except relay candidates | <dd>All candidates except relay candidates | |||
will be filtered out. This obfuscates the location | will be filtered out. This obfuscates the location | |||
information that might be ascertained by the remote peer | information that might be ascertained by the remote peer | |||
from the received candidates. Depending on how the | from the received candidates. Depending on how the | |||
application deploys and chooses relay servers, this could | application deploys and chooses relay servers, this could | |||
obfuscate location to a metro or possibly even global | obfuscate location to a metro or possibly even global | |||
level.</dd> | level.</dd> | |||
</dl> | </dl> | |||
<t>The default ICE candidate policy <bcp14>MUST</bcp14> be set to "all | <t>The default ICE candidate policy <bcp14>MUST</bcp14> be set to "all | |||
" as | ", as | |||
this is generally the desired policy, and also typically | this is generally the desired policy and also typically | |||
reduces use of application TURN server resources | reduces the use of application TURN server resources | |||
significantly.</t> | significantly.</t> | |||
<t>If a size is specified for the ICE candidate pool, this | <t>If a size is specified for the ICE candidate pool, this | |||
indicates the number of ICE components to pre-gather | indicates the number of ICE components to pre-gather | |||
candidates for. Because pre-gathering results in utilizing | candidates for. Because pre&nbhy;gathering results in utilizing | |||
STUN/TURN server resources for potentially long periods of | STUN/TURN server resources for potentially long periods of | |||
time, this must only occur upon application request, and | time, this must only occur upon application request, and | |||
therefore the default candidate pool size <bcp14>MUST</bcp14> be zero. </t> | therefore the default candidate pool size <bcp14>MUST</bcp14> be zero. </t> | |||
<t>The application can specify its preferred policy regarding | <t>The application can specify its preferred policy regarding | |||
use of bundle, the multiplexing mechanism defined in | use of bundle, the multiplexing mechanism defined in | |||
<xref target="RFCYYYB" format="default"> | <xref target="RFC8843" format="default"> | |||
</xref>. Regardless of policy, the application will always | </xref>. Regardless of policy, the application will always | |||
try to negotiate bundle onto a single transport, and will | try to negotiate bundle onto a single transport and will | |||
offer a single bundle group across all m= sections; use of | offer a single bundle group across all "m=" sections; use of | |||
this single transport is contingent upon the answerer | this single transport is contingent upon the answerer | |||
accepting bundle. However, by specifying a policy from the | accepting bundle. However, by specifying a policy from the | |||
list below, the application can control exactly how | list below, the application can control exactly how | |||
aggressively it will try to bundle media streams together, | aggressively it will try to bundle media streams together, | |||
which affects how it will interoperate with a | which affects how it will interoperate with a | |||
non-bundle-aware endpoint. When negotiating with a | non-bundle-aware endpoint. When negotiating with a | |||
non-bundle-aware endpoint, only the streams not marked as | non-bundle-aware endpoint, only the streams not marked as | |||
bundle-only streams will be established.</t> | bundle-only streams will be established.</t> | |||
<t>The set of available policies is as follows: | <t>The set of available policies is as follows: | |||
</t> | </t> | |||
<dl newline="false" spacing="normal"> | <dl newline="false" spacing="normal"> | |||
<dt>balanced:</dt> | <dt>balanced:</dt> | |||
<dd>The first m= section of each type | <dd>The first "m=" section of each type | |||
(audio, video, or application) will contain transport | (audio, video, or application) will contain transport | |||
parameters, which will allow an answerer to unbundle that | parameters, which will allow an answerer to unbundle that | |||
section. The second and any subsequent m= section of each | section. The second and any subsequent "m=" sections of each | |||
type will be marked bundle-only. The result is that if | type will be marked bundle-only. The result is that if | |||
there are N distinct media types, then candidates will be | there are N distinct media types, then candidates will be | |||
gathered for for N media streams. This policy balances | gathered for N media streams. This policy balances | |||
desire to multiplex with the need to ensure basic audio and | desire to multiplex with the need to ensure that basic audio and | |||
video can still be negotiated in legacy cases. When acting | video can still be negotiated in legacy cases. When acting | |||
as answerer, if there is no bundle group in the offer, the | as answerer, if there is no bundle group in the offer, the | |||
implementation will reject all but the first m= section of | implementation will reject all but the first "m=" section of | |||
each type.</dd> | each type.</dd> | |||
<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 will allow all streams to be received by | This policy will allow all streams to be received by | |||
non-bundle-aware endpoints, but require separate candidates | non-bundle-aware endpoints but will require separate candidates | |||
to be gathered for each media stream.</dd> | to be gathered for each media stream.</dd> | |||
<dt>max-bundle:</dt> | <dt>max-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 aims to | first will be marked as bundle-only. This policy aims to | |||
minimize candidate gathering and maximize multiplexing, at | minimize candidate gathering and maximize multiplexing, 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 tradeoff 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>The application can specify its preferred policy regarding | <t>The application can specify its preferred policy regarding | |||
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> | |||
<dt>require:</dt> | <dt>require:</dt> | |||
<dd>The JSEP implementation will only | <dd>The JSEP implementation will only | |||
gather RTP candidates and will insert an "a=rtcp-mux-only" | gather RTP candidates and will insert an "a=rtcp-mux-only" | |||
indication into any new m= sections in offers it generates. | indication into any new "m=" sections in offers it generates. | |||
This halves the number of candidates that the offerer needs | This halves the number of candidates that the offerer needs | |||
to gather. Applying a description with an m= section that | to gather. Applying a description with an "m=" section that | |||
does not contain an "a=rtcp-mux" attribute will cause an | does not contain an "a=rtcp-mux" attribute will cause an | |||
error to be returned.</dd> | error to be returned.</dd> | |||
</dl> | </dl> | |||
<t>The default multiplexing policy <bcp14>MUST</bcp14> be set to "requ ire". | <t>The default multiplexing policy <bcp14>MUST</bcp14> be set to "requ ire". | |||
Implementations <bcp14>MAY</bcp14> choose to reject attempts by the | Implementations <bcp14>MAY</bcp14> choose to reject attempts by the | |||
application to set the multiplexing policy to | application to set the multiplexing policy to | |||
"negotiate".</t> | "negotiate".</t> | |||
</section> | </section> | |||
<section anchor="sec.addTrack" numbered="true" toc="default"> | <section anchor="sec.addTrack" numbered="true" toc="default"> | |||
<name>addTrack</name> | <name>addTrack</name> | |||
<t>The addTrack method adds a MediaStreamTrack to the | <t>The addTrack method adds a MediaStreamTrack to the | |||
PeerConnection, using the MediaStream argument to associate | PeerConnection, using the MediaStream argument to associate | |||
the track with other tracks in the same MediaStream, so that | the track with other tracks in the same MediaStream, so that | |||
they can be added to the same "LS" group when creating an | they can be added to the same "LS" (Lip Synchronization) group when cr eating an | |||
offer or answer. Adding tracks to the same "LS" group | offer or answer. Adding tracks to the same "LS" group | |||
indicates that the playback of these tracks should be | indicates that the playback of these tracks should be | |||
synchronized for proper lip sync, as described in | synchronized for proper lip sync, as described in | |||
<xref target="RFC5888" sectionFormat="comma" section="7"/>. addTrack a | <xref target="RFC5888" sectionFormat="comma" section="7"/>. addT | |||
ttempts | rack attempts | |||
to minimize the number of transceivers as follows: If the | to minimize the number of transceivers as follows: if the | |||
PeerConnection is in the "have-remote-offer" state, the track | PeerConnection is in the "have&nbhy;remote-offer" state, the track | |||
will be attached to the first compatible transceiver that was | will be attached to the first compatible transceiver that was | |||
created by the most recent call to setRemoteDescription() and | created by the most recent call to setRemoteDescription() and | |||
does not have a local track. Otherwise, a new transceiver | does not have a local track. Otherwise, a new transceiver | |||
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 | |||
which 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.createDataChannel" numbered="true" toc="default"> | <section anchor="sec.createDataChannel" numbered="true" toc="default"> | |||
<name>createDataChannel</name> | <name>createDataChannel</name> | |||
<t>The createDataChannel method creates a new data channel | <t>The createDataChannel method creates a new data channel | |||
and attaches it to the PeerConnection. If no data channel | and attaches it to the PeerConnection. If no data channel | |||
currently exists for this PeerConnection, then a new | currently exists for this PeerConnection, then a new | |||
offer/answer exchange is required. All data channels on a | offer/answer exchange is required. All data channels on a | |||
given PeerConnection share the same SCTP/DTLS association and | given PeerConnection share the same SCTP/DTLS association ("SCTP" stan | |||
therefore the same m= section, so subsequent creation of data | ds | |||
for "Stream Control Transmission Protocol") and | ||||
therefore the same "m=" section, so subsequent creation of data | ||||
channels does not have any impact on the JSEP state.</t> | channels does not have any impact on the JSEP state.</t> | |||
<t>The createDataChannel method also includes a number of | <t>The createDataChannel method also includes a number of | |||
arguments which are used by the PeerConnection (e.g., | arguments that are used by the PeerConnection (e.g., | |||
maxPacketLifetime) but are not reflected in the SDP and do | maxPacketLifetime) but are not reflected in the SDP and do | |||
not affect the JSEP state.</t> | not affect the JSEP state.</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 a | contains an offer per <xref target="RFC3264" format="default"/> with t | |||
<xref target="RFC3264" format="default"/> offer with the supported | he supported | |||
configurations for the session, including descriptions of the | configurations for the session, including descriptions of the | |||
media added to this PeerConnection, the codec/RTP/RTCP | media added to this PeerConnection, the codec/RTP/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 | |||
skipping to change at line 1162 ¶ | skipping to change at line 1336 ¶ | |||
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 must follow the process defined | generation of each SDP line must follow the process defined | |||
for generating an updated offer from the RFC that specifies | for generating an updated offer from the RFC that specifies | |||
the given SDP line. For each new stream, the generation of | the given SDP line. For each new stream, the generation of | |||
the SDP must follow the process of generating an initial | the SDP must follow the process of generating an initial | |||
offer, as mentioned above. If no changes have been made, or | offer, as mentioned above. If no changes have been made, or | |||
for SDP lines that are unaffected by the requested changes, | for SDP lines that are unaffected by the requested changes, | |||
the offer will only contain the parameters negotiated by the | the offer will only contain the parameters negotiated by the | |||
last offer-answer exchange. The exact handling of subsequent | 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 must be | <t>Session descriptions generated by createOffer must be | |||
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 should return an offer that reflects the current | createOffer should return an offer that reflects the current | |||
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 does not change the PeerConnection | ICE credentials, but it does not change the PeerConnection | |||
state, trigger candidate gathering, or cause media to start | state, trigger candidate gathering, or cause media to start | |||
or stop flowing. Specifically, the offer is not applied, and | or stop flowing. Specifically, the offer is not applied, and | |||
does not become the pending local description, until | does not become the pending local description, until | |||
setLocalDescription is called.</t> | setLocalDescription is called.</t> | |||
</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 a | contains an SDP answer per <xref target="RFC3264" format="default"/> w | |||
<xref target="RFC3264" format="default"/> SDP answer with the supporte | ith the supported | |||
d | ||||
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, which <bcp14>MUST</bcp14> have been called prior to | setRemoteDescription, which <bcp14>MUST</bcp14> have been 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/RTCP options negotiated for | |||
this session, and any candidates that have been gathered by | this session, 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 | |||
must follow the process defined for generating an answer from | must follow the process defined for generating an answer from | |||
the document that specifies the given SDP line. The exact | the document that specifies 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 must be | <t>Session descriptions generated by createAnswer must be | |||
immediately usable by setLocalDescription; like createOffer, | immediately usable by setLocalDescription; like createOffer, | |||
the returned description should reflect the current state of | the returned description should reflect the current state of | |||
the system.</t> | the system.</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 does not change the PeerConnection | ICE credentials, but it does not change the PeerConnection | |||
state, trigger candidate gathering, or or cause a media state | state, trigger candidate gathering, or cause a media state | |||
change. Specifically, the answer is not applied, and does not | change. Specifically, the answer is not applied, and does not | |||
become the current local description, until | become the current local description, until | |||
setLocalDescription is called.</t> | setLocalDescription is called.</t> | |||
</section> | </section> | |||
<section anchor="sec.sessiondescriptiontype" numbered="true" toc="defaul t"> | <section anchor="sec.sessiondescriptiontype" numbered="true" toc="defaul t"> | |||
<name>SessionDescriptionType</name> | <name>SessionDescriptionType</name> | |||
<t>Session description objects (RTCSessionDescription) may be | <t>Session description objects (RTCSessionDescription) may be | |||
of type "offer", "pranswer", "answer" or "rollback". These | of type "offer", "pranswer", "answer", or "rollback". These | |||
types provide information as to how the description parameter | types provide information as to how the description parameter | |||
should be parsed, and how the media state should be | should be parsed and how the media state should be | |||
changed.</t> | changed.</t> | |||
<t>"offer" indicates that a description should be parsed as | <t>"offer" indicates that a description should 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 anytime the PeerConnection is in a stable state, or | applied any time the PeerConnection is in a stable state or | |||
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 should be parsed | <t>"pranswer" indicates that a description should be parsed | |||
as an answer, but not a final answer, and so should not | as an answer, but not a final answer, and so should not | |||
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 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 should be parsed as | <t>"answer" indicates that a description should be parsed as | |||
an answer, the offer-answer exchange should be considered | an answer, the offer/answer exchange should be considered | |||
complete, and any resources (decoders, candidates) that are | complete, and any resources (decoders, candidates) that are | |||
no longer needed can be released. A description used as an | no longer needed can be released. A description used as an | |||
"answer" may be applied as a response to an "offer", or 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 | |||
resources that were allocated as a result of the offer. As | resources that were allocated as a result of the offer. As | |||
such, the application can use some discretion on whether an | such, the application can use some discretion on whether an | |||
answer should be applied as provisional or final, and can | answer should be applied as provisional or final and can | |||
change the type of the session description as needed. For | change the type of the session description as needed. For | |||
example, in a serial forking scenario, an application may | example, in a serial forking scenario, an application may | |||
receive multiple "final" answers, one from each remote | receive multiple "final" answers, one from each remote | |||
endpoint. The application could choose to accept the initial | endpoint. The application could choose to accept the initial | |||
answers as provisional answers, and only apply an answer as | answers as provisional answers and only apply an answer as | |||
final when it receives one that meets its criteria (e.g. a | final when it receives one that meets its criteria (e.g., a | |||
live user instead of voicemail).</t> | live user instead of voicemail).</t> | |||
<t>"rollback" is a special session description type implying | <t>"rollback" is a special session description type implying | |||
that the state machine should be rolled back to the previous | that the state machine should be rolled back to the previous | |||
stable state, as described in | stable state, as described in | |||
<xref target="sec.rollback" format="default"/>. The contents <bcp14>MU ST</bcp14> be | <xref target="sec.rollback" format="default"/>. The contents <bcp14>MU ST</bcp14> be | |||
empty.</t> | empty.</t> | |||
<section anchor="sec.use-of-provisional-answer" numbered="true" toc="d efault"> | <section anchor="sec.use-of-provisional-answer" numbered="true" toc="d efault"> | |||
<name>Use of Provisional Answers</name> | <name>Use of Provisional Answers</name> | |||
<t>Most applications will not need to create answers using | <t>Most applications will not need to create answers using | |||
the "pranswer" type. While it is good practice to send an | the "pranswer" type. While it is good practice to send an | |||
immediate response to an offer, in order to warm up the | immediate response to an offer, in order to warm up the | |||
session transport and prevent media clipping, the preferred | session transport and prevent media clipping, the preferred | |||
handling for a JSEP application is to create and send a | handling for a JSEP application is to create and send a | |||
"sendonly" final answer with a null MediaStreamTrack | "sendonly" final answer with a null MediaStreamTrack | |||
immediately after receiving the offer, which will prevent | immediately after receiving the offer, which will prevent | |||
media from being sent by the caller, and allow media to be | media from being sent by the caller and allow media to be | |||
sent immediately upon answer by the callee. Later, when the | sent immediately upon answer by the callee. Later, when the | |||
callee actually accepts the call, the application can plug | callee actually accepts the call, the application can plug | |||
in the real MediaStreamTrack and create a new "sendrecv" | in the real MediaStreamTrack and create a new "sendrecv" | |||
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. | |||
<!-- [rfced] Section 4.1.8.1: We had trouble with this sentence. | ||||
If neither suggestion below is correct, please clarify. | ||||
Original: | ||||
While | ||||
this could also be done with a "sendonly" pranswer, followed by a | ||||
"sendrecv" answer, the initial pranswer leaves the offer-answer | ||||
exchange open, which means that the caller cannot send an updated | ||||
offer during this time. | ||||
Suggestion #1: | ||||
While | ||||
this could also be done with a "sendonly" pranswer, if followed by a | ||||
"sendrecv" answer the initial pranswer leaves the offer/answer | ||||
exchange open, which means that the caller cannot send an updated | ||||
offer during this time. | ||||
Suggestion #2: | ||||
While | ||||
this could also be done with a "sendonly" pranswer followed by a | ||||
"sendrecv" answer, the initial pranswer leaves the offer/answer | ||||
exchange open, which means that the caller cannot send an 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 and | plug in the tracks it has acquired, which, because ICE handshaking | |||
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. | |||
<!-- [rfced] Section 4.1.8.1: As it appears that "ICE and DTLS | ||||
handshaking have" means "ICE handshaking and DTLS handshaking have," | ||||
we updated this sentence accordingly. Please let us know if this is | ||||
incorrect (i.e., if the text refers to one handshaking process, in | ||||
which case "have" should be "has"). | ||||
Original: | ||||
Upon acceptance by the user, the | ||||
application will plug in the tracks it has acquired, which, because | ||||
ICE and DTLS handshaking have likely completed by this point, can | ||||
start transmitting immediately. | ||||
Currently: | ||||
Upon acceptance by the user, the | ||||
application will plug in the tracks it has acquired, which, because | ||||
ICE handshaking and DTLS handshaking have likely completed by this | ||||
point, can 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 | |||
media. A detailed example flow along these lines is shown | media. A detailed example flow along these lines is shown | |||
in | in | |||
<xref target="sec.warmup-example" format="default"/>.</t> | <xref target="sec.warmup-example" format="default"/>.</t> | |||
<t>Of course, some applications may not be able to perform | <t>Of course, some applications may not be able to perform | |||
this double offer-answer exchange, particularly ones that | this double offer/answer exchange, particularly ones that | |||
are attempting to gateway to legacy signaling protocols. In | are attempting to gateway to legacy signaling protocols. In | |||
these cases, pranswer can still provide the application | these cases, pranswer can still provide the application | |||
with a mechanism to warm up the transport.</t> | with a mechanism to warm up the transport.</t> | |||
</section> | </section> | |||
<section anchor="sec.rollback" numbered="true" toc="default"> | <section anchor="sec.rollback" numbered="true" toc="default"> | |||
<name>Rollback</name> | <name>Rollback</name> | |||
<t>In certain situations it may be desirable to "undo" a | <t>In certain situations, it may be desirable to "undo" a | |||
change made to setLocalDescription or setRemoteDescription. | change made to setLocalDescription or setRemoteDescription. | |||
Consider a case where a call is ongoing, and one side wants | Consider a case where a call is ongoing and one side wants | |||
to change some of the session parameters; that side | to change some of the session parameters; that side | |||
generates an updated offer and then calls | generates an updated offer and then calls | |||
setLocalDescription. However, the remote side, either | setLocalDescription. However, the remote side, either | |||
before or after setRemoteDescription, decides it does not | before or after setRemoteDescription, decides it does not | |||
want to accept the new parameters, and sends a reject | want to accept the new parameters and sends a reject | |||
message back to the offerer. Now, the offerer, and possibly | message back to the offerer. Now, the offerer, and possibly | |||
the answerer as well, need to return to a stable state and | the answerer as well, needs to return to a stable state and | |||
the previous local/remote description. To support this, we | the previous local/remote description. To support this, we | |||
introduce the concept of "rollback", which discards any | introduce the concept of "rollback", which discards any | |||
proposed changes to the session, returning the state | proposed changes to the session, returning the state | |||
machine to the stable state. A rollback is performed by | machine to the stable state. A rollback is performed by | |||
supplying a session description of type "rollback" with | supplying a session description of type "rollback" with | |||
empty contents to either setLocalDescription or | empty contents to either setLocalDescription or | |||
setRemoteDescription.</t> | setRemoteDescription.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.setlocaldescription" numbered="true" toc="default"> | <section anchor="sec.setlocaldescription" numbered="true" toc="default"> | |||
skipping to change at line 1335 ¶ | skipping to change at line 1554 ¶ | |||
each SDP line.</t> | each SDP line.</t> | |||
<t>This API changes the local media state; among other | <t>This API changes the local media state; among other | |||
things, it sets up local resources for receiving and decoding | things, it sets up local resources for receiving and decoding | |||
media. In order to successfully handle scenarios where the | media. In order to successfully handle scenarios where the | |||
application wants to offer to change from one media format to | application wants to offer to change from one media format to | |||
a different, incompatible format, the PeerConnection must be | a different, incompatible format, the PeerConnection must be | |||
able to simultaneously support use of both the current and | able to simultaneously support use of both the current and | |||
pending local descriptions (e.g., support the codecs that | pending local descriptions (e.g., support the codecs that | |||
exist in either description). This dual processing begins | exist in either description). This dual processing begins | |||
when the PeerConnection enters the "have-local-offer" state, | when the PeerConnection enters the "have-local-offer" state, | |||
and continues until setRemoteDescription is called with | and it continues until setRemoteDescription is called with | |||
either a final answer, at which point the PeerConnection can | either (1) a final answer, at which point the PeerConnection can | |||
fully adopt the pending local description, or a rollback, | fully adopt the pending local description or (2) a rollback, | |||
which results in a revert to the current local | which results in a revert to the current local | |||
description.</t> | description.</t> | |||
<t>This API indirectly controls the candidate gathering | <t>This API indirectly controls the candidate gathering | |||
process. When a local description is supplied, and the number | process. When a local description is supplied and the number | |||
of transports currently in use does not match the number of | of transports currently in use does not match the number of | |||
transports needed by the local description, the | transports needed by the local description, the | |||
PeerConnection will create transports as needed and begin | PeerConnection will create transports as needed and begin | |||
gathering candidates for each transport, using ones from the | gathering candidates for each transport, using ones from the | |||
candidate pool if available.</t> | candidate pool if available.</t> | |||
<t>If setRemoteDescription was previously called with an | <t>If setRemoteDescription was previously called with an | |||
offer, and setLocalDescription is called with an answer | offer, and setLocalDescription is called with an answer | |||
(provisional or final), and the media directions are | (provisional or final), and the media directions are | |||
compatible, and media is available to send, this will result | compatible, and media is available to send, this will result | |||
in the starting of media transmission.</t> | in the starting of media transmission. | |||
<!-- [rfced] Sections 4.1.9 and 4.1.10: We had trouble following the | ||||
purpose of all of the "and"s in these sentences. Are four conditions | ||||
set in these sentences, or fewer? | ||||
Original: | ||||
If setRemoteDescription was previously called with an offer, and | ||||
setLocalDescription is called with an answer (provisional or final), | ||||
and the media directions are compatible, and media is available to | ||||
send, this will result in the starting of media transmission. | ||||
... | ||||
If setLocalDescription was previously called with an offer, and | ||||
setRemoteDescription is called with an answer (provisional or final), | ||||
and the media directions are compatible, and media is available to | ||||
send, this will result in the starting of media transmission. | ||||
Possibly: | ||||
If (1) setRemoteDescription was previously called with an offer, | ||||
(2) setLocalDescription is called with an answer (provisional or | ||||
final), (3) the media directions are compatible, and (4) media is | ||||
available to send, media transmission can start. | ||||
... | ||||
If (1) setLocalDescription was previously called with an offer, | ||||
(2) setRemoteDescription is called with an answer (provisional or | ||||
final), (3) the media directions are compatible, and (4) media is | ||||
available to send, media transmission can start. --> | ||||
</t> | ||||
</section> | </section> | |||
<section anchor="sec.setremotedescription" numbered="true" toc="default" > | <section anchor="sec.setremotedescription" numbered="true" toc="default" > | |||
<name>setRemoteDescription</name> | <name>setRemoteDescription</name> | |||
<t>The setRemoteDescription method instructs the | <t>The setRemoteDescription method instructs the | |||
PeerConnection to apply the supplied session description as | PeerConnection to apply the supplied session description as | |||
the desired remote configuration. As in setLocalDescription, | the desired remote configuration. As in setLocalDescription, | |||
the type field of the description indicates how it should be | the type field of the description indicates how it should be | |||
processed.</t> | processed.</t> | |||
<t>This API changes the local media state; among other | <t>This API changes the local media state; among other | |||
things, it sets up local resources for sending and encoding | things, it sets up local resources for sending and encoding | |||
media.</t> | media. | |||
<!-- [rfced] Section 4.1.10: Please confirm that "local media state" | ||||
and "local resources" (as opposed to remote) are correct in the | ||||
context of setRemoteDescription. (We ask because we see identical | ||||
wording in Section 4.1.9 ("setLocalDescription").) | ||||
Original: | ||||
This API changes the local media state; among other things, it sets | ||||
up local resources for sending and encoding media. --> | ||||
</t> | ||||
<t>If setLocalDescription was previously called with an | <t>If setLocalDescription was previously called with an | |||
offer, and setRemoteDescription is called with an answer | offer, and setRemoteDescription is called with an answer | |||
(provisional or final), and the media directions are | (provisional or final), and the media directions are | |||
compatible, and media is available to send, this will result | compatible, and media is available to send, this will result | |||
in the starting of media transmission.</t> | in the starting of media transmission.</t> | |||
</section> | </section> | |||
<section anchor="sec.currentlocaldescription" numbered="true" toc="defau lt"> | <section anchor="sec.currentlocaldescription" numbered="true" toc="defau lt"> | |||
<name>currentLocalDescription</name> | <name>currentLocalDescription</name> | |||
<t>The currentLocalDescription method returns the current | <t>The currentLocalDescription method returns the current | |||
negotiated local description - i.e., the local description | negotiated local description -- i.e., the local description | |||
from the last successful offer/answer exchange - in addition | from the last successful offer/answer exchange -- in addition | |||
to any local candidates that have been generated by the ICE | to any local candidates that have been generated by the ICE | |||
agent since the local description was set.</t> | agent since the local description was set.</t> | |||
<t>A null object will be returned if an offer/answer exchange | <t>A null object will be returned if an offer/answer exchange | |||
has not yet been completed.</t> | has not yet been completed.</t> | |||
</section> | </section> | |||
<section anchor="sec.pendinglocaldescription" numbered="true" toc="defau lt"> | <section anchor="sec.pendinglocaldescription" numbered="true" toc="defau lt"> | |||
<name>pendingLocalDescription</name> | <name>pendingLocalDescription</name> | |||
<t>The pendingLocalDescription method returns a copy of the | <t>The pendingLocalDescription method returns a copy of the | |||
local description currently in negotiation - i.e., a local | local description currently in negotiation -- i.e., a local | |||
offer set without any corresponding remote answer - in | offer set without any corresponding remote answer -- in | |||
addition to any local candidates that have been generated by | addition to any local candidates that have been generated by | |||
the ICE agent since the local description was set.</t> | the ICE agent since the local description was set.</t> | |||
<t>A null object will be returned if the state of the | <t>A null object will be returned if the state of the | |||
PeerConnection is "stable" or "have-remote-offer".</t> | PeerConnection is "stable" or "have-remote-offer".</t> | |||
</section> | </section> | |||
<section anchor="sec.currentremotedescription" numbered="true" toc="defa ult"> | <section anchor="sec.currentremotedescription" numbered="true" toc="defa ult"> | |||
<name>currentRemoteDescription</name> | <name>currentRemoteDescription</name> | |||
<t>The currentRemoteDescription method returns a copy of the | <t>The currentRemoteDescription method returns a copy of the | |||
current negotiated remote description - i.e., the remote | current negotiated remote description -- i.e., the remote | |||
description from the last successful offer/answer exchange - | description from the last successful offer/answer exchange -- | |||
in addition to any remote candidates that have been supplied | in addition to any remote candidates that have been supplied | |||
via processIceMessage since the remote description was | via processIceMessage since the remote description was | |||
set.</t> | set.</t> | |||
<t>A null object will be returned if an offer/answer exchange | <t>A null object will be returned if an offer/answer exchange | |||
has not yet been completed.</t> | has not yet been completed.</t> | |||
</section> | </section> | |||
<section anchor="sec.pendingremotedescription" numbered="true" toc="defa ult"> | <section anchor="sec.pendingremotedescription" numbered="true" toc="defa ult"> | |||
<name>pendingRemoteDescription</name> | <name>pendingRemoteDescription</name> | |||
<t>The pendingRemoteDescription method returns a copy of the | <t>The pendingRemoteDescription method returns a copy of the | |||
remote description currently in negotiation - i.e., a remote | remote description currently in negotiation -- i.e., a remote | |||
offer set without any corresponding local answer - in | offer set without any corresponding local answer -- in | |||
addition to any remote candidates that have been supplied via | addition to any remote candidates that have been supplied via | |||
processIceMessage since the remote description was set.</t> | processIceMessage since the remote description was set.</t> | |||
<t>A null object will be returned if the state of the | <t>A null object will be returned if the state of the | |||
PeerConnection is "stable" or "have-local-offer".</t> | PeerConnection is "stable" or "have-local-offer".</t> | |||
</section> | </section> | |||
<section anchor="sec.cantrickle" numbered="true" toc="default"> | <section anchor="sec.cantrickle" numbered="true" toc="default"> | |||
<name>canTrickleIceCandidates</name> | <name>canTrickleIceCandidates</name> | |||
<t>The canTrickleIceCandidates property indicates whether the | <t>The canTrickleIceCandidates property indicates whether the | |||
remote side supports receiving trickled candidates. There are | remote side supports receiving trickled candidates. There are | |||
three potential values: | three potential values: | |||
skipping to change at line 1438 ¶ | skipping to change at line 1696 ¶ | |||
</dl> | </dl> | |||
<t>As described in | <t>As described in | |||
<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 which | 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 this method call depend on when it is invoked, | The effects of this method call depend on when it is invoked, | |||
and differ depending on which specific parameters are | and they will differ, depending on which specific parameters are | |||
changed:</t> | changed: | |||
<!-- [rfced] Section 4.1.16: Should "The effects of this method call" | ||||
be "The effects of calling this method," and should "This call" be | ||||
"Calling this method"? | ||||
Original: | ||||
The effects of this method call | ||||
depend on when it is invoked, and differ depending on which specific | ||||
parameters are changed: | ||||
... | ||||
This call may result in a change to the state of the ICE Agent. --> | ||||
</t> | ||||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>Any changes to the STUN/TURN servers to use affect the | <li>Any changes to the STUN/TURN servers to use affect the | |||
next gathering phase. If an ICE gathering phase has | next gathering phase. If an ICE gathering phase has | |||
already started or completed, the 'needs-ice-restart' bit | already started or completed, the 'needs-ice-restart' bit | |||
mentioned in | mentioned in | |||
<xref target="sec.ice-gather-overview" format="default"/> will be set. | <xref target="sec.ice-gather-overview" format="default"/> will be set. | |||
This will cause the next call to createOffer to generate | This will cause the next call to createOffer to generate | |||
new ICE credentials, for the purpose of forcing an ICE | new ICE credentials, for the purpose of forcing an ICE | |||
restart and kicking off a new gathering phase, in which | restart and kicking off a new gathering phase, in which | |||
the new servers will be used. If the ICE candidate pool | the new servers will be used. If the ICE candidate pool | |||
has a nonzero size, and a local description has not yet | has a nonzero size and a local description has not yet | |||
been applied, any existing candidates will be discarded, | been applied, any existing candidates will be discarded, | |||
and new candidates will be gathered from the new | and new candidates will be gathered from the new | |||
servers.</li> | servers.</li> | |||
<li>Any change to the ICE candidate policy affects the | <li>Any change to the ICE candidate policy affects the | |||
next gathering phase. If an ICE gathering phase has | next gathering phase. If an ICE gathering phase has | |||
already started or completed, the 'needs-ice-restart' bit | already started or completed, the 'needs-ice-restart' bit | |||
will be set. Either way, changes to the policy have no | will be set. Either way, changes to the policy have no | |||
effect on the candidate pool, because pooled candidates | effect on the candidate pool, because pooled candidates | |||
are not made available to the application until a | are not made available to the application until a | |||
gathering phase occurs, and so any necessary filtering | gathering phase occurs, and so any necessary filtering | |||
skipping to change at line 1484 ¶ | skipping to change at line 1755 ¶ | |||
<li>The ICE candidate pool size <bcp14>MUST NOT</bcp14> be changed a fter | <li>The ICE candidate pool size <bcp14>MUST NOT</bcp14> be changed a fter | |||
applying a local description. If a local description has | applying a local description. If a local description has | |||
not yet been applied, any changes to the ICE candidate | not yet been applied, any changes to the ICE candidate | |||
pool size take effect immediately; if increased, | pool size take effect immediately; if increased, | |||
additional candidates are pre-gathered; if decreased, the | additional candidates are pre-gathered; if decreased, the | |||
now-superfluous candidates are discarded.</li> | now-superfluous candidates are discarded.</li> | |||
<li>The bundle and RTCP-multiplexing policies <bcp14>MUST NOT</bcp14 > be | <li>The bundle and RTCP-multiplexing policies <bcp14>MUST NOT</bcp14 > be | |||
changed after the construction of the PeerConnection.</li> | changed after the construction of the PeerConnection.</li> | |||
</ul> | </ul> | |||
<t>This call may result in a change to the state of the ICE | <t>This call may result in a change to the state of the ICE | |||
Agent.</t> | agent.</t> | |||
</section> | </section> | |||
<section anchor="sec.addicecandidate" numbered="true" toc="default"> | <section anchor="sec.addicecandidate" numbered="true" toc="default"> | |||
<name>addIceCandidate</name> | <name>addIceCandidate</name> | |||
<t>The addIceCandidate method provides an update to the ICE | <t>The addIceCandidate method provides an update to the ICE | |||
agent via an IceCandidate object | agent via an IceCandidate object | |||
<xref target="sec.ice-candidate-format" format="default"/>. If the | (<xref target="sec.ice-candidate-format" format="default"/>). If the | |||
IceCandidate's candidate field is filled in, the IceCandidate | IceCandidate's candidate field is filled in, the IceCandidate | |||
is treated as a new remote ICE candidate, which will be added | is treated as a new remote ICE candidate, which will be added | |||
to the current and/or pending remote description according to | to the current and/or pending remote description according to | |||
the rules defined for Trickle ICE. Otherwise, the | the rules defined for Trickle ICE. Otherwise, the | |||
IceCandidate is treated as an end-of-candidates indication, | IceCandidate is treated as an end-of-candidates indication, | |||
as defined in | as defined in | |||
<xref target="RFCYYY6" format="default"/>.</t> | <xref target="RFC8838" format="default"/>.</t> | |||
<t>In either case, the m= section index, MID, and ufrag | <t>In either case, the "m=" section index, MID, and ufrag | |||
fields from the supplied IceCandidate are used to determine | fields from the supplied IceCandidate are used to determine | |||
which m= section and ICE candidate generation the | which "m=" section and ICE candidate generation the | |||
IceCandidate belongs to, as described in | IceCandidate belongs to, as described in | |||
<xref target="sec.ice-candidate-format" format="default"/> above. In t he case | <xref target="sec.ice-candidate-format" format="default"/> above. In t he case | |||
of an end-of-candidates indication, the absence of both the | of an end-of-candidates indication, the absence of both the | |||
m= section index and MID fields is interpreted to mean that | "m=" section index and MID fields is interpreted to mean that | |||
the indication applies to all m= sections in the specified | the indication applies to all "m=" sections in the specified | |||
ICE candidate generation. However, if both fields are absent | ICE candidate generation. However, if both fields are absent | |||
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.</t> | candidate.</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 | |||
future calls to createOffer to generate a zero port for the | future calls to createOffer to generate a zero port for the | |||
associated m= section. See below for more details.</t> | associated "m=" section. See below for more details.</t> | |||
</section> | </section> | |||
<section anchor="sec.transceiver-stopped" numbered="true" toc="default"> | <section anchor="sec.transceiver-stopped" numbered="true" toc="default"> | |||
<name>stopped</name> | <name>stopped</name> | |||
<t>The stopped property indicates whether the transceiver has | <t>The stopped property indicates whether the transceiver has | |||
been stopped, either by a call to stopTransceiver or by | been stopped, either by a call to stopTransceiver or by | |||
applying an answer that rejects the associated m= section. In | applying an answer that rejects the associated "m=" section. | |||
either of these cases, it is set to "true", and otherwise | ||||
<!-- [rfced] Section 4.2.2: Will "stopTransceiver" be clear to | ||||
readers? We could not find this string elsewhere in this document, | ||||
anywhere else in this cluster of documents, in any published RFC, or | ||||
in google searches. | ||||
Original: | ||||
The stopped property indicates whether the transceiver has been | ||||
stopped, either by a call to stopTransceiver or by applying an answer | ||||
that rejects the associated m= section. --> | ||||
In | ||||
either of these cases, it is set to "true" and otherwise | ||||
will be set to "false".</t> | will be set to "false".</t> | |||
<t>A stopped RtpTransceiver does not send any outgoing RTP or | <t>A stopped RtpTransceiver does not send any outgoing RTP or | |||
RTCP or process any incoming RTP or RTCP. It cannot be | RTCP or process any incoming RTP or RTCP. It cannot be | |||
restarted.</t> | restarted.</t> | |||
</section> | </section> | |||
<section anchor="sec.transceiver-set-direction" numbered="true" toc="def ault"> | <section anchor="sec.transceiver-set-direction" numbered="true" toc="def ault"> | |||
<name>setDirection</name> | <name>setDirection</name> | |||
<t>The setDirection method sets the direction of a | <t>The setDirection method sets the direction of a | |||
transceiver, which affects the direction property of the | transceiver, which affects the direction property of the | |||
associated m= section on future calls to createOffer and | associated "m=" section on future calls to createOffer and | |||
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 directional attributes defined in | the identically named directional 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 ( | of the transceiver immediately (<xref target="sec.transceiver-directio | |||
<xref target="sec.transceiver-direction" format="default"/>), this pro | n" format="default"/>), this property | |||
perty | ||||
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 | |||
<xref target="RFC3264" format="default"/> directional attribute of the | directional 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 "send" and "recv" directions | |||
reversed if it was a remote answer. For example, if the | reversed if it was a remote answer. | |||
directional attribute for the associated m= section in a | ||||
<!-- [rfced] Section 4.2.5: We see "direction attribute" but not | ||||
"directional attribute" in RFC 3264. Will this text be clear to | ||||
readers? (We ask because we also see "A direction attribute, | ||||
determined by applying the rules regarding the offered direction | ||||
specified in [RFC3264], Section 6.1" in Section 5.3.1 of this | ||||
document.) | ||||
Original: | ||||
More specifically, it | ||||
indicates the [RFC3264] directional attribute of the associated m= | ||||
section in the last applied answer (including provisional answers), | ||||
with "send" and "recv" directions reversed if it was a remote answer. --> | ||||
For example, if the | ||||
directional 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 | |||
offer or answer. Even when a codec is excluded by | offer or answer. Even when a codec is excluded by | |||
setCodecPreferences, it still may be used to send until the | setCodecPreferences, it still may be used to send until the | |||
next offer/answer exchange discards it.</t> | next offer/answer exchange discards it.</t> | |||
<t>The codec preferences of an RtpTransceiver can cause | <t>The codec preferences of an RtpTransceiver can cause | |||
codecs to be excluded by subsequent calls to createOffer and | codecs to be excluded by subsequent calls to createOffer and | |||
createAnswer, in which case the corresponding media formats | createAnswer, in which case the corresponding media formats | |||
in the associated m= section will be excluded. The codec | in the associated "m=" section will be excluded. The codec | |||
preferences cannot add media formats that would otherwise not | preferences cannot add media formats that would otherwise not | |||
be present.</t> | be present.</t> | |||
<t>The codec preferences of an RtpTransceiver can also | <t>The codec preferences of an RtpTransceiver can also | |||
determine the order of codecs in subsequent calls to | determine the order of codecs in subsequent calls to | |||
createOffer and createAnswer, in which case the order of the | createOffer and createAnswer, in which case the order of the | |||
media formats in the associated m= section will follow the | media formats in the associated "m=" section will follow the | |||
specified preferences.</t> | specified preferences.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.sdp-interaction-procedure" numbered="true" toc="default "> | <section anchor="sec.sdp-interaction-procedure" numbered="true" toc="default "> | |||
<name>SDP Interaction Procedures</name> | <name>SDP Interaction Procedures</name> | |||
<t>This section describes the specific procedures to be followed | <t>This section describes the specific procedures to be followed | |||
when creating and parsing SDP objects.</t> | when creating and parsing SDP objects.</t> | |||
<section anchor="sec.requirements-overview" numbered="true" toc="default"> | <section anchor="sec.requirements-overview" numbered="true" toc="default"> | |||
<name>Requirements Overview</name> | <name>Requirements Overview</name> | |||
skipping to change at line 1629 ¶ | skipping to change at line 1926 ¶ | |||
<section anchor="sec.usage-requirements" numbered="true" toc="default"> | <section anchor="sec.usage-requirements" numbered="true" toc="default"> | |||
<name>Usage Requirements</name> | <name>Usage Requirements</name> | |||
<t>All session descriptions handled by JSEP implementations, | <t>All session descriptions handled by JSEP implementations, | |||
both local and remote, <bcp14>MUST</bcp14> indicate support for the | both local and remote, <bcp14>MUST</bcp14> indicate support for the | |||
following specifications. If any of these are absent, this | following specifications. If any of these are absent, this | |||
omission <bcp14>MUST</bcp14> be treated as an error. | omission <bcp14>MUST</bcp14> be treated as an error. | |||
</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 | implementations <bcp14>MUST</bcp14> properly handle remote endpoints | |||
which | that | |||
do ICE-Lite.</li> | do ICE-lite.</li> | |||
<li>DTLS | <li>DTLS | |||
<xref target="RFC6347" format="default"/> or DTLS-SRTP | <xref target="RFC6347" format="default"/> or DTLS-SRTP | |||
<xref target="RFC5763" format="default"/>, <bcp14>MUST</bcp14> be us ed, 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="RFCYYY2" format="default"/></li> | <xref target="RFC8827" format="default"/>.</li> | |||
</ul> | </ul> | |||
<t>The SDES SRTP keying mechanism from | <t>The SDES SRTP keying mechanism from | |||
<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="RFCYYY2" format="default"/>.</t> | <xref target="RFC8827" format="default"/>. | |||
<!-- [rfced] Section 5.1.1: Does SDES refer to "source description" or | ||||
"security description"? Neither [RFC4568] nor RFC 8827 | ||||
[I-D.ietf-rtcweb-security-arch] mention "SDES" or "source description" (as | ||||
used in RFC 8852 and other documents in this cluster). | ||||
Original: | ||||
The SDES SRTP keying mechanism from [RFC4568] MUST NOT be used, as | ||||
discussed in [I-D.ietf-rtcweb-security-arch]. --> | ||||
</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> sup port | <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 <b | profile specified in <xref target="RFC7850" format="default"/> and <bc | |||
cp14>MUST</bcp14> indicate | p14>MUST</bcp14> indicate | |||
one of these profiles for each media m= line they produce in an offer. | one of these profiles for each media "m=" line they produce in an offe | |||
For data m= sections, implementations <bcp14>MUST</bcp14> support the | r. | |||
"UDP/DTLS/SCTP" profile as well as the "TCP/DTLS/SCTP" profile, and | For data "m=" sections, implementations <bcp14>MUST</bcp14> support th | |||
<bcp14>MUST</bcp14> indicate one of these profiles for each data m= li | e | |||
ne they produce | "UDP/DTLS/SCTP" profile as well as the "TCP/DTLS/SCTP" profile and | |||
<bcp14>MUST</bcp14> indicate one of these profiles for each data "m=" | ||||
line they produce | ||||
in an offer. The exact profile to use is determined by the protocol | in an offer. The exact profile to use is determined by the protocol | |||
associated with the current default or selected ICE candidate, as | associated with the current default or selected ICE candidate, as | |||
described in | described in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="3.2.1.2"/>.</t> | <xref target="RFC8839" sectionFormat="comma" section="4.2.1.2"/>.</t> | |||
<t>Unfortunately, in an attempt at compatibility, some | <t>Unfortunately, in an attempt at compatibility, some | |||
endpoints generate other profile strings even when they mean | endpoints generate other profile strings even when they mean | |||
to support one of these profiles. For instance, an endpoint | to support one of these profiles. For instance, an endpoint | |||
might generate "RTP/AVP" but supply "a=fingerprint" and | might generate "RTP/AVP" but supply "a=fingerprint" and | |||
"a=rtcp-fb" attributes, indicating its willingness to support | "a=rtcp-fb" attributes, indicating its willingness to support | |||
"UDP/TLS/RTP/SAVPF" or "TCP/DTLS/RTP/SAVPF". In order to | "UDP/TLS/RTP/SAVPF" or "TCP/DTLS/RTP/SAVPF". In order to | |||
simplify compatibility with such endpoints, JSEP | simplify compatibility with such endpoints, JSEP | |||
implementations <bcp14>MUST</bcp14> follow the following rules when | implementations <bcp14>MUST</bcp14> follow the following rules when | |||
processing the media m= sections in a received offer:</t> | processing the media "m=" sections in a received offer:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>Any profile in the offer matching one of the following | <t>Any profile in the offer matching one of the following | |||
<bcp14>MUST</bcp14> be accepted: | <bcp14>MUST</bcp14> be accepted: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>"RTP/AVP" (Defined in | <li>"RTP/AVP" (defined in | |||
<xref target="RFC4566" sectionFormat="comma" section="8.2.2"/>)< /li> | <xref target="RFC4566" sectionFormat="comma" section="8.2.2"/>)< /li> | |||
<li>"RTP/AVPF" (Defined in | <li>"RTP/AVPF" (defined in | |||
<xref target="RFC4585" sectionFormat="comma" section="9"/>)</li> | <xref target="RFC4585" sectionFormat="comma" section="9"/>)</li> | |||
<li>"RTP/SAVP" (Defined in | <li>"RTP/SAVP" (defined in | |||
<xref target="RFC3711" sectionFormat="comma" section="12"/>)</li > | <xref target="RFC3711" sectionFormat="comma" section="12"/>)</li > | |||
<li>"RTP/SAVPF" (Defined in | <li>"RTP/SAVPF" (defined in | |||
<xref target="RFC5124" sectionFormat="comma" section="6"/>)</li> | <xref target="RFC5124" sectionFormat="comma" section="6"/>)</li> | |||
<li>"TCP/DTLS/RTP/SAVP" (Defined in | <li>"TCP/DTLS/RTP/SAVP" (defined in | |||
<xref target="RFC7850" sectionFormat="comma" section="3.4"/>)</l i> | <xref target="RFC7850" sectionFormat="comma" section="3.4"/>)</l i> | |||
<li>"TCP/DTLS/RTP/SAVPF" (Defined in | <li>"TCP/DTLS/RTP/SAVPF" (defined in | |||
<xref target="RFC7850" sectionFormat="comma" section="3.5"/>)</l i> | <xref target="RFC7850" sectionFormat="comma" section="3.5"/>)</l i> | |||
<li>"UDP/TLS/RTP/SAVP" (Defined in | <li>"UDP/TLS/RTP/SAVP" (defined in | |||
<xref target="RFC5764" sectionFormat="comma" section="9"/>)</li> | <xref target="RFC5764" sectionFormat="comma" section="9"/>)</li> | |||
<li>"UDP/TLS/RTP/SAVPF" (Defined in | <li>"UDP/TLS/RTP/SAVPF" (defined in | |||
<xref target="RFC5764" sectionFormat="comma" section="9"/>)</li> | <xref target="RFC5764" sectionFormat="comma" section="9"/>)</li> | |||
</ul> | </ul> | |||
</li> | </li> | |||
<li>The profile in any "m=" line in any generated answer | <li>The profile in any "m=" line in any generated answer | |||
<bcp14>MUST</bcp14> exactly match the profile provided in the offe r.</li> | <bcp14>MUST</bcp14> exactly match the profile provided in the offe r.</li> | |||
<li>Because DTLS-SRTP is <bcp14>REQUIRED</bcp14>, the choice of SAVP or | <li>Because DTLS-SRTP is <bcp14>REQUIRED</bcp14>, the choice of SAVP or | |||
AVP has no effect; support for DTLS-SRTP is determined by | AVP has no effect; support for DTLS-SRTP is determined by | |||
the presence of one or more "a=fingerprint" attribute. | the presence of one or more "a=fingerprint" attributes. | |||
Note that lack of an "a=fingerprint" attribute will lead | Note that lack of an "a=fingerprint" attribute will lead | |||
to negotiation failure.</li> | to negotiation failure.</li> | |||
<li>The use of AVPF or AVP simply controls the timing | <li>The use of AVPF or AVP simply controls the timing | |||
rules used for RTCP feedback. If AVPF is provided, or an | rules used for RTCP feedback. If AVPF is provided or an | |||
"a=rtcp-fb" attribute is present, assume AVPF timing, | "a=rtcp-fb" attribute is present, assume AVPF timing, | |||
i.e., a default value of "trr-int=0". Otherwise, assume | i.e., a default value of "trr-int=0". Otherwise, assume | |||
that AVPF is being used in an AVP compatible mode and use | that AVPF is being used in an AVP-compatible mode and use | |||
a value of "trr-int=4000".</li> | a value of "trr-int=4000".</li> | |||
<li>For data m= sections, implementations <bcp14>MUST</bcp14> suppor t | <li>For data "m=" sections, implementations <bcp14>MUST</bcp14> supp ort | |||
receiving the "UDP/DTLS/SCTP", "TCP/DTLS/SCTP", or | receiving the "UDP/DTLS/SCTP", "TCP/DTLS/SCTP", or | |||
"DTLS/SCTP" (for backwards compatibility) profiles.</li> | "DTLS/SCTP" (for backwards compatibility) profiles.</li> | |||
</ul> | </ul> | |||
<t>Note that re-offers by JSEP implementations <bcp14>MUST</bcp14> use the | <t>Note that re-offers by JSEP implementations <bcp14>MUST</bcp14> use the | |||
correct profile strings even if the initial offer/answer | correct profile strings even if the initial offer/answer | |||
exchange used an (incorrect) older profile string. This | exchange used an (incorrect) older profile string. This | |||
simplifies JSEP behavior, with minimal downside, as any | simplifies JSEP behavior, with minimal downside, as any | |||
remote endpoint that fails to handle such a re-offer will | remote endpoint that fails to handle such a re-offer will | |||
also fail to handle a JSEP endpoint's initial offer.</t> | also fail to handle a JSEP endpoint's initial offer.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec-create-offer" numbered="true" toc="default"> | <section anchor="sec-create-offer" numbered="true" toc="default"> | |||
<name>Constructing an Offer</name> | <name>Constructing an Offer</name> | |||
<t>When createOffer is called, a new SDP description must be | <t>When createOffer is called, a new SDP description must be | |||
created that includes the functionality specified in | created that includes the functionality specified in | |||
<xref target="RFCYYY5" format="default"/>. The exact | <xref target="RFC8834" format="default"/>. The exact | |||
details of this process are explained below.</t> | details of this process are explained below.</t> | |||
<section anchor="sec.initial-offers" numbered="true" toc="default"> | <section anchor="sec.initial-offers" numbered="true" toc="default"> | |||
<name>Initial Offers</name> | <name>Initial Offers</name> | |||
<t>When createOffer is called for the first time, the result | <t>When createOffer is called for the first time, the result | |||
is known as the initial offer.</t> | is known as the initial offer.</t> | |||
<t>The first step in generating an initial offer is to | <t>The first step in generating an initial offer is to | |||
generate session-level attributes, as specified in | generate session-level attributes, as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="5"/>. Specifical ly: | <xref target="RFC4566" sectionFormat="comma" section="5"/>. Specifical ly: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The first SDP line <bcp14>MUST</bcp14> be "v=0", as specified in | <li>The first SDP line <bcp14>MUST</bcp14> be "v=0", as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.1"/></li> | <xref target="RFC4566" sectionFormat="comma" section="5.1"/>.</li> | |||
<li>The second SDP line <bcp14>MUST</bcp14> be an "o=" line, as spec ified | <li>The second SDP line <bcp14>MUST</bcp14> be an "o=" line, as spec ified | |||
in | in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.2"/>. The va | <xref target="RFC4566" sectionFormat="comma" section="5.2"/>. | |||
lue of | ||||
<!-- [rfced] Sections 5.2.1 and subsequent: Several instances of | ||||
", as specified in [RFC..." are confusing as written. Please see the | ||||
items below, and let us know if we may either remove the leading | ||||
commas or rephrase in these instances (e.g., use "defined" instead of | ||||
"specified"). (For example, in the current text it looks like | ||||
[RFC4566], Section 5.1 sets the requirement, but we don't see a | ||||
requirement listed there - only a definition.) | ||||
Examples from original: | ||||
o The first SDP line MUST be "v=0", as specified in [RFC4566], | ||||
Section 5.1 | ||||
o The second SDP line MUST be an "o=" line, as specified in | ||||
[RFC4566], Section 5.2. | ||||
... | ||||
o The third SDP line MUST be a "s=" line, as specified in [RFC4566], | ||||
Section 5.3; | ||||
... | ||||
o A "t=" line MUST be added, as specified in [RFC4566], Section 5.9; | ||||
... | ||||
The m= line MUST be followed immediately by a "c=" line, as specified | ||||
in [RFC4566], Section 5.7. | ||||
... | ||||
* If RTCP mux is indicated, prepare to demux RTP and RTCP from | ||||
the RTP ICE component, as specified in [RFC5761], | ||||
Section 5.1.3. | ||||
... | ||||
If media is already being transmitted, | ||||
the same SSRC SHOULD be used unless the clockrate of the new | ||||
codec is different, in which case a new SSRC MUST be chosen, as | ||||
specified in [RFC7160], Section 3.1. --> | ||||
The value of | ||||
the <username> field <bcp14>SHOULD</bcp14> be "-". The sess-id <bcp14>MUST</bcp14> | the <username> field <bcp14>SHOULD</bcp14> be "-". The sess-id <bcp14>MUST</bcp14> | |||
be representable by a 64-bit signed integer, and the | be representable by a 64-bit signed integer, and the | |||
value <bcp14>MUST</bcp14> be less than (2**63)-1. It is <bcp14>RECOM | value <bcp14>MUST</bcp14> be less than (2**63)-1 | |||
MENDED</bcp14> that the | ((2<sup>63</sup>)-1). | |||
<!-- [rfced] Section 5.2.1: Equations and other math-related items: | ||||
Per <https://www.rfc-editor.org/materials/FAQ-xml2rfcv3.html>, | ||||
xml2rfc v3 provides the ability to use superscript (among other | ||||
features previously not available). Please note that superscript | ||||
will display in the .html and .pdf files but not in the .txt file | ||||
(where it appears as "(2^(63))-1"). We added the "superscript" | ||||
version of "(2**63)-1" in parentheses here, to show you how it would | ||||
appear. Please let us know if you would like to use the superscript | ||||
feature. | ||||
Also, if there are other items in this document that could use | ||||
similar treatment, please let us know. | ||||
Original: | ||||
The sess-id MUST be representable by a 64-bit signed | ||||
integer, and the value MUST be less than (2**63)-1. | ||||
Currently: | ||||
.xml (to be updated per your preference): | ||||
... less than (2**63)-1 ((2<sup>63</sup>)-1). --> | ||||
It is <bcp14>RECOMMENDED</bcp14> that the | ||||
sess-id be constructed by generating a 64-bit quantity with | sess-id be constructed by generating a 64-bit quantity with | |||
the highest bit set to zero and the remaining 63 | the highest bit set to zero and the remaining 63 | |||
bits being cryptographically random. The value of the | bits being cryptographically random. The value of the | |||
<nettype> <addrtype> <unicast-address> | <nettype> <addrtype> <unicast-address> | |||
tuple <bcp14>SHOULD</bcp14> be set to a non-meaningful address, such as IN | tuple <bcp14>SHOULD</bcp14> be set to a non-meaningful address, such as IN | |||
IP4 0.0.0.0, to prevent leaking a local IP address in this | IP4 0.0.0.0, to prevent leaking a local IP address in this | |||
field; this problem is discussed in | field; this problem is discussed in | |||
<xref target="RFCYYY3" format="default"/>. As mentioned in | <xref target="RFC8828" format="default"/>. As mentioned in | |||
<xref target="RFC4566" format="default"/>, the entire o= line needs | <xref target="RFC4566" format="default"/>, the entire "o=" line need | |||
to | s to | |||
be unique, but selecting a random number for | be unique, but selecting a random number for | |||
<sess-id> is sufficient to accomplish this.</li> | <sess-id> is sufficient to accomplish this.</li> | |||
<li>The third SDP line <bcp14>MUST</bcp14> be a "s=" line, as specif ied in | <li>The third SDP line <bcp14>MUST</bcp14> be a "s=" line, as specif ied in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.3"/>; to mat ch the | <xref target="RFC4566" sectionFormat="comma" section="5.3"/>; to mat ch the | |||
"o=" line, a single dash <bcp14>SHOULD</bcp14> be used as the sessio n | "o=" line, a single dash <bcp14>SHOULD</bcp14> be used as the sessio n | |||
name, e.g. "s=-". Note that this differs from the advice in | name, e.g., "s=-". Note that this differs from the advice in | |||
<xref target="RFC4566" format="default"/> which proposes a single sp ace, but | <xref target="RFC4566" format="default"/>, which proposes a single s pace, but | |||
as both "o=" and "s=" are meaningless in JSEP, having the | as both "o=" and "s=" are meaningless in JSEP, having the | |||
same meaningless value seems clearer.</li> | same meaningless value seems clearer.</li> | |||
<li>Session Information ("i="), URI ("u="), Email Address | <li>Session Information ("i="), URI ("u="), Email Address | |||
("e="), Phone Number ("p="), Repeat Times ("r="), and Time | ("e="), Phone Number ("p="), Repeat Times ("r="), and Time | |||
Zones ("z=") lines are not useful in this context and | Zones ("z=") lines are not useful in this context and | |||
<bcp14>SHOULD NOT</bcp14> be included.</li> | <bcp14>SHOULD NOT</bcp14> be included.</li> | |||
<li>Encryption Keys ("k=") lines do not provide sufficient | <li>Encryption Keys ("k=") lines do not provide sufficient | |||
security and <bcp14>MUST NOT</bcp14> be included.</li> | security and <bcp14>MUST NOT</bcp14> be included.</li> | |||
<li>A "t=" line <bcp14>MUST</bcp14> be added, as specified in | <li>A "t=" line <bcp14>MUST</bcp14> be added, as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.9"/>; both | <xref target="RFC4566" sectionFormat="comma" section="5.9"/>; both | |||
<start-time> and <stop-time> <bcp14>SHOULD</bcp14> be se t to | <start-time> and <stop-time> <bcp14>SHOULD</bcp14> be se t to | |||
zero, e.g. "t=0 0".</li> | zero, e.g., "t=0 0".</li> | |||
<li>An "a=ice-options" line with the "trickle" and "ice2" | <li>An "a=ice-options" line with the "trickle" and "ice2" | |||
options <bcp14>MUST</bcp14> be added, as specified in <xref | options <bcp14>MUST</bcp14> be added, as specified in <xref | |||
target="RFCYYY6" sectionFormat="comma" section="3"/> and | target="RFC8840" sectionFormat="comma" section="4.1.1"/> and | |||
<xref target="RFC8445" sectionFormat="comma" section="10"/>.</li> | <xref target="RFC8445" sectionFormat="comma" section="10"/>. | |||
<li>If WebRTC identity is being used, an "a=identity" line | ||||
as described in | <!-- [rfced] Section 5.2.1: We found this RFC Editor Note on | |||
<xref target="RFCYYY2" sectionFormat="comma" section="5"/>.</li> | <https://datatracker.ietf.org/doc/draft-ietf-rtcweb-jsep/writeup/>: | |||
"OLD: | ||||
o An "a=ice-options" line with the "trickle" option MUST be added, | ||||
as specified in [I-D.ietf-ice-trickle], Section 4. | ||||
NEW: | ||||
o An "a=ice-options" line with the "trickle" option MUST be added, | ||||
as specified in [I-D.ietf-mmusic-trickle-ice-sip], Section 4.1.1." | ||||
Please note that the "OLD" text does not match what we found in the | ||||
provided draft: | ||||
o An "a=ice-options" line with the "trickle" and "ice2" options MUST | ||||
be added, as specified in [I-D.ietf-ice-trickle], Section 3 and | ||||
[RFC8445], Section 10. | ||||
We updated as follows. Is the "and [RFC8445], Section 10" still | ||||
applicable? | ||||
Currently: | ||||
* An "a=ice-options" line with the "trickle" and "ice2" options MUST | ||||
be added, as specified in [RFC8840], Section 4.1.1 and [RFC8445], | ||||
Section 10. --> | ||||
</li> | ||||
<li>If WebRTC identity is being used, an "a=identity" line, as descr | ||||
ibed in | ||||
<xref target="RFC8827" sectionFormat="comma" section="5"/>, needs | ||||
to be included. | ||||
<!-- [rfced] Section 5.2.1: This is the only bullet item in this | ||||
list that (1) is a sentence fragment, unlike the rest and (2) does | ||||
not contain "RFC 2119" language. We have updated as follows, but | ||||
please let us know if further changes are needed. | ||||
Original: | ||||
o If WebRTC identity is being used, an "a=identity" line as | ||||
described in [I-D.ietf-rtcweb-security-arch], Section 5. | ||||
Currently: | ||||
* If WebRTC identity is being used, an "a=identity" line, as | ||||
described in [RFC8827], Section 5, needs to be included. --> | ||||
</li> | ||||
</ul> | </ul> | |||
<t>The next step is to generate m= sections, as specified in | <t>The next step is to generate "m=" sections, as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.14"/>. An m= s | <xref target="RFC4566" sectionFormat="comma" section="5.14"/>. An "m=" | |||
ection is | section is | |||
generated for each RtpTransceiver that has been added to the | generated for each RtpTransceiver that has been added to the | |||
PeerConnection, excluding any stopped RtpTransceivers; this | PeerConnection, excluding any stopped RtpTransceivers; this | |||
is done in the order the RtpTransceivers were added to the | is done in the order the RtpTransceivers were added to the | |||
PeerConnection. If there are no such RtpTransceivers, no m= | PeerConnection. If there are no such RtpTransceivers, no "m=" | |||
sections are generated; more can be added later, as discussed | sections are generated; more can be added later, as discussed | |||
in | in | |||
<xref target="RFC3264" sectionFormat="comma" section="5"/>.</t> | <xref target="RFC3264" sectionFormat="comma" section="5"/>.</t> | |||
<t>For each m= section generated for an RtpTransceiver, | <t>For each "m=" section generated for an RtpTransceiver, | |||
establish a mapping between the transceiver and the index of | establish a mapping between the transceiver and the index of | |||
the generated m= section.</t> | the generated "m=" section.</t> | |||
<t>Each m= section, provided it is not marked as bundle-only, | <t>Each "m=" section, provided it is not marked as bundle-only, | |||
<bcp14>MUST</bcp14> generate a unique set of ICE credentials and gathe r its | <bcp14>MUST</bcp14> generate a unique set of ICE credentials and gathe r its | |||
own unique set of ICE candidates. Bundle-only m= sections | own unique set of ICE candidates. Bundle-only "m=" sections | |||
<bcp14>MUST NOT</bcp14> contain any ICE credentials and <bcp14>MUST NO T</bcp14> gather any | <bcp14>MUST NOT</bcp14> contain any ICE credentials and <bcp14>MUST NO T</bcp14> gather any | |||
candidates.</t> | candidates.</t> | |||
<t>For DTLS, all m= sections <bcp14>MUST</bcp14> use all the certifica te(s) | <t>For DTLS, all "m=" sections <bcp14>MUST</bcp14> use any and all cer tificates | |||
that have been specified for the PeerConnection; as a result, | that have been specified for the PeerConnection; as a result, | |||
they <bcp14>MUST</bcp14> all have the same | they <bcp14>MUST</bcp14> all have the same fingerprint value or values | |||
<xref target="RFC8122" format="default"/> fingerprint value(s), or the | <xref target="RFC8122" format="default"/>, or these | |||
se | values <bcp14>MUST</bcp14> be session-level attributes.</t> | |||
value(s) <bcp14>MUST</bcp14> be session-level attributes.</t> | <t>Each "m=" section should be generated as specified in | |||
<t>Each m= section should be generated as specified in | <xref target="RFC4566" sectionFormat="comma" section="5.14"/>. For the | |||
<xref target="RFC4566" sectionFormat="comma" section="5.14"/>. For the | "m=" line | |||
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 0. Otherwise, the port valu e is | port value <bcp14>MUST</bcp14> be set to 0. Otherwise, the port valu e 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 "dummy" port value of 9 (Discard) <bcp14>MUST</bcp14> be used, a s | the "dummy" port value of 9 (Discard) <bcp14>MUST</bcp14> be used, a s | |||
indicated in | indicated in | |||
<xref target="RFCYYY6" sectionFormat="comma" section="5.1"/>.</li> | <xref target="RFC8840" sectionFormat="comma" section="4.1.1"/>.</li> | |||
<!-- This instance of ", as specified in" is OK. --> | ||||
<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 | |||
formats <bcp14>MUST</bcp14> include the mandatory audio/video codecs as | formats <bcp14>MUST</bcp14> include the mandatory audio/video codecs as | |||
specified in | specified in | |||
<xref target="RFC7874" sectionFormat="comma" section="3"/>, and | <xref target="RFC7874" sectionFormat="comma" section="3"/> and | |||
<xref target="RFC7742" sectionFormat="comma" section="5"/>.</li> | <xref target="RFC7742" sectionFormat="comma" section="5"/>. | |||
<!-- [rfced] Sections 5.2.1, 5.3.1, and 5.11: As it appears that | ||||
each instance of "Section" in these sentences refers to the section | ||||
number of the cited RFC, as opposed to a section in this document, | ||||
we removed the commas after each first-listed section number, as | ||||
follows (particularly for any readers of the text file). Please let | ||||
us know if anything is incorrect. | ||||
Original: | ||||
o Unless excluded by the above restrictions, the media formats MUST | ||||
include the mandatory audio/video codecs as specified in | ||||
[RFC7874], Section 3, and [RFC7742], Section 5. | ||||
... | ||||
o For each media format on the m= line, "a=rtpmap" and "a=fmtp" | ||||
lines, as specified in [RFC4566], Section 6, and [RFC3264], | ||||
Section 5.1. | ||||
... | ||||
o For each media format on the m= line, "a=rtpmap" and "a=fmtp" | ||||
lines, as specified in [RFC4566], Section 6, and [RFC3264], | ||||
Section 6.1. | ||||
... | ||||
However, new media formats and new RTP header extension values | ||||
are permitted in the answer, as described in [RFC3264], | ||||
Section 7, and [RFC5285], Section 6. | ||||
Currently: | ||||
* Unless excluded by the above restrictions, the media formats MUST | ||||
include the mandatory audio/video codecs as specified in | ||||
[RFC7874], Section 3 and [RFC7742], Section 5. | ||||
... | ||||
* For each media format on the "m=" line, "a=rtpmap" and "a=fmtp" | ||||
lines, as specified in [RFC4566], Section 6 and [RFC3264], | ||||
Section 5.1. | ||||
... | ||||
* For each media format on the "m=" line, "a=rtpmap" and "a=fmtp" | ||||
lines, as specified in [RFC4566], Section 6 and [RFC3264], | ||||
Section 6.1. | ||||
... | ||||
However, new media formats and new RTP header extension values | ||||
are permitted in the answer, as described in [RFC3264], | ||||
Section 7 and [RFC5285], Section 6. --> | ||||
</li> | ||||
</ul> | </ul> | |||
<t>The m= line <bcp14>MUST</bcp14> be followed immediately by a "c=" l | ||||
ine, | <t>The "m=" line <bcp14>MUST</bcp14> be followed immediately by a "c=" | |||
line, | ||||
as specified in | as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.7"/>. Again, a s no | <xref target="RFC4566" sectionFormat="comma" section="5.7"/>. Again, a s no | |||
candidates are available yet, the "c=" line must contain the | candidates are available yet, the "c=" line must contain the | |||
"dummy" value "IN IP4 0.0.0.0", as defined in | "dummy" value "IN IP4 0.0.0.0", as defined in | |||
<xref target="RFCYYY6" sectionFormat="comma" section="5.1"/>.</t> | <xref target="RFC8840" sectionFormat="comma" section="4.1.1"/>.</t> | |||
<t> | <t> | |||
<xref target="RFCYYYH" format="default"/> groups | <xref target="RFC8859" format="default"/> groups | |||
SDP attributes into different categories. To avoid | SDP attributes into different categories. To avoid | |||
unnecessary duplication when bundling, attributes of category | unnecessary duplication when bundling, attributes of category | |||
IDENTICAL or TRANSPORT <bcp14>MUST NOT</bcp14> be repeated in bundled m= | IDENTICAL or TRANSPORT <bcp14>MUST NOT</bcp14> be repeated in bundled "m=" | |||
sections, repeating the guidance from | sections, repeating the guidance from | |||
<xref target="RFCYYYB" | <xref target="RFC8843" | |||
sectionFormat="comma" section="8.1"/>. This includes m= sections for w | sectionFormat="comma" section="8.1"/>. | |||
hich bundling has | ||||
been negotiated and is still desired, as well as m= sections | <!-- [rfced] Sections 5.2.1 and 5.2.2: Please confirm that these | |||
citations for RFC 8843 [I-D.ietf-mmusic-sdp-bundle-negotiation], Section 8.1 | ||||
are correct; we could not see a relationship. | ||||
Original: | ||||
To avoid unnecessary duplication when | ||||
bundling, attributes of category IDENTICAL or TRANSPORT MUST NOT be | ||||
repeated in bundled m= sections, repeating the guidance from | ||||
[I-D.ietf-mmusic-sdp-bundle-negotiation], Section 8.1. | ||||
... | ||||
Instead, | ||||
JSEP implementations MUST simply omit parameters in the IDENTICAL | ||||
and TRANSPORT categories for bundled m= sections, as described in | ||||
[I-D.ietf-mmusic-sdp-bundle-negotiation], Section 8.1. --> | ||||
This includes "m=" sections for which bundling has | ||||
been negotiated and is still desired, as well as "m=" sections | ||||
marked as bundle-only.</t> | marked as bundle-only.</t> | |||
<t>The following attributes, which are of a category other | <t>The following attributes, which are of a category other | |||
than IDENTICAL or TRANSPORT, <bcp14>MUST</bcp14> be included in each m = | than IDENTICAL or TRANSPORT, <bcp14>MUST</bcp14> be included in each " m=" | |||
section:</t> | section:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>An "a=mid" line, as specified in | <li>An "a=mid" line, as specified in | |||
<xref target="RFC5888" sectionFormat="comma" section="4"/>. All MI D values | <xref target="RFC5888" sectionFormat="comma" section="4"/>. All MI D values | |||
<bcp14>MUST</bcp14> be generated in a fashion that does not leak u ser | <bcp14>MUST</bcp14> be generated in a fashion that does not leak u ser | |||
information, e.g., randomly or using a per-PeerConnection | information, e.g., randomly or using a per-PeerConnection | |||
counter, and <bcp14>SHOULD</bcp14> be 3 bytes or less, to allow th em to | counter, and <bcp14>SHOULD</bcp14> be 3 bytes or less, to allow th em to | |||
efficiently fit into the RTP header extension defined in | efficiently fit into the RTP header extension defined in | |||
<xref target="RFCYYYB" sectionFormat="comma" section="14"/>. Note | <xref target="RFC8843" sectionFormat="comma" section="14"/>. | |||
that this does not set the | ||||
<!-- [rfced] Section 5.2.1: Please confirm that this citation is | ||||
correct; we could not see a relationship between Section 14 of | ||||
RFC 8843 [I-D.ietf-mmusic-sdp-bundle-negotiation] and the RTP header extension. | ||||
Original: | ||||
All MID | ||||
values MUST be generated in a fashion that does not leak user | ||||
information, e.g., randomly or using a per-PeerConnection counter, | ||||
and SHOULD be 3 bytes or less, to allow them to efficiently fit | ||||
into the RTP header extension defined in | ||||
[I-D.ietf-mmusic-sdp-bundle-negotiation], Section 14. --> | ||||
Note that this does not set the | ||||
RtpTransceiver mid property, as that only occurs when the | RtpTransceiver mid property, as that only occurs when the | |||
description is applied. The generated MID value can be | description is applied. The generated MID value can be | |||
considered a "proposed" MID at this point.</li> | considered a "proposed" MID at this point.</li> | |||
<li>A direction attribute which is the same as that of the | <li>A direction attribute that is the same as that of the | |||
associated transceiver.</li> | associated transceiver.</li> | |||
<li>For each media format on the m= line, "a=rtpmap" and | <li>For each media format on the "m=" line, "a=rtpmap" and "a=fmtp" | |||
"a=fmtp" lines, as specified in | 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 FEC mechanism, "a=rtpmap" and | <li>For each supported Forward Error Correction (FEC) mechanism, "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="RFCYYYF" sectionFormat="comma" section="6"/>, | <xref target="RFC8854" sectionFormat="comma" section="6"/>, | |||
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 target="sec.sdp-interaction-procedure" | Sections <xref target="sec.interface" format="counter"/> and <xref target="sec.sdp-interaction-procedure" | |||
format="counter"/>.</li> | format="counter"/>. | |||
<li>If this m= section is for media with configurable | ||||
<!-- [rfced] Sections 5.2.1 and 5.3.1: Please confirm that Section 6 | ||||
of RFC 8854 [I-D.ietf-rtcweb-fec] is the correct section to cite here; we | ||||
could not see a relationship. | ||||
Also, should "Sections 4 and 5" be "Sections 4 and 5 of | ||||
RFC 8854 [I-D.ietf-rtcweb-fec]"? The hyperlinks in the .html file steer to | ||||
Sections 4 and 5 of this document, and we could not find relevant | ||||
text in those sections. | ||||
Original: | ||||
The FEC mechanisms that | ||||
MUST be supported are specified in [I-D.ietf-rtcweb-fec], | ||||
Section 6, and specific usage for each media type is outlined in | ||||
Sections 4 and 5. | ||||
... | ||||
The FEC mechanisms that | ||||
MUST be supported are specified in [I-D.ietf-rtcweb-fec], | ||||
Section 6, and specific usage for each media type is outlined in | ||||
Sections 4 and 5. --> | ||||
</li> | ||||
<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 which 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 supported RTP header extension, an "a=extmap" | |||
line, as specified in | line, as specified in | |||
<xref target="RFC5285" sectionFormat="comma" section="5"/>. The li | <xref target="RFC5285" sectionFormat="comma" section="5"/>. | |||
st of | ||||
<!-- [rfced] Sections 5.2.1 and subsequent: RFC 5285 has been | ||||
obsoleted by RFC 8285. Should RFC 8285 be cited throughout the | ||||
document and listed as a Normative Reference instead of RFC 5285? | ||||
If yes, please review all textual citations (eight, by our count), | ||||
and let us know if any of the section numbers (Sections 5, 6, and | ||||
7 of RFC 5285 are cited) also need to be updated. | ||||
Original: | ||||
o For each supported RTP header extension, an "a=extmap" line, as | ||||
specified in [RFC5285], Section 5. | ||||
... | ||||
o For each supported RTP header extension that is present in the | ||||
offer, an "a=extmap" line, as specified in [RFC5285], Section 5. | ||||
... | ||||
... etc. --> | ||||
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="RFCYYY5" 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 supported RTCP feedback mechanism, an | |||
"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="RFCYYY5" 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="RFCYYY4" 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 RID values | direction, and the application has specified RID values | |||
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="RFCYYYC" 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 value, it <bcp14>MUST</bcp14> be used as the rid-identifier; | RID value, it <bcp14>MUST</bcp14> be used as the rid-identifier; | |||
otherwise a RID value <bcp14>MUST</bcp14> be generated by the | otherwise, a RID value <bcp14>MUST</bcp14> be generated by the | |||
implementation. RID values <bcp14>MUST</bcp14> be generated in a f ashion | implementation. RID values <bcp14>MUST</bcp14> be generated in a f ashion | |||
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, and <bcp14>SHOULD</bcp14> be 3 bytes | using a per-PeerConnection counter, 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 extension defined in | header extension defined in | |||
<xref target="RFCYYYD" sectionFormat="comma" section="3"/>. If | <xref target="RFC8852" sectionFormat="comma" section="3"/>. | |||
<!-- [rfced] Section 5.2.1: Section 3 of RFC 8852 [I-D.ietf-avtext-rid] lists | ||||
several header extensions. Should "extension" in this sentence be | ||||
"extensions," or should one of the extension types be specified here? | ||||
Original: | ||||
RID values MUST be generated in a fashion that | ||||
does not leak user information, e.g., randomly or using a per- | ||||
PeerConnection counter, and SHOULD be 3 bytes or less, to allow | ||||
them to efficiently fit into the RTP header extension defined in | ||||
[I-D.ietf-avtext-rid], Section 3. --> | ||||
If | ||||
no encodings have been specified, or only one encoding is | no encodings have been specified, or only one encoding is | |||
specified but without a RID value, then no "a=rid" lines | specified but without a RID value, 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="RFCYYYE" sectionFormat="comma" section="6.2"/>. The | <xref target="RFC8853" sectionFormat="comma" | |||
list of RIDs <bcp14>MUST</bcp14> include all of the RID | section="6.2"/>. The list of RIDs <bcp14>MUST</bcp14> | |||
identifiers used in the "a=rid" lines for this m= | include all of the RID identifiers | |||
used in the "a=rid" lines for this "m=" | ||||
section.</li> | section.</li> | |||
<li>If the bundle policy for this PeerConnection is set to | <li>If the bundle policy for this PeerConnection is set to | |||
"max-bundle", and this is not the first m= section, or | "max-bundle", and this is not the first "m=" section, or | |||
the bundle policy is set to "balanced", and this is not | the bundle policy is set to "balanced", and this is not | |||
the first m= section for this media type, an | the first "m=" section for this media type, an | |||
"a=bundle-only" line.</li> | "a=bundle-only" line. | |||
<!-- [rfced] Section 5.2.1: We had trouble sorting out the "and" | ||||
... "or" relationships here. If the suggested text is not correct, | ||||
please clarify. | ||||
Original: | ||||
o If the bundle policy for this PeerConnection is set to "max- | ||||
bundle", and this is not the first m= section, or the bundle | ||||
policy is set to "balanced", and this is not the first m= section | ||||
for this media type, an "a=bundle-only" line. | ||||
Suggested: | ||||
o If (1) the bundle policy for this PeerConnection is set to "max- | ||||
bundle" and this is not the first "m=" section or (2) the bundle | ||||
policy is set to "balanced" and this is not the first "m=" section | ||||
for this media type, an "a=bundle-only" line. --> | ||||
</li> | ||||
</ul> | </ul> | |||
<t>The following attributes, which are of category IDENTICAL | <t>The following attributes, which are of category IDENTICAL | |||
or TRANSPORT, <bcp14>MUST</bcp14> appear only in "m=" sections which e | or TRANSPORT, <bcp14>MUST</bcp14> appear only in "m=" sections that ei | |||
ither | ther | |||
have a unique address or which are associated with the | have a unique address or are associated with the | |||
bundle-tag. (In initial offers, this means those "m=" | BUNDLE-tag. (In initial offers, this means those "m=" | |||
sections which do not contain an "a=bundle-only" | sections that do not contain an "a=bundle-only" | |||
attribute.)</t> | attribute.)</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>"a=ice-ufrag" and "a=ice-pwd" lines, as specified in | <li>"a=ice-ufrag" and "a=ice-pwd" lines, as specified in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="4.4"/>.</li> | <xref target="RFC8839" sectionFormat="comma" section="5.4"/>.</li> | |||
<li>For each desired digest algorithm, one or more | <li>For each desired digest algorithm, one or more | |||
"a=fingerprint" lines for each of the endpoint's | "a=fingerprint" lines for each of the endpoint's | |||
certificates, as specified in | certificates, as specified in | |||
<xref target="RFC8122" sectionFormat="comma" section="5"/>.</li> | <xref target="RFC8122" sectionFormat="comma" section="5"/>.</li> | |||
<li>An "a=setup" line, as specified in | <li>An "a=setup" line, as specified in | |||
<xref target="RFC4145" sectionFormat="comma" section="4"/>, and cl arified | <xref target="RFC4145" sectionFormat="comma" section="4"/> and cla rified | |||
for use in DTLS-SRTP scenarios in | for use in DTLS-SRTP scenarios in | |||
<xref target="RFC5763" sectionFormat="comma" section="5"/>. The ro le value | <xref target="RFC5763" sectionFormat="comma" section="5"/>. The ro le value | |||
in the offer <bcp14>MUST</bcp14> be "actpass".</li> | in the offer <bcp14>MUST</bcp14> be "actpass".</li> | |||
<li>An "a=tls-id" line, as specified in | <li>An "a=tls-id" line, as specified in | |||
<xref target="RFCYYYA" sectionFormat="comma" section="5.2"/>.</li> | <xref target="RFC8842" sectionFormat="comma" section="5.2"/>.</li> | |||
<li>An "a=rtcp" line, as specified in | <li>An "a=rtcp" line, as specified in | |||
<xref target="RFC3605" sectionFormat="comma" section="2.1"/>, cont aining | <xref target="RFC3605" sectionFormat="comma" section="2.1"/>, cont aining | |||
the dummy value "9 IN IP4 0.0.0.0", because no candidates | the dummy value "9 IN IP4 0.0.0.0", because no candidates | |||
have yet been gathered.</li> | have yet been gathered. | |||
<!-- [rfced] Sections 5.2.1 and 5.3.1: Please confirm that | ||||
"9 IN IP4 0.0.0.0" (and not "IN IP4 0.0.0.0") is correct in these | ||||
two items. | ||||
Original: | ||||
o An "a=rtcp" line, as specified in [RFC3605], Section 2.1, | ||||
containing the dummy value "9 IN IP4 0.0.0.0", because no | ||||
candidates have yet been gathered. | ||||
... | ||||
Otherwise, an "a=rtcp" line, as | ||||
specified in [RFC3605], Section 2.1, containing the dummy value "9 | ||||
IN IP4 0.0.0.0" (because no candidates have yet been gathered). --> | ||||
</li> | ||||
<li>An "a=rtcp-mux" line, as specified in | <li>An "a=rtcp-mux" line, as specified in | |||
<xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>.</l i> | <xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>.</l i> | |||
<li>If the RTP/RTCP multiplexing policy is "require", an | <li>If the RTP/RTCP multiplexing policy is "require", an | |||
"a=rtcp-mux-only" line, as specified in | "a=rtcp-mux-only" line, as specified in | |||
<xref target="RFCYYYG" 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, a 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> b e set | set to "application", and the <proto> field <bcp14>MUST</bcp14> be set | |||
to "UDP/DTLS/SCTP" | to "UDP/DTLS/SCTP" | |||
<xref target="RFCYYY9" 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="RFCYYY9" sectionFormat="comma" section="4.1"/>.</t> | <xref target="RFC8841" sectionFormat="comma" section="4.1"/>. | |||
<t>Within the data m= section, an "a=mid" line <bcp14>MUST</bcp14> be | ||||
<!-- [rfced] Section 5.2.1: We could not find any mention of | ||||
"webrtc-datachannel" in Section 4.1 of RFC 8841 [I-D.ietf-mmusic-sctp-sdp]. | ||||
Please confirm that this citation is correct and will be clear to | ||||
readers. | ||||
Original: | ||||
The "fmt" value MUST be set to "webrtc- | ||||
datachannel" as specified in [I-D.ietf-mmusic-sctp-sdp], Section 4.1. --> | ||||
</t> | ||||
<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="RFCYYY9" 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="RFCYYY9" 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=" | |||
section either has a unique address or is associated with the | section either has a unique address or is associated with the | |||
bundle-tag (e.g., if it is the only m= section): | BUNDLE-tag (e.g., if it is the only "m=" section): | |||
</t> | </t> | |||
<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 identifier | semantics "BUNDLE" and <bcp14>MUST</bcp14> include the mid identifiers | |||
s of | 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 | |||
the mid values for each RtpTransceiver.</t> | the mid values for each RtpTransceiver.</t> | |||
<t>Attributes which SDP permits to either be at the session | <t>Attributes that SDP permits to be at either the session | |||
level or the media level <bcp14>SHOULD</bcp14> generally be at the med ia | level or the media level <bcp14>SHOULD</bcp14> generally be at the med ia | |||
level even if they are identical. This assists development | level even if they are identical. This assists development | |||
and debugging by making it easier to understand individual | and debugging by making it easier to understand individual | |||
media sections, especially if one of a set of initially | media sections, especially if one of a set of initially | |||
identical attributes is subsequently changed. However, | identical attributes is subsequently changed. However, | |||
implementations <bcp14>MAY</bcp14> choose to aggregate attributes at t he | implementations <bcp14>MAY</bcp14> choose to aggregate attributes at t he | |||
session level and JSEP implementations <bcp14>MUST</bcp14> be prepared to | session level, and JSEP implementations <bcp14>MUST</bcp14> be prepare d to | |||
receive attributes in either location.</t> | receive attributes in either location.</t> | |||
<t>Attributes other than the ones specified above <bcp14>MAY</bcp14> b e | <t>Attributes other than the ones specified above <bcp14>MAY</bcp14> b e | |||
included, except for the following attributes which are | included, except for the following attributes, which are | |||
specifically incompatible with the requirements of | specifically incompatible with the requirements of | |||
<xref target="RFCYYY5" format="default"/>, and <bcp14>MUST | <xref target="RFC8834" format="default"/> and <bcp14>MUST | |||
NOT</bcp14> be included: | NOT</bcp14> be included: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>"a=crypto"</li> | <li>"a=crypto"</li> | |||
<li>"a=key-mgmt"</li> | <li>"a=key-mgmt"</li> | |||
<li>"a=ice-lite"</li> | <li>"a=ice-lite"</li> | |||
</ul> | </ul> | |||
<t>Note that when bundle is used, any additional attributes | <t>Note that when bundle is used, any additional attributes | |||
that are added <bcp14>MUST</bcp14> follow the advice in | that are added <bcp14>MUST</bcp14> follow the advice in | |||
<xref target="RFCYYYH" format="default"/> on | <xref target="RFC8859" format="default"/> on | |||
how those attributes interact with bundle.</t> | how those attributes interact with bundle.</t> | |||
<t>Note that these requirements are in some cases stricter | <t>Note that these requirements are in some cases stricter | |||
than those of SDP. Implementations <bcp14>MUST</bcp14> be prepared to accept | than those of SDP. Implementations <bcp14>MUST</bcp14> be prepared to accept | |||
compliant SDP even if it would not conform to the | compliant SDP even if it would not conform to the | |||
requirements for generating SDP in this specification.</t> | requirements for generating SDP in this specification.</t> | |||
</section> | </section> | |||
<section anchor="sec.subsequent-offers" numbered="true" toc="default"> | <section anchor="sec.subsequent-offers" numbered="true" toc="default"> | |||
<name>Subsequent Offers</name> | <name>Subsequent Offers</name> | |||
<t>When createOffer is called a second (or later) time, or is | <t>When createOffer is called a second (or later) time or is | |||
called after a local description has already been installed, | called after a local description has already been installed, | |||
the processing is somewhat different than for an initial | the processing is somewhat different than for an initial | |||
offer.</t> | offer.</t> | |||
<t>If the previous offer was not applied using | <t>If the previous offer was not applied using | |||
setLocalDescription, meaning the PeerConnection is still in | setLocalDescription, meaning the PeerConnection is still in | |||
the "stable" state, the steps for generating an initial offer | the "stable" state, the steps for generating an initial offer | |||
should be followed, subject to the following restriction: | should be followed, subject to the following restriction: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The fields of the "o=" line <bcp14>MUST</bcp14> stay the same ex cept | <li>The fields of the "o=" line <bcp14>MUST</bcp14> stay the same ex cept | |||
skipping to change at line 2087 ¶ | skipping to change at line 2670 ¶ | |||
<session-version>.</t> | <session-version>.</t> | |||
<t>If the previous offer was applied using | <t>If the previous offer was applied using | |||
setLocalDescription, but a corresponding answer from the | setLocalDescription, but a corresponding answer from the | |||
remote side has not yet been applied, meaning the | remote side has not yet been applied, meaning the | |||
PeerConnection is still in the "have-local-offer" state, an | PeerConnection is still in the "have-local-offer" state, an | |||
offer is generated by following the steps in the "stable" | offer is generated by following the steps in the "stable" | |||
state above, along with these exceptions: | state above, along with these exceptions: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The "s=" and "t=" lines <bcp14>MUST</bcp14> stay the same.</li> | <li>The "s=" and "t=" lines <bcp14>MUST</bcp14> stay the same.</li> | |||
<li>If any RtpTransceiver has been added, and there exists | <li>If any RtpTransceiver has been added and there exists | |||
an m= section with a zero port in the current local | an "m=" section with a zero port in the current local | |||
description or the current remote description, that m= | description or the current remote description, that "m=" | |||
section <bcp14>MUST</bcp14> be recycled by generating an m= section | section <bcp14>MUST</bcp14> be recycled by generating an "m=" sectio | |||
for | n for | |||
the added RtpTransceiver as if the m= section were being | the added RtpTransceiver as if the "m=" section were being | |||
added to the session description (including a new MID | added to the session description (including a new MID | |||
value), and placing it at the same index as the m= section | value) and placing it at the same index as the "m=" section | |||
with a zero port.</li> | with a zero port.</li> | |||
<li>If an RtpTransceiver is stopped and is not associated | <li>If an RtpTransceiver is stopped and is not associated | |||
with an m= section, an m= section <bcp14>MUST NOT</bcp14> be generat | with an "m=" section, an "m=" section <bcp14>MUST NOT</bcp14> be gen | |||
ed for | erated for | |||
it. This prevents adding back RtpTransceivers whose m= | it. This prevents adding back RtpTransceivers whose "m=" | |||
sections were recycled and used for a new RtpTransceiver in | sections were recycled and used for a new RtpTransceiver in | |||
a previous offer/ answer exchange, as described above.</li> | a previous offer/ answer exchange, as described above.</li> | |||
<li>If an RtpTransceiver has been stopped and is associated | <li>If an RtpTransceiver has been stopped and is associated | |||
with an m= section, and the m= section is not being | with an "m=" section, and the "m=" section is not being | |||
recycled as described above, an m= section <bcp14>MUST</bcp14> be | recycled as described above, an "m=" section <bcp14>MUST</bcp14> be | |||
generated for it with the port set to zero and all "a=msid" | generated for it with the port set to zero and all "a=msid" | |||
lines removed.</li> | lines removed.</li> | |||
<li>For RtpTransceivers that are not stopped, the "a=msid" | <li>For RtpTransceivers that are not stopped, the "a=msid" | |||
line(s) <bcp14>MUST</bcp14> stay the same if they are present in the | line or lines <bcp14>MUST</bcp14> stay the same if they are present in the | |||
current description, regardless of changes to the | current description, regardless of changes to the | |||
transceiver's direction or track. If no "a=msid" line is | transceiver's direction or track. If no "a=msid" line is | |||
present in the current description, "a=msid" line(s) <bcp14>MUST</bc p14> | present in the current description, "a=msid" line(s) <bcp14>MUST</bc p14> | |||
be generated according to the same rules as for an initial | be generated according to the same rules as for an initial | |||
offer.</li> | offer.</li> | |||
<li>Each "m=" and c=" line <bcp14>MUST</bcp14> be filled in with the port, | <li>Each "m=" and "c=" line <bcp14>MUST</bcp14> be filled in with th e port, | |||
relevant RTP profile, and address of the default candidate for the | relevant RTP profile, and address of the default candidate for the | |||
m= section, as described in | "m=" section, as described in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="3.2.1.2"/>, an | <xref target="RFC8839" sectionFormat="comma" section="4.2.1.2"/> and | |||
d clarified in | clarified in | |||
<xref target="sec.profile-names" format="default"/>. | <xref target="sec.profile-names" format="default"/>. | |||
If no RTP candidates have yet been gathered, dummy | If no RTP candidates have yet been gathered, dummy | |||
values <bcp14>MUST</bcp14> still be used, as described above.</li> | values <bcp14>MUST</bcp14> still be used, as described above.</li> | |||
<li>Each "a=mid" line <bcp14>MUST</bcp14> stay the same.</li> | <li>Each "a=mid" line <bcp14>MUST</bcp14> stay the same.</li> | |||
<li>Each "a=ice-ufrag" and "a=ice-pwd" line <bcp14>MUST</bcp14> stay the | <li>Each "a=ice-ufrag" and "a=ice-pwd" line <bcp14>MUST</bcp14> stay the | |||
same, unless the ICE configuration has changed (either | same, unless the ICE configuration has changed (e.g., changes to | |||
changes to the supported STUN/TURN servers, or the ICE | either the supported STUN/TURN servers or the ICE | |||
candidate policy), or the "IceRestart" option ( | candidate policy) or the "IceRestart" option | |||
<xref target="sec.icerestart" format="default"/> was specified. If t | (<xref target="sec.icerestart" format="default"/>) was specified. | |||
he m= | ||||
section is bundled into another m= section, it still <bcp14>MUST | <!-- [rfced] Section 5.2.2: As it appears that "either changes to" | |||
means "changes to either," we updated this sentence accordingly. | ||||
Please let us know if this is incorrect. | ||||
Original (the parentheses around "Section 5.2.3.1" have been fixed): | ||||
o Each "a=ice-ufrag" and "a=ice-pwd" line MUST stay the same, unless | ||||
the ICE configuration has changed (either changes to the supported | ||||
STUN/TURN servers, or the ICE candidate policy), or the | ||||
"IceRestart" option ( Section 5.2.3.1 was specified. | ||||
Currently: | ||||
* Each "a=ice-ufrag" and "a=ice-pwd" line MUST stay the same, unless | ||||
the ICE configuration has changed (e.g., changes to either the | ||||
supported STUN/TURN servers or the ICE candidate policy) or the | ||||
"IceRestart" option (Section 5.2.3.1) was specified. --> | ||||
If the "m=" | ||||
section is bundled into another "m=" section, it still <bcp14>MUST | ||||
NOT</bcp14> contain any ICE credentials.</li> | NOT</bcp14> contain any ICE credentials.</li> | |||
<li>If the m= section is not bundled into another m= | <li>If the "m=" section is not bundled into another "m=" | |||
section, its "a=rtcp" attribute line <bcp14>MUST</bcp14> be filled i n with | section, its "a=rtcp" attribute line <bcp14>MUST</bcp14> be filled i n with | |||
the port and address of the default RTCP candidate, as | the port and address of the default RTCP candidate, as | |||
indicated in | indicated in | |||
<xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>. If n o RTCP | <xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>. If n o RTCP | |||
candidates have yet been gathered, dummy values <bcp14>MUST</bcp14> be | candidates have yet been gathered, dummy values <bcp14>MUST</bcp14> be | |||
used, as described in the initial offer section above.</li> | used, as described in <xref target="sec.initial-offers"/> above. | |||
<li>If the m= section is not bundled into another m= | ||||
<!-- [rfced] Sections 5.2.2, 5.3.1, and 5.3.2: We changed "the | ||||
initial offer section" and "the initial offers section" to | ||||
"Section 5.2.1," and we changed "the initial answer section" to | ||||
"Section 5.3.1." Please let us know if these changes are incorrect. | ||||
Original: | ||||
If no RTCP candidates have yet been gathered, | ||||
dummy values MUST be used, as described in the initial offer | ||||
section above. | ||||
... | ||||
The process here is identical to that | ||||
indicated in the initial offers section above, except that the | ||||
"a=ice-options" line, with the "trickle" option as specified in | ||||
[I-D.ietf-ice-trickle], Section 3, and the "ice2" option as specified | ||||
in [RFC8445], Section 10, is only included if such an option was | ||||
present in the offer. | ||||
... | ||||
If no RTCP candidates have yet been gathered, dummy values MUST be | ||||
used, as described in the initial answer section above. | ||||
Currently: | ||||
If no RTCP candidates have yet been gathered, | ||||
dummy values MUST be used, as described in Section 5.2.1 above. | ||||
... | ||||
The process here is identical to that | ||||
indicated in Section 5.2.1 above, except that the "a=ice-options" | ||||
line, with the "trickle" option as specified in [RFC8840], | ||||
Section 4.1.3 and the "ice2" option as specified in [RFC8445], | ||||
Section 10, is only included if such an option was present in the | ||||
offer. | ||||
... | ||||
If no RTCP candidates have yet been gathered, dummy values MUST be | ||||
used, as described in Section 5.3.1 above. --> | ||||
</li> | ||||
<li>If the "m=" section is not bundled into another "m=" | ||||
section, for each candidate that has been gathered during | section, for each candidate that has been gathered during | |||
the most recent gathering phase (see | the most recent gathering phase (see | |||
<xref target="sec.ice-gather-overview" format="default"/>), an | <xref target="sec.ice-gather-overview" format="default"/>), an | |||
"a=candidate" line <bcp14>MUST</bcp14> be added, as defined in | "a=candidate" line <bcp14>MUST</bcp14> be added, as defined in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="4.1"/>. | <xref target="RFC8839" sectionFormat="comma" section="5.1"/>. | |||
If candidate gathering for the section has completed, an | If candidate gathering for the section has completed, an | |||
"a=end-of-candidates" attribute <bcp14>MUST</bcp14> be added, as des cribed | "a=end-of-candidates" attribute <bcp14>MUST</bcp14> be added, as des cribed | |||
in | in | |||
<xref target="RFCYYY6" sectionFormat="comma" section="9.3"/>. | <xref target="RFC8840" sectionFormat="comma" section="8.2"/>. | |||
If the m= section is bundled into another m= section, both | If the "m=" section is bundled into another "m=" section, both | |||
"a=candidate" and "a=end-of-candidates" <bcp14>MUST</bcp14> be | "a=candidate" and "a=end-of-candidates" <bcp14>MUST</bcp14> be | |||
omitted.</li> | omitted. | |||
<!-- [rfced] Section 5.2.2: We found this RFC Editor Note on | ||||
<https://datatracker.ietf.org/doc/draft-ietf-rtcweb-jsep/writeup/>: | ||||
"OLD: | ||||
o If the m= section is not bundled into another m= section, for each | ||||
candidate that has been gathered during the most recent gathering | ||||
phase (see Section 3.5.1), an "a=candidate" line MUST be added, as | ||||
defined in [RFC5245], Section 4.3., paragraph 3. If candidate | ||||
gathering for the section has completed, an "a=end-of-candidates" | ||||
attribute MUST be added, as described in [I-D.ietf-ice-trickle], | ||||
Section 9.3. If the m= section is bundled into another m= | ||||
section, both "a=candidate" and "a=end-of-candidates" MUST be | ||||
omitted. | ||||
NEW: | ||||
o If the m= section is not bundled into another m= section, for each | ||||
candidate that has been gathered during the most recent gathering | ||||
phase (see Section 3.5.1), an "a=candidate" line MUST be added, as | ||||
defined in [RFC5245], Section 4.3., paragraph 3. If candidate | ||||
gathering for the section has completed, an "a=end-of-candidates" | ||||
attribute MUST be added, as described in | ||||
[I-D.ietf-mmusic-trickle-ice-sip], Section 8.2. If the m= section is | ||||
bundled into another m= section, both "a=candidate" and | ||||
"a=end-of-candidates" MUST be omitted." | ||||
Please note that the "OLD" text does not match what we found in the | ||||
provided draft (i.e., "[RFC5245], Section 4.3., paragraph 3" versus | ||||
"[I-D.ietf-mmusic-ice-sip-sdp], Section 4.1"): | ||||
o If the m= section is not bundled into another m= section, for each | ||||
candidate that has been gathered during the most recent gathering | ||||
phase (see Section 3.5.1), an "a=candidate" line MUST be added, as | ||||
defined in [I-D.ietf-mmusic-ice-sip-sdp], Section 4.1. If | ||||
candidate gathering for the section has completed, an "a=end-of- | ||||
candidates" attribute MUST be added, as described in | ||||
[I-D.ietf-ice-trickle], Section 9.3. If the m= section is bundled | ||||
into another m= section, both "a=candidate" and "a=end-of- | ||||
candidates" MUST be omitted. | ||||
Please review, and let us know if further changes are needed. | ||||
(Note: "[RFC8839]" and "[RFC8840]" are the RFC numbers assigned to | ||||
[I-D.ietf-mmusic-ice-sip-sdp] and [I-D.ietf-mmusic-trickle-ice-sip], | ||||
respectively.) | ||||
Currently: | ||||
* If the "m=" section is not bundled into another "m=" section, for each | ||||
candidate that has been gathered during the most recent gathering | ||||
phase (see Section 3.5.1), an "a=candidate" line MUST be added, as | ||||
defined in [RFC8839], Section 5.1. If candidate gathering for the | ||||
section has completed, an "a=end-of-candidates" attribute MUST be | ||||
added, as described in [RFC8840], Section 8.2. If the "m=" section | ||||
is bundled into another "m=" section, both "a=candidate" and "a=end- | ||||
of-candidates" MUST be omitted. --> | ||||
</li> | ||||
<li>For RtpTransceivers that are still present, the "a=rid" | <li>For RtpTransceivers that are still present, the "a=rid" | |||
lines <bcp14>MUST</bcp14> stay the same.</li> | lines <bcp14>MUST</bcp14> stay the same.</li> | |||
<li>For RtpTransceivers that are still present, any | <li>For RtpTransceivers that are still present, any | |||
"a=simulcast" line <bcp14>MUST</bcp14> stay the same.</li> | "a=simulcast" line <bcp14>MUST</bcp14> stay the same.</li> | |||
</ul> | </ul> | |||
<t>If the previous offer was applied using | <t>If the previous offer was applied using | |||
setLocalDescription, and a corresponding answer from the | setLocalDescription, and a corresponding answer from the | |||
remote side has been applied using setRemoteDescription, | remote side has been applied using setRemoteDescription, | |||
meaning the PeerConnection is in the "have-remote-pranswer" | meaning the PeerConnection is in the "have-remote-pranswer" | |||
or "stable" states, an offer is generated based on the | state or the "stable" state, an offer is generated based on the | |||
negotiated session descriptions by following the steps | negotiated session descriptions by following the steps | |||
mentioned for the "have-local-offer" state above.</t> | mentioned for the "have-local-offer" state above.</t> | |||
<t>In addition, for each existing, non-recycled, non-rejected | <t>In addition, for each existing, non-recycled, non-rejected | |||
m= section in the new offer, the following adjustments are | "m=" section in the new offer, the following adjustments are | |||
made based on the contents of the corresponding m= section in | made based on the contents of the corresponding "m=" section in | |||
the current local or remote description, as appropriate: | the current local or remote description, as appropriate: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The m= line and corresponding "a=rtpmap" and "a=fmtp" | <li>The "m=" line and corresponding "a=rtpmap" and "a=fmtp" | |||
lines <bcp14>MUST</bcp14> only include media formats which have not | lines <bcp14>MUST</bcp14> only include media formats that have not b | |||
been | een | |||
excluded by the codec preferences of the associated | excluded by the codec preferences of the associated | |||
transceiver, and <bcp14>MUST</bcp14> include all currently available | 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 present in the most recent answer.</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 present in the most recent answer, except for the | |||
case of format-specific mechanisms that are referencing a | case of format-specific mechanisms that are referencing a | |||
newly-added media format.</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 <bcp14>MUST NOT</bcp14> be added, as ind icated | <li>An "a=bundle-only" line <bcp14>MUST NOT</bcp14> be added, as ind icated | |||
in | in | |||
<xref target="RFCYYYB" sectionFormat="comma" section="6"/>. Instead, | <xref target="RFC8843" sectionFormat="comma" section="6"/>. | |||
JSEP implementations <bcp14>MUST</bcp14> simply omit | ||||
<!-- [rfced] Section 5.2.2: We could not find any indication in | ||||
RFC 8843 [I-D.ietf-mmusic-sdp-bundle-negotiation], Section 6 that an | ||||
"a=bundle-only" line MUST NOT be added. Will this be clear to | ||||
readers? | ||||
Original: | ||||
o An "a=bundle-only" line MUST NOT be added, as indicated in | ||||
[I-D.ietf-mmusic-sdp-bundle-negotiation], Section 6. | ||||
Possibly: | ||||
* An "a=bundle-only" line, as described in [RFC8843], Section 6, | ||||
MUST NOT be added. --> | ||||
Instead, JSEP implementations <bcp14>MUST</bcp14> simply omit | ||||
parameters in the IDENTICAL and TRANSPORT categories for | parameters in the IDENTICAL and TRANSPORT categories for | |||
bundled m= sections, as described in | bundled "m=" sections, as described in | |||
<xref target="RFCYYYB" sectionFormat="comma" section="8.1"/>.</li> | <xref target="RFC8843" sectionFormat="comma" section="8.1"/>.</li> | |||
<li>Note that if media m= sections are bundled into a data | <li>Note that if media "m=" sections are bundled into a data | |||
m= section, then certain TRANSPORT and IDENTICAL attributes | "m=" section, then certain TRANSPORT and IDENTICAL attributes | |||
may appear in the data m= section even if they would | may 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"). This cannot happen in initial offers because | "a=rtcp-mux"). This cannot happen in initial offers because | |||
in the initial offer JSEP implementations always list media | in the initial offer JSEP implementations always list media | |||
m= sections (if any) before the data m= section (if any), | "m=" sections (if any) before the data "m=" section (if any), | |||
and at least one of those media m= sections will not have | and at least one of those media "m=" sections will not have | |||
the "a=bundle-only" attribute. Therefore, in initial | the "a=bundle-only" attribute. Therefore, in initial | |||
offers, any "a=bundle-only" m= sections will be bundled | offers, any "a=bundle-only" "m=" sections will be bundled | |||
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 must contain all m= | other words, the bundle attribute must 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>"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 | |||
synchronized in the new offer.</t> | synchronized in the new offer.</t> | |||
</section> | </section> | |||
<section anchor="sec.options-handling1" numbered="true" toc="default"> | <section anchor="sec.options-handling1" numbered="true" toc="default"> | |||
<name>Options Handling</name> | <name>Options Handling</name> | |||
<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 a 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="RFCYYY7" sectionFormat="comma" section="3.4.1.1.1"/>. If this | <xref target="RFC8839" sectionFormat="comma" section="4.4.3.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> | |||
skipping to change at line 2284 ¶ | skipping to change at line 2993 ¶ | |||
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 must be | <t>When createAnswer is called, a new SDP description must be | |||
created that is compatible with the supplied remote description | created that is compatible with the supplied remote description | |||
as well as the requirements specified in | as well as the requirements specified in | |||
<xref target="RFCYYY5" format="default"/>. The exact | <xref target="RFC8834" format="default"/>. The exact | |||
details of this process are explained below.</t> | details of this process are explained below.</t> | |||
<section anchor="sec.initial-answers" numbered="true" toc="default"> | <section anchor="sec.initial-answers" numbered="true" toc="default"> | |||
<name>Initial Answers</name> | <name>Initial Answers</name> | |||
<t>When createAnswer is called for the first time after a | <t>When createAnswer is called for the first time after a | |||
remote description has been provided, the result is known as | remote description has been provided, the result is known as | |||
the initial answer. If no remote description has been | the initial answer. If no remote description has been | |||
installed, an answer cannot be generated, and an error <bcp14>MUST</bc p14> | installed, an answer cannot be generated, and an error <bcp14>MUST</bc p14> | |||
be returned.</t> | be returned.</t> | |||
<t>Note that the remote description SDP may not have been | <t>Note that the remote description SDP may not have been | |||
created by a JSEP endpoint and may not conform to all the | created by a JSEP endpoint and may not conform to all the | |||
requirements listed in | requirements listed in | |||
<xref target="sec-create-offer" format="default"/>. For many cases, th is | <xref target="sec-create-offer" format="default"/>. For many cases, th is | |||
is not a problem. However, if any mandatory SDP attributes | is not a problem. However, if any mandatory SDP attributes | |||
are missing, or functionality listed as mandatory-to-use | are missing or functionality listed as mandatory-to-use | |||
above is not present, this <bcp14>MUST</bcp14> be treated as an error, | above is not present, this <bcp14>MUST</bcp14> be treated as an error | |||
and | and | |||
<bcp14>MUST</bcp14> cause the affected m= sections to be marked as | <bcp14>MUST</bcp14> cause the affected "m=" sections to be marked as | |||
rejected.</t> | rejected.</t> | |||
<t>The first step in generating an initial answer is to | <t>The first step in generating an initial answer is to | |||
generate session-level attributes. The process here is | generate session-level attributes. The process here is | |||
identical to that indicated in the initial offers section | identical to that indicated in <xref target="sec.initial-offers"/> abo | |||
above, except that the "a=ice-options" line, with the | ve, except that the "a=ice-options" line, with the | |||
"trickle" option as specified in | "trickle" option as specified in | |||
<xref target="RFCYYY6" sectionFormat="comma" section="3"/>, | <xref target="RFC8840" sectionFormat="comma" section="4.1.3"/> | |||
and the "ice2" option as specified in | and the "ice2" option as specified in | |||
<xref target="RFC8445" sectionFormat="comma" section="10"/>, is | <xref target="RFC8445" sectionFormat="comma" section="10"/>, is | |||
only included if such an option was present in the offer.</t> | only included if such an option was present in the offer. | |||
<!-- [rfced] Section 5.3.1: We found this RFC Editor Note on | ||||
<https://datatracker.ietf.org/doc/draft-ietf-rtcweb-jsep/writeup/>: | ||||
"OLD: | ||||
The first step in generating an initial answer is to generate | ||||
session-level attributes. The process here is identical to that | ||||
indicated in the initial offers section above, except that the | ||||
"a=ice-options" line, with the "trickle" option as specified in | ||||
[I-D.ietf-ice-trickle], Section 4, is only included if such an option | ||||
was present in the offer. | ||||
NEW: | ||||
The first step in generating an initial answer is to generate | ||||
session-level attributes. The process here is identical to that | ||||
indicated in the initial offers section above, except that the | ||||
"a=ice-options" line, with the "trickle" option as specified in | ||||
[I-D.ietf-mmusic-trickle-ice-sip], Section 4.1.3, is only included | ||||
if such an option was present in the offer." | ||||
Please note that the "OLD" text does not match what we found in the | ||||
provided draft: | ||||
The first step in generating an initial answer is to generate | ||||
session-level attributes. The process here is identical to that | ||||
indicated in the initial offers section above, except that the | ||||
"a=ice-options" line, with the "trickle" option as specified in | ||||
[I-D.ietf-ice-trickle], Section 3, and the "ice2" option as specified | ||||
in [RFC8445], Section 10, is only included if such an option was | ||||
present in the offer. | ||||
We updated as follows. As noted previously, (1) for ease of the | ||||
reader and (2) to create a usable hyperlink in the .html file, we | ||||
changed "the initial offers section above" to "Section 5.2.1 above." | ||||
Currently: | ||||
The first step in generating an initial answer is to generate | ||||
session-level attributes. The process here is identical to that | ||||
indicated in Section 5.2.1 above, except that the "a=ice-options" | ||||
line, with the "trickle" option as specified in [RFC8840], | ||||
Section 4.1.3 and the "ice2" option as specified in [RFC8445], | ||||
Section 10, is only included if such an option was present in the | ||||
offer. --> | ||||
</t> | ||||
<t>The next step is to generate session-level lip sync | <t>The next step is to generate session-level lip sync | |||
groups, as defined in | groups, as defined in | |||
<xref target="RFC5888" sectionFormat="comma" section="7"/>. For each g roup of type | <xref target="RFC5888" sectionFormat="comma" section="7"/>. For each g roup of type | |||
"LS" present in the offer, select the local RtpTransceivers | "LS" present in the offer, select the local RtpTransceivers | |||
that are referenced by the MID values in the specified group, | that are referenced by the MID values in the specified group, | |||
and determine which of them either reference a common local | and determine which of them either reference a common local | |||
MediaStream (specified in the calls to | MediaStream (specified in the calls to | |||
addTrack/addTransceiver used to create them), or have no | addTrack/addTransceiver used to create them) or have no | |||
MediaStream to reference because they were not created by | MediaStream to reference because they were not created by | |||
addTrack/addTransceiver. If at least two such RtpTransceivers | addTrack/addTransceiver. If at least two such RtpTransceivers | |||
exist, a group of type "LS" with the mid values of these | exist, a group of type "LS" with the mid values of these | |||
RtpTransceivers <bcp14>MUST</bcp14> be added. Otherwise the offered "L S" | RtpTransceivers <bcp14>MUST</bcp14> be added. Otherwise, the offered " LS" | |||
group <bcp14>MUST</bcp14> be ignored and no corresponding group genera ted in | group <bcp14>MUST</bcp14> be ignored and no corresponding group genera ted in | |||
the answer.</t> | the answer.</t> | |||
<t>As a simple example, consider the following offer of a | <t>As a simple example, consider the following offer of a | |||
single audio and single video track contained in the same | single audio and single video track contained in the same | |||
MediaStream. SDP lines not relevant to this example have been | MediaStream. SDP lines not relevant to this example have been | |||
removed for clarity. As explained in | removed for clarity. As explained in | |||
<xref target="sec-create-offer" format="default"/>, a group of type "L S" has | <xref target="sec-create-offer" format="default"/>, a group of type "L S" has | |||
been added that references each track's RtpTransceiver.</t> | been added that references each track's RtpTransceiver.</t> | |||
<sourcecode name="" type="sdp"><![CDATA[ | <sourcecode name="" type="sdp"><![CDATA[ | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
skipping to change at line 2385 ¶ | skipping to change at line 3139 ¶ | |||
preferences of the offerer to be maintained, and so the | preferences of the offerer to be maintained, and so the | |||
subsequent answer will contain an identical "LS" group.</t> | subsequent answer will contain an identical "LS" group.</t> | |||
<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 | <t>The example in <xref target="sec.detailed-example" format="default" | |||
<xref target="sec.detailed-example" format="default"/> example later i | /> shows a more involved case of "LS" group | |||
n this | ||||
document shows a more involved case of "LS" group | ||||
generation.</t> | generation.</t> | |||
<t>The next step is to generate m= sections for each m= | <t>The next step is to generate "m=" sections 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> | |||
<t>For each offered m= section, if any of the following | <t>For each offered "m=" section, if any of the following | |||
conditions are true, the corresponding m= section in the | conditions are true, the corresponding "m=" section in the | |||
answer <bcp14>MUST</bcp14> be marked as rejected by setting the port i n the | answer <bcp14>MUST</bcp14> be marked as rejected by setting the port i n the | |||
m= line to zero, as indicated in | "m=" line to zero, as indicated in | |||
<xref target="RFC3264" sectionFormat="comma" section="6"/>, and furthe r | <xref target="RFC3264" sectionFormat="comma" section="6"/>, and furthe r | |||
processing for this m= section can be skipped: | processing for this "m=" section can be skipped: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The associated RtpTransceiver has been stopped.</li> | <li>The associated RtpTransceiver has been stopped.</li> | |||
<li>None of the offered media formats are supported and, if | <li>None of the offered media formats are supported and, if | |||
applicable, allowed by codec preferences.</li> | applicable, allowed by codec preferences. | |||
<!-- [rfced] Section 5.3.1: Does this text mean that the offered | ||||
media formats are allowed (in which case it should say "they are | ||||
allowed") or are not allowed (in which case "and, if applicable" | ||||
should be "or, if applicable")? | ||||
Original: | ||||
o None of the offered media formats are supported and, if | ||||
applicable, allowed by codec preferences. --> | ||||
</li> | ||||
<li>The bundle policy is "max-bundle", and this is not the | <li>The bundle policy is "max-bundle", and this is not the | |||
first m= section or in the same bundle group as the first | first "m=" section or in the same bundle group as the first | |||
m= section.</li> | "m=" section.</li> | |||
<li>The bundle policy is "balanced", and this is not the | <li>The bundle policy is "balanced", and this is not the | |||
first m= section for this media type or in the same bundle | first "m=" section for this media type or in the same bundle | |||
group as the first m= section for this media type.</li> | group as the first "m=" section for this media type.</li> | |||
<li>This m= section is in a bundle group, and the group's | <li>This "m=" section is in a bundle group, and the group's | |||
offerer tagged m= section is being rejected due to one of | offerer tagged "m=" section is being rejected due to one of | |||
the above reasons. This requires all m= sections in the | the above reasons. This requires all "m=" sections in the | |||
bundle group to be rejected, as specified in | bundle group to be rejected, as specified in | |||
<xref target="RFCYYYB" sectionFormat="comma" section="7.3.3"/>.</li> | <xref target="RFC8843" sectionFormat="comma" section="7.3.3"/>.</li> | |||
</ul> | </ul> | |||
<t>Otherwise, each m= section in the answer should then be | <t>Otherwise, each "m=" section in the answer should then be | |||
generated as specified in | generated as specified in | |||
<xref target="RFC3264" sectionFormat="comma" section="6.1"/>. For the m= line | <xref target="RFC3264" sectionFormat="comma" section="6.1"/>. For the "m=" line | |||
itself, the following rules must be followed: | itself, the following rules must be followed: | |||
<!-- [rfced] Section 5.3.1: Should "must be followed:" here be "MUST be | ||||
followed:"? (We ask because (1) we see "For the m= line itself, the following | ||||
rules MUST be followed:" in Section 5.2.1 and (2) all of the rules | ||||
listed below this sentence include a "MUST.") | ||||
Original: | ||||
For the m= line itself, the | ||||
following rules must be followed: --> | ||||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The port value would normally be set to the port of the | <li>The port value would normally be set to the port of the | |||
default ICE candidate for this m= section, but given that | default ICE candidate for this "m=" section, but given that | |||
no candidates are available yet, the "dummy" port value of | no candidates are available yet, the "dummy" port value of | |||
9 (Discard) <bcp14>MUST</bcp14> be used, as indicated in | 9 (Discard) <bcp14>MUST</bcp14> be used, as indicated in | |||
<xref target="RFCYYY6" sectionFormat="comma" section="5.1"/>.</li> | <xref target="RFC8840" sectionFormat="comma" section="4.1.1"/>.</li> | |||
<li>The <proto> field <bcp14>MUST</bcp14> be set to exactly ma tch the | <li>The <proto> field <bcp14>MUST</bcp14> be set to exactly ma tch the | |||
<proto> field for the corresponding m= line in the | <proto> field for the corresponding "m=" line in the | |||
offer.</li> | offer.</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, regardless of what was offered, and | corresponding order, regardless of what was offered, and | |||
<bcp14>MUST</bcp14> exclude any codecs not present in the codec | <bcp14>MUST</bcp14> exclude any codecs not present in the codec | |||
preferences.</li> | preferences.</li> | |||
<li>Otherwise, the media formats on the m= line <bcp14>MUST</bcp14> be | <li>Otherwise, the media formats on the "m=" line <bcp14>MUST</bcp14 > be | |||
generated in the same order as those offered in the current | generated in the same order as those offered in the current | |||
remote description, excluding any currently unsupported | remote description, excluding any currently unsupported | |||
formats. Any currently available media formats that are not | formats. Any currently available media formats that are not | |||
present in the current remote description <bcp14>MUST</bcp14> be add ed | present in the current remote description <bcp14>MUST</bcp14> be add ed | |||
after all existing formats.</li> | after all existing formats.</li> | |||
<li>In either case, the media formats in the answer <bcp14>MUST</bcp 14> | <li>In either case, the media formats in the answer <bcp14>MUST</bcp 14> | |||
include at least one format that is present in the offer, | include at least one format that is present in the offer | |||
but <bcp14>MAY</bcp14> include formats that are locally supported bu t not | but <bcp14>MAY</bcp14> include formats that are locally supported bu t not | |||
present in the offer, as mentioned in | present in the offer, as mentioned in | |||
<xref target="RFC3264" sectionFormat="comma" section="6.1"/>. If no common format | <xref target="RFC3264" sectionFormat="comma" section="6.1"/>. If no common format | |||
exists, the m= section is rejected as described above.</li> | exists, the "m=" section is rejected as described above.</li> | |||
</ul> | </ul> | |||
<t>The m= line <bcp14>MUST</bcp14> be followed immediately by a "c=" l | ||||
ine, | <t>The "m=" line <bcp14>MUST</bcp14> be followed immediately by a "c=" | |||
line, | ||||
as specified in | as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.7"/>. Again, a s no | <xref target="RFC4566" sectionFormat="comma" section="5.7"/>. Again, a s no | |||
candidates are available yet, the "c=" line must contain the | candidates are available yet, the "c=" line must contain the | |||
"dummy" value "IN IP4 0.0.0.0", as defined in | "dummy" value "IN IP4 0.0.0.0", as defined in | |||
<xref target="RFCYYY6" sectionFormat="comma" section="5.1"/>.</t> | <xref target="RFC8840" sectionFormat="comma" section="4.1.3"/>.</t> | |||
<t>If the offer supports bundle, all m= sections to be | <t>If the offer supports bundle, all "m=" sections to be | |||
bundled must use the same ICE credentials and candidates; all | bundled must use the same ICE credentials and candidates; all | |||
m= sections not being bundled must use unique ICE credentials | "m=" sections not being bundled must use unique ICE credentials | |||
and candidates. Each m= section <bcp14>MUST</bcp14> contain the follow | and candidates. Each "m=" section <bcp14>MUST</bcp14> contain the foll | |||
ing | owing | |||
attributes (which are of attribute types other than IDENTICAL | attributes (which are of attribute types other than IDENTICAL | |||
and TRANSPORT): | or TRANSPORT): | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>If and only if present in the offer, an "a=mid" line, as | <li>If and only if present in the offer, an "a=mid" line, as | |||
specified in | specified in | |||
<xref target="RFC5888" sectionFormat="comma" section="9.1"/>. The "m id" | <xref target="RFC5888" sectionFormat="comma" section="9.1"/>. The "m id" | |||
value <bcp14>MUST</bcp14> match that specified in the offer.</li> | value <bcp14>MUST</bcp14> match that specified in the offer.</li> | |||
<li>A direction attribute, determined by applying the rules | <li>A direction attribute, determined by applying the rules | |||
regarding the offered direction specified in | regarding the offered direction specified in | |||
<xref target="RFC3264" sectionFormat="comma" section="6.1"/>, and th en | <xref target="RFC3264" sectionFormat="comma" section="6.1"/>, and th en | |||
intersecting with the direction of the associated | intersecting with the direction of the associated | |||
RtpTransceiver. For example, in the case where an m= | RtpTransceiver. For example, in the case where an "m=" | |||
section is offered as "sendonly", and the local transceiver | section is offered as "sendonly" and the local transceiver | |||
is set to "sendrecv", the result in the answer is a | is set to "sendrecv", the result in the answer is a | |||
"recvonly" direction.</li> | "recvonly" direction.</li> | |||
<li>For each media format on the m= line, "a=rtpmap" and | <li>For each media format on the "m=" line, "a=rtpmap" and "a=fmtp" | |||
"a=fmtp" lines, as specified in | 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 supported FEC mechanism, "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="RFCYYYF" sectionFormat="comma" section="6"/>, and | <xref target="RFC8854" sectionFormat="comma" section="6"/>, and | |||
specific usage for each media type is outlined in Sections | specific usage for each media type is outlined in Sections | |||
<xref target="sec.interface" format="counter"/> and <xref | <xref target="sec.interface" format="counter"/> and <xref | |||
target="sec.sdp-interaction-procedure" format="counter"/>.</li> | target="sec.sdp-interaction-procedure" format="counter"/>.</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 which 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 supported RTP header extension that is present | |||
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="RFCYYY5" 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 supported RTCP feedback mechanism that is | |||
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="RFCYYY5" 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="RFCYYY4" 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> | |||
</ul> | </ul> | |||
<t>Each m= section which is not bundled into another m= | <t>Each "m=" section that is not bundled into another "m=" | |||
section, <bcp14>MUST</bcp14> contain the following attributes (which a | section <bcp14>MUST</bcp14> contain the following attributes (which ar | |||
re of | e of | |||
category IDENTICAL or TRANSPORT):</t> | category IDENTICAL or TRANSPORT):</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>"a=ice-ufrag" and "a=ice-pwd" lines, as specified in | <li>"a=ice-ufrag" and "a=ice-pwd" lines, as specified in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="4.4"/>.</li> | <xref target="RFC8839" sectionFormat="comma" section="5.4"/>.</li> | |||
<li>For each desired digest algorithm, one or more | <li>For each desired digest algorithm, one or more | |||
"a=fingerprint" lines for each of the endpoint's | "a=fingerprint" lines for each of the endpoint's | |||
certificates, as specified in | certificates, as specified in | |||
<xref target="RFC8122" sectionFormat="comma" section="5"/>.</li> | <xref target="RFC8122" sectionFormat="comma" section="5"/>.</li> | |||
<li>An "a=setup" line, as specified in | <li>An "a=setup" line, as specified in | |||
<xref target="RFC4145" sectionFormat="comma" section="4"/>, and cl arified | <xref target="RFC4145" sectionFormat="comma" section="4"/> and cla rified | |||
for use in DTLS-SRTP scenarios in | for use in DTLS-SRTP scenarios in | |||
<xref target="RFC5763" sectionFormat="comma" section="5"/>. The ro le value | <xref target="RFC5763" sectionFormat="comma" section="5"/>. The ro le value | |||
in the answer <bcp14>MUST</bcp14> be "active" or "passive". When t he | in the answer <bcp14>MUST</bcp14> be "active" or "passive". When t he | |||
offer contains the "actpass" value, as will always be the | offer contains the "actpass" value, as will always be the | |||
case with JSEP endpoints, the answerer <bcp14>SHOULD</bcp14> use t he | case with JSEP endpoints, the answerer <bcp14>SHOULD</bcp14> use t he | |||
"active" role. Offers from non-JSEP endpoints <bcp14>MAY</bcp14> s end | "active" role. Offers from non-JSEP endpoints <bcp14>MAY</bcp14> s end | |||
other values for "a=setup", in which case the answer <bcp14>MUST</ bcp14> | other values for "a=setup", in which case the answer <bcp14>MUST</ bcp14> | |||
use a value consistent with the value in the offer.</li> | use a value consistent with the value in the offer.</li> | |||
<li>An "a=tls-id" line, as specified in | <li>An "a=tls-id" line, as specified in | |||
<xref target="RFCYYYA" sectionFormat="comma" section="5.3"/>.</li> | <xref target="RFC8842" sectionFormat="comma" section="5.3"/>.</li> | |||
<li>If present in the offer, an "a=rtcp-mux" line, as | <li>If present in the offer, an "a=rtcp-mux" line, as | |||
specified in | specified in | |||
<xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>. Ot herwise, | <xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>. Ot herwise, | |||
an "a=rtcp" line, as specified in | an "a=rtcp" line, as specified in | |||
<xref target="RFC3605" sectionFormat="comma" section="2.1"/>, cont aining | <xref target="RFC3605" sectionFormat="comma" section="2.1"/>, cont aining | |||
the dummy value "9 IN IP4 0.0.0.0" (because no candidates | the dummy value "9 IN IP4 0.0.0.0" (because no candidates | |||
have yet been gathered).</li> | have yet been gathered).</li> | |||
<li>If present in the offer, an "a=rtcp-rsize" line, as | <li>If present in the offer, an "a=rtcp-rsize" line, as | |||
specified in | specified in | |||
<xref target="RFC5506" sectionFormat="comma" section="5"/>.</li> | <xref target="RFC5506" sectionFormat="comma" section="5"/>.</li> | |||
</ul> | </ul> | |||
<t>If a data channel m= section has been offered, a m= | <t>If a data channel "m=" section has been offered, an "m=" | |||
section <bcp14>MUST</bcp14> also be generated for data. The <media& gt; | section <bcp14>MUST</bcp14> also be generated for data. The <media& gt; | |||
field <bcp14>MUST</bcp14> be set to "application" and the <proto> ; and | field <bcp14>MUST</bcp14> be set to "application", and the <proto&g t; and | |||
<fmt> fields <bcp14>MUST</bcp14> be set to exactly match the fie lds in | <fmt> fields <bcp14>MUST</bcp14> be set to exactly match the fie lds in | |||
the offer.</t> | the offer.</t> | |||
<t>Within the data m= section, an "a=mid" line <bcp14>MUST</bcp14> be | <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="RFCYYY9" 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="RFCYYY9" 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=" | |||
section is not bundled into another m= section: | section is not bundled into another "m=" section: | |||
</t> | </t> | |||
<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>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 of "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 the all mid identi fiers | 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, no m= sections in the answer should have an | the offer, no "m=" sections in the answer should have an | |||
"a=bundle-only" line.</t> | "a=bundle-only" line.</t> | |||
<t>Attributes that are common between all m= sections <bcp14>MAY</bcp1 | <t>Attributes that are common between all "m=" sections <bcp14>MAY</bc | |||
4> be | p14> be | |||
moved to session-level, if explicitly defined to be valid at | moved to the session level if explicitly defined to be valid at | |||
session-level.</t> | the session level. | |||
<!-- [rfced] Section 5.3.1: Per "the session level" used elsewhere in this | ||||
document and "ice-options are now at session level" in the Change Log, we | ||||
changed "to session-level" and "at session-level" to "to the session level" | ||||
and "at the session level." Please let us know any objections. | ||||
Original: | ||||
Attributes that are common between all m= sections MAY be moved to | ||||
session-level, if explicitly defined to be valid at session-level. | ||||
Currently: | ||||
Attributes that are common between all "m=" sections MAY be moved to | ||||
the session level if explicitly defined to be valid at 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> | |||
<section anchor="sec.subsequent-answers" numbered="true" toc="default"> | <section anchor="sec.subsequent-answers" numbered="true" toc="default"> | |||
<name>Subsequent Answers</name> | <name>Subsequent Answers</name> | |||
<t>When createAnswer is called a second (or later) time, or | <t>When createAnswer is called a second (or later) time or | |||
is called after a local description has already been | is called after a local description has already been | |||
installed, the processing is somewhat different than for an | installed, the processing is somewhat different than for an | |||
initial answer.</t> | initial answer.</t> | |||
<t>If the previous answer was not applied using | <t>If the previous answer was not applied using | |||
setLocalDescription, meaning the PeerConnection is still in | setLocalDescription, meaning the PeerConnection is still in | |||
the "have-remote-offer" state, the steps for generating an | the "have-remote-offer" state, the steps for generating an | |||
initial answer should be followed, subject to the following | initial answer should be followed, subject to the following | |||
restriction: | restriction: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
skipping to change at line 2636 ¶ | skipping to change at line 3425 ¶ | |||
if the session description changes in any way from the | if the session description changes in any way from the | |||
previously generated answer.</li> | previously generated answer.</li> | |||
</ul> | </ul> | |||
<t>If any session description was previously supplied to | <t>If any session description was previously supplied to | |||
setLocalDescription, an answer is generated by following the | setLocalDescription, an answer is generated by following the | |||
steps in the "have-remote-offer" state above, along with | steps in the "have-remote-offer" state above, along with | |||
these exceptions: | these exceptions: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The "s=" and "t=" lines <bcp14>MUST</bcp14> stay the same.</li> | <li>The "s=" and "t=" lines <bcp14>MUST</bcp14> stay the same.</li> | |||
<li>Each "m=" and c=" line <bcp14>MUST</bcp14> be filled in with the | <li>Each "m=" and "c=" line <bcp14>MUST</bcp14> be filled in with th | |||
port | e port | |||
and address of the default candidate for the m= section, as | and address of the default candidate for the "m=" section, as | |||
described in | described in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="3.2.1.2"/>. No | <xref target="RFC8839" sectionFormat="comma" section="4.2.1.2"/>. No | |||
te that in certain cases, the m= line protocol | te that in certain cases, the "m=" line protocol | |||
may not match that of the default candidate, because the m= line | may not match that of the default candidate, because the "m=" line | |||
protocol value <bcp14>MUST</bcp14> match what was supplied in the of fer, as | protocol value <bcp14>MUST</bcp14> match what was supplied in the of fer, as | |||
described above.</li> | described above.</li> | |||
<li>Each "a=ice-ufrag" and "a=ice-pwd" line <bcp14>MUST</bcp14> stay the | <li>Each "a=ice-ufrag" and "a=ice-pwd" line <bcp14>MUST</bcp14> stay the | |||
same, unless the m= section is restarting, in which case | same, unless the "m=" section is restarting, in which case | |||
new ICE credentials must be created as specified in | new ICE credentials must be created as specified in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="3.4.1.1.1"/>. | <xref target="RFC8839" sectionFormat="comma" section="4.4.1.1.1"/>. | |||
If the m= | If the "m=" | |||
section is bundled into another m= section, it still <bcp14>MUST | section is bundled into another "m=" section, it still <bcp14>MUST | |||
NOT</bcp14> contain any ICE credentials.</li> | NOT</bcp14> contain any ICE credentials.</li> | |||
<li>Each "a=tls-id" line <bcp14>MUST</bcp14> stay the same unless th e | <li>Each "a=tls-id" line <bcp14>MUST</bcp14> stay the same, unless t he | |||
offerer's "a=tls-id" line changed, in which case a new | offerer's "a=tls-id" line changed, in which case a new | |||
"a=tls-id" value <bcp14>MUST</bcp14> be created, as described in | "a=tls-id" value <bcp14>MUST</bcp14> be created, as described in | |||
<xref target="RFCYYYA" sectionFormat="comma" section="5.2"/>.</li> | <xref target="RFC8842" sectionFormat="comma" section="5.2"/>.</li> | |||
<li>Each "a=setup" line <bcp14>MUST</bcp14> use an "active" or "pass ive" | <li>Each "a=setup" line <bcp14>MUST</bcp14> use an "active" or "pass ive" | |||
role value consistent with the existing DTLS association, | role value consistent with the existing DTLS association, | |||
if the association is being continued by the offerer.</li> | if the association is being continued by the offerer.</li> | |||
<li>RTCP multiplexing must be used, and an "a=rtcp-mux" line | <li>RTCP multiplexing must be used, and an "a=rtcp-mux" line | |||
inserted if and only if the m= section previously used RTCP | inserted if and only if the "m=" section previously used RTCP | |||
multiplexing.</li> | multiplexing.</li> | |||
<li>If the m= section is not bundled into another m= section | <li>If the "m=" section is not bundled into another "m=" section | |||
and RTCP multiplexing is not active, an "a=rtcp" attribute | and RTCP multiplexing is not active, an "a=rtcp" attribute | |||
line <bcp14>MUST</bcp14> be filled in with the port and address of t he | line <bcp14>MUST</bcp14> be filled in with the port and address of t he | |||
default RTCP candidate. If no RTCP candidates have yet been | default RTCP candidate. If no RTCP candidates have yet been | |||
gathered, dummy values <bcp14>MUST</bcp14> be used, as described in | gathered, dummy values <bcp14>MUST</bcp14> be used, as described in | |||
the | <xref target="sec.initial-answers"/> above.</li> | |||
initial answer section above.</li> | ||||
<li>If the m= section is not bundled into another m= | <li>If the "m=" section is not bundled into another "m=" | |||
section, for each candidate that has been gathered during | section, for each candidate that has been gathered during | |||
the most recent gathering phase (see | the most recent gathering phase (see | |||
<xref target="sec.ice-gather-overview" format="default"/>), an | <xref target="sec.ice-gather-overview" format="default"/>), an | |||
"a=candidate" line <bcp14>MUST</bcp14> be added, as defined in | "a=candidate" line <bcp14>MUST</bcp14> be added, as defined in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="4.1"/>. | <xref target="RFC8839" sectionFormat="comma" section="5.1"/>. | |||
If candidate gathering for the section has completed, an | If candidate gathering for the section has completed, an | |||
"a=end-of-candidates" attribute <bcp14>MUST</bcp14> be added, as des cribed | "a=end-of-candidates" attribute <bcp14>MUST</bcp14> be added, as des cribed | |||
in | in | |||
<xref target="RFCYYY6" sectionFormat="comma" section="9.3"/>. | <xref target="RFC8840" sectionFormat="comma" section="8.2"/>. | |||
If the m= section is bundled into another m= section, both | If the "m=" section is bundled into another "m=" section, both | |||
"a=candidate" and "a=end-of-candidates" <bcp14>MUST</bcp14> be | "a=candidate" and "a=end-of-candidates" <bcp14>MUST</bcp14> be | |||
omitted.</li> | omitted. | |||
<!-- [rfced] Section 5.3.2: We found this RFC Editor Note on | ||||
<https://datatracker.ietf.org/doc/draft-ietf-rtcweb-jsep/writeup/>: | ||||
"OLD: | ||||
o If the m= section is not bundled into another m= section, for each | ||||
candidate that has been gathered during the most recent gathering | ||||
phase (see Section 3.5.1), an "a=candidate" line MUST be added, as | ||||
defined in [RFC5245], Section 4.3., paragraph 3. If candidate | ||||
gathering for the section has completed, an "a=end-of-candidates" | ||||
attribute MUST be added, as described in [I-D.ietf-ice-trickle], | ||||
Section 9.3. If the m= section is bundled into another m= | ||||
section, both "a=candidate" and "a=end-of-candidates" MUST be | ||||
omitted. | ||||
NEW: | ||||
o If the m= section is not bundled into another m= section, for each | ||||
candidate that has been gathered during the most recent gathering | ||||
phase (see Section 3.5.1), an "a=candidate" line MUST be added, as | ||||
defined in [RFC5245], Section 4.3., paragraph 3. If candidate | ||||
gathering for the section has completed, an "a=end-of-candidates" | ||||
attribute MUST be added, as described in | ||||
[I-D.ietf-mmusic-trickle-ice-sip], Section 8.2. If the m= section is | ||||
bundled into another m= section, both "a=candidate" and | ||||
"a=end-of-candidates" MUST be omitted." | ||||
Please note that the "OLD" text does not match what we found in the | ||||
provided draft (i.e., "[RFC5245], Section 4.3., paragraph 3" versus | ||||
"[I-D.ietf-mmusic-ice-sip-sdp], Section 4.1"): | ||||
o If the m= section is not bundled into another m= section, for each | ||||
candidate that has been gathered during the most recent gathering | ||||
phase (see Section 3.5.1), an "a=candidate" line MUST be added, as | ||||
defined in [I-D.ietf-mmusic-ice-sip-sdp], Section 4.1. If | ||||
candidate gathering for the section has completed, an "a=end-of- | ||||
candidates" attribute MUST be added, as described in | ||||
[I-D.ietf-ice-trickle], Section 9.3. If the m= section is bundled | ||||
into another m= section, both "a=candidate" and "a=end-of- | ||||
candidates" MUST be omitted. | ||||
Please review, and let us know if further changes are needed. (As | ||||
noted previously, "[RFC8839]" and "[RFC8840]" are the RFC numbers assigned | ||||
for [I-D.ietf-mmusic-ice-sip-sdp] and | ||||
[I-D.ietf-mmusic-trickle-ice-sip], respectively.) | ||||
Currently: | ||||
* If the "m=" section is not bundled into another "m=" section, for each | ||||
candidate that has been gathered during the most recent gathering | ||||
phase (see Section 3.5.1), an "a=candidate" line MUST be added, as | ||||
defined in [RFC8839], Section 5.1. If candidate gathering for the | ||||
section has completed, an "a=end-of-candidates" attribute MUST be | ||||
added, as described in [RFC8840], Section 8.2. If the "m=" section | ||||
is bundled into another "m=" section, both "a=candidate" and "a=end- | ||||
of-candidates" MUST be omitted. --> | ||||
</li> | ||||
<li>For RtpTransceivers that are not stopped, the "a=msid" | <li>For RtpTransceivers that are not stopped, the "a=msid" | |||
line(s) <bcp14>MUST</bcp14> stay the same, regardless of changes to the | line(s) <bcp14>MUST</bcp14> stay the same, regardless of changes to the | |||
transceiver's direction or track. If no "a=msid" line is | transceiver's direction or track. If no "a=msid" line is | |||
present in the current description, "a=msid" line(s) <bcp14>MUST</bc p14> | present in the current description, "a=msid" line(s) <bcp14>MUST</bc p14> | |||
be generated according to the same rules as for an initial | be generated according to the same rules as for an initial | |||
answer.</li> | answer.</li> | |||
</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 options are 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 should be generated | parameter has no effect, and the answer should be generated | |||
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> | |||
skipping to change at line 2734 ¶ | skipping to change at line 3580 ¶ | |||
the application <bcp14>MAY</bcp14> modify the SDP to reduce its capabili ties | the application <bcp14>MAY</bcp14> modify the SDP to reduce its capabili ties | |||
before sending it to the far side, as long as it follows the | before sending it to the far side, as long as it follows the | |||
rules above that define a valid JSEP offer or answer. Likewise, | rules above that define a valid JSEP offer or answer. Likewise, | |||
an application that has received an offer or answer from a peer | an application that has received an offer or answer from a peer | |||
<bcp14>MAY</bcp14> modify the received SDP, subject to the same constrai nts, | <bcp14>MAY</bcp14> modify the received SDP, subject to the same constrai nts, | |||
before calling setRemoteDescription.</t> | before calling setRemoteDescription.</t> | |||
<t>As always, the application is solely responsible for what it | <t>As always, the application is solely responsible for what it | |||
sends to the other party, and all incoming SDP will be | sends to the other party, and all incoming SDP will be | |||
processed by the JSEP implementation to the extent of its | processed by the JSEP implementation to the extent of its | |||
capabilities. It is an error to assume that all SDP is | capabilities. It is an error to assume that all SDP is | |||
well-formed; however, one should be able to assume that any | well formed; however, one should be able to assume that any | |||
implementation of this specification will be able to process, | implementation of this specification will be able to process, | |||
as a remote offer or answer, unmodified SDP coming from any | as a remote offer or answer, unmodified SDP coming from any | |||
other implementation of this specification.</t> | other implementation of this specification.</t> | |||
</section> | </section> | |||
<section anchor="sec.processing-a-local-desc" numbered="true" toc="default "> | <section anchor="sec.processing-a-local-desc" numbered="true" toc="default "> | |||
<name>Processing a Local Description</name> | <name>Processing a Local Description</name> | |||
<t>When a SessionDescription is supplied to | <t>When a SessionDescription is supplied to | |||
setLocalDescription, the following steps <bcp14>MUST</bcp14> be performe d: | setLocalDescription, the following steps <bcp14>MUST</bcp14> be performe d: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
skipping to change at line 2820 ¶ | skipping to change at line 3666 ¶ | |||
</section> | </section> | |||
<section anchor="sec.processing-a-rollback" numbered="true" toc="default"> | <section anchor="sec.processing-a-rollback" numbered="true" toc="default"> | |||
<name>Processing a Rollback</name> | <name>Processing a Rollback</name> | |||
<t>A rollback may be performed if the PeerConnection is in any | <t>A rollback may be performed if the PeerConnection is in any | |||
state except for "stable". This means that both offers and | state except for "stable". This means that both offers and | |||
provisional answers can be rolled back. Rollback can only be | provisional answers can be rolled back. Rollback can only be | |||
used to cancel proposed changes; there is no support for | used to cancel proposed changes; there is no support for | |||
rolling back from a stable state to a previous stable state. If | rolling back from a stable state to a previous stable state. If | |||
a rollback is attempted in the "stable" state, processing <bcp14>MUST</b cp14> | a rollback is attempted in the "stable" state, processing <bcp14>MUST</b cp14> | |||
stop and an error <bcp14>MUST</bcp14> be returned. Note that this implie s that | stop and an error <bcp14>MUST</bcp14> be returned. Note that this implie s that | |||
once the answerer has performed setLocalDescription with his | 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"/>). This means | <xref target="sec.applying-a-local-desc" format="counter"/>). | |||
that | ||||
<!-- [rfced] Section 5.7: Please confirm that Section 5.9 is the | ||||
correct section to cite here. We easily found relevant text in | ||||
Section 5.10 but not in Section 5.9. | ||||
Original: | ||||
A rollback disassociates any RtpTransceivers that were associated | ||||
with m= sections by the application of the rolled-back session | ||||
description (see Section 5.10 and Section 5.9). --> | ||||
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 | value of the RtpTransceiver's mid property <bcp14>MUST</bcp14> be set to | |||
null, | "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, a | 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 a 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> | |||
</section> | </section> | |||
<section anchor="sec.parsing-a-desc" numbered="true" toc="default"> | <section anchor="sec.parsing-a-desc" numbered="true" toc="default"> | |||
<name>Parsing a Session Description</name> | <name>Parsing a Session Description</name> | |||
<t>The SDP contained in the session description object consists | <t>The SDP contained in the session description object consists | |||
of a sequence of text lines, each containing a key-value | of a sequence of text lines, each containing a key-value | |||
expression, as described in | expression, as described in | |||
<xref target="RFC4566" sectionFormat="comma" section="5"/>. The SDP is r ead, | <xref target="RFC4566" sectionFormat="comma" section="5"/>. The SDP is r ead, | |||
line-by-line, and converted to a data structure that contains | line by line, and converted to a data structure that contains | |||
the deserialized information. However, SDP allows many types of | the deserialized information. However, SDP allows many types of | |||
lines, not all of which are relevant to JSEP applications. For | lines, not all of which are relevant to JSEP applications. For | |||
each line, the implementation will first ensure it is | each line, the implementation will first ensure that it is | |||
syntactically correct according to its defining ABNF, check | syntactically correct according to its defining ABNF, check | |||
that it conforms to | that it conforms to the semantics used in | |||
<xref target="RFC4566" format="default"/> and | <xref target="RFC4566" format="default"/> and | |||
<xref target="RFC3264" format="default"/> semantics, and then either par se and | <xref target="RFC3264" format="default"/>, and then either parse and | |||
store or discard the provided value, as described below.</t> | store or discard the provided value, as described below.</t> | |||
<t>If any line is not well-formed, or cannot be parsed as | <t>If any line is not well formed or cannot be parsed as | |||
described, the parser <bcp14>MUST</bcp14> stop with an error and reject the | described, the parser <bcp14>MUST</bcp14> stop with an error and reject the | |||
session description, even if the value is to be discarded. This | session description, even if the value is to be discarded. This | |||
ensures that implementations do not accidentally misinterpret | ensures that implementations do not accidentally misinterpret | |||
ambiguous SDP.</t> | ambiguous SDP.</t> | |||
<section anchor="sec.session-level-parse" numbered="true" toc="default"> | <section anchor="sec.session-level-parse" numbered="true" toc="default"> | |||
<name>Session-Level Parsing</name> | <name>Session-Level Parsing</name> | |||
<t>First, the session-level lines are checked and parsed. | <t>First, the session-level lines are checked and parsed. | |||
These lines <bcp14>MUST</bcp14> occur in a specific order, and with a | These lines <bcp14>MUST</bcp14> occur in a specific order, and with a | |||
specific syntax, as defined in | specific syntax, as defined in | |||
<xref target="RFC4566" sectionFormat="comma" section="5"/>. Note that while the | <xref target="RFC4566" sectionFormat="comma" section="5"/>. Note that while the | |||
specific line types (e.g. "v=", "c=") <bcp14>MUST</bcp14> occur in the | specific line types (e.g., "v=", "c=") <bcp14>MUST</bcp14> occur in th e | |||
defined order, lines of the same type (typically "a=") can | defined order, lines of the same type (typically "a=") can | |||
occur in any order.</t> | occur in any order.</t> | |||
<t>The following non-attribute lines are not meaningful in | <t>The following non-attribute lines are not meaningful in | |||
the JSEP context and <bcp14>MAY</bcp14> be discarded once they have be en | the JSEP context and <bcp14>MAY</bcp14> be discarded once they have be en | |||
checked. | checked. | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The "c=" line <bcp14>MUST</bcp14> be checked for syntax but its value | <li>The "c=" line <bcp14>MUST</bcp14> be checked for syntax, but its value | |||
is only used for ICE mismatch detection, as defined in | is only used for ICE mismatch detection, as defined in | |||
<xref target="RFC8445" sectionFormat="comma" section="5.4"/>. Note t hat JSEP | <xref target="RFC8445" sectionFormat="comma" section="5.4"/>. Note t hat JSEP | |||
implementations should never encounter this condition | implementations should never encounter this condition | |||
because ICE is required for WebRTC.</li> | because ICE is required for WebRTC.</li> | |||
<li>The "i=", "u=", "e=", "p=", "t=", "r=", "z=", and "k=" | <li>The "i=", "u=", "e=", "p=", "t=", "r=", "z=", and "k=" | |||
lines are not used by this specification; they <bcp14>MUST</bcp14> b e | lines are not used by this specification; they <bcp14>MUST</bcp14> b e | |||
checked for syntax but their values are not used.</li> | checked for syntax, but their values are not used. | |||
<!-- [rfced] Section 5.8.1: We found this sentence confusing; should | ||||
"t=" remain in this list of lines not used by this specification? | ||||
Original: | ||||
The "i=", "u=", "e=", "p=", "t=", "r=", "z=", and "k=" lines are | ||||
not used by this specification; they MUST be checked for syntax | ||||
but their values are not used. | ||||
We ask because we see (for example): | ||||
o A "t=" line MUST be added, as specified in [RFC4566], Section 5.9; | ||||
both <start-time> and <stop-time> SHOULD be set to zero, e.g. "t=0 | ||||
0". | ||||
... | ||||
o The "s=" and "t=" lines MUST stay the same. | ||||
... | ||||
t=0 0 --> | ||||
</li> | ||||
</ul> | </ul> | |||
<t>The remaining non-attribute lines are processed as | <t>The remaining non-attribute lines are processed as | |||
follows: | follows: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The "v=" line <bcp14>MUST</bcp14> have a version of 0, as specif ied in | <li>The "v=" line <bcp14>MUST</bcp14> have a version of 0, as specif ied in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.1"/>.</li> | <xref target="RFC4566" sectionFormat="comma" section="5.1"/>.</li> | |||
<li>The "o=" line <bcp14>MUST</bcp14> be parsed as specified in | <li>The "o=" line <bcp14>MUST</bcp14> be parsed as specified in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.2"/>.</li> | <xref target="RFC4566" sectionFormat="comma" section="5.2"/>.</li> | |||
<li>The "b=" line, if present, <bcp14>MUST</bcp14> be parsed as spec ified | <li>The "b=" line, if present, <bcp14>MUST</bcp14> be parsed as spec ified | |||
skipping to change at line 2920 ¶ | skipping to change at line 3797 ¶ | |||
<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 mids 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="RFCYYY7" sectionFormat="comma" section="4.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 ice-lite 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="RFCYYY7" sectionFormat="comma" section="4.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="RFCYYY7" sectionFormat="comma" section="4.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="RFCYYY7" sectionFormat="comma" section="4.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 | |||
<xref target="RFC8122" sectionFormat="comma" section="5"/>, and the set of | <xref target="RFC8122" sectionFormat="comma" section="5"/>, and the set of | |||
fingerprint and algorithm values is stored.</li> | fingerprint and algorithm values is stored.</li> | |||
<li>If present, a single "a=setup" line is parsed as | <li>If present, a single "a=setup" line is parsed as | |||
specified in | specified in | |||
<xref target="RFC4145" sectionFormat="comma" section="4"/>, and the setup value | <xref target="RFC4145" sectionFormat="comma" section="4"/>, and the setup value | |||
is stored.</li> | is stored.</li> | |||
<li>If present, a single "a=tls-id" line is parsed as | <li>If present, a single "a=tls-id" line is parsed as | |||
specified in <xref target="RFCYYYA" sectionFormat="comma" section="5 "/>, and | specified in <xref target="RFC8842" sectionFormat="comma" section="5 "/>, and | |||
the tls-id value is stored.</li> | the tls-id value is stored.</li> | |||
<li>Any "a=identity" lines are parsed and the identity | <li>Any "a=identity" lines are parsed and the identity | |||
values stored for subsequent verification, as specified | values stored for subsequent verification, as specified in | |||
<xref target="RFCYYY2" sectionFormat="comma" section="5"/>.</li> | <xref target="RFC8827" sectionFormat="comma" section="5"/>.</li> | |||
<li>Any "a=extmap" lines are parsed as specified in | <li>Any "a=extmap" lines are parsed as specified in | |||
<xref target="RFC5285" sectionFormat="comma" section="5"/>, and thei r values are | <xref target="RFC5285" sectionFormat="comma" section="5"/>, and thei r values are | |||
stored.</li> | stored.</li> | |||
</ul> | </ul> | |||
<t>Other attributes that are not relevant to JSEP may also be | <t>Other attributes that are not relevant to JSEP may also be | |||
present, and implementations <bcp14>SHOULD</bcp14> process any that th ey | present, and implementations <bcp14>SHOULD</bcp14> process any that th ey | |||
recognize. As required by | recognize. As required by | |||
<xref target="RFC4566" sectionFormat="comma" section="5.13"/>, unknown | <xref target="RFC4566" sectionFormat="comma" section="5.13"/>, unknown | |||
attribute lines <bcp14>MUST</bcp14> be ignored.</t> | attribute lines <bcp14>MUST</bcp14> be ignored.</t> | |||
<t>Once all the session-level lines have been parsed, | <t>Once all the session-level lines have been parsed, | |||
processing continues with the lines in m= sections.</t> | processing continues with the lines in "m=" sections.</t> | |||
</section> | </section> | |||
<section anchor="sec.media-level-parse" numbered="true" toc="default"> | <section anchor="sec.media-level-parse" numbered="true" toc="default"> | |||
<name>Media Section Parsing</name> | <name>Media Section Parsing</name> | |||
<t>Like the session-level lines, the media section lines <bcp14>MUST</ bcp14> | <t>Like the session-level lines, the media section lines <bcp14>MUST</ bcp14> | |||
occur in the specific order and with the specific syntax | occur in the specific order and with the specific syntax | |||
defined in | defined in | |||
<xref target="RFC4566" sectionFormat="comma" section="5"/>.</t> | <xref target="RFC4566" sectionFormat="comma" section="5"/>.</t> | |||
<t>The "m=" line itself <bcp14>MUST</bcp14> be parsed as described in | <t>The "m=" line itself <bcp14>MUST</bcp14> be parsed as described in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.14"/>, and the media, port, | <xref target="RFC4566" sectionFormat="comma" section="5.14"/>, and the media, port, | |||
proto, and fmt values stored.</t> | proto, and fmt values stored.</t> | |||
skipping to change at line 2984 ¶ | skipping to change at line 3861 ¶ | |||
in | in | |||
<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>Specific processing <bcp14>MUST</bcp14> also be applied for the fol lowing | <t>Specific processing <bcp14>MUST</bcp14> also be applied for the fol lowing | |||
attribute lines: | attribute lines: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<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="RFCYYY7" sectionFormat="comma" section="4.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="RFCYYY7" sectionFormat="comma" section="4.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="RFCYYY7" sectionFormat="comma" section="4.6"/>, | <xref target="RFC8839" sectionFormat="comma" section="5.6"/>, | |||
and the set of specified options is stored.</li> | and the set of specified options is stored.</li> | |||
<li>Any "a=candidate" attributes <bcp14>MUST</bcp14> be parsed as sp ecified | <li>Any "a=candidate" attributes <bcp14>MUST</bcp14> be parsed as sp ecified | |||
in | in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="4.1"/>, and th eir values stored.</li> | <xref target="RFC8839" sectionFormat="comma" section="5.1"/>, and th eir values stored.</li> | |||
<li>Any "a=remote-candidates" attributes <bcp14>MUST</bcp14> be pars ed as | <li>Any "a=remote-candidates" attributes <bcp14>MUST</bcp14> be pars ed as | |||
specified in | specified in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="4.2"/>, but th | <xref target="RFC8839" sectionFormat="comma" section="5.2"/>, but th | |||
eir values are ignored.</li> | eir values are ignored.</li> | |||
<li>If present, a single "a=end-of-candidates" attribute | <li>If present, a single "a=end-of-candidates" attribute | |||
<bcp14>MUST</bcp14> be parsed as specified in | <bcp14>MUST</bcp14> be parsed as specified in | |||
<xref target="RFCYYY6" sectionFormat="comma" section="8.2"/>, and | <xref target="RFC8840" sectionFormat="comma" section="8.1"/>, and | |||
its presence or absence flagged and stored.</li> | its presence or absence flagged and stored.</li> | |||
<li>Any "a=fingerprint" lines are parsed as specified in | <li>Any "a=fingerprint" lines are parsed as specified in | |||
<xref target="RFC8122" sectionFormat="comma" section="5"/>, and the set of | <xref target="RFC8122" sectionFormat="comma" section="5"/>, and the set of | |||
fingerprint and algorithm values is stored.</li> | fingerprint and algorithm values is stored.</li> | |||
</ul> | </ul> | |||
<t>If the "m=" proto value indicates use of RTP, as described | <t>If the "m=" proto value indicates use of RTP, as described | |||
in | in | |||
<xref target="sec.profile-names" format="default"/> above, the followi ng | <xref target="sec.profile-names" format="default"/> above, the followi ng | |||
attribute lines <bcp14>MUST</bcp14> be processed: | attribute lines <bcp14>MUST</bcp14> be processed: | |||
</t> | </t> | |||
skipping to change at line 3027 ¶ | skipping to change at line 3905 ¶ | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/>, and thei r values | <xref target="RFC4566" sectionFormat="comma" section="6"/>, and thei r values | |||
stored.</li> | stored.</li> | |||
<li>If present, a single "a=ptime" line <bcp14>MUST</bcp14> be parse d as | <li>If present, a single "a=ptime" line <bcp14>MUST</bcp14> be parse d as | |||
described in | described in | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/>, and its value | <xref target="RFC4566" sectionFormat="comma" section="6"/>, and its value | |||
stored.</li> | stored.</li> | |||
<li>If present, a single "a=maxptime" line <bcp14>MUST</bcp14> be pa rsed as | <li>If present, a single "a=maxptime" line <bcp14>MUST</bcp14> be pa rsed as | |||
described in | described in | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/>, and its value | <xref target="RFC4566" sectionFormat="comma" section="6"/>, and its value | |||
stored.</li> | stored.</li> | |||
<li>If present, a single direction attribute line (e.g. | <li>If present, a single direction attribute line (e.g., | |||
"a=sendrecv") <bcp14>MUST</bcp14> be parsed as described in | "a=sendrecv") <bcp14>MUST</bcp14> be parsed as described in | |||
<xref target="RFC4566" sectionFormat="comma" section="6"/>, and its value | <xref target="RFC4566" sectionFormat="comma" section="6"/>, and its value | |||
stored.</li> | stored.</li> | |||
<li>Any "a=ssrc" attributes <bcp14>MUST</bcp14> be parsed as specifi ed in | <li>Any "a=ssrc" attributes <bcp14>MUST</bcp14> be parsed as specifi ed in | |||
<xref target="RFC5576" sectionFormat="comma" section="4.1"/>, and th eir values | <xref target="RFC5576" sectionFormat="comma" section="4.1"/>, and th eir values | |||
stored.</li> | stored.</li> | |||
<li>Any "a=extmap" attributes <bcp14>MUST</bcp14> be parsed as speci fied in | <li>Any "a=extmap" attributes <bcp14>MUST</bcp14> be parsed as speci fied in | |||
<xref target="RFC5285" sectionFormat="comma" section="5"/>, and thei r values | <xref target="RFC5285" sectionFormat="comma" section="5"/>, and thei r values | |||
stored.</li> | stored.</li> | |||
<li>Any "a=rtcp-fb" attributes <bcp14>MUST</bcp14> be parsed as spec ified | <li>Any "a=rtcp-fb" attributes <bcp14>MUST</bcp14> be parsed as spec ified | |||
in | in | |||
<xref target="RFC4585" sectionFormat="comma" section="4.2"/>, and th eir values | <xref target="RFC4585" sectionFormat="comma" section="4.2"/>, and th eir values | |||
stored.</li> | stored.</li> | |||
<li>If present, a single "a=rtcp-mux" attribute <bcp14>MUST</bcp14> be | <li>If present, a single "a=rtcp-mux" attribute <bcp14>MUST</bcp14> be | |||
parsed as specified in | parsed as specified in | |||
<xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>, and its | <xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>, and its | |||
presence or absence flagged and stored.</li> | presence or absence flagged and stored.</li> | |||
<li>If present, a single "a=rtcp-mux-only" attribute <bcp14>MUST</bc p14> be | <li>If present, a single "a=rtcp-mux-only" attribute <bcp14>MUST</bc p14> be | |||
parsed as specified in | parsed as specified in | |||
<xref target="RFCYYYG" sectionFormat="comma" section="3"/>, | <xref target="RFC8858" sectionFormat="comma" section="3"/>, | |||
and its presence or absence flagged and stored.</li> | and its presence or absence flagged and stored.</li> | |||
<li>If present, a single "a=rtcp-rsize" attribute <bcp14>MUST</bcp14 > be | <li>If present, a single "a=rtcp-rsize" attribute <bcp14>MUST</bcp14 > be | |||
parsed as specified in | parsed as specified in | |||
<xref target="RFC5506" sectionFormat="comma" section="5"/>, and its presence or | <xref target="RFC5506" sectionFormat="comma" section="5"/>, and its presence or | |||
absence flagged and stored.</li> | absence flagged and stored.</li> | |||
<li>If present, a single "a=rtcp" attribute <bcp14>MUST</bcp14> be p arsed | <li>If present, a single "a=rtcp" attribute <bcp14>MUST</bcp14> be p arsed | |||
as specified in | as specified in | |||
<xref target="RFC3605" sectionFormat="comma" section="2.1"/>, but it s value is | <xref target="RFC3605" sectionFormat="comma" section="2.1"/>, but it s value is | |||
ignored, as this information is superfluous when using | ignored, as this information is superfluous when using | |||
ICE.</li> | ICE.</li> | |||
<li>If present, "a=msid" attributes <bcp14>MUST</bcp14> be parsed as | <li>If present, "a=msid" attributes <bcp14>MUST</bcp14> be parsed as | |||
specified in | specified in | |||
<xref target="RFCYYY4" sectionFormat="comma" section="3.2"/>, and | <xref target="RFC8830" sectionFormat="comma" section="3.2"/>, and | |||
their values stored, ignoring any "appdata" field. If no "a=msid" | their values stored, ignoring any "appdata" field. If no "a=msid" | |||
attributes are present, a random msid-id value is generated for a | attributes are present, a random msid-id value is generated for a | |||
"default" MediaStream for the session, if not already present, and | "default" MediaStream for the session, if not already present, and | |||
this value is stored.</li> | this value is stored.</li> | |||
<li>Any "a=imageattr" attributes <bcp14>MUST</bcp14> be parsed as sp ecified | <li>Any "a=imageattr" attributes <bcp14>MUST</bcp14> be parsed as sp ecified | |||
in | in | |||
<xref target="RFC6236" sectionFormat="comma" section="3"/>, and thei r values | <xref target="RFC6236" sectionFormat="comma" section="3"/>, and thei r values | |||
stored.</li> | stored.</li> | |||
<li>Any "a=rid" lines <bcp14>MUST</bcp14> be parsed as specified in | <li>Any "a=rid" lines <bcp14>MUST</bcp14> be parsed as specified in | |||
<xref target="RFCYYYC" sectionFormat="comma" section="10"/>, and | <xref target="RFC8851" sectionFormat="comma" section="10"/>, and | |||
their values stored.</li> | their values stored.</li> | |||
<li>If present, a single "a=simulcast" line <bcp14>MUST</bcp14> be p arsed | <li>If present, a single "a=simulcast" line <bcp14>MUST</bcp14> be p arsed | |||
as specified in | as specified in | |||
<xref target="RFCYYYE" format="default"/>, and | <xref target="RFC8853" format="default"/>, and | |||
its values stored.</li> | its values stored.</li> | |||
</ul> | </ul> | |||
<t>Otherwise, if the "m=" proto value indicates use of SCTP, | <t>Otherwise, if the "m=" proto value indicates use of SCTP, | |||
the following attribute lines <bcp14>MUST</bcp14> be processed: | the following attribute lines <bcp14>MUST</bcp14> be processed: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>The "m=" fmt value <bcp14>MUST</bcp14> be parsed as specified in | <li>The "m=" fmt value <bcp14>MUST</bcp14> be parsed as specified in | |||
<xref target="RFCYYY9" sectionFormat="comma" section="4.3"/>, | <xref target="RFC8841" sectionFormat="comma" section="4.3"/>, | |||
and the application protocol value stored.</li> | and the application protocol value stored.</li> | |||
<li>An "a=sctp-port" attribute <bcp14>MUST</bcp14> be present, and i t <bcp14>MUST</bcp14> | <li>An "a=sctp-port" attribute <bcp14>MUST</bcp14> be present, and i t <bcp14>MUST</bcp14> | |||
be parsed as specified in | be parsed as specified in | |||
<xref target="RFCYYY9" sectionFormat="comma" section="5.2"/>, | <xref target="RFC8841" sectionFormat="comma" section="5.2"/>, | |||
and the value stored.</li> | and the value stored.</li> | |||
<li>If present, a single "a=max-message-size" attribute <bcp14>MUST< /bcp14> | <li>If present, a single "a=max-message-size" attribute <bcp14>MUST< /bcp14> | |||
be parsed as specified in | be parsed as specified in | |||
<xref target="RFCYYY9" sectionFormat="comma" section="6"/>, and | <xref target="RFC8841" sectionFormat="comma" section="6"/>, and | |||
the value stored. Otherwise, use the specified default.</li> | the value stored. Otherwise, use the specified default.</li> | |||
</ul> | </ul> | |||
<t>Other attributes that are not relevant to JSEP may also be | <t>Other attributes that are not relevant to JSEP may also be | |||
present, and implementations <bcp14>SHOULD</bcp14> process any that th ey | present, and implementations <bcp14>SHOULD</bcp14> process any that th ey | |||
recognize. As required by | recognize. As required by | |||
<xref target="RFC4566" sectionFormat="comma" section="5.13"/>, unknown | <xref target="RFC4566" sectionFormat="comma" section="5.13"/>, unknown | |||
attribute lines <bcp14>MUST</bcp14> be ignored.</t> | attribute lines <bcp14>MUST</bcp14> be ignored.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | <section numbered="true" toc="default"> | |||
<name>Semantics Verification</name> | <name>Semantics Verification</name> | |||
<t>Assuming parsing completes successfully, the parsed | <t>Assuming that parsing completes successfully, the parsed | |||
description is then evaluated to ensure internal consistency | description is then evaluated to ensure internal consistency | |||
as well as proper support for mandatory features. | as well as proper support for mandatory features. | |||
Specifically, the following checks are performed: | Specifically, the following checks are performed: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>For each m= section, valid values for each of the | <t>For each "m=" section, valid values for each of the | |||
mandatory-to-use features enumerated in | mandatory-to-use features enumerated in | |||
<xref target="sec.usage-requirements" format="default"/> <bcp14>MUST </bcp14> be present. | <xref target="sec.usage-requirements" format="default"/> <bcp14>MUST </bcp14> be present. | |||
These values <bcp14>MAY</bcp14> either be present at the media level , or | These values <bcp14>MAY</bcp14> be either present at the media level or | |||
inherited from the session level. | inherited from the session level. | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>ICE ufrag and password values, which <bcp14>MUST</bcp14> com ply with | <li>ICE ufrag and password values, which <bcp14>MUST</bcp14> com ply with | |||
the size limits specified in | the size limits specified in | |||
<xref target="RFCYYY7" sectionFormat="comma" section="4.4"/>.</li> | <xref target="RFC8839" sectionFormat="comma" section="5.4"/>.</li> | |||
<li>tls-id value, which <bcp14>MUST</bcp14> be set according to | <li>A tls-id value, which <bcp14>MUST</bcp14> be set according t | |||
<xref target="RFCYYYA" sectionFormat="comma" section="5"/>. If | o | |||
this is a re-offer or a response to a re-offer and the | <xref target="RFC8842" sectionFormat="comma" section="5"/>. If | |||
tls-id value is different from that presently in use, the | this is a re-offer or a response to a re-offer and the | |||
DTLS connection is not being continued and the remote | tls-id value is different from that presently in use, the | |||
description <bcp14>MUST</bcp14> be part of an ICE restart, togethe | DTLS connection is not being continued and the remote | |||
r with | description <bcp14>MUST</bcp14> be part of an ICE restart, togethe | |||
new ufrag and password values.</li> | r with | |||
<li>DTLS setup value, which <bcp14>MUST</bcp14> be set according | new ufrag and password values.</li> | |||
to the | <li>A DTLS setup value, which <bcp14>MUST</bcp14> be set accordi | |||
rules specified in | ng to the | |||
<xref target="RFC5763" sectionFormat="comma" section="5"/> and <bc | rules specified in | |||
p14>MUST</bcp14> be | <xref target="RFC5763" sectionFormat="comma" section="5"/> and <bc | |||
consistent with the selected role of the current DTLS | p14>MUST</bcp14> be | |||
connection, if one exists and is being continued.</li> | consistent with the selected role of the current DTLS | |||
<li>DTLS fingerprint values, where at least one | connection, if one exists and is being continued.</li> | |||
fingerprint <bcp14>MUST</bcp14> be present.</li> | <li>DTLS fingerprint values, where at least one | |||
</ul> | fingerprint <bcp14>MUST</bcp14> be present.</li> | |||
</li> | </ul> | |||
<li>All RID values referenced in an "a=simulcast" line <bcp14>MUST</ | </li> | |||
bcp14> | <li>All RID values referenced in an "a=simulcast" line <bcp14>MUST</ | |||
exist as "a=rid" lines.</li> | bcp14> | |||
<li>Each m= section is also checked to ensure prohibited | exist as "a=rid" lines.</li> | |||
features are not used.</li> | <li>Each "m=" section is also checked to ensure that prohibited | |||
<li>If the RTP/RTCP multiplexing policy is "require", each | features are not used.</li> | |||
m= section <bcp14>MUST</bcp14> contain an "a=rtcp-mux" attribute. If | <li>If the RTP/RTCP multiplexing policy is "require", each | |||
an m= | "m=" section <bcp14>MUST</bcp14> contain an "a=rtcp-mux" attribute. | |||
section contains an "a=rtcp-mux-only" attribute, that | If an "m=" | |||
section <bcp14>MUST</bcp14> also contain an "a=rtcp-mux" attribute.< | section contains an "a=rtcp-mux-only" attribute, that | |||
/li> | section <bcp14>MUST</bcp14> also contain an "a=rtcp-mux" attribute.< | |||
<li>If an m= section was present in the previous answer, the | /li> | |||
state of RTP/RTCP multiplexing <bcp14>MUST</bcp14> match what was | <li>If an "m=" section was present in the previous answer, the | |||
previously negotiated.</li> | state of RTP/RTCP multiplexing <bcp14>MUST</bcp14> match what was | |||
</ul> | previously negotiated.</li> | |||
<t>If this session description is of type "pranswer" or | </ul> | |||
"answer", the following additional checks are applied: | <t>If this session description is of type "pranswer" or | |||
</t> | "answer", the following additional checks are applied: | |||
<ul spacing="normal"> | </t> | |||
<li>The session description must follow the rules defined in | <ul spacing="normal"> | |||
<li>The session description must follow the rules defined in | ||||
<xref target="RFC3264" sectionFormat="comma" section="6"/>, includin | <xref target="RFC3264" sectionFormat="comma" section="6"/>, includin | |||
g the | g the | |||
requirement that the number of m= sections <bcp14>MUST</bcp14> exact | requirement that the number of "m=" sections <bcp14>MUST</bcp14> exa | |||
ly | ctly | |||
match the number of m= sections in the associated | match the number of "m=" sections in the associated | |||
offer.</li> | offer.</li> | |||
<li>For each m= section, the media type and protocol values | <li>For each "m=" section, the media type and protocol values | |||
<bcp14>MUST</bcp14> exactly match the media type and protocol values | <bcp14>MUST</bcp14> exactly match the media type and protocol values | |||
in | in | |||
the corresponding m= section in the associated offer.</li> | the corresponding "m=" section in the associated offer.</li> | |||
</ul> | </ul> | |||
<t>If any of the preceding checks failed, processing <bcp14>MUST</bcp1 | <t>If any of the preceding checks failed, processing <bcp14>MUST</bcp1 | |||
4> | 4> | |||
stop and an error <bcp14>MUST</bcp14> be returned.</t> | stop and an error <bcp14>MUST</bcp14> be returned.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.applying-a-local-desc" numbered="true" toc="default"> | <section anchor="sec.applying-a-local-desc" numbered="true" toc="default" | |||
<name>Applying a Local Description</name> | > | |||
<t>The following steps are performed at the media engine level | <name>Applying a Local Description</name> | |||
to apply a local description. If an error is returned, the | <t>The following steps are performed at the media engine level | |||
session <bcp14>MUST</bcp14> be restored to the state it was in before | to apply a local description. If an error is returned, the | |||
performing these steps.</t> | session <bcp14>MUST</bcp14> be restored to the state it was in before | |||
<t>First, m= sections are processed. For each m= section, the | performing these steps.</t> | |||
following steps <bcp14>MUST</bcp14> be performed; if any parameters are | <t>First, "m=" sections are processed. For each "m=" section, the | |||
out of | following steps <bcp14>MUST</bcp14> be performed; if any parameters are | |||
bounds, or cannot be applied, processing <bcp14>MUST</bcp14> stop and an | out of | |||
error | bounds or cannot be applied, processing <bcp14>MUST</bcp14> stop and an | |||
<bcp14>MUST</bcp14> be returned. | error | |||
</t> | <bcp14>MUST</bcp14> be returned. | |||
<ul spacing="normal"> | </t> | |||
<li>If this m= section is new, begin gathering candidates for | <ul spacing="normal"> | |||
it, as defined in | <li>If this "m=" section is new, begin gathering candidates for | |||
<xref target="RFC8445" sectionFormat="comma" section="5.1.1"/>, unless | it, as defined in | |||
it is | <xref target="RFC8445" sectionFormat="comma" section="5.1.1"/>, unless | |||
definitively being bundled (either this is an offer and the | it is | |||
m= section is marked bundle-only, or it is an answer and the | definitively being bundled (either (1) this is an offer and the | |||
m= section is bundled into into another m= section.)</li> | "m=" section is marked bundle-only or (2) it is an answer and the | |||
<li>Or, if the ICE ufrag and password values have changed, | "m=" section is bundled into another "m=" section).</li> | |||
trigger the ICE agent to start an ICE restart as described in | <li>Or, if the ICE ufrag and password values have changed, | |||
<xref target="RFC8445" sectionFormat="comma" section="9"/>, and begin | trigger the ICE agent to start an ICE restart as described in | |||
gathering new candidates for the m= section. If this | <xref target="RFC8445" sectionFormat="comma" section="9"/>, and begin | |||
description is an answer, also start checks on that media | gathering new candidates for the "m=" section. If this | |||
section.</li> | description is an answer, also start checks on that media | |||
<li> | section.</li> | |||
<t>If the m= section proto value indicates use of RTP: | <li> | |||
</t> | <t>If the "m=" section proto value indicates use of RTP: | |||
<ul spacing="normal"> | </t> | |||
<li> | <ul spacing="normal"> | |||
<t>If there is no RtpTransceiver associated with this m= | <li> | |||
section, find one and associate it with this m= section | <t>If there is no RtpTransceiver associated with this "m=" | |||
according to the following steps. Note that this situation | section, find one and associate it with this "m=" section | |||
will only occur when applying an offer. | according to the following steps. Note that this situation | |||
</t> | will only occur when applying an offer. | |||
<ul spacing="normal"> | </t> | |||
<li>Find the RtpTransceiver that corresponds to this m= | <ul spacing="normal"> | |||
section, using the mapping between transceivers and m= | <li>Find the RtpTransceiver that corresponds to this "m=" | |||
section indices established when creating the offer.</li> | section, using the mapping between transceivers and "m=" | |||
<li>Set the value of this RtpTransceiver's mid property to | section indices established when creating the offer.</li> | |||
the MID of the m= section.</li> | <li>Set the value of this RtpTransceiver's mid property to | |||
</ul> | the MID of the "m=" section.</li> | |||
</li> | </ul> | |||
<li>If RTCP mux is indicated, prepare to demux RTP and RTCP | </li> | |||
from the RTP ICE component, as specified in | <li>If RTCP mux is indicated, prepare to demux RTP and RTCP | |||
<xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>.</li> | from the RTP ICE component, as specified in | |||
<li>For each specified RTP header extension, establish a | <xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>.</li> | |||
mapping between the extension ID and URI, as described in | <li>For each specified RTP header extension, establish a | |||
<xref target="RFC5285" sectionFormat="comma" section="6"/>.</li> | mapping between the extension ID and URI, as described in | |||
<li>If the MID header extension is supported, prepare to | <xref target="RFC5285" sectionFormat="comma" section="6"/>.</li> | |||
demux RTP streams intended for this m= section based on the | <li>If the MID header extension is supported, prepare to | |||
MID header extension, as described in | demux RTP streams intended for this "m=" section based on the | |||
<xref target="RFCYYYB" sectionFormat="comma" section="15"/>.</li> | MID header extension, as described in | |||
<li>For each specified media format, establish a mapping | <xref target="RFC8843" sectionFormat="comma" section="15"/>.</li> | |||
between the payload type and the actual media format, as | <li>For each specified media format, establish a mapping | |||
described in | between the payload type and the actual media format, as | |||
<xref target="RFC3264" sectionFormat="comma" section="6.1"/>. In add | described in | |||
ition, | <xref target="RFC3264" sectionFormat="comma" section="6.1"/>. In add | |||
prepare to demux RTP streams intended for this m= section | ition, | |||
based on the media formats supported by this m= section, as | prepare to demux RTP streams intended for this "m=" section | |||
described in | based on the media formats supported by this "m=" section, as | |||
<xref target="RFCYYYB" sectionFormat="comma" section="10.2"/>.</li> | described in | |||
<li>For each specified "rtx" media format, establish a | <xref target="RFC8843" sectionFormat="comma" section="9.2"/>. | |||
mapping between the RTX payload type and its associated | ||||
primary payload type, as described in | ||||
Sections <xref target="RFC4588" section="8.6" sectionFormat="bare"/> | ||||
and <xref target="RFC4588" section="8.7" sectionFormat="bare"/> of <xref target | ||||
="RFC4588"/>.</li> | ||||
<li>If the directional attribute is of type "sendrecv" or | ||||
"recvonly", enable receipt and decoding of media.</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
<t>Finally, if this description is of type "pranswer" or | ||||
"answer", follow the processing defined in | ||||
<xref target="sec.applying-an-answer" format="default"/> below.</t> | ||||
</section> | ||||
<section anchor="sec.applying-a-remote-desc" numbered="true" toc="default" | ||||
> | ||||
<name>Applying a Remote Description</name> | ||||
<t>The following steps are performed to apply a remote | ||||
description. If an error is returned, the session <bcp14>MUST</bcp14> be | ||||
restored to the state it was in before performing these | ||||
steps.</t> | ||||
<t>If the answer contains any "a=ice-options" attributes where | ||||
"trickle" is listed as an attribute, update the PeerConnection | ||||
canTrickle property to be true. Otherwise, set this property to | ||||
false.</t> | ||||
<t>The following steps <bcp14>MUST</bcp14> be performed for attributes a | ||||
t the | ||||
session level; if any parameters are out of bounds, or cannot | ||||
be applied, processing <bcp14>MUST</bcp14> stop and an error <bcp14>MUST | ||||
</bcp14> be returned. | ||||
</t> | <!-- [rfced] Sections 5.9, 5.10, 5.11, and 6: | |||
<ul spacing="normal"> | RFC 8843 [I-D.ietf-mmusic-sdp-bundle-negotiation] does not have a Section 8.2 | |||
<li>For any specified "CT" bandwidth value, set this as the | or a Section 10.2. We have updated these to refer to 7.2 and 9.2, | |||
limit for the maximum total bitrate for all m= sections, as | respectively. Please review. | |||
specified in | ||||
<xref target="RFC4566" sectionFormat="comma" section="5.8"/>. Within t | ||||
his | ||||
overall limit, the implementation can dynamically decide how | ||||
to best allocate the available bandwidth between m= sections, | ||||
respecting any specific limits that have been specified for | ||||
individual m= sections.</li> | ||||
<li>For any specified "RR" or "RS" bandwidth values, handle as | ||||
specified in | ||||
<xref target="RFC3556" sectionFormat="comma" section="2"/>.</li> | ||||
<li>Any "AS" bandwidth value <bcp14>MUST</bcp14> be ignored, as the me | ||||
aning | ||||
of this construct at the session level is not well | ||||
defined.</li> | ||||
</ul> | ||||
<t>For each m= section, the following steps <bcp14>MUST</bcp14> be perfo | ||||
rmed; | ||||
if any parameters are out of bounds, or cannot be applied, | ||||
processing <bcp14>MUST</bcp14> stop and an error <bcp14>MUST</bcp14> be | ||||
returned. | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>If the ICE ufrag or password changed from the previous | ||||
remote description: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the description is of type "offer", the | ||||
implementation <bcp14>MUST</bcp14> note that an ICE restart is neede | ||||
d, as | ||||
described in | ||||
<xref target="RFCYYY7" sectionFormat="comma" section="3.4.1.1.1"/></ | ||||
li> | ||||
<li>If the description is of type "answer" or "pranswer", | ||||
then check to see if the current local description is an | ||||
ICE restart, and if not, generate an error. If the | ||||
PeerConnection state is "have-remote-pranswer", and the ICE | ||||
ufrag or password changed from the previous provisional | ||||
answer, then signal the ICE agent to discard any previous | ||||
ICE check list state for the m= section. Finally, signal | ||||
the ICE agent to begin checks.</li> | ||||
</ul> | ||||
</li> | ||||
<li>If the current local description indicates an ICE restart, | ||||
and either the ICE ufrag or password has not changed from the | ||||
previous remote description, as prescribed by | ||||
<xref target="RFC8445" sectionFormat="comma" section="9"/>, generate a | ||||
n | ||||
error.</li> | ||||
<li>Configure the ICE components associated with this media | ||||
section to use the supplied ICE remote ufrag and password for | ||||
their connectivity checks.</li> | ||||
<li>Pair any supplied ICE candidates with any gathered local | ||||
candidates, as described in | ||||
<xref target="RFC8445" sectionFormat="comma" section="6.1.2"/>, and st | ||||
art | ||||
connectivity checks with the appropriate credentials.</li> | ||||
<li>If an "a=end-of-candidates" attribute is present, process | ||||
the end-of-candidates indication as described in | ||||
<xref target="RFCYYY6" sectionFormat="comma" section="11"/>.</li> | ||||
<li> | ||||
<t>If the m= section proto value indicates use of RTP: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the m= section is being recycled (see | ||||
<xref target="sec.subsequent-offers" format="default"/>), dissociate | ||||
the currently associated RtpTransceiver by setting its mid | ||||
property to null, and discard the mapping between the | ||||
transceiver and its m= section index.</li> | ||||
<li> | ||||
<t>If the m= section is not associated with any | ||||
RtpTransceiver (possibly because it was dissociated in the | ||||
previous step), either find an RtpTransceiver or create one | ||||
according to the following steps: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the m= section is sendrecv or recvonly, and there | ||||
are RtpTransceivers of the same type that were added to | ||||
the PeerConnection by addTrack and are not associated | ||||
with any m= section and are not stopped, find the first | ||||
(according to the canonical order described in | ||||
<xref target="sec.initial-offers" format="default"/>) such | ||||
RtpTransceiver.</li> | ||||
<li>If no RtpTransceiver was found in the previous step, | ||||
create one with a recvonly direction.</li> | ||||
<li>Associate the found or created RtpTransceiver with the | ||||
m= section by setting the value of the RtpTransceiver's | ||||
mid property to the MID of the m= section, and establish | ||||
a mapping between the transceiver and the index of the m= | ||||
section. If the m= section does not include a MID (i.e., | ||||
the remote endpoint does not support the MID extension), | ||||
generate a value for the RtpTransceiver mid property, | ||||
following the guidance for "a=mid" mentioned in | ||||
<xref target="sec.initial-offers" format="default"/>.</li> | ||||
</ul> | ||||
</li> | ||||
<li>For each specified media format that is also supported | ||||
by the local implementation, establish a mapping between | ||||
the specified payload type and the media format, as | ||||
described in | ||||
<xref target="RFC3264" sectionFormat="comma" section="6.1"/>. Specif | ||||
ically, this | ||||
means that the implementation records the payload type to | ||||
be used in outgoing RTP packets when sending each specified | ||||
media format, as well as the relative preference for each | ||||
format that is indicated in their ordering. If any | ||||
indicated media format is not supported by the local | ||||
implementation, it <bcp14>MUST</bcp14> be ignored.</li> | ||||
<li>For each specified "rtx" media format, establish a | ||||
mapping between the RTX payload type and its associated | ||||
primary payload type, as described in | ||||
<xref target="RFC4588" sectionFormat="comma" section="4"/>. If any r | ||||
eferenced | ||||
primary payload types are not present, this <bcp14>MUST</bcp14> resu | ||||
lt in | ||||
an error. Note that RTX payload types may refer to primary | ||||
payload types which are not supported by the local media | ||||
implementation, in which case, the RTX payload type <bcp14>MUST</bcp | ||||
14> | ||||
also be ignored.</li> | ||||
<li>For each specified fmtp parameter that is supported by | ||||
the local implementation, enable them on the associated | ||||
media formats.</li> | ||||
<li>For each specified SSRC that is signaled in the m= | ||||
section, prepare to demux RTP streams intended for this m= | ||||
section using that SSRC, as described in | ||||
<xref target="RFCYYYB" sectionFormat="comma" section="10.2"/>.</li> | ||||
<li>For each specified RTP header extension that is also | ||||
supported by the local implementation, establish a mapping | ||||
between the extension ID and URI, as described in | ||||
<xref target="RFC5285" sectionFormat="comma" section="5"/>. Specific | ||||
ally, this | ||||
means that the implementation records the extension ID to | ||||
be used in outgoing RTP packets when sending each specified | ||||
header extension. If any indicated RTP header extension is | ||||
not supported by the local implementation, it <bcp14>MUST</bcp14> be | ||||
ignored.</li> | ||||
<li>For each specified RTCP feedback mechanism that is | ||||
supported by the local implementation, enable them on the | ||||
associated media formats.</li> | ||||
<li> | ||||
<t>For any specified "TIAS" bandwidth value, set this value | ||||
as a constraint on the maximum RTP bitrate to be used when | ||||
sending media, as specified in | ||||
<xref target="RFC3890" format="default"/>. If a "TIAS" value is not | ||||
present, but an "AS" value is specified, generate a "TIAS" | ||||
value using this formula: | ||||
</t> | ||||
<ul empty="true"> | ||||
<li>TIAS = AS * 1000 * 0.95 - (50 * 40 * 8)</li> | ||||
</ul> | ||||
<t> | ||||
The 50 is based on 50 packets per second, the 40 is | ||||
based on an estimate of total header size, the 1000 changes | ||||
the unit from kbps to bps (as required by TIAS), and the | ||||
0.95 is to allocate 5% to RTCP. "TIAS" is used in | ||||
preference to "AS" because it provides more accurate | ||||
control of bandwidth.</t> | ||||
</li> | ||||
<li>For any "RR" or "RS" bandwidth values, handle as | ||||
specified in | ||||
<xref target="RFC3556" sectionFormat="comma" section="2"/>.</li> | ||||
<li>Any specified "CT" bandwidth value <bcp14>MUST</bcp14> be igno | ||||
red, as | ||||
the meaning of this construct at the media level is not | ||||
well defined.</li> | ||||
<li> | ||||
<t>If the m= section is of type audio: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>For each specified "CN" media format, configure | ||||
silence suppression for all supported media formats with | ||||
the same clockrate, as described in | ||||
<xref target="RFC3389" sectionFormat="comma" section="5"/>, except | ||||
for formats | ||||
that have their own internal silence suppression | ||||
mechanisms. Silence suppression for such formats (e.g., | ||||
Opus) is controlled via fmtp parameters, as discussed in | ||||
<xref target="sec.voiceactivitydetection1" format="default"/>.</li | ||||
> | ||||
<li>For each specified "telephone-event" media format, | ||||
enable DTMF transmission for all supported media formats | ||||
with the same clockrate, as described in | ||||
<xref target="RFC4733" sectionFormat="comma" section="2.5.1.2"/>. | ||||
If there are | ||||
any supported media formats that do not have a | ||||
corresponding telephone-event format, disable DTMF | ||||
transmission for those formats.</li> | ||||
<li>For any specified "ptime" value, configure the | ||||
available media formats to use the specified packet size | ||||
when sending. If the specified size is not supported for | ||||
a media format, use the next closest value instead.</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
<t>Finally, if this description is of type "pranswer" or | ||||
"answer", follow the processing defined in | ||||
<xref target="sec.applying-an-answer" format="default"/> below.</t> | ||||
</section> | ||||
<section anchor="sec.applying-an-answer" numbered="true" toc="default"> | ||||
<name>Applying an Answer</name> | ||||
<t>In addition to the steps mentioned above for processing a | ||||
local or remote description, the following steps are performed | ||||
when processing a description of type "pranswer" or | ||||
"answer".</t> | ||||
<t>For each m= section, the following steps <bcp14>MUST</bcp14> be perfo | ||||
rmed: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the m= section has been rejected (i.e. port is set to | ||||
zero in the answer), stop any reception or transmission of | ||||
media for this section, and, unless a non-rejected m= section | ||||
is bundled with this m= section, discard any associated ICE | ||||
components, as described in | ||||
<xref target="RFCYYY7" sectionFormat="comma" section="3.4.3.1"/>.</li> | ||||
<li>If the remote DTLS fingerprint has been changed or the | ||||
tls-id has changed, tear down the DTLS connection. This | ||||
includes the case when the PeerConnection state is | ||||
"have-remote-pranswer". If a DTLS connection needs to be torn | ||||
down but the answer does not indicate an ICE restart or, in | ||||
the case of "have-remote-pranswer", new ICE credentials, an | ||||
error <bcp14>MUST</bcp14> be generated. If an ICE restart is performed | ||||
without a change in tls-id or fingerprint, then the same DTLS | ||||
connection is continued over the new ICE channel. Note that | ||||
although JSEP requires that answerers change the tls-id value | ||||
if and only if the offerer does, non-JSEP answerers are | ||||
permitted to change the tls-id as long as the offer contained | ||||
an ICE restart. Thus, JSEP implementations which process DTLS | ||||
data prior to receiving an answer <bcp14>MUST</bcp14> be prepared to r | ||||
eceive | ||||
either a ClientHello or data from the previous DTLS | ||||
connection.</li> | ||||
<li>If no valid DTLS connection exists, prepare to start a | ||||
DTLS connection, using the specified roles and fingerprints, | ||||
on any underlying ICE components, once they are active.</li> | ||||
<li> | ||||
<t>If the m= section proto value indicates use of RTP: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the m= section references RTCP feedback mechanisms | ||||
that were not present in the corresponding m= section in | ||||
the offer, this indicates a negotiation problem and <bcp14>MUST</bcp | ||||
14> | ||||
result in an error. However, new media formats and new RTP | ||||
header extension values are permitted in the answer, as | ||||
described in | ||||
<xref target="RFC3264" sectionFormat="comma" section="7"/>, and | ||||
<xref target="RFC5285" sectionFormat="comma" section="6"/>.</li> | ||||
<li>If the m= section has RTCP mux enabled, discard the RTCP | ||||
ICE component, if one exists, and begin or continue muxing | ||||
RTCP over the RTP ICE component, as specified in | ||||
<xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>. Othe | ||||
rwise, | ||||
prepare to transmit RTCP over the RTCP ICE component; if no | ||||
RTCP ICE component exists, because RTCP mux was previously | ||||
enabled, this <bcp14>MUST</bcp14> result in an error.</li> | ||||
<li>If the m= section has reduced-size RTCP enabled, | ||||
configure the RTCP transmission for this m= section to use | ||||
reduced-size RTCP, as specified in | ||||
<xref target="RFC5506" format="default"/>.</li> | ||||
<li>If the directional attribute in the answer indicates | ||||
that the JSEP implementation should be sending media | ||||
("sendonly" for local answers, "recvonly" for remote | ||||
answers, or "sendrecv" for either type of answer), choose | ||||
the media format to send as the most preferred media format | ||||
from the remote description that is also locally supported, | ||||
as discussed in Sections <xref target="RFC3264" section="6.1" | ||||
sectionFormat="bare"/> and <xref target="RFC3264" section="7" sectionFormat="bar | ||||
e"/> of <xref target="RFC3264"/>, and start | ||||
transmitting RTP media using that format once the | ||||
underlying transport layers have been established. If an | ||||
SSRC has not already been chosen for this outgoing RTP | ||||
stream, choose a random one. If media is already being | ||||
transmitted, the same SSRC <bcp14>SHOULD</bcp14> be used unless the | ||||
clockrate of the new codec is different, in which case a | ||||
new SSRC <bcp14>MUST</bcp14> be chosen, as specified in | ||||
<xref target="RFC7160" sectionFormat="comma" section="3.1"/>.</li> | ||||
<li>The payload type mapping from the remote description is | ||||
used to determine payload types for the outgoing RTP | ||||
streams, including the payload type for the send media | ||||
format chosen above. Any RTP header extensions that were | ||||
negotiated should be included in the outgoing RTP streams, | ||||
using the extension mapping from the remote description; if | ||||
the RID header extension has been negotiated, and RID | ||||
values are specified, include the RID header extension in | ||||
the outgoing RTP streams, as indicated in | ||||
<xref target="RFCYYYC" sectionFormat="comma" section="4"/>.</li> | ||||
<li>If the m= section is of type audio, and silence | ||||
suppression was configured for the send media format as a | ||||
result of processing the remote description, and is also | ||||
enabled for that format in the local description, use | ||||
silence suppression for outgoing media, in accordance with | ||||
the guidance in | ||||
<xref target="sec.voiceactivitydetection1" format="default"/>. If th | ||||
ese | ||||
conditions are not met, silence suppression <bcp14>MUST NOT</bcp14> | ||||
be | ||||
used for outgoing media.</li> | ||||
<li>If simulcast has been negotiated, send the number of | ||||
Source RTP Streams as specified in | ||||
<xref target="RFCYYYE" sectionFormat="comma" section="6.2.2"/>.</li> | ||||
<li>If the send media format chosen above has a | ||||
corresponding "rtx" media format, or a FEC mechanism has | ||||
been negotiated, establish a Redundancy RTP Stream with a | ||||
random SSRC for each Source RTP Stream, and start or | ||||
continue transmitting RTX/FEC packets as needed.</li> | ||||
<li>If the send media format chosen above has a | ||||
corresponding "red" media format of the same clockrate, | ||||
allow redundant encoding using the specified format for | ||||
resiliency purposes, as discussed in | ||||
<xref target="RFCYYYF" sectionFormat="comma" section="3.2"/>. Note | ||||
that unlike RTX or FEC media formats, the "red" format is | ||||
transmitted on the Source RTP Stream, not the Redundancy | ||||
RTP Stream.</li> | ||||
<li>Enable the RTCP feedback mechanisms referenced in the | ||||
media section for all Source RTP Streams using the | ||||
specified media formats. Specifically, begin or continue | ||||
sending the requested feedback types and reacting to | ||||
received feedback, as specified in | ||||
<xref target="RFC4585" sectionFormat="comma" section="4.2"/>. When s | ||||
ending RTCP | ||||
feedback, follow the rules and recommendations from | ||||
<xref target="RFC8108" sectionFormat="comma" section="5.4.1"/>, to select | ||||
which SSRC to use.</li> | ||||
<li>If the directional attribute in the answer indicates | ||||
that the JSEP implementation should not be sending media | ||||
("recvonly" for local answers, "sendonly" for remote | ||||
answers, or "inactive" for either type of answer) stop | ||||
transmitting all RTP media, but continue sending RTCP, as | ||||
described in | ||||
<xref target="RFC3264" sectionFormat="comma" section="5.1"/>.</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>If the m= section proto value indicates use of SCTP: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If an SCTP association exists, and the remote SCTP port | ||||
has changed, discard the existing SCTP association. This | ||||
includes the case when the PeerConnection state is | ||||
"have-remote-pranswer".</li> | ||||
<li>If no valid SCTP association exists, prepare to initiate | ||||
a SCTP association over the associated ICE component and | ||||
DTLS connection, using the local SCTP port value from the | ||||
local description, and the remote SCTP port value from the | ||||
remote description, as described in | ||||
<xref target="RFCYYY9" sectionFormat="comma" section="10.2"/>.</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
<t>If the answer contains valid bundle groups, discard any ICE | ||||
components for the m= sections that will be bundled onto the | ||||
primary ICE components in each bundle, and begin muxing these | ||||
m= sections accordingly, as described in | ||||
<xref target="RFCYYYB" sectionFormat="comma" section="8.2"/>.</t> | ||||
<t>If the description is of type "answer", and there are still | ||||
remaining candidates in the ICE candidate pool, discard | ||||
them.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="sec.rtp.demux" numbered="true" toc="default"> | ||||
<name>Processing RTP/RTCP</name> | ||||
<t>When bundling, associating incoming RTP/RTCP with the proper | ||||
m= section is defined in | ||||
<xref target="RFCYYYB" sectionFormat="comma" section="10.2"/>. When not bu | ||||
ndling, the proper m= section is clear from the | ||||
ICE component over which the RTP/RTCP is received.</t> | ||||
<t>Once the proper m= section(s) are known, RTP/RTCP is delivered | ||||
to the RtpTransceiver(s) associated with the m= section(s) and | ||||
further processing of the RTP/RTCP is done at the RtpTransceiver | ||||
level. This includes using RID | ||||
<xref target="RFCYYYC" format="default"/> to distinguish between | ||||
multiple Encoded Streams, as well as determine which Source RTP | ||||
stream should be repaired by a given Redundancy RTP stream.</t> | ||||
</section> | ||||
<section anchor="sec.examples" numbered="true" toc="default"> | ||||
<name>Examples</name> | ||||
<t>Note that this example section shows several SDP fragments. To | ||||
format in 72 columns, some of the lines in SDP have been split | ||||
into multiple lines, where leading whitespace indicates that a | ||||
line is a continuation of the previous line. In addition, some | ||||
blank lines have been added to improve readability but are not | ||||
valid in SDP.</t> | ||||
<t>More examples of SDP for WebRTC call flows, including examples | ||||
with IPv6 addresses, can be found in | ||||
<xref target="I-D.ietf-rtcweb-sdp" format="default"/>.</t> | ||||
<section anchor="sec.simple-examples" numbered="true" toc="default"> | ||||
<name>Simple Example</name> | ||||
<t>This section shows a very simple example that sets up a | ||||
minimal audio / video call between two JSEP endpoints without | ||||
using trickle ICE. The example in the following section | ||||
provides a more detailed example of what could happen in a JSEP | ||||
session.</t> | ||||
<t>The code flow below shows Alice's endpoint initiating the | ||||
session to Bob's endpoint. The messages from the JavaScript | ||||
application in Alice's browser to the JavaScript in Bob's | ||||
browser, abbreviated as AliceJS and BobJS respectively, are | ||||
assumed to flow over some signaling protocol via a web server. | ||||
The JavaScript on both Alice's side and Bob's side waits for | ||||
all candidates before sending the offer or answer, so the | ||||
offers and answers are complete; trickle ICE is not used. The | ||||
user agents (JSEP implementations) in Alice and Bob's browsers, | ||||
abbreviated as AliceUA and BobUA respectively, are using the | ||||
default bundle policy of "balanced", and the default RTCP mux | ||||
policy of "require".</t> | ||||
<sourcecode name="" type="pseudocode"><![CDATA[ | Original: | |||
In addition, prepare to demux RTP | ||||
streams intended for this m= section based on the media formats | ||||
supported by this m= section, as described in | ||||
[I-D.ietf-mmusic-sdp-bundle-negotiation], Section 10.2. | ||||
... | ||||
* For each specified SSRC that is signaled in the m= section, | ||||
prepare to demux RTP streams intended for this m= section using | ||||
that SSRC, as described in | ||||
[I-D.ietf-mmusic-sdp-bundle-negotiation], Section 10.2. | ||||
... | ||||
If the answer contains valid bundle groups, discard any ICE | ||||
components for the m= sections that will be bundled onto the primary | ||||
ICE components in each bundle, and begin muxing these m= sections | ||||
accordingly, as described in | ||||
[I-D.ietf-mmusic-sdp-bundle-negotiation], Section 8.2. | ||||
... | ||||
When bundling, associating incoming RTP/RTCP with the proper m= | ||||
section is defined in [I-D.ietf-mmusic-sdp-bundle-negotiation], | ||||
Section 10.2. --> | ||||
</li> | ||||
<li>For each specified "rtx" media format, establish a | ||||
mapping between the RTX payload type and its associated | ||||
primary payload type, as described in | ||||
Sections <xref target="RFC4588" section="8.6" | ||||
sectionFormat="bare"/> and <xref target="RFC4588" section="8.7" | ||||
sectionFormat="bare"/> of <xref target="RFC4588"/>. | ||||
<!-- [rfced] Sections 5.9 and 5.11: We had to change "[RFC4588], | ||||
Sections 8.6 and 8.7" to "Sections 8.6 and 8.7 of [RFC4588]" | ||||
(in Section 5.9) and "[RFC3264], Sections 6.1 and 7" to "Sections 6.1 | ||||
and 7 of [RFC3264]" (in Section 5.11) in order to get the hyperlinks | ||||
to work properly in the .html/.pdf files. Please let us know any concerns. | ||||
Original: | ||||
* For each specified "rtx" media format, establish a mapping | ||||
between the RTX payload type and its associated primary payload | ||||
type, as described in [RFC4588], Sections 8.6 and 8.7. | ||||
... | ||||
* If the directional attribute in the answer indicates that the | ||||
JSEP implementation should be sending media ("sendonly" for | ||||
local answers, "recvonly" for remote answers, or "sendrecv" for | ||||
either type of answer), choose the media format to send as the | ||||
most preferred media format from the remote description that is | ||||
also locally supported, as discussed in [RFC3264], Sections 6.1 | ||||
and 7, and start transmitting RTP media using that format once | ||||
the underlying transport layers have been established. | ||||
Currently: | ||||
- For each specified "rtx" media format, establish a mapping | ||||
between the RTX payload type and its associated primary payload | ||||
type, as described in Sections 8.6 and 8.7 of [RFC4588]. | ||||
... | ||||
- If the directional attribute in the answer indicates that the | ||||
JSEP implementation should be sending media ("sendonly" for | ||||
local answers, "recvonly" for remote answers, or "sendrecv" for | ||||
either type of answer), choose the media format to send as the | ||||
most preferred media format from the remote description that is | ||||
also locally supported, as discussed in Sections 6.1 and 7 of | ||||
[RFC3264], and start transmitting RTP media using that format | ||||
once the underlying transport layers have been established. --> | ||||
</li> | ||||
<li>If the directional attribute is of type "sendrecv" or | ||||
"recvonly", enable receipt and decoding of media.</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
<t>Finally, if this description is of type "pranswer" or | ||||
"answer", follow the processing defined in | ||||
<xref target="sec.applying-an-answer" format="default"/> below.</t> | ||||
</section> | ||||
<section anchor="sec.applying-a-remote-desc" numbered="true" toc="default | ||||
"> | ||||
<name>Applying a Remote Description</name> | ||||
<t>The following steps are performed to apply a remote | ||||
description. If an error is returned, the session <bcp14>MUST</bcp14> be | ||||
restored to the state it was in before performing these | ||||
steps.</t> | ||||
<t>If the answer contains any "a=ice-options" attributes where | ||||
"trickle" is listed as an attribute, update the PeerConnection | ||||
canTrickle property to be "true". Otherwise, set this property to | ||||
"false".</t> | ||||
<t>The following steps <bcp14>MUST</bcp14> be performed for attributes a | ||||
t the | ||||
session level; if any parameters are out of bounds or cannot | ||||
be applied, processing <bcp14>MUST</bcp14> stop and an error <bcp14>MUST | ||||
</bcp14> be returned. | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>For any specified "CT" bandwidth value, set this value as the | ||||
limit for the maximum total bitrate for all "m=" sections, as | ||||
specified in | ||||
<xref target="RFC4566" sectionFormat="comma" section="5.8"/>. Within t | ||||
his | ||||
overall limit, the implementation can dynamically decide how | ||||
to best allocate the available bandwidth between "m=" sections, | ||||
respecting any specific limits that have been specified for | ||||
individual "m=" sections.</li> | ||||
<li>For any specified "RR" or "RS" bandwidth values, handle as | ||||
specified in | ||||
<xref target="RFC3556" sectionFormat="comma" section="2"/>.</li> | ||||
<li>Any "AS" bandwidth value <bcp14>MUST</bcp14> be ignored, as the me | ||||
aning | ||||
of this construct at the session level is not well | ||||
defined. | ||||
<!-- [rfced] Section 5.10: For ease of the reader, we suggest adding | ||||
a citation that provides the definition of "AS." Please let us know | ||||
if we may update as follows. | ||||
Original: | ||||
o Any "AS" bandwidth value MUST be ignored, as the meaning of this | ||||
construct at the session level is not well defined. | ||||
Suggested: | ||||
* Any "AS" bandwidth value ([RFC4566], Section 5.8) MUST be | ||||
ignored, as the meaning of this construct at the session level is | ||||
not well defined. --> | ||||
</li> | ||||
</ul> | ||||
<t>For each "m=" section, the following steps <bcp14>MUST</bcp14> be per | ||||
formed; | ||||
if any parameters are out of bounds or cannot be applied, | ||||
processing <bcp14>MUST</bcp14> stop and an error <bcp14>MUST</bcp14> be | ||||
returned. | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>If the ICE ufrag or password changed from the previous | ||||
remote description: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the description is of type "offer", the | ||||
implementation <bcp14>MUST</bcp14> note that an ICE restart is neede | ||||
d, as | ||||
described in | ||||
<xref target="RFC8839" sectionFormat="comma" section="4.4.1.1.1"/>.< | ||||
/li> | ||||
<li>If the description is of type "answer" or "pranswer", | ||||
then check to see if the current local description is an | ||||
ICE restart, and if not, generate an error. If the | ||||
PeerConnection state is "have-remote-pranswer" and the ICE | ||||
ufrag or password changed from the previous provisional | ||||
answer, then signal the ICE agent to discard any previous | ||||
ICE check list state for the "m=" section. Finally, signal | ||||
the ICE agent to begin checks. | ||||
<!-- [rfced] Other documents in this cluster spell "checklist" as one | ||||
word. May we change "check list" in this document to "checklist"? --> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li>If the current local description indicates an ICE restart | ||||
and either the ICE ufrag or password has not changed from the | ||||
previous remote description, as prescribed by | ||||
<xref target="RFC8445" sectionFormat="comma" section="9"/>, generate a | ||||
n | ||||
error. | ||||
<!-- [rfced] Section 5.10: We found this sentence confusing, as we | ||||
could not tell what "as prescribed by [RFC8445], Section 9" and | ||||
"generate an error" refer to. Please confirm that the citation is | ||||
correct and will be clear to readers. | ||||
Original: | ||||
o If the current local description indicates an ICE restart, and | ||||
either the ICE ufrag or password has not changed from the previous | ||||
remote description, as prescribed by [RFC8445], Section 9, | ||||
generate an error. --> | ||||
</li> | ||||
<li>Configure the ICE components associated with this media | ||||
section to use the supplied ICE remote ufrag and password for | ||||
their connectivity checks.</li> | ||||
<li>Pair any supplied ICE candidates with any gathered local | ||||
candidates, as described in | ||||
<xref target="RFC8445" sectionFormat="comma" section="6.1.2"/>, and st | ||||
art | ||||
connectivity checks with the appropriate credentials.</li> | ||||
<li>If an "a=end-of-candidates" attribute is present, process | ||||
the end-of-candidates indication as described in | ||||
<xref target="RFC8838" sectionFormat="comma" section="14"/>.</li> | ||||
<li> | ||||
<t>If the "m=" section proto value indicates use of RTP: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the "m=" section is being recycled (see | ||||
<xref target="sec.subsequent-offers" format="default"/>), dissociat | ||||
e | ||||
the currently associated RtpTransceiver by setting its mid | ||||
property to "null", and discard the mapping between the | ||||
transceiver and its "m=" section index.</li> | ||||
<li> | ||||
<t>If the "m=" section is not associated with any | ||||
RtpTransceiver (possibly because it was dissociated in the | ||||
previous step), either find an RtpTransceiver or create one | ||||
according to the following steps: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the "m=" section is sendrecv or recvonly, and there | ||||
are RtpTransceivers of the same type that were added to | ||||
the PeerConnection by addTrack and are not associated | ||||
with any "m=" section and are not stopped, find the first | ||||
(according to the canonical order described in | ||||
<xref target="sec.initial-offers" format="default"/>) such | ||||
RtpTransceiver.</li> | ||||
<li>If no RtpTransceiver was found in the previous step, | ||||
create one with a recvonly direction.</li> | ||||
<li>Associate the found or created RtpTransceiver with the | ||||
"m=" section by setting the value of the RtpTransceiver's | ||||
mid property to the MID of the "m=" section, and establish | ||||
a mapping between the transceiver and the index of the "m=" | ||||
section. If the "m=" section does not include a MID (i.e., | ||||
the remote endpoint does not support the MID extension), | ||||
generate a value for the RtpTransceiver mid property, | ||||
following the guidance for "a=mid" mentioned in | ||||
<xref target="sec.initial-offers" format="default"/>.</li> | ||||
</ul> | ||||
</li> | ||||
<li>For each specified media format that is also supported | ||||
by the local implementation, establish a mapping between | ||||
the specified payload type and the media format, as | ||||
described in | ||||
<xref target="RFC3264" sectionFormat="comma" section="6.1"/>. Speci | ||||
fically, this | ||||
means that the implementation records the payload type to | ||||
be used in outgoing RTP packets when sending each specified | ||||
media format, as well as the relative preference for each | ||||
format that is indicated in their ordering. If any | ||||
indicated media format is not supported by the local | ||||
implementation, it <bcp14>MUST</bcp14> be ignored.</li> | ||||
<li>For each specified "rtx" media format, establish a | ||||
mapping between the RTX payload type and its associated | ||||
primary payload type, as described in | ||||
<xref target="RFC4588" sectionFormat="comma" section="4"/>. If any | ||||
referenced | ||||
primary payload types are not present, this <bcp14>MUST</bcp14> res | ||||
ult in | ||||
an error. Note that RTX payload types may refer to primary | ||||
payload types that are not supported by the local media | ||||
implementation, in which case the RTX payload type <bcp14>MUST</bcp | ||||
14> | ||||
also be ignored.</li> | ||||
<li>For each specified fmtp parameter that is supported by | ||||
the local implementation, enable them on the associated | ||||
media formats.</li> | ||||
<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 using that SSRC, as described in | ||||
<xref target="RFC8843" sectionFormat="comma" section="9.2"/>.</li> | ||||
<li>For each specified RTP header extension that is also | ||||
supported by the local implementation, establish a mapping | ||||
between the extension ID and URI, as described in | ||||
<xref target="RFC5285" sectionFormat="comma" section="5"/>. Specifi | ||||
cally, this | ||||
means that the implementation records the extension ID to | ||||
be used in outgoing RTP packets when sending each specified | ||||
header extension. If any indicated RTP header extension is | ||||
not supported by the local implementation, it <bcp14>MUST</bcp14> b | ||||
e | ||||
ignored.</li> | ||||
<li>For each specified RTCP feedback mechanism that is | ||||
supported by the local implementation, enable them on the | ||||
associated media formats.</li> | ||||
<li> | ||||
<t>For any specified "TIAS" ("Transport | ||||
Independent Application Specific Maximum") bandwidth value, set this value | ||||
as a constraint on the maximum RTP bitrate to be used when | ||||
sending media, as specified in | ||||
<xref target="RFC3890" format="default"/>. If a "TIAS" value is not | ||||
present but an "AS" value is specified, generate a "TIAS" | ||||
value using this formula: | ||||
</t> | ||||
<ul empty="true"> | ||||
<li>TIAS = AS * 1000 * 0.95 - (50 * 40 * 8)</li> | ||||
</ul> | ||||
<t> | ||||
The "50" is based on 50 packets per second, the "40" is | ||||
based on an estimate of total header size, the "1000" changes | ||||
the unit from kbps to bps (as required by TIAS), and the | ||||
"0.95" is to allocate 5% to RTCP. | ||||
<!-- [rfced] Section 5.10: For ease of the reader, should the "8" | ||||
also be explained (e.g., possibly "bytes to bits")? We ask because | ||||
explanations are provided for the other four numbers. | ||||
Original: | ||||
TIAS = AS * 1000 * 0.95 - (50 * 40 * 8) | ||||
The 50 is based on 50 packets per second, the 40 is based on an | ||||
estimate of total header size, the 1000 changes the unit from | ||||
kbps to bps (as required by TIAS), and the 0.95 is to allocate | ||||
5% to RTCP.--> | ||||
"TIAS" is used in | ||||
preference to "AS" because it provides more accurate | ||||
control of bandwidth.</t> | ||||
</li> | ||||
<li>For any "RR" or "RS" bandwidth values, handle as | ||||
specified in | ||||
<xref target="RFC3556" sectionFormat="comma" section="2"/>.</li> | ||||
<li>Any specified "CT" bandwidth value <bcp14>MUST</bcp14> be ign | ||||
ored, as | ||||
the meaning of this construct at the media level is not | ||||
well defined.</li> | ||||
<li> | ||||
<t>If the "m=" section is of type "audio": | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>For each specified "CN" media format, configure | ||||
silence suppression for all supported media formats with | ||||
the same clock rate, as described in | ||||
<xref target="RFC3389" sectionFormat="comma" section="5"/>, excep | ||||
t for formats | ||||
that have their own internal silence suppression | ||||
mechanisms. Silence suppression for such formats (e.g., | ||||
Opus) is controlled via fmtp parameters, as discussed in | ||||
<xref target="sec.voiceactivitydetection1" format="default"/>.</l | ||||
i> | ||||
<li>For each specified "telephone-event" media format, | ||||
enable dual-tone multifrequency (DTMF) transmission for all suppo | ||||
rted media formats | ||||
with the same clock rate, as described in | ||||
<xref target="RFC4733" sectionFormat="comma" section="2.5.1.2"/>. | ||||
If there are | ||||
any supported media formats that do not have a | ||||
corresponding telephone-event format, disable DTMF | ||||
transmission for those formats.</li> | ||||
<li>For any specified "ptime" value, configure the | ||||
available media formats to use the specified packet size | ||||
when sending. If the specified size is not supported for | ||||
a media format, use the next closest value instead.</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
<t>Finally, if this description is of type "pranswer" or | ||||
"answer", follow the processing defined in | ||||
<xref target="sec.applying-an-answer" format="default"/> below.</t> | ||||
</section> | ||||
<section anchor="sec.applying-an-answer" numbered="true" toc="default"> | ||||
<name>Applying an Answer</name> | ||||
<t>In addition to the steps mentioned above for processing a | ||||
local or remote description, the following steps are performed | ||||
when processing a description of type "pranswer" or | ||||
"answer".</t> | ||||
<t>For each "m=" section, the following steps <bcp14>MUST</bcp14> be pe | ||||
rformed: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the "m=" section has been rejected (i.e., the port value is se | ||||
t to | ||||
zero in the answer), stop any reception or transmission of | ||||
media for this section, and, unless a non-rejected "m=" section | ||||
is bundled with this "m=" section, discard any associated ICE | ||||
components, as described in | ||||
<xref target="RFC8839" sectionFormat="comma" section="4.4.3.1"/>.</li | ||||
> | ||||
<li>If the remote DTLS fingerprint has been changed or the | ||||
tls-id has changed, tear down the DTLS connection. This | ||||
includes the case when the PeerConnection state is | ||||
"have-remote-pranswer". If a DTLS connection needs to be torn | ||||
down but the answer does not indicate an ICE restart or, in | ||||
the case of "have-remote-pranswer", new ICE credentials, an | ||||
error <bcp14>MUST</bcp14> be generated. If an ICE restart is perform | ||||
ed | ||||
without a change in tls-id or fingerprint, then the same DTLS | ||||
connection is continued over the new ICE channel. Note that | ||||
although JSEP requires that answerers change the tls-id value | ||||
if and only if the offerer does, non-JSEP answerers are | ||||
permitted to change the tls-id as long as the offer contained | ||||
an ICE restart. Thus, JSEP implementations that process DTLS | ||||
data prior to receiving an answer <bcp14>MUST</bcp14> be prepared to | ||||
receive | ||||
either a ClientHello or data from the previous DTLS | ||||
connection.</li> | ||||
<li>If no valid DTLS connection exists, prepare to start a | ||||
DTLS connection, using the specified roles and fingerprints, | ||||
on any underlying ICE components, once they are active.</li> | ||||
<li> | ||||
<t>If the "m=" section proto value indicates use of RTP: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If the "m=" section references RTCP feedback mechanisms | ||||
that were not present in the corresponding "m=" section in | ||||
the offer, this indicates a negotiation problem and <bcp14>MUST</b | ||||
cp14> | ||||
result in an error. However, new media formats and new RTP | ||||
header extension values are permitted in the answer, as | ||||
described in | ||||
<xref target="RFC3264" sectionFormat="comma" section="7"/> and | ||||
<xref target="RFC5285" sectionFormat="comma" section="6"/>.</li> | ||||
<li>If the "m=" section has RTCP mux enabled, discard the RTCP | ||||
ICE component, if one exists, and begin or continue muxing | ||||
RTCP over the RTP ICE component, as specified in | ||||
<xref target="RFC5761" sectionFormat="comma" section="5.1.3"/>. Ot | ||||
herwise, | ||||
prepare to transmit RTCP over the RTCP ICE component; if no | ||||
RTCP ICE component exists because RTCP mux was previously | ||||
enabled, this <bcp14>MUST</bcp14> result in an error.</li> | ||||
<li>If the "m=" section has Reduced-Size RTCP enabled, | ||||
configure the RTCP transmission for this "m=" section to use | ||||
Reduced-Size RTCP, as specified in | ||||
<xref target="RFC5506" format="default"/>.</li> | ||||
<li>If the directional attribute in the answer indicates | ||||
that the JSEP implementation should be sending media | ||||
("sendonly" for local answers, "recvonly" for remote | ||||
answers, or "sendrecv" for either type of answer), choose | ||||
the media format to send as the most preferred media format | ||||
from the remote description that is also locally supported, | ||||
as discussed in Sections <xref target="RFC3264" section="6.1" | ||||
sectionFormat="bare"/> and <xref target="RFC3264" section="7" sectionFormat=" | ||||
bare"/> of <xref target="RFC3264"/>, and start | ||||
transmitting RTP media using that format once the | ||||
underlying transport layers have been established. If an | ||||
SSRC has not already been chosen for this outgoing RTP | ||||
stream, choose a random one. If media is already being | ||||
transmitted, the same SSRC <bcp14>SHOULD</bcp14> be used unless th | ||||
e | ||||
clock rate of the new codec is different, in which case a | ||||
new SSRC <bcp14>MUST</bcp14> be chosen, as specified in | ||||
<xref target="RFC7160" sectionFormat="comma" section="3.1"/>.</li> | ||||
<li>The payload type mapping from the remote description is | ||||
used to determine payload types for the outgoing RTP | ||||
streams, including the payload type for the send media | ||||
format chosen above. Any RTP header extensions that were | ||||
negotiated should be included in the outgoing RTP streams, | ||||
using the extension mapping from the remote description; if | ||||
the RID header extension has been negotiated and RID | ||||
values are specified, include the RID header extension in | ||||
the outgoing RTP streams, as indicated in | ||||
<xref target="RFC8851" sectionFormat="comma" section="4"/>.</li> | ||||
<li>If (1) the "m=" section is of type "audio" and (2) sile | ||||
nce | ||||
suppression was configured for the send media format as a | ||||
result of processing the remote description and is also | ||||
enabled for that format in the local description, use | ||||
silence suppression for outgoing media, in accordance with | ||||
the guidance in | ||||
<xref target="sec.voiceactivitydetection1" format="default"/>. | ||||
<!-- [rfced] Section 5.11: As it appears that "is also enabled" | ||||
refers to silence suppression, we updated this sentence as follows. | ||||
Please let us know if this is incorrect. | ||||
Original: | ||||
* If the m= section is of type audio, and silence suppression was | ||||
configured for the send media format as a result of processing | ||||
the remote description, and is also enabled for that format in | ||||
the local description, use silence suppression for outgoing | ||||
media, in accordance with the guidance in Section 5.2.3.2. | ||||
Currently: | ||||
- If (1) the "m=" section is of type "audio" and (2) silence | ||||
suppression was configured for the send media format as a | ||||
result of processing the remote description and is also enabled | ||||
for that format in the local description, use silence | ||||
suppression for outgoing media, in accordance with the guidance | ||||
in Section 5.2.3.2. --> | ||||
If these | ||||
conditions are not met, silence suppression <bcp14>MUST NOT</bcp14 | ||||
> be | ||||
used for outgoing media.</li> | ||||
<li>If simulcast has been negotiated, send the number of | ||||
Source RTP Streams as specified in | ||||
<xref target="RFC8853" sectionFormat="comma" section="6.2.2"/>. | ||||
<!-- [rfced] Section 5.11: Please (1) confirm that Section 6.2.2 of | ||||
RFC 8853 [I-D.ietf-mmusic-sdp-simulcast] (with version -14 being the latest | ||||
for this draft) is the correct section to cite here and (2) clarify | ||||
the meaning of "send the number of Source RTP Streams as specified in" | ||||
(perhaps "... the specified number of ..." or "... the appropriate | ||||
number of ..."?). | ||||
Original: | ||||
* If simulcast has been negotiated, send the number of Source RTP | ||||
Streams as specified in [I-D.ietf-mmusic-sdp-simulcast], | ||||
Section 6.2.2. --> | ||||
</li> | ||||
<li>If the send media format chosen above has a | ||||
corresponding "rtx" media format or a FEC mechanism has | ||||
been negotiated, establish a redundancy RTP stream with a | ||||
random SSRC for each Source RTP Stream, and start or | ||||
continue transmitting RTX/FEC packets as needed.</li> | ||||
<li>If the send media format chosen above has a | ||||
corresponding "red" media format of the same clock rate, | ||||
allow redundant encoding using the specified format for | ||||
resiliency purposes, as discussed in | ||||
<xref target="RFC8854" sectionFormat="comma" section="3.2"/>. Note | ||||
that unlike RTX or FEC media formats, the "red" format is | ||||
transmitted on the Source RTP Stream, not the redundancy | ||||
RTP stream.</li> | ||||
<li>Enable the RTCP feedback mechanisms referenced in the | ||||
media section for all Source RTP Streams using the | ||||
specified media formats. Specifically, begin or continue | ||||
sending the requested feedback types and reacting to | ||||
received feedback, as specified in | ||||
<xref target="RFC4585" sectionFormat="comma" section="4.2"/>. When | ||||
sending RTCP | ||||
feedback, follow the rules and recommendations from | ||||
<xref target="RFC8108" sectionFormat="comma" section="5.4.1"/> to select | ||||
which SSRC to use.</li> | ||||
<li>If the directional attribute in the answer indicates | ||||
that the JSEP implementation should not be sending media | ||||
("recvonly" for local answers, "sendonly" for remote | ||||
answers, or "inactive" for either type of answer), stop | ||||
transmitting all RTP media, but continue sending RTCP, as | ||||
described in | ||||
<xref target="RFC3264" sectionFormat="comma" section="5.1"/>.</li> | ||||
</ul> | ||||
</li> | ||||
<li> | ||||
<t>If the "m=" section proto value indicates use of SCTP: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>If an SCTP association exists and the remote SCTP port | ||||
has changed, discard the existing SCTP association. This | ||||
includes the case when the PeerConnection state is | ||||
"have-remote-pranswer".</li> | ||||
<li>If no valid SCTP association exists, prepare to initiate | ||||
an SCTP association over the associated ICE component and | ||||
DTLS connection, using the local SCTP port value from the | ||||
local description and the remote SCTP port value from the | ||||
remote description, as described in | ||||
<xref target="RFC8841" sectionFormat="comma" section="10.2"/>.</li | ||||
> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
<t>If the answer contains valid bundle groups, discard any ICE | ||||
components for the "m=" sections that will be bundled onto the | ||||
primary ICE components in each bundle, and begin muxing these | ||||
"m=" sections accordingly, as described in | ||||
<xref target="RFC8843" sectionFormat="comma" section="7.2"/>.</t> | ||||
<t>If the description is of type "answer" and there are still | ||||
remaining candidates in the ICE candidate pool, discard | ||||
them.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="sec.rtp.demux" numbered="true" toc="default"> | ||||
<name>Processing RTP/RTCP</name> | ||||
<t>When bundling, associating incoming RTP/RTCP with the proper | ||||
"m=" section is defined in | ||||
<xref target="RFC8843" 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> | ||||
<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 | ||||
further processing of the RTP/RTCP is done at the RtpTransceiver | ||||
level. This includes using RID | ||||
<xref target="RFC8851" format="default"/> to distinguish between | ||||
multiple encoded streams, as well as to determine which Source RTP | ||||
stream should be repaired by a given redundancy RTP stream.</t> | ||||
</section> | ||||
<section anchor="sec.examples" numbered="true" toc="default"> | ||||
<name>Examples</name> | ||||
<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 | ||||
into multiple lines, where leading whitespace indicates that a | ||||
line is a continuation of the previous line. In addition, some | ||||
blank lines have been added to improve readability but are not | ||||
valid in SDP.</t> | ||||
<t>More examples of SDP for WebRTC call flows, including examples | ||||
with IPv6 addresses, can be found in | ||||
<xref target="I-D.ietf-rtcweb-sdp" format="default"/>.</t> | ||||
<section anchor="sec.simple-examples" numbered="true" toc="default"> | ||||
<name>Simple Example</name> | ||||
<t>This section shows a very simple example that sets up a | ||||
minimal audio/video call between two JSEP endpoints without | ||||
using Trickle ICE. The example in the following section | ||||
provides a more detailed example of what could happen in a JSEP | ||||
session.</t> | ||||
<t>The code flow below shows Alice's endpoint initiating the | ||||
session to Bob's endpoint. The messages from the JavaScript | ||||
application in Alice's browser to the JavaScript in Bob's | ||||
browser, abbreviated as "AliceJS" and "BobJS", respectively, are | ||||
assumed to flow over some signaling protocol via a web server. | ||||
The JavaScript on both Alice's side and Bob's side waits for | ||||
all candidates before sending the offer or answer, so the | ||||
offers and answers are complete; Trickle ICE is not used. The | ||||
user agents (JSEP implementations) in Alice's and Bob's browsers, | ||||
abbreviated as "AliceUA" and "BobUA", respectively, are using the | ||||
default bundle policy of "balanced", and the default RTCP mux | ||||
policy of "require". | ||||
<!-- [rfced] Section 7.1: We had trouble following the meaning of | ||||
this sentence. If the suggested text is not correct, please clarify. | ||||
Original: | ||||
The user agents (JSEP implementations) in Alice and Bob's | ||||
browsers, abbreviated as AliceUA and BobUA respectively, are using | ||||
the default bundle policy of "balanced", and the default RTCP mux | ||||
policy of "require". | ||||
Suggested: | ||||
The user agents (JSEP implementations) in Alice's and Bob's | ||||
browsers, abbreviated as "AliceUA" and "BobUA", respectively, are | ||||
using the default bundle policy of "balanced" (AliceUA) and the | ||||
default RTCP mux policy of "require" (BobUA). --> | ||||
</t> | ||||
<!-- [rfced] Throughout: <artwork> has been converted to <sourcecode> as | ||||
applicable and we set the "type" attribute. Please review and let us know | ||||
corrections are needed. | ||||
--> | ||||
<sourcecode name="" type="pseudocode"><![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 two tracks: audio and video | AliceJS->AliceUA: addTrack with two tracks: audio and video | |||
AliceJS->AliceUA: createOffer to get offer | AliceJS->AliceUA: createOffer to get offer | |||
AliceJS->AliceUA: setLocalDescription with offer | AliceJS->AliceUA: setLocalDescription with offer | |||
AliceUA->AliceJS: multiple onicecandidate events with candidates | AliceUA->AliceJS: multiple onicecandidate events with candidates | |||
// wait for ICE gathering to complete | // wait for ICE gathering to complete | |||
AliceUA->AliceJS: onicecandidate event with null candidate | AliceUA->AliceJS: onicecandidate event with null candidate | |||
AliceJS->AliceUA: get |offer-A1| from pendingLocalDescription | AliceJS->AliceUA: get |offer-A1| from pendingLocalDescription | |||
skipping to change at line 3669 ¶ | skipping to change at line 4718 ¶ | |||
// Bob accepts call | // Bob accepts call | |||
BobJS->BobUA: addTrack with local tracks | BobJS->BobUA: addTrack with local tracks | |||
BobJS->BobUA: createAnswer | BobJS->BobUA: createAnswer | |||
BobJS->BobUA: setLocalDescription with answer | BobJS->BobUA: setLocalDescription with answer | |||
BobUA->BobJS: multiple onicecandidate events with candidates | BobUA->BobJS: multiple onicecandidate events with candidates | |||
// wait for ICE gathering to complete | // wait for ICE gathering to complete | |||
BobUA->BobJS: onicecandidate event with null candidate | BobUA->BobJS: onicecandidate event with null candidate | |||
BobJS->BobUA: get |answer-A1| from currentLocalDescription | BobJS->BobUA: get |answer-A1| from currentLocalDescription | |||
// |answer-A1| is sent over signaling protocol to Alice | // |answer-A1| is sent over signaling protocol | |||
// to Alice | ||||
BobJS->WebServer: signaling with |answer-A1| | BobJS->WebServer: signaling with |answer-A1| | |||
WebServer->AliceJS: signaling with |answer-A1| | WebServer->AliceJS: signaling with |answer-A1| | |||
// |answer-A1| arrives at Alice | // |answer-A1| arrives at Alice | |||
AliceJS->AliceUA: setRemoteDescription with |answer-A1| | AliceJS->AliceUA: setRemoteDescription with |answer-A1| | |||
AliceUA->AliceJS: ontrack events for audio and video tracks | AliceUA->AliceJS: ontrack events for audio and video tracks | |||
// media flows | // media flows | |||
BobUA->AliceUA: media sent from Bob to Alice | BobUA->AliceUA: media sent from Bob to Alice | |||
AliceUA->BobUA: media sent from Alice to Bob ]]></sourcecode> | AliceUA->BobUA: media sent from Alice to Bob ]]></sourcecode> | |||
<t>The SDP for |offer-A1| looks like:</t> | ||||
<sourcecode name="offer-A1" type="sdp"><![CDATA[ | <t>The SDP for |offer-A1| looks like:</t> | |||
<sourcecode name="offer-A1" type="sdp"><![CDATA[ | ||||
v=0 | v=0 | |||
o=- 4962303333179871722 1 IN IP4 0.0.0.0 | o=- 4962303333179871722 1 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 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 10100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 10100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 203.0.113.100 | c=IN IP4 203.0.113.100 | |||
skipping to change at line 3749 ¶ | skipping to change at line 4800 ¶ | |||
19:E2:1C:3B:4B:9F:81:E6:B8:5C:F4:A5:A8:D8:73:04: | 19:E2:1C:3B:4B:9F:81:E6:B8:5C:F4:A5:A8:D8:73:04: | |||
BB:05:2F:70:9F:04:A9:0E:05:E9:26:33:E8:70:88:A2 | BB:05:2F:70:9F:04:A9:0E:05:E9:26:33:E8:70:88:A2 | |||
a=setup:actpass | a=setup:actpass | |||
a=tls-id:91bbf309c0990a6bec11e38ba2933cee | a=tls-id:91bbf309c0990a6bec11e38ba2933cee | |||
a=rtcp:10103 IN IP4 203.0.113.100 | a=rtcp:10103 IN IP4 203.0.113.100 | |||
a=rtcp-mux | a=rtcp-mux | |||
a=rtcp-rsize | a=rtcp-rsize | |||
a=candidate:1 1 udp 2113929471 203.0.113.100 10102 typ host | a=candidate:1 1 udp 2113929471 203.0.113.100 10102 typ host | |||
a=candidate:1 2 udp 2113929470 203.0.113.100 10103 typ host | a=candidate:1 2 udp 2113929470 203.0.113.100 10103 typ host | |||
a=end-of-candidates ]]></sourcecode> | a=end-of-candidates ]]></sourcecode> | |||
<t>The SDP for |answer-A1| looks like:</t> | ||||
<sourcecode name="answer-A1" type="sdp"><![CDATA[ | <!-- [rfced] Sections 7.1, 7.2, and 7.3: Please confirm that the | |||
"=" signs in these ten "=rtpmap:103" entries do not need to be | ||||
preceded by an "a" line identifier. We ask because these are the | ||||
only "=rtpmap:" SDP lines that begin with "=" instead of "a=". | ||||
Example from original: | ||||
=rtpmap:103 rtx/90000 --> | ||||
<t>The SDP for |answer-A1| looks like:</t> | ||||
<sourcecode name="answer-A1" type="sdp"><![CDATA[ | ||||
v=0 | v=0 | |||
o=- 6729291447651054566 1 IN IP4 0.0.0.0 | o=- 6729291447651054566 1 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 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 10200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 10200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 203.0.113.200 | c=IN IP4 203.0.113.200 | |||
skipping to change at line 3803 ¶ | skipping to change at line 4863 ¶ | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | =rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
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:61317484-2ed4-49d7-9eb7-1414322a7aae ]]></sourcecode> | a=msid:61317484-2ed4-49d7-9eb7-1414322a7aae ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="sec.detailed-example" numbered="true" toc="default"> | <section anchor="sec.detailed-example" numbered="true" toc="default"> | |||
<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 "max-bundle", an RTCP mux policy | mode, with a bundle policy of "max-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 | |||
screensharing, both supporting FEC, and 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> | |||
<sourcecode name="" type="pseudocode"><![CDATA[ | <sourcecode name="" type="pseudocode"><![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| | |||
// |offer-B1| is sent over signaling protocol to Bob | // |offer-B1| is sent over signaling protocol to Bob | |||
AliceJS->WebServer: signaling with |offer-B1| | AliceJS->WebServer: signaling with |offer-B1| | |||
WebServer->BobJS: signaling with |offer-B1| | WebServer->BobJS: signaling with |offer-B1| | |||
// |offer-B1| arrives at Bob | // |offer-B1| arrives at Bob | |||
BobJS->BobUA: create a PeerConnection | BobJS->BobUA: create a PeerConnection | |||
BobJS->BobUA: setRemoteDescription with |offer-B1| | BobJS->BobUA: setRemoteDescription with |offer-B1| | |||
BobUA->BobJS: ontrack with audio track from Alice | BobUA->BobJS: ontrack event with audio track from Alice | |||
// candidates are sent to Bob | // candidates are sent to Bob | |||
AliceUA->AliceJS: onicecandidate (host) |offer-B1-candidate-1| | AliceUA->AliceJS: onicecandidate (host) |offer-B1-candidate-1| | |||
AliceJS->WebServer: signaling with |offer-B1-candidate-1| | AliceJS->WebServer: signaling with |offer-B1-candidate-1| | |||
AliceUA->AliceJS: onicecandidate (srflx) |offer-B1-candidate-2| | AliceUA->AliceJS: onicecandidate (srflx) |offer-B1-candidate-2| | |||
AliceJS->WebServer: signaling with |offer-B1-candidate-2| | AliceJS->WebServer: signaling with |offer-B1-candidate-2| | |||
AliceUA->AliceJS: onicecandidate (relay) |offer-B1-candidate-3| | AliceUA->AliceJS: onicecandidate (relay) |offer-B1-candidate-3| | |||
AliceJS->WebServer: signaling with |offer-B1-candidate-3| | AliceJS->WebServer: signaling with |offer-B1-candidate-3| | |||
WebServer->BobJS: signaling with |offer-B1-candidate-1| | WebServer->BobJS: signaling with |offer-B1-candidate-1| | |||
skipping to change at line 3887 ¶ | skipping to change at line 4947 ¶ | |||
// data channel opens | // data channel opens | |||
BobUA->BobJS: ondatachannel event | BobUA->BobJS: ondatachannel event | |||
AliceUA->AliceJS: ondatachannel event | AliceUA->AliceJS: ondatachannel event | |||
BobUA->BobJS: onopen | BobUA->BobJS: onopen | |||
AliceUA->AliceJS: onopen | AliceUA->AliceJS: onopen | |||
// media is flowing between endpoints | // media is flowing between endpoints | |||
BobUA->AliceUA: audio+data sent from Bob to Alice | BobUA->AliceUA: audio+data sent from Bob to Alice | |||
AliceUA->BobUA: audio+data sent from Alice to Bob | AliceUA->BobUA: audio+data sent from Alice to Bob | |||
// some time later Bob adds two video streams | // some time later, Bob adds two video streams | |||
// note, no candidates exchanged, because of bundle | // note: no candidates exchanged, because of bundle | |||
BobJS->BobUA: addTrack with first video stream | BobJS->BobUA: addTrack with first video stream | |||
BobJS->BobUA: addTrack with second video stream | BobJS->BobUA: addTrack with second video stream | |||
BobJS->BobUA: createOffer to get |offer-B2| | BobJS->BobUA: createOffer to get |offer-B2| | |||
BobJS->BobUA: setLocalDescription with |offer-B2| | BobJS->BobUA: setLocalDescription with |offer-B2| | |||
// |offer-B2| is sent to Alice | // |offer-B2| is sent to Alice | |||
BobJS->WebServer: signaling with |offer-B2| | BobJS->WebServer: signaling with |offer-B2| | |||
WebServer->AliceJS: signaling with |offer-B2| | WebServer->AliceJS: signaling with |offer-B2| | |||
AliceJS->AliceUA: setRemoteDescription with |offer-B2| | AliceJS->AliceUA: setRemoteDescription with |offer-B2| | |||
AliceUA->AliceJS: ontrack event with first video track | AliceUA->AliceJS: ontrack event with first video track | |||
AliceUA->AliceJS: ontrack event with second video track | AliceUA->AliceJS: ontrack event with second video track | |||
AliceJS->AliceUA: createAnswer to get |answer-B2| | AliceJS->AliceUA: createAnswer to get |answer-B2| | |||
AliceJS->AliceUA: setLocalDescription with |answer-B2| | AliceJS->AliceUA: setLocalDescription with |answer-B2| | |||
// |answer-B2| is sent over signaling protocol to Bob | // |answer-B2| is sent over signaling protocol | |||
// to Bob | ||||
AliceJS->WebServer: signaling with |answer-B2| | AliceJS->WebServer: signaling with |answer-B2| | |||
WebServer->BobJS: signaling with |answer-B2| | WebServer->BobJS: signaling with |answer-B2| | |||
BobJS->BobUA: setRemoteDescription with |answer-B2| | BobJS->BobUA: setRemoteDescription with |answer-B2| | |||
// media is flowing between endpoints | // media is flowing between endpoints | |||
BobUA->AliceUA: audio+video+data sent from Bob to Alice | BobUA->AliceUA: audio+video+data sent from Bob to Alice | |||
AliceUA->BobUA: audio+video+data sent from Alice to Bob ]]></sourcecode> | AliceUA->BobUA: audio+video+data sent from Alice to Bob ]]></sourcecode> | |||
<t>The SDP for |offer-B1| looks like:</t> | ||||
<sourcecode name="offer-B1" type="sdp"><![CDATA[ | <!-- [rfced] Section 7.2: We changed "ontrack with" to "ontrack event | |||
with" per the other three "ontrack event with" items. Please let us | ||||
know if this is incorrect. | ||||
Original: | ||||
BobUA->BobJS: ontrack with audio track from Alice | ||||
Currently: | ||||
BobUA->BobJS: ontrack event with audio track from Alice --> | ||||
<t>The SDP for |offer-B1| looks like:</t> | ||||
<sourcecode name="offer-B1" type="sdp"><![CDATA[ | ||||
v=0 | v=0 | |||
o=- 4962303333179871723 1 IN IP4 0.0.0.0 | o=- 4962303333179871723 1 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 | a=group:BUNDLE a1 d1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:a1 | a=mid:a1 | |||
skipping to change at line 3952 ¶ | skipping to change at line 5024 ¶ | |||
a=rtcp-mux | a=rtcp-mux | |||
a=rtcp-mux-only | a=rtcp-mux-only | |||
a=rtcp-rsize | a=rtcp-rsize | |||
m=application 0 UDP/DTLS/SCTP webrtc-datachannel | m=application 0 UDP/DTLS/SCTP webrtc-datachannel | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:d1 | a=mid:d1 | |||
a=sctp-port:5000 | a=sctp-port:5000 | |||
a=max-message-size:65536 | a=max-message-size:65536 | |||
a=bundle-only ]]></sourcecode> | a=bundle-only ]]></sourcecode> | |||
<t>|offer-B1-candidate-1| looks like:</t> | ||||
<sourcecode name="offer-B1-candidate-1" type="sdp"><![CDATA[ | <t>|offer-B1-candidate-1| looks like:</t> | |||
<sourcecode name="offer-B1-candidate-1" type="sdp"><![CDATA[ | ||||
ufrag ATEn | ufrag ATEn | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 2113929471 203.0.113.100 10100 typ host ]]></sourcecode> | attr candidate:1 1 udp 2113929471 203.0.113.100 10100 typ host ]]></sourcecode> | |||
<t>|offer-B1-candidate-2| looks like:</t> | <t>|offer-B1-candidate-2| looks like:</t> | |||
<sourcecode name="offer-B1-candidate-2" type="sdp"><![CDATA[ | <sourcecode name="offer-B1-candidate-2" type="sdp"><![CDATA[ | |||
ufrag ATEn | ufrag ATEn | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 1845494015 198.51.100.100 11100 typ srflx | attr candidate:1 1 udp 1845494015 198.51.100.100 11100 typ srflx | |||
raddr 203.0.113.100 rport 10100 ]]></sourcecode> | raddr 203.0.113.100 rport 10100 ]]></sourcecode> | |||
<t>|offer-B1-candidate-3| looks like:</t> | <t>|offer-B1-candidate-3| looks like:</t> | |||
<sourcecode name="offer-B1-candidate-3" type="sdp"><![CDATA[ | <sourcecode name="offer-B1-candidate-3" type="sdp"><![CDATA[ | |||
ufrag ATEn | ufrag ATEn | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 255 192.0.2.100 12100 typ relay | attr candidate:1 1 udp 255 192.0.2.100 12100 typ relay | |||
raddr 198.51.100.100 rport 11100 ]]></sourcecode> | raddr 198.51.100.100 rport 11100 ]]></sourcecode> | |||
<t>The SDP for |answer-B1| looks like:</t> | <t>The SDP for |answer-B1| looks like:</t> | |||
<sourcecode name="answer-B1" type="sdp"><![CDATA[ | <sourcecode name="answer-B1" type="sdp"><![CDATA[ | |||
v=0 | v=0 | |||
o=- 7729291447651054566 1 IN IP4 0.0.0.0 | o=- 7729291447651054566 1 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 | a=group:BUNDLE a1 d1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:a1 | a=mid:a1 | |||
skipping to change at line 4013 ¶ | skipping to change at line 5086 ¶ | |||
a=tls-id:7a25ab85b195acaf3121f5a8ab4f0f71 | a=tls-id:7a25ab85b195acaf3121f5a8ab4f0f71 | |||
a=rtcp-mux | a=rtcp-mux | |||
a=rtcp-mux-only | a=rtcp-mux-only | |||
a=rtcp-rsize | a=rtcp-rsize | |||
m=application 9 UDP/DTLS/SCTP webrtc-datachannel | m=application 9 UDP/DTLS/SCTP webrtc-datachannel | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:d1 | a=mid:d1 | |||
a=sctp-port:5000 | a=sctp-port:5000 | |||
a=max-message-size:65536 ]]></sourcecode> | a=max-message-size:65536 ]]></sourcecode> | |||
<t>|answer-B1-candidate-1| looks like:</t> | ||||
<sourcecode name="answer-B1-candidate-1" type="sdp"><![CDATA[ | <t>|answer-B1-candidate-1| looks like:</t> | |||
<sourcecode name="answer-B1-candidate-1" type="sdp"><![CDATA[ | ||||
ufrag 7sFv | ufrag 7sFv | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 2113929471 203.0.113.200 10200 typ host ]]></sourcecode> | attr candidate:1 1 udp 2113929471 203.0.113.200 10200 typ host ]]></sourcecode> | |||
<t>|answer-B1-candidate-2| looks like:</t> | <t>|answer-B1-candidate-2| looks like:</t> | |||
<sourcecode name="answer-B1-candidate-2" type="sdp"><![CDATA[ | <sourcecode name="answer-B1-candidate-2" type="sdp"><![CDATA[ | |||
ufrag 7sFv | ufrag 7sFv | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 1845494015 198.51.100.200 11200 typ srflx | attr candidate:1 1 udp 1845494015 198.51.100.200 11200 typ srflx | |||
raddr 203.0.113.200 rport 10200 ]]></sourcecode> | raddr 203.0.113.200 rport 10200 ]]></sourcecode> | |||
<t>|answer-B1-candidate-3| looks like:</t> | <t>|answer-B1-candidate-3| looks like:</t> | |||
<sourcecode name="answer-B1-candidate-3" type="sdp"><![CDATA[ | <sourcecode name="answer-B1-candidate-3" type="sdp"><![CDATA[ | |||
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 | |||
c=IN IP4 192.0.2.200 | c=IN IP4 192.0.2.200 | |||
skipping to change at line 4128 ¶ | skipping to change at line 5202 ¶ | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | =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 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 | |||
m=audio 12100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 12100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 192.0.2.100 | c=IN IP4 192.0.2.100 | |||
skipping to change at line 4215 ¶ | skipping to change at line 5289 ¶ | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | =rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=imageattr:100 recv [x=[48:1920],y=[48:1080],q=1.0] | a=imageattr:100 recv [x=[48:1920],y=[48:1080],q=1.0] | |||
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 ]]></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, A | <xref target="sec.use-of-provisional-answer" format="default"/>. Here, | |||
lice's | 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 | |||
transmitted immediately by the callee immediately upon | transmitted by the callee immediately upon | |||
answering the call, minimizing perceived post-dial-delay. The | answering the call, minimizing perceived post-dial delay. The | |||
second offer/answer exchange can also change the preferred | second offer/answer exchange can also change the preferred | |||
codecs or other session parameters.</t> | codecs or other session parameters.</t> | |||
<t>This example also makes use of the "relay" ICE candidate | <t>This example also makes use of the "relay" ICE candidate | |||
policy described in | policy described in | |||
<xref target="sec.ice-candidate-policy" format="default"/> to minimize t | <xref target="sec.ice-candidate-policy" format="default"/> to minimize | |||
he ICE | the ICE | |||
gathering and checking needed.</t> | gathering and checking needed.</t> | |||
<sourcecode name="" type="pseudocode"><![CDATA[ | <sourcecode name="" type="pseudocode"><![CDATA[ | |||
// set up local media state | // set up local media state | |||
AliceJS->AliceUA: create new PeerConnection with "relay" ICE policy | AliceJS->AliceUA: create new PeerConnection with "relay" ICE policy | |||
AliceJS->AliceUA: addTrack with two tracks: audio and video | AliceJS->AliceUA: addTrack with two tracks: audio and video | |||
AliceJS->AliceUA: createOffer to get |offer-C1| | AliceJS->AliceUA: createOffer to get |offer-C1| | |||
AliceJS->AliceUA: setLocalDescription with |offer-C1| | AliceJS->AliceUA: setLocalDescription with |offer-C1| | |||
// |offer-C1| is sent over signaling protocol to Bob | // |offer-C1| is sent over signaling protocol to Bob | |||
AliceJS->WebServer: signaling with |offer-C1| | AliceJS->WebServer: signaling with |offer-C1| | |||
WebServer->BobJS: signaling with |offer-C1| | WebServer->BobJS: signaling with |offer-C1| | |||
skipping to change at line 4266 ¶ | skipping to change at line 5340 ¶ | |||
BobJS->BobUA: setRemoteDescription with |offer-C1| | BobJS->BobUA: setRemoteDescription with |offer-C1| | |||
BobUA->BobJS: ontrack events for audio and video | BobUA->BobJS: ontrack events for audio and video | |||
// a relay candidate is sent to Bob | // a relay candidate is sent to Bob | |||
AliceUA->AliceJS: onicecandidate (relay) |offer-C1-candidate-1| | AliceUA->AliceJS: onicecandidate (relay) |offer-C1-candidate-1| | |||
AliceJS->WebServer: signaling with |offer-C1-candidate-1| | AliceJS->WebServer: signaling with |offer-C1-candidate-1| | |||
WebServer->BobJS: signaling with |offer-C1-candidate-1| | WebServer->BobJS: signaling with |offer-C1-candidate-1| | |||
BobJS->BobUA: addIceCandidate with |offer-C1-candidate-1| | BobJS->BobUA: addIceCandidate with |offer-C1-candidate-1| | |||
// Bob prepares an early answer to warmup the transport | // Bob prepares an early answer to warm up the | |||
// transport | ||||
BobJS->BobUA: addTransceiver with null audio and video tracks | BobJS->BobUA: addTransceiver with null audio and video tracks | |||
BobJS->BobUA: transceiver.setDirection(sendonly) for both | BobJS->BobUA: transceiver.setDirection(sendonly) for both | |||
BobJS->BobUA: createAnswer | BobJS->BobUA: createAnswer | |||
BobJS->BobUA: setLocalDescription with answer | BobJS->BobUA: setLocalDescription with answer | |||
// |answer-C1| is sent over signaling protocol to Alice | // |answer-C1| is sent over signaling protocol | |||
// to Alice | ||||
BobJS->WebServer: signaling with |answer-C1| | BobJS->WebServer: signaling with |answer-C1| | |||
WebServer->AliceJS: signaling with |answer-C1| | WebServer->AliceJS: signaling with |answer-C1| | |||
// |answer-C1| (sendonly) arrives at Alice | // |answer-C1| (sendonly) arrives at Alice | |||
AliceJS->AliceUA: setRemoteDescription with |answer-C1| | AliceJS->AliceUA: setRemoteDescription with |answer-C1| | |||
AliceUA->AliceJS: ontrack events for audio and video | AliceUA->AliceJS: ontrack events for audio and video | |||
// a relay candidate is sent to Alice | // a relay candidate is sent to Alice | |||
BobUA->BobJS: onicecandidate (relay) |answer-B1-candidate-1| | BobUA->BobJS: onicecandidate (relay) |answer-B1-candidate-1| | |||
BobJS->WebServer: signaling with |answer-B1-candidate-1| | BobJS->WebServer: signaling with |answer-B1-candidate-1| | |||
WebServer->AliceJS: signaling with |answer-B1-candidate-1| | WebServer->AliceJS: signaling with |answer-B1-candidate-1| | |||
AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-1| | AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-1| | |||
// ICE and DTLS establish while call is ringing | // ICE and DTLS establish while call is ringing | |||
// Bob accepts call, starts media, and sends new offer | // Bob accepts call, starts media, and sends | |||
// new offer | ||||
BobJS->BobUA: transceiver.setTrack with audio and video tracks | BobJS->BobUA: transceiver.setTrack with audio and video tracks | |||
BobUA->AliceUA: media sent from Bob to Alice | BobUA->AliceUA: media sent from Bob to Alice | |||
BobJS->BobUA: transceiver.setDirection(sendrecv) for both | BobJS->BobUA: transceiver.setDirection(sendrecv) for both | |||
transceivers | transceivers | |||
BobJS->BobUA: createOffer | BobJS->BobUA: createOffer | |||
BobJS->BobUA: setLocalDescription with offer | BobJS->BobUA: setLocalDescription with offer | |||
// |offer-C2| is sent over signaling protocol to Alice | // |offer-C2| is sent over signaling protocol | |||
// to Alice | ||||
BobJS->WebServer: signaling with |offer-C2| | BobJS->WebServer: signaling with |offer-C2| | |||
WebServer->AliceJS: signaling with |offer-C2| | WebServer->AliceJS: signaling with |offer-C2| | |||
// |offer-C2| (sendrecv) arrives at Alice | // |offer-C2| (sendrecv) arrives at Alice | |||
AliceJS->AliceUA: setRemoteDescription with |offer-C2| | AliceJS->AliceUA: setRemoteDescription with |offer-C2| | |||
AliceJS->AliceUA: createAnswer | AliceJS->AliceUA: createAnswer | |||
AliceJS->AliceUA: setLocalDescription with |answer-C2| | AliceJS->AliceUA: setLocalDescription with |answer-C2| | |||
AliceUA->BobUA: media sent from Alice to Bob | AliceUA->BobUA: media sent from Alice to Bob | |||
// |answer-C2| is sent over signaling protocol to Bob | // |answer-C2| is sent over signaling protocol | |||
// to Bob | ||||
AliceJS->WebServer: signaling with |answer-C2| | AliceJS->WebServer: signaling with |answer-C2| | |||
WebServer->BobJS: signaling with |answer-C2| | WebServer->BobJS: signaling with |answer-C2| | |||
BobJS->BobUA: setRemoteDescription with |answer-C2| ]]></sourcecode> | BobJS->BobUA: setRemoteDescription with |answer-C2| ]]></sourcecode> | |||
<t>The SDP for |offer-C1| looks like:</t> | <t>The SDP for |offer-C1| looks like:</t> | |||
<sourcecode name="offer-C1" type="sdp"><![CDATA[ | <sourcecode name="offer-C1" type="sdp"><![CDATA[ | |||
v=0 | v=0 | |||
o=- 1070771854436052752 1 IN IP4 0.0.0.0 | o=- 1070771854436052752 1 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 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
skipping to change at line 4365 ¶ | skipping to change at line 5444 ¶ | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | =rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
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:bbce3ba6-abfc-ac63-d00a-e15b286f8fce | a=msid:bbce3ba6-abfc-ac63-d00a-e15b286f8fce | |||
a=bundle-only ]]></sourcecode> | a=bundle-only ]]></sourcecode> | |||
<t>|offer-C1-candidate-1| looks like:</t> | <t>|offer-C1-candidate-1| looks like:</t> | |||
<sourcecode name="offer-C1-candidate-1" type="sdp"><![CDATA[ | <sourcecode name="offer-C1-candidate-1" type="sdp"><![CDATA[ | |||
ufrag 4ZcD | ufrag 4ZcD | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 255 192.0.2.100 12100 typ relay | attr candidate:1 1 udp 255 192.0.2.100 12100 typ relay | |||
raddr 0.0.0.0 rport 0 ]]></sourcecode> | raddr 0.0.0.0 rport 0 ]]></sourcecode> | |||
<t>The SDP for |answer-C1| looks like:</t> | <t>The SDP for |answer-C1| looks like:</t> | |||
<sourcecode name="answer-C1" type="sdp"><![CDATA[ | <sourcecode name="answer-C1" type="sdp"><![CDATA[ | |||
v=0 | v=0 | |||
o=- 6386516489780559513 1 IN IP4 0.0.0.0 | o=- 6386516489780559513 1 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 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
skipping to change at line 4425 ¶ | skipping to change at line 5504 ¶ | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | =rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
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:751f239e-4ae0-c549-aa3d-890de772998b ]]></sourcecode> | a=msid:751f239e-4ae0-c549-aa3d-890de772998b ]]></sourcecode> | |||
<t>|answer-C1-candidate-1| looks like:</t> | <t>|answer-C1-candidate-1| looks like:</t> | |||
<sourcecode name="answer-C1-candidate-1" type="sdp"><![CDATA[ | <sourcecode name="answer-C1-candidate-1" type="sdp"><![CDATA[ | |||
ufrag TpaA | ufrag TpaA | |||
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 0.0.0.0 rport 0 ]]></sourcecode> | raddr 0.0.0.0 rport 0 ]]></sourcecode> | |||
<t>The SDP for |offer-C2| looks like:</t> | <t>The SDP for |offer-C2| looks like:</t> | |||
<sourcecode name="offer-C2" type="sdp"><![CDATA[ | <sourcecode name="offer-C2" type="sdp"><![CDATA[ | |||
v=0 | v=0 | |||
o=- 6386516489780559513 2 IN IP4 0.0.0.0 | o=- 6386516489780559513 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 v1 | a=group:BUNDLE a1 v1 | |||
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 | |||
c=IN IP4 192.0.2.200 | c=IN IP4 192.0.2.200 | |||
skipping to change at line 4488 ¶ | skipping to change at line 5567 ¶ | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | =rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
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:751f239e-4ae0-c549-aa3d-890de772998b ]]></sourcecode> | a=msid:751f239e-4ae0-c549-aa3d-890de772998b ]]></sourcecode> | |||
<t>The SDP for |answer-C2| looks like:</t> | <t>The SDP for |answer-C2| looks like:</t> | |||
<sourcecode name="answer-C2" type="sdp"><![CDATA[ | <sourcecode name="answer-C2" type="sdp"><![CDATA[ | |||
v=0 | v=0 | |||
o=- 1070771854436052752 2 IN IP4 0.0.0.0 | o=- 1070771854436052752 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 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 12100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 12100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 192.0.2.100 | c=IN IP4 192.0.2.100 | |||
skipping to change at line 4544 ¶ | skipping to change at line 5623 ¶ | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | =rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
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:bbce3ba6-abfc-ac63-d00a-e15b286f8fce ]]></sourcecode> | a=msid:bbce3ba6-abfc-ac63-d00a-e15b286f8fce ]]></sourcecode> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.security-considerations" numbered="true" toc="default"> | <section anchor="sec.security-considerations" numbered="true" toc="defaul | |||
<name>Security Considerations</name> | t"> | |||
<t>The IETF has published separate documents | <name>Security Considerations</name> | |||
<xref target="RFCYYY2" format="default"/> | <t>The IETF has published separate documents | |||
<xref target="RFCYYY1" format="default"/> describing the security | <xref target="RFC8827" format="default"/> | |||
architecture for WebRTC as a whole. The remainder of this section | <xref target="RFC8826" format="default"/> describing the security | |||
describes security considerations for this document.</t> | architecture for WebRTC as a whole. The remainder of this section | |||
<t>While formally the JSEP interface is an API, it is better to | describes security considerations for this document.</t> | |||
think of it as an Internet protocol, with the application | <t>While formally the JSEP interface is an API, it is better to | |||
JavaScript being untrustworthy from the perspective of the JSEP | think of it as an Internet protocol, with the application | |||
implementation. Thus, the threat model of | JavaScript being untrustworthy from the perspective of the JSEP | |||
<xref target="RFC3552" format="default"/> applies. In particular, JavaScri | implementation. Thus, the threat model of | |||
pt can | <xref target="RFC3552" format="default"/> applies. In particular, JavaSc | |||
call the API in any order and with any inputs, including | ript can | |||
malicious ones. This is particularly relevant when we consider | call the API in any order and with any inputs, including | |||
the SDP which is passed to setLocalDescription(). While correct | malicious ones. This is particularly relevant when we consider | |||
API usage requires that the application pass in SDP which was | the SDP that is passed to setLocalDescription(). While correct | |||
derived from createOffer() or createAnswer(), there is no | API usage requires that the application pass in SDP that was | |||
guarantee that applications do so. The JSEP implementation <bcp14>MUST</bc | derived from createOffer() or createAnswer(), there is no | |||
p14> | guarantee that applications do so. The JSEP implementation <bcp14>MUST</ | |||
be prepared for the JavaScript to pass in bogus data instead.</t> | bcp14> | |||
<t>Conversely, the application programmer needs to be aware that | be prepared for the JavaScript to pass in bogus data instead.</t> | |||
the JavaScript does not have complete control of endpoint | <t>Conversely, the application programmer needs to be aware that | |||
behavior. One case that bears particular mention is that editing | the JavaScript does not have complete control of endpoint | |||
ICE candidates out of the SDP or suppressing trickled candidates | behavior. One case that bears particular mention is that editing | |||
does not have the expected behavior: implementations will still | ICE candidates out of the SDP or suppressing trickled candidates | |||
perform checks from those candidates even if they are not sent to | does not have the expected behavior: implementations will still | |||
the other side. Thus, for instance, it is not possible to prevent | perform checks from those candidates even if they are not sent to | |||
the remote peer from learning your public IP address by removing | the other side. Thus, for instance, it is not possible to prevent | |||
server reflexive candidates. Applications which wish to conceal | the remote peer from learning your public IP address by removing | |||
their public IP address should instead configure the ICE agent to | server-reflexive candidates. Applications that wish to conceal | |||
use only relay candidates.</t> | their public IP address should instead configure the ICE agent to | |||
</section> | use only relay candidates.</t> | |||
<section anchor="sec.iana-considerations" numbered="true" toc="default"> | </section> | |||
<name>IANA Considerations</name> | <section anchor="sec.iana-considerations" numbered="true" toc="default"> | |||
<t>This document requires no actions from IANA.</t> | <name>IANA Considerations</name> | |||
</section> | <t>This document has no IANA actions.</t> | |||
<section anchor="sec.acknowledgements" numbered="true" toc="default"> | </section> | |||
<name>Acknowledgements</name> | </middle> | |||
<t><contact fullname="Harald Alvestrand"/>, <contact fullname="Taylor | <back> | |||
Brandstetter"/>, <contact fullname="Suhas Nandakumar"/>, and | <!-- draft-ietf-rtcweb-sdp ("Publication Requested") --> | |||
<contact fullname="Peter Thatcher"/> provided significant text for this | ||||
draft. <contact fullname="Bernard Aboba"/>, <contact fullname="Adam | ||||
Bergkvist"/>, <contact fullname="Dan Burnett"/>, <contact fullname="Ben | ||||
Campbell"/>, <contact fullname="Alissa Cooper"/>, | ||||
<contact fullname="Richard Ejzak"/>, <contact fullname="Stefan | ||||
HÃ¥kansson"/>, <contact fullname="Ted Hardie"/>, <contact fullname="Christe | ||||
r Holmberg"/> | ||||
<contact fullname="Andrew Hutton"/>, <contact fullname="Randell | ||||
Jesup"/>, <contact fullname="Matthew Kaufman"/>, <contact fullname="Anant | ||||
Narayanan"/>, | ||||
<contact fullname="Adam Roach"/>, <contact fullname="Robert Sparks"/>, | ||||
<contact fullname="Neil Stratford"/>, <contact fullname="Martin | ||||
Thomson"/>, <contact fullname="Sean | ||||
Turner"/>, and <contact fullname="Magnus Westerlund"/> all provided valuab | ||||
le feedback on | ||||
this proposal.</t> | ||||
</section> | ||||
</middle> | ||||
<back> | ||||
<displayreference target="I-D.ietf-rtcweb-sdp" to="SDP4WebRTC"/> | <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> | |||
<!-- draft-ietf-avtext-rid (RFC YYYD) --> | ||||
<reference anchor="RFCYYYD" target="https://www.rfc-editor.org/info/rfcY | ||||
YYD"> | ||||
<front> | ||||
<title>RTP Stream Identifier Source Description (SDES)</title> | ||||
<seriesInfo name="RFC" value="YYYD"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYYD"/> | ||||
<author initials="A.B." surname="Roach" fullname="Adam Roach"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar | ||||
"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="P" surname="Thatcher" fullname="Peter Thatcher"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-ice-trickle (RFC YYY6) --> | <!--draft-ietf-mmusic-trickle-ice-sip-18: 8840 --> | |||
<reference anchor="RFCYYY6" target="https://www.rfc-editor.org/info/rfcY | <reference anchor="RFC8840" target="https://www.rfc-editor.org/info/rf | |||
YY6"> | c8840"> | |||
<front> | <front> | |||
<title>Trickle ICE: Incremental Provisioning of Candidates for the I | <title>A Session Initiation Protocol (SIP) Usage for Incremental | |||
nteractive Connectivity Establishment (ICE) Protocol</title> | Provisioning of Candidates for the Interactive Connectivity | |||
<seriesInfo name="RFC" value="YYY6"/> | Establishment (Trickle ICE)</title> | |||
<seriesInfo name="DOI" value="10.17487/RFCYYY6"/> | ||||
<author initials="E" surname="Ivov" fullname="Emil Ivov"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="E" surname="Rescorla" fullname="Eric Rescorla"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="J" surname="Uberti" fullname="Justin Uberti"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="P" surname="Saint-Andre" fullname="Peter Saint-And | ||||
re"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-dtls-sdp (RFC YYYA) --> | <author initials="E" surname="Ivov" fullname="Emil Ivov"> | |||
<reference anchor="RFCYYYA" target="https://www.rfc-editor.org/info/rfcY | <organization/> | |||
YYA"> | </author> | |||
<front> | <author initials="T" surname="Stach" fullname="Thomas Stach"> | |||
<title>Session Description Protocol (SDP) Offer/Answer Consideration | <organization/> | |||
s for Datagram Transport Layer Security (DTLS) and Transport Layer Security (TLS | </author> | |||
)</title> | <author initials="E" surname="Marocco" fullname="Enrico Marocco"> | |||
<seriesInfo name="RFC" value="YYYA"/> | <organization/> | |||
<seriesInfo name="DOI" value="10.17487/RFCYYYA"/> | </author> | |||
<author initials="C.H." surname="Holmberg" fullname="Christer Holmbe | <author initials="C" surname="Holmberg" fullname="Christer Holmber | |||
rg"> | g"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<author initials="R.S." surname="Shpount" fullname="Roman Shpount"> | <date month="July" year="2018"/> | |||
<organization/> | </front> | |||
</author> | <seriesInfo name="DOI" value="10.17487/RFC8840"/> | |||
<date month="May" year="2020"/> | <seriesInfo name="RFC" value="8840"/> | |||
</front> | </reference> | |||
</reference> | ||||
<!-- draft-ietf-mmusic-ice-sip-sdp (RFC YYY7) --> | <!-- draft-ietf-avtext-rid-09; 8852 --> | |||
<reference anchor="RFCYYY7" target="https://www.rfc-editor.org/info/rfcY | <reference anchor="RFC8852" target="https://www.rfc-editor.org/info/rfc8852"> | |||
YY7"> | <front> | |||
<front> | <title>RTP Stream Identifier Source Description (SDES)</title> | |||
<title>Session Description Protocol (SDP) Offer/Answer Procedures | <author initials="A.B." surname="Roach" fullname="Adam Roach"/> | |||
for Interactive Connectivity Establishment (ICE)</title> | <author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar"/> | |||
<seriesInfo name="RFC" value="YYY7"/> | <author initials="P" surname="Thatcher" fullname="Peter Thatcher"/> | |||
<seriesInfo name="DOI" value="10.17487/RFCYYY7"/> | <date month="July" year="2020"/> | |||
<author initials="M" surname="Petit-Huguenin" fullname="Marc Petit-H | </front> | |||
uguenin"> | <seriesInfo name="DOI" value="10.17487/RFC8852"/> | |||
<organization/> | <seriesInfo name="RFC" value="8852"/> | |||
</author> | </reference> | |||
<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="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-msid (RFC YYY4) --> | <!-- draft-ietf-ice-trickle: RFC 8838 --> | |||
<reference anchor="RFCYYY4" target="https://www.rfc-editor.org/info/rfcY | <reference anchor="RFC8838" target="https://www.rfc-editor.org/info/rfc8838"> | |||
YY4"> | <front> | |||
<front> | <title>Trickle ICE: Incremental Provisioning of Candidates for the | |||
<title>WebRTC MediaStream Identification in the Session | Interactive Connectivity Establishment (ICE) Protocol</title> | |||
Description Protocol</title> | ||||
<seriesInfo name="RFC" value="YYY4"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYY4"/> | ||||
<author initials="H. T." surname="Alvestrand" fullname="Harald Alves | ||||
trand"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-mux-exclusive (RFC YYYG) --> | <author initials="E" surname="Ivov" fullname="Emil Ivov"> | |||
<reference anchor="RFCYYYG" target="https://www.rfc-editor.org/info/rfcY | <organization /> | |||
YYG"> | </author> | |||
<front> | ||||
<title>Indicating Exclusive Support of RTP/RTCP Multiplexing Using | ||||
the Session Description Protocol (SDP)</title> | ||||
<seriesInfo name="RFC" value="YYYG"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYYG"/> | ||||
<author initials="C" surname="Holmberg" fullname="Christer Holmberg" | ||||
> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-rid (RFC YYYC) --> | <author initials="J" surname="Uberti" fullname="Justin Uberti"> | |||
<reference anchor="RFCYYYC" target="https://www.rfc-editor.org/info/rfcY | <organization /> | |||
YYC"> | </author> | |||
<front> | ||||
<title>RTP Payload Format Restrictions</title> | ||||
<seriesInfo name="RFC" value="YYYC"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYYC"/> | ||||
<author initials="A.B." surname="Roach" fullname="Adam Roach" role=" | ||||
editor"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-sctp-sdp (RFC YYY9) --> | <author initials="P" surname="Saint-Andre" fullname="Peter Saint-Andre"> | |||
<reference anchor="RFCYYY9" target="https://www.rfc-editor.org/info/rfcY | <organization /> | |||
YY9"> | </author> | |||
<front> | ||||
<title>Session Description Protocol (SDP) Offer/Answer Procedures | ||||
for Stream Control Transmission Protocol (SCTP) over Datagram | ||||
Transport Layer Security (DTLS) Transport</title> | ||||
<seriesInfo name="RFC" value="YYY9"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYY9"/> | ||||
<author initials="C" surname="Holmberg" fullname="Christer Holmberg" | ||||
> | ||||
<organization/> | ||||
</author> | ||||
<author initials="R.S." 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="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-sdp-bundle-negotiation (RFC YYYB) --> | <date month="July" year="2020" /> | |||
<reference anchor="RFCYYYB" target="https://www.rfc-editor.org/info/rfcY | </front> | |||
YYB"> | <seriesInfo name="RFC" value="8838" /> | |||
<front> | <seriesInfo name="DOI" value="10.17487/RFC8838"/> | |||
<title>Negotiating Media Multiplexing Using the Session Description | </reference> | |||
Protocol (SDP)</title> | ||||
<seriesInfo name="RFC" value="YYYB"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYYB"/> | ||||
<author initials="C.H." surname="Holmberg" fullname="Christer Holmbe | ||||
rg"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="H. T." surname="Alvestrand" fullname="Harald Alves | ||||
trand"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="C" surname="Jennings" fullname="Cullen Jennings"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-sdp-mux-attributes (RFC YYYH) --> | <!-- draft-ietf-mmusic-dtls-sdp RFC-to-be 8842 --> | |||
<reference anchor="RFCYYYH" target="https://www.rfc-editor.org/info/rfcY | <reference anchor="RFC8842" target="https://www.rfc-editor.org/info/rfc8842"> | |||
YYH"> | ||||
<front> | ||||
<title>A Framework for Session Description Protocol (SDP) | ||||
Attributes When Multiplexing</title> | ||||
<seriesInfo name="RFC" value="YYYH"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYYH"/> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar | ||||
"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-sdp-simulcast (RFC YYYE) --> | <front> | |||
<reference anchor="RFCYYYE" target="https://www.rfc-editor.org/info/rfcY | <title>Session Description Protocol (SDP) Offer/Answer Considerations for | |||
YYE"> | Datagram Transport Layer Security (DTLS) and Transport Layer Security (TLS)</tit | |||
<front> | le> | |||
<title>Using Simulcast in Session Description Protocol (SDP) and | ||||
RTP Sessions</title> | ||||
<seriesInfo name="RFC" value="YYYE"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYYE"/> | ||||
<author initials="B" surname="Burman" fullname="Bo Burman"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="M" surname="Westerlund" fullname="Magnus Westerlun | ||||
d"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar | ||||
"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="M" surname="Zanaty" fullname="Mo Zanaty"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-rtcweb-fec (RFC YYYF) --> | <author initials="C." surname="Holmberg" fullname="Christer Holmberg"> | |||
<reference anchor="RFCYYYF" target="https://www.rfc-editor.org/info/rfcY | <organization /> | |||
YYF"> | </author> | |||
<front> | ||||
<title>WebRTC Forward Error Correction Requirements</title> | ||||
<seriesInfo name="RFC" value="YYYF"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYYF"/> | ||||
<author initials="J" surname="Uberti" fullname="Justin Uberti"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-rtcweb-rtp-usage (RFC YYY5) --> | <author initials="R." surname="Shpount" fullname="Roman Shpount"> | |||
<reference anchor="RFCYYY5" target="https://www.rfc-editor.org/info/rfcY | <organization /> | |||
YY5"> | </author> | |||
<front> | ||||
<title>Web Real-Time Communication (WebRTC): Media Transport and Use | ||||
of RTP</title> | ||||
<seriesInfo name="RFC" value="YYY5"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYY5"/> | ||||
<author initials="C" surname="Perkins" fullname="Colin Perkins"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="M" surname="Westerlund" fullname="Magnus Westerlun | ||||
d"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="J" surname="Ott" fullname="Joerg Ott"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-rtcweb-security (RFC YYY1) --> | <date month="July" year="2020" /> | |||
<reference anchor="RFCYYY1" target="https://www.rfc-editor.org/info/rfcY | </front> | |||
YY1"> | <seriesInfo name="RFC" value="8842" /> | |||
<front> | <seriesInfo name="DOI" value="10.17487/RFC8842"/> | |||
<title>Security Considerations for WebRTC</title> | ||||
<seriesInfo name="RFC" value="YYY1"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYY1"/> | ||||
<author initials="E" surname="Rescorla" fullname="Eric Rescorla"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-rtcweb-security-arch (RFC YYY2) --> | </reference> | |||
<reference anchor="RFCYYY2" target="https://www.rfc-editor.org/info/rfcY | ||||
YY2"> | <!-- draft-ietf-mmusic-ice-sip-sdp-39 RFC-to-be 8839 --> | |||
<front> | ||||
<title>WebRTC Security Architecture</title> | <reference anchor='RFC8839' target="https://www.rfc-editor.org/info/rfc8839"> | |||
<seriesInfo name="RFC" value="YYY2"/> | <front> | |||
<seriesInfo name="DOI" value="10.17487/RFCYYY2"/> | <title>Session Description Protocol (SDP) Offer/Answer Procedures for Interactiv | |||
<author initials="E" surname="Rescorla" fullname="Eric Rescorla"> | e Connectivity Establishment (ICE)</title> | |||
<organization/> | ||||
</author> | <author initials='M' surname='Petit-Huguenin' fullname='Marc Petit-Huguenin'> | |||
<date month="May" year="2020"/> | <organization /> | |||
</front> | </author> | |||
</reference> | ||||
<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="July" year="2020"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8839"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8839"/> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-msid: 8830 --> | ||||
<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="July" year="2020" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8830" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8830"/> | ||||
</reference> | ||||
<!--draft-ietf-mmusic-mux-exclusive-12; part of C238; RFC 8858--> | ||||
<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="July" year='2020' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8858' /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8858"/> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-rid: 8851 --> | ||||
<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="July" year="2020"/> | ||||
</front> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8851"/> | ||||
<seriesInfo name="RFC" value="8851"/> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-sctp-sdp: 8841 --> | ||||
<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="July" year="2020" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8841" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8841"/> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-sdp-bundle-negotiation (RFC 8843) --> | ||||
<reference anchor="RFC8843" target="https://www.rfc-editor.org/info/rfc8843" | ||||
> | ||||
<front> | ||||
<title>Negotiating Media Multiplexing Using the Session Description Prot | ||||
ocol (SDP)</title> | ||||
<author initials="C" surname="Holmberg" fullname="Christer Holmberg"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="H" surname="Alvestrand" fullname="Harald Alvestrand"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="C" surname="Jennings" fullname="Cullen Jennings"> | ||||
<organization/> | ||||
</author> | ||||
<date month="July" year="2020"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8843"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8843"/> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-sdp-mux-attributes-17 (RFC 8859) --> | ||||
<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="July" year="2020"/> | ||||
</front> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8859"/> | ||||
<seriesInfo name="RFC" value="8859"/> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-sdp-simulcast: 8853 --> | ||||
<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="July" year="2020"/> | ||||
</front> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8853"/> | ||||
<seriesInfo name="RFC" value="8853"/> | ||||
</reference> | ||||
<!-- draft-ietf-rtcweb-fec: 8854 --> | ||||
<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="July" year="2020"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8854"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8854"/> | ||||
</reference> | ||||
<!-- draft-ietf-rtcweb-rtp-usage; RFC 8834 --> | ||||
<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="July" year="2020" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8834" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8834"/> | ||||
</reference> | ||||
<!--draft-ietf-rtcweb-security: RFC 8826 --> | ||||
<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='July' year='2020'/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8826"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8826"/> | ||||
</reference> | ||||
<!--draft-ietf-rtcweb-security-arch: 8827 --> | ||||
<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='July' year='2020'/> | ||||
</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. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3261. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3261. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3264. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3264. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3552. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3552. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3605. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3605. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3890. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3890. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4145. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4145. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4566. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4566. xml"/> | |||
skipping to change at line 4898 ¶ | skipping to change at line 6006 ¶ | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7742. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7742. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7850. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7850. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7874. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7874. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8108. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8108. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8122. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8122. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8445. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8445. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3711. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3711. xml"/> | |||
</references> | </references> | |||
<references> | <references> | |||
<name>Informative References</name> | <name>Informative References</name> | |||
<!-- draft-ietf-rtcweb-ip-handling (RFC YYY3) --> | ||||
<reference anchor="RFCYYY3" target="https://www.rfc-editor.org/info/rfcY | ||||
YY3"> | ||||
<front> | ||||
<title>WebRTC IP Address Handling Requirements</title> | ||||
<seriesInfo name="RFC" value="YYY3"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYY3"/> | ||||
<author initials="J." surname="Uberti" fullname="Justin Uberti"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<!-- draft-ietf-mmusic-trickle-ice-sip (RFC YYY8) --> | <!-- draft-ietf-rtcweb-ip-handling: 8828 --> | |||
<reference anchor="RFCYYY8" target="https://www.rfc-editor.org/info/rfcY | <reference anchor="RFC8828" target="https://www.rfc-editor.org/info/rfc8828"> | |||
YY8"> | <front> | |||
<front> | <title>WebRTC IP Address Handling Requirements</title> | |||
<title>A Session Initiation Protocol (SIP) Usage for Incremental | <author initials="J" surname="Uberti" fullname="Justin Uberti"> | |||
Provisioning of Candidates for the Interactive Connectivity Establish | <organization /> | |||
ment (Trickle ICE)</title> | </author> | |||
<seriesInfo name="RFC" value="YYY8"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFCYYY8"/> | ||||
<author initials="E" surname="Ivov" fullname="Emil Ivov"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="T" surname="Stach" fullname="Thomas Stach"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="E" surname="Marocco" fullname="Enrico Marocco"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="C.H." surname="Holmberg" fullname="Christer Holmbe | ||||
rg"> | ||||
<organization/> | ||||
</author> | ||||
<date month="May" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<date month="July" year="2020" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8828" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8828"/> | ||||
</reference> | ||||
<!-- 7/6/2020: IESG eval --> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf -rtcweb-sdp.xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf -rtcweb-sdp.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3389. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3389. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4568. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4568. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4588. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4588. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4733. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4733. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5245. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5245. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5506. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5506. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5576. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5576. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5763. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5763. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5764. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5764. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6120. xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6464. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6464. xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6544. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6544. xml"/> | |||
<!-- [rfced] Informative References: RFC 6544 is not cited anywhere | ||||
in this document. Please let us know where it should be cited. | ||||
Original: | ||||
[RFC6544] Rosenberg, J., Keranen, A., Lowekamp, B., and A. Roach, | ||||
"TCP Candidates with Interactive Connectivity | ||||
Establishment (ICE)", RFC 6544, DOI 10.17487/RFC6544, | ||||
March 2012, <https://www.rfc-editor.org/info/rfc6544>. --> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3556. xml"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3556. 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.3960. xml"/> | |||
<reference anchor="W3C.webrtc" target="https://www.w3.org/TR/2017/WD-web rtc-20170515/"> | <reference anchor="W3C.webrtc" target="https://www.w3.org/TR/2017/WD-web rtc-20170515/"> | |||
<front> | <front> | |||
<title>WebRTC 1.0: Real-time Communication Between | <title>WebRTC 1.0: Real-time Communication Between | |||
Browsers</title> | Browsers</title> | |||
<author fullname="Adam Bergkvist" initials="A." surname="Bergkvist"> | <author fullname="Adam Bergkvist" initials="A." surname="Bergkvist"> | |||
<organization>Ericsson</organization> | <organization>Ericsson</organization> | |||
</author> | </author> | |||
skipping to change at line 4976 ¶ | skipping to change at line 6075 ¶ | |||
<author fullname="Bernard Aboba" initials="B." surname="Aboba"> | <author fullname="Bernard Aboba" initials="B." surname="Aboba"> | |||
<organization>Microsoft Corporation</organization> | <organization>Microsoft Corporation</organization> | |||
</author> | </author> | |||
<author fullname="Taylor Brandstetter" initials="T." surname="Brands tetter"> | <author fullname="Taylor Brandstetter" initials="T." surname="Brands tetter"> | |||
<organization>Google</organization> | <organization>Google</organization> | |||
</author> | </author> | |||
<date month="May" year="2017"/> | <date month="May" year="2017"/> | |||
</front> | </front> | |||
<refcontent>World Wide Web Consortium WD WD-webrtc-20170515</refcont ent> | <refcontent>World Wide Web Consortium WD WD-webrtc-20170515</refcont ent> | |||
</reference> | </reference> | |||
<!-- [rfced] Informative References: The provided URL for | ||||
[W3C.webrtc] steers to a page with a red window that says | ||||
"This version is outdated!" Because the latest version | ||||
(September 2018) also discusses the RTCPeerConnection interface, | ||||
may we update this listing as suggested below? | ||||
Also, if you agree to this update, should Jan-Ivar Bruaroey be | ||||
added to the second sentence of the Acknowledgements section | ||||
(after Adam Bergkvist)? | ||||
Original: | ||||
[W3C.webrtc] | ||||
Bergkvist, A., Burnett, D., Jennings, C., Narayanan, A., | ||||
Aboba, B., and T. Brandstetter, "WebRTC 1.0: Real-time | ||||
Communication Between Browsers", World Wide Web Consortium | ||||
WD WD-webrtc-20170515, May 2017, | ||||
<https://www.w3.org/TR/2017/WD-webrtc-20170515/>. | ||||
Suggested: | ||||
[W3C.webrtc] | ||||
Bergkvist, A., Burnett, D., Jennings, C., Narayanan, A., | ||||
Aboba, B., Brandstetter, T., and J-I. Bruaroey, "WebRTC | ||||
1.0: Real-time Communication Between Browsers", World | ||||
Wide Web Consortium Candidate Recommendation, September | ||||
2018, <https://www.w3.org/TR/webrtc/>. --> | ||||
<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 Group Services and System Aspects; IP | Specification Group Services and System Aspects; IP | |||
Multimedia Subsystem (IMS); Multimedia Telephony; Media | Multimedia Subsystem (IMS); Multimedia Telephony; Media | |||
handling and interaction (Release 12)</title> | handling and interaction (Release 12)</title> | |||
<seriesInfo name="3GPP TS" value="26.114 V12.8.0"/> | <seriesInfo name="3GPP TS" value="26.114 V12.8.0"/> | |||
<author> | <author> | |||
<organization>3GPP</organization> | <organization>3GPP</organization> | |||
</author> | </author> | |||
<date year="2014" month="December"/> | <date year="2014" month="December"/> | |||
</front> | </front> | |||
</reference> | </reference> | |||
<!-- [rfced] Informative References: We see on | ||||
<https://www.3gpp.org/DynaReport/26114.htm> that a newer version | ||||
dated September 2019 is available. The new version also discusses | ||||
CVO (as mentioned in Section 3.6.2 of this document). May we update | ||||
this listing as suggested below? | ||||
Original: | ||||
This is required regardless of whether the receiver | ||||
supports performing receive-side rotation (e.g., through CVO | ||||
[TS26.114]), as it significantly simplifies the matching logic. | ||||
... | ||||
[TS26.114] | ||||
3GPP TS 26.114 V12.8.0, "3rd Generation Partnership | ||||
Project; Technical Specification Group Services and System | ||||
Aspects; IP Multimedia Subsystem (IMS); Multimedia | ||||
Telephony; Media handling and interaction (Release 12)", | ||||
December 2014, <http://www.3gpp.org/DynaReport/26114.htm>. | ||||
Suggested: | ||||
[TS26.114] | ||||
3GPP, "3rd Generation Partnership Project; Technical | ||||
Specification Group Services and System Aspects; IP | ||||
Multimedia Subsystem (IMS); Multimedia Telephony; Media | ||||
handling and interaction (Release 16)", 3GPP TS 26.114 | ||||
V16.3.0, September 2019, | ||||
<http://www.3gpp.org/DynaReport/26114.htm>. --> | ||||
</references> | </references> | |||
</references> | </references> | |||
<section anchor="sec.appendix-a" numbered="true" toc="default"> | <section anchor="sec.appendix-a" numbered="true" toc="default"> | |||
<name>Appendix A</name> | <name>ABNF Definitions</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"> | |||
<name>SDP ABNF References</name> | <name>SDP ABNF References</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Attribute</th> | <th align="left">Attribute</th> | |||
<th align="left">Reference</th> | <th align="left">Reference</th> | |||
</tr> | </tr> | |||
skipping to change at line 5122 ¶ | skipping to change at line 6276 ¶ | |||
<xref target="RFC6236" sectionFormat="of" section="3.1"/></td> | <xref target="RFC6236" sectionFormat="of" section="3.1"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">extmap (encrypt option)</td> | <td align="left">extmap (encrypt option)</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFC6904" sectionFormat="of" section="4"/></td> | <xref target="RFC6904" sectionFormat="of" section="4"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">candidate</td> | <td align="left">candidate</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFCYYY7" sectionFormat="of" section="4.1"/></td> | <xref target="RFC8839" sectionFormat="of" section="5.1"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">remote-candidates</td> | <td align="left">remote-candidates</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFCYYY7" sectionFormat="of" section="4.2"/></td> | <xref target="RFC8839" sectionFormat="of" section="5.2"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">ice-lite</td> | <td align="left">ice-lite</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFCYYY7" sectionFormat="of" section="4.3"/></td> | <xref target="RFC8839" sectionFormat="of" section="5.3"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">ice-ufrag</td> | <td align="left">ice-ufrag</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFCYYY7" sectionFormat="of" section="4.4"/></td> | <xref target="RFC8839" sectionFormat="of" section="5.4"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">ice-pwd</td> | <td align="left">ice-pwd</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFCYYY7" sectionFormat="of" section="4.4"/></td> | <xref target="RFC8839" sectionFormat="of" section="5.4"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">ice-options</td> | <td align="left">ice-options</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFCYYY7" sectionFormat="of" section="4.6"/></td> | <xref target="RFC8839" sectionFormat="of" section="5.6"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">msid</td> | <td align="left">msid</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFCYYY4" sectionFormat="of" section="2"/></td> | <xref target="RFC8830" sectionFormat="of" section="3"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">rid</td> | <td align="left">rid</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFCYYYC" sectionFormat="of" section="10"/></td> | <xref target="RFC8851" sectionFormat="of" section="10"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">simulcast</td> | <td align="left">simulcast</td> | |||
<td align="left"> | <td align="left"> | |||
<xref target="RFCYYYE" sectionFormat="of" section="6.1"/></td> | <xref target="RFC8853" sectionFormat="of" section="6.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="RFCYYYA" sectionFormat="of" section="4"/></td> | <xref target="RFC8842" sectionFormat="of" section="4"/></td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
<!-- [rfced] Appendix A: Please review the following, and let us | ||||
know any concerns. | ||||
a) We changed the title of Appendix A from "Appendix A" to | ||||
"ABNF Definitions." If this is not correct, please provide an | ||||
appropriately descriptive title. | ||||
b) Please review the citations listed in Table 1. In many cases, | ||||
we could not see the relevant parameters listed in the cited | ||||
sections. For example, we do not see | ||||
* any of the attributes (ptime, maxptime, rtpmap, recvonly, ...) | ||||
listed in Section 9 of [RFC4566]. | ||||
* the setup attribute mentioned in Section 3 of [RFC4145]. | ||||
* the connection attribute mentioned in Sections 3 or 4 of [RFC4145]. | ||||
* the "mid" attribute listed in Section 5 of [RFC5888]. | ||||
* the "group" attribute listed in Section 4 of [RFC5888]. | ||||
c) We do not see the attributes "framerate," "quality," or | ||||
"connection" listed anywhere else in this document. Do they need to | ||||
be included here? | ||||
d) Please note that in order to render workable hyperlinks in the | ||||
.html/.pdf files we changed the original citation format (for example, | ||||
"[RFC5285] Section 7") to this style (for example, "Section 7 of | ||||
[RFC5285]"). | ||||
e) As noted previously, it appears that most of the listed section | ||||
numbers for RFC 8839 [I-D.ietf-mmusic-ice-sip-sdp] are "off by one" (i.e., | ||||
that "4.1" should be "5.1," "4.2" should be "5.2," etc. We have updated the | ||||
section references accordingly; please review and let us know if any | ||||
corrections are needed. | ||||
f) Please confirm that Section 6.1 of RFC 8853 [I-D.ietf-mmusic-sdp-simulcast] | ||||
is the correct section to cite here. | ||||
(We ask because we could not see a relationship, other than the | ||||
mention of "simulcast" mostly in terms of simulcast streams, and also | ||||
because we see ABNF for the "a=simulcast" attribute in Section 5.1 of | ||||
RFC 8853 [I-D.ietf-mmusic-sdp-simulcast].) | ||||
Original: | ||||
Appendix A. Appendix A | ||||
... | ||||
| simulcast | [I-D.ietf-mmusic-sdp-simulcast] Section | | ||||
| | 6.1 | ||||
Currently: | ||||
Appendix A. ABNF Definitions | ||||
... | ||||
| simulcast | Section 6.1 of [RFC8853] | --> | ||||
</section> | </section> | |||
<section anchor="sec.change-log" numbered="true" toc="default"> | <section anchor="sec.acknowledgements" numbered="false" toc="default"> | |||
<name>Change log</name> | <name>Acknowledgements</name> | |||
<t>Note to RFC Editor: Please remove this section before | <t><contact fullname="Harald Alvestrand"/>, <contact fullname="Taylor | |||
publication.</t> | Brandstetter"/>, <contact fullname="Suhas Nandakumar"/>, and | |||
<t>Changes in draft-26:</t> | <contact fullname="Peter Thatcher"/> provided significant text for this | |||
<ul spacing="normal"> | document. <contact fullname="Bernard Aboba"/>, <contact fullname="Adam | |||
<li>Update guidance on generation of the m= proto value to be | Bergkvist"/>, <contact fullname="Dan Burnett"/>, <contact fullname="Ben | |||
consistent with ice-sip-sdp.</li> | Campbell"/>, <contact fullname="Alissa Cooper"/>, | |||
</ul> | <contact fullname="Richard Ejzak"/>, <contact fullname="Stefan | |||
<t>Changes in draft-25:</t> | HÃ¥kansson"/>, <contact fullname="Ted Hardie"/>, <contact fullname="Christe | |||
<ul spacing="normal"> | r Holmberg"/>, | |||
<li>Remove MSID track ID from offers and answers.</li> | <contact fullname="Andrew Hutton"/>, <contact fullname="Randell | |||
<li>Add note about rejecting all m= sections in a BUNDLE group.</li> | Jesup"/>, <contact fullname="Matthew Kaufman"/>, <contact fullname="Anant | |||
<li>Update ICE references to RFC 8445 and mention ice2.</li> | Narayanan"/>, | |||
</ul> | <contact fullname="Adam Roach"/>, <contact fullname="Robert Sparks"/>, | |||
<t>Changes in draft-24:</t> | <contact fullname="Neil Stratford"/>, <contact fullname="Martin | |||
<ul spacing="normal"> | Thomson"/>, <contact fullname="Sean | |||
<li>Clarify that rounding is permitted when trying to maintain | Turner"/>, and <contact fullname="Magnus Westerlund"/> all provided valuab | |||
aspect ratio.</li> | le feedback on | |||
<li>Update tls-id handling to match what is specified in | this document.</t> | |||
dtls-sdp.</li> | ||||
</ul> | ||||
<t>Changes in draft-23:</t> | ||||
<ul spacing="normal"> | ||||
<li>Clarify rollback handling, and treat it similarly to other | ||||
setLocal/setRemote usages.</li> | ||||
<li>Adopt a first-fit policy for handling multiple remote | ||||
a=imageattr attributes.</li> | ||||
<li>Clarify that a session description with zero m= sections | ||||
is legal.</li> | ||||
</ul> | ||||
<t>Changes in draft-22:</t> | ||||
<ul spacing="normal"> | ||||
<li>Clarify currentDirection versus direction.</li> | ||||
<li>Correct session-id text so that it aligns with RFC | ||||
3264.</li> | ||||
<li>Clarify that generated ICE candidate objects must have all | ||||
four fields.</li> | ||||
<li>Make rollback work from any state besides stable and | ||||
regardless of whether setLocalDescription or | ||||
setRemoteDescription is used.</li> | ||||
<li>Allow modifying SDP before sending or after receiving | ||||
either offers or answers (previously this was forbidden for | ||||
answers).</li> | ||||
<li>Provide rationale for several design choices.</li> | ||||
</ul> | ||||
<t>Changes in draft-21:</t> | ||||
<ul spacing="normal"> | ||||
<li>Change dtls-id to tls-id to match MMUSIC draft.</li> | ||||
<li>Replace regular expression for proto field with a list and | ||||
clarify that the answer must exactly match the offer.</li> | ||||
<li>Remove text about how to error check on setLocal because | ||||
local descriptions cannot be changed.</li> | ||||
<li>Rework silence suppression support to always require that | ||||
both sides agree to silence suppression or none is used.</li> | ||||
<li>Remove instructions to parse "a=ssrc-group".</li> | ||||
<li>Allow the addition of new codecs in answers and in | ||||
subsequent offers.</li> | ||||
<li>Clarify imageattr processing. Replace use of [x=0,y=0] | ||||
with direction indicators.</li> | ||||
<li>Document when early media can occur.</li> | ||||
<li>Fix ICE default port handling when bundle-only is | ||||
used.</li> | ||||
<li>Forbid duplicating IDENTICAL/TRANSPORT attributes when you | ||||
are bundling.</li> | ||||
<li>Clarify the number of components to gather when bundle is | ||||
involved.</li> | ||||
<li>Explicitly state that PTs and SSRCs are to be used for | ||||
demuxing.</li> | ||||
<li>Update guidance on "a=setup" line. This should now match | ||||
the MMUSIC draft.</li> | ||||
<li>Update guidance on certificate/digest matching to conform | ||||
to RFC8122.</li> | ||||
<li>Update examples.</li> | ||||
</ul> | ||||
<t>Changes in draft-20:</t> | ||||
<ul spacing="normal"> | ||||
<li>Remove Appendix-B.</li> | ||||
</ul> | ||||
<t>Changes in draft-19:</t> | ||||
<ul spacing="normal"> | ||||
<li>Examples are now machine-generated for correctness, and | ||||
use IETF-approved example IP addresses.</li> | ||||
<li>Add early transport warmup example, and add missing | ||||
attributes to existing examples.</li> | ||||
<li>Only send "a=rtcp-mux-only" and "a=bundle-only" on new m= | ||||
sections.</li> | ||||
<li>Update references.</li> | ||||
<li>Add coverage of a=identity.</li> | ||||
<li>Explain the lipsync group algorithm more thoroughly.</li> | ||||
<li>Remove unnecessary list of MTI specs.</li> | ||||
<li>Allow codecs which weren't offered to appear in answers | ||||
and which weren't selected to appear in subsequent | ||||
offers.</li> | ||||
<li>Codec preferences now are applied on both initial and | ||||
subsequent offers and answers.</li> | ||||
<li>Clarify a=msid handling for recvonly m= sections.</li> | ||||
<li>Clarify behavior of attributes for bundle-only data | ||||
channels.</li> | ||||
<li>Allow media attributes to appear in data m= sections when | ||||
all the media m= sections are bundle-only.</li> | ||||
<li>Use consistent terminology for JSEP implementations.</li> | ||||
<li>Describe how to handle failed API calls.</li> | ||||
<li>Some cleanup on routing rules.</li> | ||||
</ul> | ||||
<t>Changes in draft-18:</t> | ||||
<ul spacing="normal"> | ||||
<li>Update demux algorithm and move it to an appendix in | ||||
preparation for merging it into BUNDLE.</li> | ||||
<li>Clarify why we can't handle an incoming offer to send | ||||
simulcast.</li> | ||||
<li>Expand IceCandidate object text.</li> | ||||
<li>Further document use of ICE candidate pool.</li> | ||||
<li>Document removeTrack.</li> | ||||
<li>Update requirements to only accept the last generated | ||||
offer/answer as an argument to setLocalDescription.</li> | ||||
<li>Allow round pixels.</li> | ||||
<li>Fix code around default timing when AVPF is not | ||||
specified.</li> | ||||
<li>Clean up terminology around m= line and m=section.</li> | ||||
<li>Provide a more realistic example for minimum decoder | ||||
capabilities.</li> | ||||
<li>Document behavior when rtcp-mux policy is require but | ||||
rtcp-mux attribute not provided.</li> | ||||
<li>Expanded discussion of RtpSender and RtpReceiver.</li> | ||||
<li>Add RtpTransceiver.currentDirection and document | ||||
setDirection.</li> | ||||
<li>Require imageattr x=0, y=0 to indicate that there are no | ||||
valid resolutions.</li> | ||||
<li>Require a privacy-preserving MID/RID construction.</li> | ||||
<li>Require support for RFC 3556 bandwidth modifiers.</li> | ||||
<li>Update maxptime description.</li> | ||||
<li>Note that endpoints may encounter extra codecs in answers | ||||
and subsequent offers from non-JSEP peers.</li> | ||||
<li>Update references.</li> | ||||
</ul> | ||||
<t>Changes in draft-17:</t> | ||||
<ul spacing="normal"> | ||||
<li>Split createOffer and createAnswer sections to clearly | ||||
indicate attributes which always appear and which only appear | ||||
when not bundled into another m= section.</li> | ||||
<li>Add descriptions of RtpTransceiver methods.</li> | ||||
<li>Describe how to process RTCP feedback attributes.</li> | ||||
<li>Clarify transceiver directions and their interaction with | ||||
3264.</li> | ||||
<li>Describe setCodecPreferences.</li> | ||||
<li>Update RTP demux algorithm. Include RTCP.</li> | ||||
<li>Update requirements for when a=rtcp is included, limiting | ||||
to cases where it is needed for backward compatibility.</li> | ||||
<li>Clarify SAR handling.</li> | ||||
<li>Updated addTrack matching algorithm.</li> | ||||
<li>Remove a=ssrc requirements.</li> | ||||
<li>Handle a=setup in reoffers.</li> | ||||
<li>Discuss how RTX/FEC should be handled.</li> | ||||
<li>Discuss how telephone-event should be handled.</li> | ||||
<li>Discuss how CN/DTX should be handled.</li> | ||||
<li>Add missing references to ABNF table.</li> | ||||
</ul> | ||||
<t>Changes in draft-16:</t> | ||||
<ul spacing="normal"> | ||||
<li>Update addIceCandidate to indicate ICE generation and | ||||
allow per-m= section end-of-candidates.</li> | ||||
<li>Update fingerprint handling to use | ||||
draft-ietf-mmusic-4572-update.</li> | ||||
<li>Update text around SDP processing of RTP header extensions | ||||
and payload formats.</li> | ||||
<li>Add sections on simulcast, addTransceiver, and | ||||
createDataChannel.</li> | ||||
<li>Clarify text to ensure that the session ID is a positive | ||||
63 bit integer.</li> | ||||
<li>Clarify SDP processing for direction indication.</li> | ||||
<li>Describe SDP processing for rtcp-mux-only.</li> | ||||
<li>Specify how SDP session version in o= line.</li> | ||||
<li>Require that when doing an re-offer, the capabilities of | ||||
the new session are mostly required to be a subset of the | ||||
previously negotiated session.</li> | ||||
<li>Clarified ICE restart interaction with bundle-only.</li> | ||||
<li>Remove support for changing SDP before calling | ||||
setLocalDescription.</li> | ||||
<li>Specify algorithm for demuxing RTP based on MID, PT, and | ||||
SSRC.</li> | ||||
<li>Clarify rules for rejecting m= lines when bundle policy is | ||||
balanced or max-bundle.</li> | ||||
</ul> | ||||
<t>Changes in draft-15:</t> | ||||
<ul spacing="normal"> | ||||
<li>Clarify text around codecs offered in subsequent | ||||
transactions to refer to what's been negotiated.</li> | ||||
<li>Rewrite LS handling text to indicate edge cases and that | ||||
we're living with them.</li> | ||||
<li>Require that answerer reject m= lines when there are no | ||||
codecs in common.</li> | ||||
<li>Enforce max-bundle on offer processing.</li> | ||||
<li>Fix TIAS formula to handle bits vs. kilobits.</li> | ||||
<li>Describe addTrack algorithm.</li> | ||||
<li>Clean up references.</li> | ||||
</ul> | ||||
<t>Changes in draft-14:</t> | ||||
<ul spacing="normal"> | ||||
<li>Added discussion of RtpTransceivers + RtpSenders + | ||||
RtpReceivers, and how they interact with | ||||
createOffer/createAnswer.</li> | ||||
<li>Removed obsolete OfferToReceiveX options.</li> | ||||
<li>Explained how addIceCandidate can be used for | ||||
end-of-candidates.</li> | ||||
</ul> | ||||
<t>Changes in draft-13:</t> | ||||
<ul spacing="normal"> | ||||
<li>Clarified which SDP lines can be ignored.</li> | ||||
<li>Clarified how to handle various received attributes.</li> | ||||
<li>Revised how attributes should be generated for bundled m= | ||||
lines.</li> | ||||
<li>Remove unused references.</li> | ||||
<li>Remove text advocating use of unilateral PTs.</li> | ||||
<li>Trigger an ICE restart even if the ICE candidate policy is | ||||
being made more strict.</li> | ||||
<li>Remove the 'public' ICE candidate policy.</li> | ||||
<li>Move open issues into GitHub issues.</li> | ||||
<li>Split local/remote description accessors into | ||||
current/pending.</li> | ||||
<li>Clarify a=imageattr handling.</li> | ||||
<li>Add more detail on VoiceActivityDetection handling.</li> | ||||
<li>Reference draft-shieh-rtcweb-ip-handling.</li> | ||||
<li>Make it clear when an ICE restart should occur.</li> | ||||
<li>Resolve changes needed in references.</li> | ||||
<li>Remove MSID semantics.</li> | ||||
<li>ice-options are now at session level.</li> | ||||
<li>Default RTCP mux policy is now 'require'.</li> | ||||
</ul> | ||||
<t>Changes in draft-12:</t> | ||||
<ul spacing="normal"> | ||||
<li>Filled in sections on applying local and remote | ||||
descriptions.</li> | ||||
<li>Discussed downscaling and upscaling to fulfill imageattr | ||||
requirements.</li> | ||||
<li>Updated what SDP can be modified by the application.</li> | ||||
<li>Updated to latest datachannel SDP.</li> | ||||
<li>Allowed multiple fingerprint lines.</li> | ||||
<li>Switched back to IPv4 for dummy candidates.</li> | ||||
<li>Added additional clarity on ICE default candidates.</li> | ||||
</ul> | ||||
<t>Changes in draft-11:</t> | ||||
<ul spacing="normal"> | ||||
<li>Clarified handling of RTP CNAMEs.</li> | ||||
<li>Updated what SDP lines should be processed or ignored.</li> | ||||
<li>Specified how a=imageattr should be used.</li> | ||||
</ul> | ||||
<t>Changes in draft-10:</t> | ||||
<ul spacing="normal"> | ||||
<li>Described video size negotiation with imageattr.</li> | ||||
<li>Clarified rejection of sections that do not have | ||||
mux-only.</li> | ||||
<li>Add handling of LS groups</li> | ||||
</ul> | ||||
<t>Changes in draft-09:</t> | ||||
<ul spacing="normal"> | ||||
<li>Don't return null for {local,remote}Description after | ||||
close().</li> | ||||
<li>Changed TCP/TLS to UDP/DTLS in RTP profile names.</li> | ||||
<li>Separate out bundle and mux policy.</li> | ||||
<li>Added specific references to FEC mechanisms.</li> | ||||
<li>Added canTrickle mechanism.</li> | ||||
<li>Added section on subsequent answers and, answer | ||||
options.</li> | ||||
<li>Added text defining set{Local,Remote}Description | ||||
behavior.</li> | ||||
</ul> | ||||
<t>Changes in draft-08: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Added new example section and removed old examples in | ||||
appendix.</li> | ||||
<li>Fixed <proto> field handling.</li> | ||||
<li>Added text describing a=rtcp attribute.</li> | ||||
<li>Reworked handling of OfferToReceiveAudio and | ||||
OfferToReceiveVideo per discussion at IETF 90.</li> | ||||
<li>Reworked trickle ICE handling and its impact on m= and c= | ||||
lines per discussion at interim.</li> | ||||
<li>Added max-bundle-and-rtcp-mux policy.</li> | ||||
<li>Added description of maxptime handling.</li> | ||||
<li>Updated ICE candidate pool default to 0.</li> | ||||
<li>Resolved open issues around AppID/receiver-ID.</li> | ||||
<li>Reworked and expanded how changes to the ICE configuration | ||||
are handled.</li> | ||||
<li>Some reference updates.</li> | ||||
<li>Editorial clarification.</li> | ||||
</ul> | ||||
<t>Changes in draft-07: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Expanded discussion of VAD and Opus DTX.</li> | ||||
<li>Added a security considerations section.</li> | ||||
<li>Rewrote the section on modifying SDP to require | ||||
implementations to clearly indicate whether any given | ||||
modification is allowed.</li> | ||||
<li>Clarified impact of IceRestart on CreateOffer in local-offer | ||||
state.</li> | ||||
<li>Guidance on whether attributes should be defined at the | ||||
media level or the session level.</li> | ||||
<li>Renamed "default" bundle policy to "balanced".</li> | ||||
<li>Removed default ICE candidate pool size and clarify how it | ||||
works.</li> | ||||
<li>Defined a canonical order for assignment of MSTs to m= | ||||
lines.</li> | ||||
<li>Removed discussion of rehydration.</li> | ||||
<li>Added Eric Rescorla as a draft editor.</li> | ||||
<li>Cleaned up references.</li> | ||||
<li>Editorial cleanup</li> | ||||
</ul> | ||||
<t>Changes in draft-06: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Reworked handling of m= line recycling.</li> | ||||
<li>Added handling of BUNDLE and bundle-only.</li> | ||||
<li>Clarified handling of rollback.</li> | ||||
<li>Added text describing the ICE Candidate Pool and its | ||||
behavior.</li> | ||||
<li>Allowed OfferToReceiveX to create multiple recvonly m= | ||||
sections.</li> | ||||
</ul> | ||||
<t>Changes in draft-05: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Fixed several issues identified in the createOffer/Answer | ||||
sections during document review.</li> | ||||
<li>Updated references.</li> | ||||
</ul> | ||||
<t>Changes in draft-04: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Filled in sections on createOffer and createAnswer.</li> | ||||
<li>Added SDP examples.</li> | ||||
<li>Fixed references.</li> | ||||
</ul> | ||||
<t>Changes in draft-03: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Added text describing relationship to W3C specification</li> | ||||
</ul> | ||||
<t>Changes in draft-02: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<!-- A --> | ||||
<li>Converted from nroff</li> | ||||
<!-- B --> | ||||
<li>Removed comparisons to old approaches abandoned by the | ||||
working group</li> | ||||
<!-- C --> | ||||
<li>Removed stuff that has moved to W3C specification</li> | ||||
<!-- D --> | ||||
<li>Align SDP handling with W3C draft</li> | ||||
<!-- E --> | ||||
<li>Clarified section on forking.</li> | ||||
<!-- F --> | ||||
<!-- G --> | ||||
<!-- H --> | ||||
<!-- I --> | ||||
<!-- J --> | ||||
<!-- K --> | ||||
<!-- L --> | ||||
</ul> | ||||
<t>Changes in draft-01: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Added diagrams for architecture and state machine.</li> | ||||
<li>Added sections on forking and rehydration.</li> | ||||
<li>Clarified meaning of "pranswer" and "answer".</li> | ||||
<li>Reworked how ICE restarts and media directions are | ||||
controlled.</li> | ||||
<li>Added list of parameters that can be changed in a | ||||
description.</li> | ||||
<li>Updated suggested API and examples to match latest | ||||
thinking.</li> | ||||
<li>Suggested API and examples have been moved to an | ||||
appendix.</li> | ||||
</ul> | ||||
<t>Changes in draft -00: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li>Migrated from draft-uberti-rtcweb-jsep-02.</li> | ||||
</ul> | ||||
</section> | </section> | |||
</back> | </back> | |||
<!-- [rfced] Please let us know if any changes are needed for the | ||||
following: | ||||
a) The following terms were used inconsistently in this document. | ||||
We chose to use the latter forms. Please let us know any objections. | ||||
a m= / an "m=" (per published RFCs and per author feedback for other | ||||
documents in this cluster | ||||
q= value / "q=" value (We also changed 'x= and y= values' to | ||||
"x=" and "y=" values') | ||||
a RTP / an RTP | ||||
to true / to "true" (per the rest of the cluster) | ||||
to false / to "false" (per the rest of the cluster) | ||||
bundle-tag / BUNDLE-tag (per other documents in this cluster) | ||||
offer-answer exchange / offer/answer exchange | ||||
clockrate / clock rate (per RFCs 3389 and 7160) | ||||
other than IDENTICAL and TRANSPORT / other than IDENTICAL or TRANSPORT | ||||
b) The following terms appear to be used inconsistently in this | ||||
document. Please let us know which form is preferred. | ||||
createOffer API / createOffer() API (We see "createAnswer() API" but | ||||
not "createAnswer API"; however, we also see "getCapabilities API" | ||||
and "W3C RTCPeerConnection API." In RFC 8826 (draft-ietf-rtcweb-security), | ||||
we see "XMLHttpRequest() API.") | ||||
setLocalDescription API / setLocalDescription() API | ||||
/ setRemoteDescription() API | ||||
(We also see "whether setLocalDescription or | ||||
setRemoteDescription is called" and "before | ||||
setRemoteDescription() is called") | ||||
mid identifiers / MID identifiers | ||||
Because RFC 8843 (draft-ietf-mmusic-sdp-bundle-negotiation) and | ||||
RFC 8852 (draft-ietf-avtext-rid) define "MID" as "Media Identification," | ||||
would it be appropriate to use "mid values" (or "MID values"*) | ||||
and "MIDs" instead of "mid identifiers" and "MID identifiers"? | ||||
* We see inconsistent capitalization in this cluster of documents; | ||||
a separate question regarding which form to use will be sent | ||||
separately. | ||||
"RID identifiers" and "rid-identifier": RFC 8851 (draft-ietf-mmusic-rid) | ||||
defines "RID" as "restriction identifier." Should "RID | ||||
identifiers" and "rid-identifier" be "rid-ids" and "rid-id" | ||||
per RFC 8851 (draft-ietf-mmusic-rid), to avoid "identifier identifier(s)"? | ||||
the stable state (1 instance) / the "stable" state (3 instances) | ||||
(Also, should 'the previous stable state' be 'a previous stable | ||||
state' (per Section 5.7) or 'the previous "stable" state'?) | ||||
sess-id / <sess-id> (Section 5.2.1, second bullet item) | ||||
set to zero / set to 0 (May we use the latter, because of | ||||
'"dummy" port value of 9' in Sections 5.2.1 and 5.3.1?) | ||||
dummy value / "dummy" value | ||||
fmt value / "fmt" value | ||||
mid value / "mid" value | ||||
tls-id value / "a=tls-id" value | ||||
"IceRestart" option / IceRestart option | ||||
dissociate (Section 5.10) / disassociate (Sections 3.4.1 and 5.7) | ||||
Example: "A rollback disassociates any RtpTransceivers that were | ||||
associated with m= sections by the application of the rolled-back | ||||
session description (see Section 5.10 and Section 5.9)." | ||||
c) Are "canTrickleIceCandidates" (Section 4.1.15) and "canTrickle | ||||
property" (Section 5.10) distinct terms? If so, should this | ||||
distinction be clarified in the text? --> | ||||
</rfc> | </rfc> | |||
End of changes. 493 change blocks. | ||||
2050 lines changed or deleted | 2956 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |