| 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/ | ||||