| rfc9429.original | rfc9429.txt | |||
|---|---|---|---|---|
| Network Working Group J. Uberti | Internet Engineering Task Force (IETF) J. Uberti | |||
| Internet-Draft | Request for Comments: 9429 | |||
| Obsoletes: 8829 (if approved) C. Jennings | Obsoletes: 8829 C. Jennings | |||
| Intended status: Standards Track Cisco | Category: Standards Track Cisco | |||
| Expires: 24 March 2024 E. Rescorla, Ed. | ISSN: 2070-1721 E. Rescorla, Ed. | |||
| Mozilla | Mozilla | |||
| 21 September 2023 | February 2024 | |||
| JavaScript Session Establishment Protocol (JSEP) | JavaScript Session Establishment Protocol (JSEP) | |||
| draft-uberti-rtcweb-rfc8829bis-05 | ||||
| Abstract | Abstract | |||
| This document describes the mechanisms for allowing a JavaScript | This document describes the mechanisms for allowing a JavaScript | |||
| application to control the signaling plane of a multimedia session | application to control the signaling plane of a multimedia session | |||
| via the interface specified in the W3C RTCPeerConnection API and | via the interface specified in the W3C RTCPeerConnection API and | |||
| discusses how this relates to existing signaling protocols. | discusses how this relates to existing signaling protocols. | |||
| This specification obsoletes RFC 8829. | This specification obsoletes RFC 8829. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on 24 March 2024. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9429. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2023 IETF Trust and the persons identified as the | Copyright (c) 2024 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
| license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
| and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
| extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
| described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
| provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
| in the Revised BSD License. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction | |||
| 1.1. General Design of JSEP . . . . . . . . . . . . . . . . . 4 | 1.1. General Design of JSEP | |||
| 1.2. Other Approaches Considered . . . . . . . . . . . . . . . 6 | 1.2. Other Approaches Considered | |||
| 1.3. Changes from RFC 8829 . . . . . . . . . . . . . . . . . . 7 | 1.3. Changes from RFC 8829 | |||
| 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 2. Terminology | |||
| 3. Semantics and Syntax . . . . . . . . . . . . . . . . . . . . 7 | 3. Semantics and Syntax | |||
| 3.1. Signaling Model . . . . . . . . . . . . . . . . . . . . . 7 | 3.1. Signaling Model | |||
| 3.2. Session Descriptions and State Machine . . . . . . . . . 8 | 3.2. Session Descriptions and State Machine | |||
| 3.3. Session Description Format . . . . . . . . . . . . . . . 11 | 3.3. Session Description Format | |||
| 3.4. Session Description Control . . . . . . . . . . . . . . . 11 | 3.4. Session Description Control | |||
| 3.4.1. RtpTransceivers . . . . . . . . . . . . . . . . . . . 11 | 3.4.1. RtpTransceivers | |||
| 3.4.2. RtpSenders . . . . . . . . . . . . . . . . . . . . . 12 | 3.4.2. RtpSenders | |||
| 3.4.3. RtpReceivers . . . . . . . . . . . . . . . . . . . . 12 | 3.4.3. RtpReceivers | |||
| 3.5. ICE . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 3.5. ICE | |||
| 3.5.1. ICE Gathering Overview . . . . . . . . . . . . . . . 12 | 3.5.1. ICE Gathering Overview | |||
| 3.5.2. ICE Candidate Trickling . . . . . . . . . . . . . . . 13 | 3.5.2. ICE Candidate Trickling | |||
| 3.5.2.1. ICE Candidate Format . . . . . . . . . . . . . . 14 | 3.5.2.1. ICE Candidate Format | |||
| 3.5.3. ICE Candidate Policy . . . . . . . . . . . . . . . . 15 | 3.5.3. ICE Candidate Policy | |||
| 3.5.4. ICE Candidate Pool . . . . . . . . . . . . . . . . . 15 | 3.5.4. ICE Candidate Pool | |||
| 3.5.5. ICE Versions . . . . . . . . . . . . . . . . . . . . 16 | 3.5.5. ICE Versions | |||
| 3.6. Video Size Negotiation . . . . . . . . . . . . . . . . . 16 | 3.6. Video Size Negotiation | |||
| 3.6.1. Creating an imageattr Attribute . . . . . . . . . . . 17 | 3.6.1. Creating an imageattr Attribute | |||
| 3.6.2. Interpreting imageattr Attributes . . . . . . . . . . 18 | 3.6.2. Interpreting imageattr Attributes | |||
| 3.7. Simulcast . . . . . . . . . . . . . . . . . . . . . . . . 19 | 3.7. Simulcast | |||
| 3.8. Interactions with Forking . . . . . . . . . . . . . . . . 20 | 3.8. Interactions with Forking | |||
| 3.8.1. Sequential Forking . . . . . . . . . . . . . . . . . 21 | 3.8.1. Sequential Forking | |||
| 3.8.2. Parallel Forking . . . . . . . . . . . . . . . . . . 21 | 3.8.2. Parallel Forking | |||
| 4. Interface . . . . . . . . . . . . . . . . . . . . . . . . . . 22 | 4. Interface | |||
| 4.1. PeerConnection . . . . . . . . . . . . . . . . . . . . . 22 | 4.1. PeerConnection | |||
| 4.1.1. Constructor . . . . . . . . . . . . . . . . . . . . . 22 | 4.1.1. Constructor | |||
| 4.1.2. addTrack . . . . . . . . . . . . . . . . . . . . . . 25 | 4.1.2. addTrack | |||
| 4.1.3. removeTrack . . . . . . . . . . . . . . . . . . . . . 25 | 4.1.3. removeTrack | |||
| 4.1.4. addTransceiver . . . . . . . . . . . . . . . . . . . 25 | 4.1.4. addTransceiver | |||
| 4.1.5. onaddtrack Event . . . . . . . . . . . . . . . . . . 26 | 4.1.5. onaddtrack Event | |||
| 4.1.6. createDataChannel . . . . . . . . . . . . . . . . . . 26 | 4.1.6. createDataChannel | |||
| 4.1.7. ondatachannel Event . . . . . . . . . . . . . . . . . 26 | 4.1.7. ondatachannel Event | |||
| 4.1.8. createOffer . . . . . . . . . . . . . . . . . . . . . 26 | 4.1.8. createOffer | |||
| 4.1.9. createAnswer . . . . . . . . . . . . . . . . . . . . 27 | 4.1.9. createAnswer | |||
| 4.1.10. SessionDescriptionType . . . . . . . . . . . . . . . 28 | 4.1.10. SessionDescriptionType | |||
| 4.1.10.1. Use of Provisional Answers . . . . . . . . . . . 29 | 4.1.10.1. Use of Provisional Answers | |||
| 4.1.10.2. Rollback . . . . . . . . . . . . . . . . . . . . 30 | 4.1.10.2. Rollback | |||
| 4.1.11. setLocalDescription . . . . . . . . . . . . . . . . . 30 | 4.1.11. setLocalDescription | |||
| 4.1.12. setRemoteDescription . . . . . . . . . . . . . . . . 31 | 4.1.12. setRemoteDescription | |||
| 4.1.13. currentLocalDescription . . . . . . . . . . . . . . . 31 | 4.1.13. currentLocalDescription | |||
| 4.1.14. pendingLocalDescription . . . . . . . . . . . . . . . 31 | 4.1.14. pendingLocalDescription | |||
| 4.1.15. currentRemoteDescription . . . . . . . . . . . . . . 32 | 4.1.15. currentRemoteDescription | |||
| 4.1.16. pendingRemoteDescription . . . . . . . . . . . . . . 32 | 4.1.16. pendingRemoteDescription | |||
| 4.1.17. canTrickleIceCandidates . . . . . . . . . . . . . . . 32 | 4.1.17. canTrickleIceCandidates | |||
| 4.1.18. setConfiguration . . . . . . . . . . . . . . . . . . 33 | 4.1.18. setConfiguration | |||
| 4.1.19. addIceCandidate . . . . . . . . . . . . . . . . . . . 34 | 4.1.19. addIceCandidate | |||
| 4.1.20. onicecandidate Event . . . . . . . . . . . . . . . . 34 | 4.1.20. onicecandidate Event | |||
| 4.2. RtpTransceiver . . . . . . . . . . . . . . . . . . . . . 35 | 4.2. RtpTransceiver | |||
| 4.2.1. stop . . . . . . . . . . . . . . . . . . . . . . . . 35 | 4.2.1. stop | |||
| 4.2.2. stopped . . . . . . . . . . . . . . . . . . . . . . . 35 | 4.2.2. stopped | |||
| 4.2.3. setDirection . . . . . . . . . . . . . . . . . . . . 35 | 4.2.3. setDirection | |||
| 4.2.4. direction . . . . . . . . . . . . . . . . . . . . . . 36 | 4.2.4. direction | |||
| 4.2.5. currentDirection . . . . . . . . . . . . . . . . . . 36 | 4.2.5. currentDirection | |||
| 4.2.6. setCodecPreferences . . . . . . . . . . . . . . . . . 36 | 4.2.6. setCodecPreferences | |||
| 5. SDP Interaction Procedures . . . . . . . . . . . . . . . . . 37 | 5. SDP Interaction Procedures | |||
| 5.1. Requirements Overview . . . . . . . . . . . . . . . . . . 37 | 5.1. Requirements Overview | |||
| 5.1.1. Usage Requirements . . . . . . . . . . . . . . . . . 37 | 5.1.1. Usage Requirements | |||
| 5.1.2. Profile Names and Interoperability . . . . . . . . . 37 | 5.1.2. Profile Names and Interoperability | |||
| 5.2. Constructing an Offer . . . . . . . . . . . . . . . . . . 39 | 5.2. Constructing an Offer | |||
| 5.2.1. Initial Offers . . . . . . . . . . . . . . . . . . . 39 | 5.2.1. Initial Offers | |||
| 5.2.2. Subsequent Offers . . . . . . . . . . . . . . . . . . 45 | 5.2.2. Subsequent Offers | |||
| 5.2.3. Options Handling . . . . . . . . . . . . . . . . . . 49 | 5.2.3. Options Handling | |||
| 5.2.3.1. IceRestart . . . . . . . . . . . . . . . . . . . 49 | 5.2.3.1. IceRestart | |||
| 5.2.3.2. VoiceActivityDetection . . . . . . . . . . . . . 49 | 5.2.3.2. VoiceActivityDetection | |||
| 5.3. Generating an Answer . . . . . . . . . . . . . . . . . . 50 | 5.3. Generating an Answer | |||
| 5.3.1. Initial Answers . . . . . . . . . . . . . . . . . . . 50 | 5.3.1. Initial Answers | |||
| 5.3.2. Subsequent Answers . . . . . . . . . . . . . . . . . 56 | 5.3.2. Subsequent Answers | |||
| 5.3.3. Options Handling . . . . . . . . . . . . . . . . . . 58 | 5.3.3. Options Handling | |||
| 5.3.3.1. VoiceActivityDetection . . . . . . . . . . . . . 58 | 5.3.3.1. VoiceActivityDetection | |||
| 5.4. Modifying an Offer or Answer . . . . . . . . . . . . . . 58 | 5.4. Modifying an Offer or Answer | |||
| 5.5. Processing a Local Description . . . . . . . . . . . . . 59 | 5.5. Processing a Local Description | |||
| 5.6. Processing a Remote Description . . . . . . . . . . . . . 60 | 5.6. Processing a Remote Description | |||
| 5.7. Processing a Rollback . . . . . . . . . . . . . . . . . . 60 | 5.7. Processing a Rollback | |||
| 5.8. Parsing a Session Description . . . . . . . . . . . . . . 61 | 5.8. Parsing a Session Description | |||
| 5.8.1. Session-Level Parsing . . . . . . . . . . . . . . . . 62 | 5.8.1. Session-Level Parsing | |||
| 5.8.2. Media Section Parsing . . . . . . . . . . . . . . . . 63 | 5.8.2. Media Section Parsing | |||
| 5.8.3. Semantics Verification . . . . . . . . . . . . . . . 66 | 5.8.3. Semantics Verification | |||
| 5.9. Applying a Local Description . . . . . . . . . . . . . . 67 | 5.9. Applying a Local Description | |||
| 5.10. Applying a Remote Description . . . . . . . . . . . . . . 68 | 5.10. Applying a Remote Description | |||
| 5.11. Applying an Answer . . . . . . . . . . . . . . . . . . . 72 | 5.11. Applying an Answer | |||
| 6. Processing RTP/RTCP . . . . . . . . . . . . . . . . . . . . . 75 | 6. Processing RTP/RTCP | |||
| 7. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 76 | 7. Examples | |||
| 7.1. Simple Example . . . . . . . . . . . . . . . . . . . . . 76 | 7.1. Simple Example | |||
| 7.2. Detailed Example . . . . . . . . . . . . . . . . . . . . 80 | 7.2. Detailed Example | |||
| 7.3. Early Transport Warmup Example . . . . . . . . . . . . . 90 | 7.3. Early Transport Warmup Example | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 97 | 8. Security Considerations | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 97 | 9. IANA Considerations | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 97 | 10. References | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . 97 | 10.1. Normative References | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . 102 | 10.2. Informative References | |||
| Appendix A. SDP ABNF Syntax . . . . . . . . . . . . . . . . . . 104 | Appendix A. SDP ABNF Syntax | |||
| Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 106 | Acknowledgements | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 106 | Authors' Addresses | |||
| 1. Introduction | 1. Introduction | |||
| This document describes how the W3C Web Real-Time Communication | This document describes how the W3C Web Real-Time Communication | |||
| (WebRTC) RTCPeerConnection interface [W3C.webrtc] is used to control | (WebRTC) RTCPeerConnection interface [W3C.webrtc] is used to control | |||
| the setup, management, and teardown of a multimedia session. | the setup, management, and teardown of a multimedia session. | |||
| 1.1. General Design of JSEP | 1.1. General Design of JSEP | |||
| WebRTC call setup has been designed to focus on controlling the media | WebRTC call setup has been designed to focus on controlling the media | |||
| skipping to change at page 7, line 9 ¶ | skipping to change at line 284 ¶ | |||
| and especially how to generate the correct answer from an arbitrary | and especially how to generate the correct answer from an arbitrary | |||
| offer and the supported capabilities. While this could certainly be | offer and 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 example. | basically forces the use of said library even for a simple example. | |||
| Providing createOffer/createAnswer avoids this problem. | Providing createOffer/createAnswer avoids this problem. | |||
| 1.3. Changes from RFC 8829 | 1.3. Changes from RFC 8829 | |||
| When [RFC8829] was published, inconsistencies regarding BUNDLE | When [RFC8829] was published, inconsistencies regarding BUNDLE | |||
| [RFC8843] operation were identified with regard to both the | [RFC8843] operation were identified with regard to both the | |||
| specification text as well as implementation behavior. The former | specification text and implementation behavior. The former concern | |||
| concern was addressed via an update to BUNDLE (see [RFC9143]). For | was addressed via an update to BUNDLE (see [RFC9143]). For the | |||
| the latter concern, it was observed that some implementations | latter concern, it was observed that some implementations implemented | |||
| implemented the "max-bundle" bundle policy defined in [RFC8829] by | the "max-bundle" bundle policy defined in [RFC8829] by assuming that | |||
| assuming that bundling had already been negotiated, rather than | bundling had already been negotiated, rather than marking "m=" | |||
| marking "m=" sections as bundle-only as indicated by the BUNDLE | sections as bundle-only as indicated by the BUNDLE specification. In | |||
| specification. In order to prevent unexpected changes to | order to prevent unexpected changes to applications relying on the | |||
| applications relying on the pre-standard behavior, the decision was | pre-standard behavior, the decision was made to deprecate "max- | |||
| made to deprecate "max-bundle" and instead introduce an identically | bundle" and instead introduce an identically defined "must-bundle" | |||
| defined "must-bundle" policy that, when selected, provides the | policy that, when selected, provides the behavior originally | |||
| behavior originally specified by [RFC8829]. | specified by [RFC8829]. | |||
| 2. Terminology | 2. Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
| BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| 3. Semantics and Syntax | 3. Semantics and Syntax | |||
| skipping to change at page 8, line 35 ¶ | skipping to change at line 351 ¶ | |||
| that must be handled in the JSEP APIs. | that must be handled in the JSEP APIs. | |||
| Whether a session description applies to the local side or the remote | Whether a session description applies to the local side or the remote | |||
| side affects the meaning of that description. For example, the list | side affects the meaning of that description. For example, the list | |||
| of codecs sent to a remote party indicates what the local side is | of codecs sent to a remote party indicates what the local side is | |||
| willing to receive, which, when intersected with the set of codecs | willing to receive, which, when intersected with the set of codecs | |||
| the remote side supports, specifies what the remote side should send. | the remote side supports, specifies what the remote side should send. | |||
| However, not all parameters follow this rule; some parameters are | However, not all parameters follow this rule; some parameters are | |||
| declarative, and the remote side must either accept them or reject | declarative, and the remote side must either accept them or reject | |||
| them altogether. An example of such a parameter is the TLS | them altogether. An example of such a parameter is the TLS | |||
| fingerprints [RFC8122] as used in the context of DTLS [RFC6347]; | fingerprints [RFC8122] as used in the context of DTLS [RFC6347] | |||
| these fingerprints are calculated based on the local certificate(s) | [RFC9147]; these fingerprints are calculated based on the local | |||
| offered and are not subject to negotiation. | certificate(s) offered and are not subject to negotiation. | |||
| In addition, various RFCs put different conditions on the format of | In addition, various RFCs put different conditions on the format of | |||
| offers versus answers. For example, an offer may propose an | offers versus answers. For example, an offer may propose an | |||
| arbitrary number of "m=" sections (i.e., media descriptions as | arbitrary number of "m=" sections (i.e., media descriptions as | |||
| described in [RFC4566], Section 5.14), but an answer must contain the | described in [RFC4566], Section 5.14), but an answer must contain the | |||
| exact same number as the offer. | exact same number as the offer. | |||
| Lastly, while the exact media parameters are known only after an | Lastly, while the exact media parameters are known only after an | |||
| offer and an answer have been exchanged, the offerer may receive ICE | offer and an answer have been exchanged, the offerer may receive ICE | |||
| checks, and possibly media (e.g., in the case of a re-offer after a | checks, and possibly media (e.g., in the case of a re-offer after a | |||
| skipping to change at page 12, line 5 ¶ | skipping to change at line 513 ¶ | |||
| associated with one "m=" section. Each RtpTransceiver has an | associated with one "m=" section. Each RtpTransceiver has an | |||
| RtpSender and an RtpReceiver, which an application can use to control | RtpSender and an RtpReceiver, which an application can use to control | |||
| the sending and receiving of RTP media. The application may also | the sending and receiving of RTP media. The application may also | |||
| modify the RtpTransceiver directly, for instance, by stopping it. | modify the RtpTransceiver directly, for instance, by stopping it. | |||
| RtpTransceivers generally have a 1:1 mapping with "m=" sections, | RtpTransceivers generally have a 1:1 mapping with "m=" sections, | |||
| although there may be more RtpTransceivers than "m=" sections when | although there may be more RtpTransceivers than "m=" sections when | |||
| RtpTransceivers are created but not yet associated with an "m=" | RtpTransceivers are created but not yet associated with an "m=" | |||
| section, or if RtpTransceivers have been stopped and disassociated | section, or if RtpTransceivers have been stopped and disassociated | |||
| from "m=" sections. An RtpTransceiver is said to be associated with | from "m=" sections. An RtpTransceiver is said to be associated with | |||
| an "m=" section if its media identification (mid) property is non- | an "m=" section if its mid property is non-null, i.e., set to a valid | |||
| null; otherwise, it is said to be disassociated. The associated "m=" | Media Identification (MID) value; otherwise, it is said to be | |||
| section is determined using a mapping between transceivers and "m=" | disassociated. The associated "m=" section is determined using a | |||
| section indices, formed when creating an offer or applying a remote | mapping between transceivers and "m=" section indices, formed when | |||
| offer. | creating an offer or applying a remote offer. | |||
| An RtpTransceiver is never associated with more than one "m=" | An RtpTransceiver is never associated with more than one "m=" | |||
| section, and once a session description is applied, an "m=" section | section, and once a session description is applied, an "m=" section | |||
| is always associated with exactly one RtpTransceiver. However, in | is always associated with exactly one RtpTransceiver. However, in | |||
| certain cases where an "m=" section has been rejected, as discussed | certain cases where an "m=" section has been rejected, as discussed | |||
| in Section 5.2.2 below, that "m=" section will be "recycled" and | in Section 5.2.2 below, that "m=" section will be "recycled" and | |||
| associated with a new RtpTransceiver with a new MID value. | associated with a new RtpTransceiver with a new MID value. | |||
| RtpTransceivers can be created explicitly by the application or | RtpTransceivers can be created explicitly by the application or | |||
| implicitly by calling setRemoteDescription with an offer that adds | implicitly by calling setRemoteDescription with an offer that adds | |||
| skipping to change at page 17, line 22 ¶ | skipping to change at line 758 ¶ | |||
| 3.6.1. Creating an imageattr Attribute | 3.6.1. Creating an imageattr Attribute | |||
| The receiver will first combine any known local limits (e.g., | The receiver will first combine any known local limits (e.g., | |||
| hardware decoder capabilities or local policy) to determine the | hardware decoder capabilities or local policy) to determine the | |||
| absolute minimum and maximum sizes it can receive. If there are no | absolute minimum and maximum sizes it can receive. If there are no | |||
| known local limits, the "a=imageattr" attribute SHOULD be omitted. | known local limits, the "a=imageattr" attribute SHOULD be omitted. | |||
| If these local limits preclude receiving any video, i.e., the | If these local limits preclude receiving any video, i.e., the | |||
| degenerate case of no permitted resolutions, the "a=imageattr" | degenerate case of no permitted resolutions, the "a=imageattr" | |||
| attribute MUST be omitted, and the "m=" section MUST be marked as | attribute MUST be omitted, and the "m=" section MUST be marked as | |||
| sendonly/inactive, as appropriate. | "sendonly"/"inactive", as appropriate. | |||
| Otherwise, an "a=imageattr" attribute is created with a "recv" | Otherwise, an "a=imageattr" attribute is created with a "recv" | |||
| direction, and the resulting resolution space formed from the | direction, and the resulting resolution space formed from the | |||
| aforementioned intersection is used to specify its minimum and | aforementioned intersection is used to specify its minimum and | |||
| maximum "x=" and "y=" values. | maximum "x=" and "y=" values. | |||
| The rules here express a single set of preferences, and therefore, | The rules here express a single set of preferences, and therefore, | |||
| the "a=imageattr" "q=" value is not important. It SHOULD be set to | the "a=imageattr" "q=" value is not important. It SHOULD be set to | |||
| "1.0". | "1.0". | |||
| skipping to change at page 20, line 47 ¶ | skipping to change at line 924 ¶ | |||
| description that lists each desired encoding, and no "recv" simulcast | description that lists each desired encoding, and no "recv" simulcast | |||
| stream description. The "m=" section will also include an "a=rid" | stream description. The "m=" section will also include an "a=rid" | |||
| attribute for each encoding, as specified in [RFC8851], Section 4; | attribute for each encoding, as specified in [RFC8851], Section 4; | |||
| the use of Restriction Identifiers (RIDs, also called rid-ids or | the use of Restriction Identifiers (RIDs, also called rid-ids or | |||
| RtpStreamIds) allows the individual encodings to be disambiguated | RtpStreamIds) allows the individual encodings to be disambiguated | |||
| even though they are all part of the same "m=" section. | even though they are all part of the same "m=" section. | |||
| 3.8. Interactions with Forking | 3.8. Interactions with Forking | |||
| Some call signaling systems allow various types of forking where an | Some call signaling systems allow various types of forking where an | |||
| SDP Offer may be provided to more than one device. For example, SIP | SDP offer may be provided to more than one device. For example, SIP | |||
| [RFC3261] defines both a "parallel search" and "sequential search". | [RFC3261] defines both a "parallel search" and "sequential search". | |||
| Although these are primarily signaling-level issues that are outside | Although these are primarily signaling-level issues that are outside | |||
| the scope of JSEP, they do have some impact on the configuration of | the scope of JSEP, they do have some impact on the configuration of | |||
| the media plane that is relevant. When forking happens at the | the media plane that is relevant. When forking happens at the | |||
| signaling layer, the JavaScript application responsible for the | signaling layer, the JavaScript application responsible for the | |||
| signaling needs to make the decisions about what media should be sent | signaling needs to make the decisions about what media should be sent | |||
| or received at any point in time, as well as which remote endpoint it | or received at any point in time, as well as which remote endpoint it | |||
| should communicate with; JSEP is used to make sure the media engine | should communicate with; JSEP is used to make sure the media engine | |||
| can make the RTP and media perform as required by the application. | can make the RTP and media perform as required by the application. | |||
| The basic operations that the applications can have the media engine | The basic operations that the applications can have the media engine | |||
| skipping to change at page 24, line 4 ¶ | skipping to change at line 1071 ¶ | |||
| The set of available policies is as follows: | The set of available policies is as follows: | |||
| balanced: The first "m=" section of each type (audio, video, or | balanced: The first "m=" section of each type (audio, video, or | |||
| application) will contain transport parameters, which will allow | application) will contain transport parameters, which will allow | |||
| an answerer to unbundle that section. The second and any | an answerer to unbundle that section. The second and any | |||
| subsequent "m=" sections of each type will be marked as bundle- | subsequent "m=" sections of each type will be marked as bundle- | |||
| only. The result is that if there are N distinct media types, | only. The result is that if there are N distinct media types, | |||
| then candidates will be gathered for N media streams. This policy | then candidates will be gathered for N media streams. This policy | |||
| balances the desire to multiplex with the need to ensure that | balances the desire to multiplex with the need to ensure that | |||
| basic audio and video can still be negotiated in legacy cases. | basic audio and video can still be negotiated in legacy cases. | |||
| When acting as answerer, if there is no bundle group in the offer, | When acting as answerer, if there is no bundle group in the offer, | |||
| the implementation will reject all but the first "m=" section of | the implementation will reject all but the first "m=" section of | |||
| each type. | each type. | |||
| max-compat: All "m=" sections will contain transport parameters; | max-compat: All "m=" sections will contain transport parameters; | |||
| none will be marked as bundle-only. This policy makes no | none will be marked as bundle-only. This policy makes no | |||
| assumptions about the remote endpoint and as such will allow all | assumptions about the remote endpoint and as such will allow all | |||
| streams to be received by non-bundle-aware endpoints, but as a | streams to be received by non-bundle-aware endpoints, but as a | |||
| result requires separate candidates to be gathered for each media | result requires separate candidates to be gathered for each media | |||
| stream. | stream. | |||
| must-bundle: Only the first "m=" section will contain transport | must-bundle: Only the first "m=" section will contain transport | |||
| parameters; all streams other than the first will be marked as | parameters; all streams other than the first will be marked as | |||
| bundle-only. This policy presumes the remote endpoint supports | bundle-only. This policy presumes that the remote endpoint | |||
| multiplexing and accordingly aims to minimize candidate gathering, | supports multiplexing and accordingly aims to minimize candidate | |||
| at the cost of less compatibility with legacy endpoints. When | gathering, at the cost of less compatibility with legacy | |||
| acting as answerer, the implementation will reject any "m=" | endpoints. When acting as answerer, the implementation will | |||
| sections other than the first "m=" section, unless they are in the | reject any "m=" sections other than the first "m=" section, unless | |||
| same bundle group as that "m=" section. | they are in the same bundle group as that "m=" section. | |||
| As it provides the best trade-off between performance and | As it provides the best trade-off between performance and | |||
| compatibility with legacy endpoints, the default bundle policy MUST | compatibility with legacy endpoints, the default bundle policy MUST | |||
| be set to "balanced". | be set to "balanced". | |||
| [RFC8829] defined a policy known as "max-bundle", which, while | [RFC8829] defined a policy known as "max-bundle", which, while | |||
| defined identically to the "must-bundle" policy described above, was | defined identically to the "must-bundle" policy described above, was | |||
| implemented by some implementations according to an earlier, pre- | implemented by some implementations according to an earlier, pre- | |||
| standard definition (in which, for example, no "m=" sections were | standard definition (in which, for example, no "m=" sections were | |||
| marked as bundle-only). As a result, "max-bundle" is considered | marked as bundle-only). As a result, "max-bundle" is considered | |||
| deprecated, and implementations compliant with this specification | deprecated, and implementations compliant with this specification | |||
| SHOULD ignore attempts by the application to select this bundle | SHOULD ignore attempts by the application to select this bundle | |||
| policy (although some phase-out period may be necessary to avoid | policy (although some phase-out period may be necessary to avoid | |||
| application breakage). | application breakage). | |||
| The application can specify its preferred policy regarding use of | The application can specify its preferred policy regarding the use of | |||
| RTP/RTCP multiplexing [RFC5761] using one of the following policies: | RTP/RTCP multiplexing [RFC5761] using one of the following policies: | |||
| negotiate: The JSEP implementation will gather both RTP and RTCP | negotiate: The JSEP implementation will gather both RTP and RTCP | |||
| candidates but also will offer "a=rtcp-mux", thus allowing for | candidates but also will offer "a=rtcp-mux", thus allowing for | |||
| compatibility with either multiplexing or non-multiplexing | compatibility with either multiplexing or non-multiplexing | |||
| endpoints. | endpoints. | |||
| require: The JSEP implementation will only gather RTP candidates and | require: The JSEP implementation will only gather RTP candidates and | |||
| will insert an "a=rtcp-mux-only" indication into any new "m=" | will insert an "a=rtcp-mux-only" indication into any new "m=" | |||
| sections in offers it generates. This halves the number of | sections in offers it generates. This halves the number of | |||
| skipping to change at page 25, line 30 ¶ | skipping to change at line 1145 ¶ | |||
| compatible transceiver that was created by the most recent call to | compatible transceiver that was created by the most recent call to | |||
| setRemoteDescription and does not have a local track. Otherwise, a | setRemoteDescription and does not have a local track. Otherwise, a | |||
| new transceiver will be created, as described in Section 4.1.4. | new transceiver will be created, as described in Section 4.1.4. | |||
| 4.1.3. removeTrack | 4.1.3. removeTrack | |||
| The removeTrack method removes a MediaStreamTrack from the | The removeTrack method removes a MediaStreamTrack from the | |||
| PeerConnection, using the RtpSender argument to indicate which sender | PeerConnection, using the RtpSender argument to indicate which sender | |||
| should have its track removed. The sender's track is cleared, and | should have its track removed. The sender's track is cleared, and | |||
| the sender stops sending. Future calls to createOffer will mark the | the sender stops sending. Future calls to createOffer will mark the | |||
| "m=" section associated with the sender as recvonly (if | "m=" section associated with the sender as "recvonly" (if | |||
| transceiver.direction is sendrecv) or as inactive (if | transceiver.direction is "sendrecv") or as "inactive" (if | |||
| transceiver.direction is sendonly). | transceiver.direction is "sendonly"). | |||
| 4.1.4. addTransceiver | 4.1.4. addTransceiver | |||
| The addTransceiver method adds a new RtpTransceiver to the | The addTransceiver method adds a new RtpTransceiver to the | |||
| PeerConnection. If a MediaStreamTrack argument is provided, then the | PeerConnection. If a MediaStreamTrack argument is provided, then the | |||
| transceiver will be configured with that media type and the track | transceiver will be configured with that media type and the track | |||
| will be attached to the transceiver. Otherwise, the application MUST | will be attached to the transceiver. Otherwise, the application MUST | |||
| explicitly specify the type; this mode is useful for creating | explicitly specify the type; this mode is useful for creating | |||
| recvonly transceivers as well as for creating transceivers to which a | "recvonly" transceivers as well as for creating transceivers to which | |||
| track can be attached at some later point. | a track can be attached at some later point. | |||
| At the time of creation, the application can also specify a | At the time of creation, the application can also specify a | |||
| transceiver direction attribute, a set of MediaStreams that the | transceiver direction attribute, a set of MediaStreams that the | |||
| transceiver is associated with (allowing "LS" group assignments), and | transceiver is associated with (allowing "LS" group assignments), and | |||
| a set of encodings for the media (used for simulcast as described in | a set of encodings for the media (used for simulcast as described in | |||
| Section 3.7). | Section 3.7). | |||
| 4.1.5. onaddtrack Event | 4.1.5. onaddtrack Event | |||
| The onaddtrack event is dispatched to the application when a new | The onaddtrack event is dispatched to the application when a new | |||
| skipping to change at page 27, line 10 ¶ | skipping to change at line 1218 ¶ | |||
| generation of the SDP will follow the process defined for generating | generation of the SDP will follow the process defined for generating | |||
| an initial offer from the specification that defines the given SDP | an initial offer from the specification that defines the given SDP | |||
| line. The exact handling of initial offer generation is detailed in | line. The exact handling of initial offer generation is detailed in | |||
| Section 5.2.1 below. | Section 5.2.1 below. | |||
| In the event createOffer is called after the session is established, | In the event createOffer is called after the session is established, | |||
| createOffer will generate an offer to modify the current session | createOffer will generate an offer to modify the current session | |||
| based on any changes that have been made to the session, e.g., adding | based on any changes that have been made to the session, e.g., adding | |||
| or stopping RtpTransceivers, or requesting an ICE restart. For each | or stopping RtpTransceivers, or requesting an ICE restart. For each | |||
| existing stream, the generation of each SDP line MUST follow the | existing stream, the generation of each SDP line MUST follow the | |||
| process defined for generating an updated offer from the RFC that | process defined for generating an updated offer from the | |||
| specifies the given SDP line. For each new stream, the generation of | specification that defines the given SDP line. For each new stream, | |||
| the SDP MUST follow the process of generating an initial offer, as | the generation of the SDP MUST follow the process of generating an | |||
| mentioned above. The exact handling of subsequent offer generation | initial offer, as mentioned above. The exact handling of subsequent | |||
| is detailed in Section 5.2.2 below. | offer generation is detailed in Section 5.2.2 below. | |||
| Session descriptions generated by createOffer MUST be immediately | Session descriptions generated by createOffer MUST be immediately | |||
| usable by setLocalDescription; if a system has limited resources | usable by setLocalDescription; if a system has limited resources | |||
| (e.g., a finite number of decoders), createOffer SHOULD return an | (e.g., a finite number of decoders), createOffer SHOULD return an | |||
| offer that reflects the current state of the system, so that | offer that reflects the current state of the system, so that | |||
| setLocalDescription will succeed when it attempts to acquire those | setLocalDescription will succeed when it attempts to acquire those | |||
| resources. | resources. | |||
| Calling this method may do things such as generating new ICE | Calling this method may do things such as generating new ICE | |||
| credentials, but it does not change the PeerConnection state, trigger | credentials, but it does not change the PeerConnection state, trigger | |||
| skipping to change at page 27, line 36 ¶ | skipping to change at line 1244 ¶ | |||
| Specifically, the offer is not applied, and does not become the | Specifically, the offer is not applied, and does not become the | |||
| pending local description, until setLocalDescription is called. | pending local description, until setLocalDescription is called. | |||
| 4.1.9. createAnswer | 4.1.9. createAnswer | |||
| The createAnswer method generates a blob of SDP that contains an SDP | The createAnswer method generates a blob of SDP that contains an SDP | |||
| answer per [RFC3264] with the supported configuration for the session | answer per [RFC3264] with the supported configuration for the session | |||
| that is compatible with the parameters supplied in the most recent | that is compatible with the parameters supplied in the most recent | |||
| call to setRemoteDescription; setRemoteDescription MUST have been | call to setRemoteDescription; setRemoteDescription MUST have been | |||
| called prior to calling createAnswer. Like createOffer, the returned | called prior to calling createAnswer. Like createOffer, the returned | |||
| blob contains descriptions of the media added to this PeerConnection, | blob contains descriptions of the media added to this PeerConnection; | |||
| the codec, RTP, and RTCP options supported by the application, and | the codec, RTP, and RTCP options supported by the application; and | |||
| any candidates that have been gathered by the ICE agent. An options | any candidates that have been gathered by the ICE agent. An options | |||
| parameter may be supplied to provide additional control over the | parameter may be supplied to provide additional control over the | |||
| generated answer. | generated answer. | |||
| As an answer, the generated SDP will contain a specific configuration | As an answer, the generated SDP will contain a specific configuration | |||
| that specifies how the media plane should be established; for each | that specifies how the media plane should be established; for each | |||
| SDP line, the generation of the SDP MUST follow the process defined | SDP line, the generation of the SDP MUST follow the process defined | |||
| for generating an answer from the specification that defines the | for generating an answer from the specification that defines the | |||
| given SDP line. The exact handling of answer generation is detailed | given SDP line. The exact handling of answer generation is detailed | |||
| in Section 5.3 below. | in Section 5.3 below. | |||
| skipping to change at page 28, line 27 ¶ | skipping to change at line 1283 ¶ | |||
| "offer" indicates that a description MUST be parsed as an offer; said | "offer" indicates that a description MUST be parsed as an offer; said | |||
| description may include many possible media configurations. A | description may include many possible media configurations. A | |||
| description used as an "offer" may be applied any time the | description used as an "offer" may be applied any time the | |||
| PeerConnection is in a "stable" state or applied as an update to a | PeerConnection is in a "stable" state or applied as an update to a | |||
| previously supplied but unanswered "offer". | previously supplied but unanswered "offer". | |||
| "pranswer" indicates that a description MUST be parsed as an answer, | "pranswer" indicates that a description MUST be parsed as an answer, | |||
| but not a final answer, and so MUST NOT result in the freeing of | but not a final answer, and so MUST NOT result in the freeing of | |||
| allocated resources. It may result in the start of media | allocated resources. It may result in the start of media | |||
| transmission, if the answer does not specify an inactive media | transmission, if the answer does not specify an "inactive" media | |||
| direction. A description used as a "pranswer" may be applied as a | direction. A description used as a "pranswer" may be applied as a | |||
| response to an "offer" or as an update to a previously sent | response to an "offer" or as an update to a previously sent | |||
| "pranswer". | "pranswer". | |||
| "answer" indicates that a description MUST be parsed as an answer, | "answer" indicates that a description MUST be parsed as an answer, | |||
| the offer/answer exchange MUST be considered complete, and any | the offer/answer exchange MUST be considered complete, and any | |||
| resources (decoders, candidates) that are no longer needed SHOULD be | resources (decoders, candidates) that are no longer needed SHOULD be | |||
| released. A description used as an "answer" may be applied as a | released. A description used as an "answer" may be applied as a | |||
| response to an "offer" or as an update to a previously sent | response to an "offer" or as an update to a previously sent | |||
| "pranswer". | "pranswer". | |||
| skipping to change at page 29, line 30 ¶ | skipping to change at line 1332 ¶ | |||
| MediaStreamTrack and create a new "sendrecv" offer to update the | MediaStreamTrack and create a new "sendrecv" offer to update the | |||
| previous offer/answer pair and start bidirectional media flow. While | previous offer/answer pair and start bidirectional media flow. While | |||
| this could also be done with a "sendonly" pranswer followed by a | this could also be done with a "sendonly" pranswer followed by a | |||
| "sendrecv" answer, the initial pranswer leaves the offer/answer | "sendrecv" answer, the initial pranswer leaves the offer/answer | |||
| exchange open, which means that the caller cannot send an updated | exchange open, which means that the caller cannot send an updated | |||
| offer during this time. | offer during this time. | |||
| As an example, consider a typical JSEP application that wants to set | As an example, consider a typical JSEP application that wants to set | |||
| up audio and video as quickly as possible. When the callee receives | up audio and video as quickly as possible. When the callee receives | |||
| an offer with audio and video MediaStreamTracks, it will send an | an offer with audio and video MediaStreamTracks, it will send an | |||
| immediate answer accepting these tracks as sendonly (meaning that the | immediate answer accepting these tracks as "sendonly" (meaning that | |||
| caller will not send the callee any media yet, and because the callee | the caller will not send the callee any media yet, and because the | |||
| has not yet added its own MediaStreamTracks, the callee will not send | callee has not yet added its own MediaStreamTracks, the callee will | |||
| any media either). It will then ask the user to accept the call and | not send any media either). It will then ask the user to accept the | |||
| acquire the needed local tracks. Upon acceptance by the user, the | call and acquire the needed local tracks. Upon acceptance by the | |||
| application will plug in the tracks it has acquired, which, because | user, the application will plug in the tracks it has acquired, which, | |||
| ICE handshaking and DTLS handshaking have likely completed by this | because ICE handshaking and DTLS handshaking have likely completed by | |||
| point, can start transmitting immediately. The application will also | this point, can start transmitting immediately. The application will | |||
| send a new offer to the remote side indicating call acceptance and | also send a new offer to the remote side indicating call acceptance | |||
| moving the audio and video to be two-way media. A detailed example | and moving the audio and video to be two-way media. A detailed | |||
| flow along these lines is shown in Section 7.3. | example flow along these lines is shown in Section 7.3. | |||
| Of course, some applications may not be able to perform this double | Of course, some applications may not be able to perform this double | |||
| offer/answer exchange, particularly ones that are attempting to | offer/answer exchange, particularly ones that are attempting to | |||
| gateway to legacy signaling protocols. In these cases, pranswer can | gateway to legacy signaling protocols. In these cases, pranswer can | |||
| still provide the application with a mechanism to warm up the | still provide the application with a mechanism to warm up the | |||
| transport. | transport. | |||
| 4.1.10.2. Rollback | 4.1.10.2. Rollback | |||
| In certain situations, it may be desirable to "undo" a change made to | In certain situations, it may be desirable to "undo" a change made to | |||
| skipping to change at page 33, line 13 ¶ | skipping to change at line 1484 ¶ | |||
| cannot support trickle. | cannot support trickle. | |||
| As described in Section 3.5.2, JSEP implementations always provide | As described in Section 3.5.2, JSEP implementations always provide | |||
| candidates to the application individually, consistent with what is | candidates to the application individually, consistent with what is | |||
| needed for Trickle ICE. However, applications can use the | needed for Trickle ICE. However, applications can use the | |||
| canTrickleIceCandidates property to determine whether their peer can | canTrickleIceCandidates property to determine whether their peer can | |||
| actually do Trickle ICE, i.e., whether it is safe to send an initial | actually do Trickle ICE, i.e., whether it is safe to send an initial | |||
| offer or answer followed later by candidates as they are gathered. | offer or answer followed later by candidates as they are gathered. | |||
| As "true" is the only value that definitively indicates remote | As "true" is the only value that definitively indicates remote | |||
| Trickle ICE support, an application that compares | Trickle ICE support, an application that compares | |||
| canTrickleIceCandidates against "true" will by default attempt Half | canTrickleIceCandidates against "true" will by default attempt half | |||
| Trickle on initial offers and Full Trickle on subsequent interactions | trickle on initial offers and full trickle on subsequent interactions | |||
| with a Trickle ICE-compatible agent. | with a Trickle ICE-compatible agent. | |||
| 4.1.18. setConfiguration | 4.1.18. setConfiguration | |||
| The setConfiguration method allows the global configuration of the | The setConfiguration method allows the global configuration of the | |||
| PeerConnection, which was initially set by constructor parameters, to | PeerConnection, which was initially set by constructor parameters, to | |||
| be changed during the session. The effects of calling this method | be changed during the session. The effects of calling this method | |||
| depend on when it is invoked, and they will differ, depending on | depend on when it is invoked, and they will differ, depending on | |||
| which specific parameters are changed: | which specific parameters are changed: | |||
| skipping to change at page 34, line 34 ¶ | skipping to change at line 1553 ¶ | |||
| "m=" sections in the specified ICE candidate generation. However, if | "m=" sections in the specified ICE candidate generation. However, if | |||
| both fields are null for a new remote candidate, this MUST be treated | both fields are null for a new remote candidate, this MUST be treated | |||
| as an invalid condition, as specified below. | as an invalid condition, as specified below. | |||
| If any IceCandidate fields contain invalid values or an error occurs | If any IceCandidate fields contain invalid values or an error occurs | |||
| during the processing of the IceCandidate object, the supplied | during the processing of the IceCandidate object, the supplied | |||
| IceCandidate MUST be ignored and an error MUST be returned. | IceCandidate MUST be ignored and an error MUST be returned. | |||
| Otherwise, the new remote candidate or end-of-candidates indication | Otherwise, the new remote candidate or end-of-candidates indication | |||
| is supplied to the ICE agent. In the case of a new remote candidate, | is supplied to the ICE agent. In the case of a new remote candidate, | |||
| connectivity checks will be sent to the new candidate, assuming | connectivity checks will be sent to the new candidate, assuming that | |||
| setLocalDescription has already been called to initialize the ICE | setLocalDescription has already been called to initialize the ICE | |||
| gathering process. | gathering process. | |||
| 4.1.20. onicecandidate Event | 4.1.20. onicecandidate Event | |||
| The onicecandidate event is dispatched to the application in two | The onicecandidate event is dispatched to the application in two | |||
| situations: (1) when the ICE agent has discovered a new allowed local | situations: (1) when the ICE agent has discovered a new allowed local | |||
| ICE candidate during ICE gathering, as outlined in Section 3.5.1 and | ICE candidate during ICE gathering, as outlined in Section 3.5.1 and | |||
| subject to the restrictions discussed in Section 3.5.3, or (2) when | subject to the restrictions discussed in Section 3.5.3, or (2) when | |||
| an ICE gathering phase completes. The event contains a single | an ICE gathering phase completes. The event contains a single | |||
| skipping to change at page 35, line 12 ¶ | skipping to change at line 1578 ¶ | |||
| candidate will also be added to the current and/or pending local | candidate will also be added to the current and/or pending local | |||
| description according to the rules defined for Trickle ICE. | description according to the rules defined for Trickle ICE. | |||
| In the second case, the event's IceCandidate object MUST have its | In the second case, the event's IceCandidate object MUST have its | |||
| candidate field set to null to indicate that the current gathering | candidate field set to null to indicate that the current gathering | |||
| phase is complete, i.e., there will be no further onicecandidate | phase is complete, i.e., there will be no further onicecandidate | |||
| events in this phase. However, the IceCandidate's ufrag field MUST | events in this phase. However, the IceCandidate's ufrag field MUST | |||
| be specified to indicate which ICE candidate generation is ending. | be specified to indicate which ICE candidate generation is ending. | |||
| The IceCandidate's "m=" section index and MID fields MAY be specified | The IceCandidate's "m=" section index and MID fields MAY be specified | |||
| to indicate that the event applies to a specific "m=" section, or set | to indicate that the event applies to a specific "m=" section, or set | |||
| to null to indicate it applies to all "m=" sections in the current | to null to indicate that it applies to all "m=" sections in the | |||
| ICE candidate generation. This event can be used by the application | current ICE candidate generation. This event can be used by the | |||
| to generate an end-of-candidates indication, as defined in [RFC8838], | application to generate an end-of-candidates indication, as defined | |||
| Section 13. | in [RFC8838], Section 13. | |||
| 4.2. RtpTransceiver | 4.2. RtpTransceiver | |||
| 4.2.1. stop | 4.2.1. stop | |||
| The stop method stops an RtpTransceiver. This will cause future | The stop method stops an RtpTransceiver. This will cause future | |||
| calls to createOffer to generate a zero port for the associated "m=" | calls to createOffer to generate a zero port for the associated "m=" | |||
| section. See below for more details. | section. See below for more details. | |||
| 4.2.2. stopped | 4.2.2. stopped | |||
| skipping to change at page 36, line 5 ¶ | skipping to change at line 1615 ¶ | |||
| future calls to createOffer and createAnswer. The permitted values | future calls to createOffer and createAnswer. The permitted values | |||
| for direction are "recvonly", "sendrecv", "sendonly", and "inactive", | for direction are "recvonly", "sendrecv", "sendonly", and "inactive", | |||
| mirroring the identically named direction attributes defined in | mirroring the identically named direction attributes defined in | |||
| [RFC4566], Section 6. | [RFC4566], Section 6. | |||
| When creating offers, the transceiver direction is directly reflected | When creating offers, the transceiver direction is directly reflected | |||
| in the output, even for re-offers. When creating answers, the | in the output, even for re-offers. When creating answers, the | |||
| transceiver direction is intersected with the offered direction, as | transceiver direction is intersected with the offered direction, as | |||
| explained in Section 5.3 below. | explained in Section 5.3 below. | |||
| Note that while setDirection sets the direction property of the | Note that while setDirection sets the direction property | |||
| transceiver immediately (Section 4.2.4), this property does not | (Section 4.2.4) of the transceiver immediately, this property does | |||
| immediately affect whether the transceiver's RtpSender will send or | not immediately affect whether the transceiver's RtpSender will send | |||
| its RtpReceiver will receive. The direction in effect is represented | or its RtpReceiver will receive. The direction in effect is | |||
| by the currentDirection property, which is only updated when an | represented by the currentDirection property, which is only updated | |||
| answer is applied. | when an answer is applied. | |||
| 4.2.4. direction | 4.2.4. direction | |||
| The direction property indicates the last value passed into | The direction property indicates the last value passed into | |||
| setDirection. If setDirection has never been called, it is set to | setDirection. If setDirection has never been called, it is set to | |||
| the direction the transceiver was initialized with. | the direction the transceiver was initialized with. | |||
| 4.2.5. currentDirection | 4.2.5. currentDirection | |||
| The currentDirection property indicates the last negotiated direction | The currentDirection property indicates the last negotiated direction | |||
| for the transceiver's associated "m=" section. More specifically, it | for the transceiver's associated "m=" section. More specifically, it | |||
| indicates the direction attribute [RFC3264] of the associated "m=" | indicates the direction attribute [RFC3264] of the associated "m=" | |||
| section in the last applied answer (including provisional answers), | section in the last applied answer (including provisional answers), | |||
| with "send" and "recv" directions reversed if it was a remote answer. | with the direction reversed if it was a remote answer. For example, | |||
| For example, if the direction attribute for the associated "m=" | if the direction attribute for the associated "m=" section in a | |||
| section in a remote answer is "recvonly", currentDirection is set to | remote answer is "recvonly", currentDirection is set to "sendonly". | |||
| "sendonly". | ||||
| If an answer that references this transceiver has not yet been | If an answer that references this transceiver has not yet been | |||
| applied or if the transceiver is stopped, currentDirection is set to | applied or if the transceiver is stopped, currentDirection is set to | |||
| "null". | null. | |||
| 4.2.6. setCodecPreferences | 4.2.6. setCodecPreferences | |||
| The setCodecPreferences method sets the codec preferences of a | The setCodecPreferences method sets the codec preferences of a | |||
| transceiver, which in turn affect the presence and order of codecs of | transceiver, which in turn affect the presence and order of codecs of | |||
| the associated "m=" section on future calls to createOffer and | the associated "m=" section on future calls to createOffer and | |||
| createAnswer. Note that setCodecPreferences does not directly affect | createAnswer. Note that setCodecPreferences does not directly affect | |||
| which codec the implementation decides to send. It only affects | which codec the implementation decides to send. It only affects | |||
| which codecs the implementation indicates that it prefers to receive, | which codecs the implementation indicates that it prefers to receive, | |||
| via the offer or answer. Even when a codec is excluded by | via the offer or answer. Even when a codec is excluded by | |||
| skipping to change at page 37, line 34 ¶ | skipping to change at line 1689 ¶ | |||
| If any of these are absent, this omission MUST be treated as an | If any of these are absent, this omission MUST be treated as an | |||
| error. | error. | |||
| * ICE, as specified in [RFC8445], MUST be used. Note that the | * ICE, as specified in [RFC8445], MUST be used. Note that the | |||
| remote endpoint may use a lite implementation; implementations | remote endpoint may use a lite implementation; implementations | |||
| MUST properly handle remote endpoints that use ICE-lite. The | MUST properly handle remote endpoints that use ICE-lite. The | |||
| remote endpoint may also use an older version of ICE; | remote endpoint may also use an older version of ICE; | |||
| implementations MUST properly handle remote endpoints that use ICE | implementations MUST properly handle remote endpoints that use ICE | |||
| as specified in [RFC5245]. | as specified in [RFC5245]. | |||
| * DTLS [RFC6347] or DTLS-SRTP [RFC5763] MUST be used, as appropriate | * DTLS [RFC6347] [RFC9147] or DTLS-SRTP [RFC5763] MUST be used, as | |||
| for the media type, as specified in [RFC8827]. | appropriate for the media type, as specified in [RFC8827]. Note: | |||
| RFC 8827 requires implementations to support DTLS 1.2 [RFC6347] | ||||
| and permits the use of DTLS 1.3 [RFC9147]. | ||||
| The SDP security descriptions mechanism for SRTP keying [RFC4568] | The SDP security descriptions mechanism for Secure Real-time | |||
| MUST NOT be used, as discussed in [RFC8827]. | Transport Protocol (SRTP) keying [RFC4568] MUST NOT be used, as | |||
| discussed in [RFC8827]. | ||||
| 5.1.2. Profile Names and Interoperability | 5.1.2. Profile Names and Interoperability | |||
| For media "m=" sections, JSEP implementations MUST support the | For media "m=" sections, JSEP implementations MUST support the | |||
| "UDP/TLS/RTP/SAVPF" profile specified in [RFC5764] as well as the | "UDP/TLS/RTP/SAVPF" profile specified in [RFC5764] as well as the | |||
| "TCP/DTLS/RTP/SAVPF" profile specified in [RFC7850] and MUST indicate | "TCP/DTLS/RTP/SAVPF" profile specified in [RFC7850] and MUST indicate | |||
| one of these profiles for each media "m=" line they produce in an | one of these profiles for each media "m=" line they produce in an | |||
| offer. For data "m=" sections, implementations MUST support the | offer. For data "m=" sections, implementations MUST support the | |||
| "UDP/DTLS/SCTP" profile as well as the "TCP/DTLS/SCTP" profile and | "UDP/DTLS/SCTP" profile as well as the "TCP/DTLS/SCTP" profile and | |||
| MUST indicate one of these profiles for each data "m=" line they | MUST indicate one of these profiles for each data "m=" line they | |||
| skipping to change at page 41, line 8 ¶ | skipping to change at line 1852 ¶ | |||
| all have the same fingerprint value or values [RFC8122], or these | all have the same fingerprint value or values [RFC8122], or these | |||
| values MUST be session-level attributes. | values MUST be session-level attributes. | |||
| Each "m=" section MUST be generated as specified in [RFC4566], | Each "m=" section MUST be generated as specified in [RFC4566], | |||
| Section 5.14. For the "m=" line itself, the following rules MUST be | Section 5.14. For the "m=" line itself, the following rules MUST be | |||
| followed: | followed: | |||
| * If the "m=" section is marked as bundle-only, then the <port> | * If the "m=" section is marked as bundle-only, then the <port> | |||
| value MUST be set to zero. Otherwise, the <port> value is set to | value MUST be set to zero. Otherwise, the <port> value is set to | |||
| the port of the default ICE candidate for this "m=" section, but | the port of the default ICE candidate for this "m=" section, but | |||
| given that no candidates are available yet, the default port value | given that no candidates are available yet, the default <port> | |||
| of 9 (Discard) MUST be used, as indicated in [RFC8840], | value of 9 (Discard) MUST be used, as indicated in [RFC8840], | |||
| Section 4.1.1. | Section 4.1.1. | |||
| * To properly indicate use of DTLS, the <proto> field MUST be set to | * To properly indicate use of DTLS, the <proto> field MUST be set to | |||
| "UDP/TLS/RTP/SAVPF", as specified in [RFC5764], Section 8. | "UDP/TLS/RTP/SAVPF", as specified in [RFC5764], Section 8. | |||
| * If codec preferences have been set for the associated transceiver, | * If codec preferences have been set for the associated transceiver, | |||
| media formats MUST be generated in the corresponding order and | media formats MUST be generated in the corresponding order and | |||
| MUST exclude any codecs not present in the codec preferences. | MUST exclude any codecs not present in the codec preferences. | |||
| * Unless excluded by the above restrictions, the media formats MUST | * Unless excluded by the above restrictions, the media formats MUST | |||
| skipping to change at page 42, line 15 ¶ | skipping to change at line 1908 ¶ | |||
| * For each primary codec where RTP retransmission should be used, a | * For each primary codec where RTP retransmission should be used, a | |||
| corresponding "a=rtpmap" line indicating "rtx" with the clock rate | corresponding "a=rtpmap" line indicating "rtx" with the clock rate | |||
| of the primary codec and an "a=fmtp" line that references the | of the primary codec and an "a=fmtp" line that references the | |||
| payload type of the primary codec, as specified in [RFC4588], | payload type of the primary codec, as specified in [RFC4588], | |||
| Section 8.1. | Section 8.1. | |||
| * For each Forward Error Correction (FEC) mechanism supported by the | * For each Forward Error Correction (FEC) mechanism supported by the | |||
| application, "a=rtpmap" and "a=fmtp" lines, as specified in | application, "a=rtpmap" and "a=fmtp" lines, as specified in | |||
| [RFC4566], Section 6. The FEC mechanisms that MUST be supported | [RFC4566], Section 6. The FEC mechanisms that MUST be supported | |||
| are specified in [RFC8854], Section 7, and specific usage for each | are specified in [RFC8854], Section 7, and specific usage for each | |||
| media type is outlined in Sections 4 and 5. | media type is outlined in Sections 4 and 5 of [RFC8854]. | |||
| * If this "m=" section is for media with configurable durations of | * If this "m=" section is for media with configurable durations of | |||
| media per packet, e.g., audio, an "a=maxptime" line, indicating | media per packet, e.g., audio, an "a=maxptime" line, indicating | |||
| the maximum amount of media, specified in milliseconds, that can | the maximum amount of media, specified in milliseconds, that can | |||
| be encapsulated in each packet, as specified in [RFC4566], | be encapsulated in each packet, as specified in [RFC4566], | |||
| Section 6. This value is set to the smallest of the maximum | Section 6. This value is set to the smallest of the maximum | |||
| duration values across all the codecs included in the "m=" | duration values across all the codecs included in the "m=" | |||
| section. | section. | |||
| * If this "m=" section is for video media and there are known | * If this "m=" section is for video media and there are known | |||
| skipping to change at page 42, line 40 ¶ | skipping to change at line 1933 ¶ | |||
| "a=extmap" line, as specified in [RFC5285], Section 5. The list | "a=extmap" line, as specified in [RFC5285], Section 5. The list | |||
| of header extensions that SHOULD/MUST be supported is specified in | of header extensions that SHOULD/MUST be supported is specified in | |||
| [RFC8834], Section 5.2. Any header extensions that require | [RFC8834], Section 5.2. Any header extensions that require | |||
| encryption MUST be specified as indicated in [RFC6904], Section 4. | encryption MUST be specified as indicated in [RFC6904], Section 4. | |||
| * For each RTCP feedback mechanism supported by the application, an | * For each RTCP feedback mechanism supported by the application, an | |||
| "a=rtcp-fb" line, as specified in [RFC4585], Section 4.2. The | "a=rtcp-fb" line, as specified in [RFC4585], Section 4.2. The | |||
| list of RTCP feedback mechanisms that SHOULD/MUST be supported is | list of RTCP feedback mechanisms that SHOULD/MUST be supported is | |||
| specified in [RFC8834], Section 5.1. | specified in [RFC8834], Section 5.1. | |||
| * If the RtpTransceiver has a sendrecv or sendonly direction: | * If the RtpTransceiver has a "sendrecv" or "sendonly" direction: | |||
| - For each MediaStream that was associated with the transceiver | - For each MediaStream that was associated with the transceiver | |||
| when it was created via addTrack or addTransceiver, an "a=msid" | when it was created via addTrack or addTransceiver, an "a=msid" | |||
| line, as specified in [RFC8830], Section 2, but omitting the | line, as specified in [RFC8830], Section 2, but omitting the | |||
| "appdata" field. | "appdata" field. | |||
| * If the RtpTransceiver has a sendrecv or sendonly direction, and | * If the RtpTransceiver has a "sendrecv" or "sendonly" direction, | |||
| the application has specified a rid-id for an encoding, or has | and the application has specified a rid-id for an encoding, or has | |||
| specified more than one encoding in the RtpSenders's parameters, | specified more than one encoding in the RtpSenders's parameters, | |||
| an "a=rid" line for each encoding specified. The "a=rid" line is | an "a=rid" line for each encoding specified. The "a=rid" line is | |||
| specified in [RFC8851], and its direction MUST be "send". If the | specified in [RFC8851], and its direction MUST be "send". If the | |||
| application has chosen a rid-id, it MUST be used; otherwise, a | application has chosen a rid-id, it MUST be used; otherwise, a | |||
| rid-id MUST be generated by the implementation. rid-ids MUST be | rid-id MUST be generated by the implementation. rid-ids MUST be | |||
| generated in a fashion that does not leak user information, e.g., | generated in a fashion that does not leak user information, e.g., | |||
| randomly or using a per-PeerConnection counter (see guidance at | randomly or using a per-PeerConnection counter (see guidance at | |||
| the end of [RFC8852], Section 3.3), and SHOULD be 3 bytes or less, | the end of [RFC8852], Section 3.3), and SHOULD be 3 bytes or less, | |||
| to allow them to efficiently fit into the RTP header extensions | to allow them to efficiently fit into the RTP header extensions | |||
| defined in [RFC8852], Section 3.3. If no encodings have been | defined in [RFC8852], Section 3.3. If no encodings have been | |||
| specified, or only one encoding is specified but without a rid-id, | specified, or only one encoding is specified but without a rid-id, | |||
| then no "a=rid" lines are generated. | then no "a=rid" lines are generated. | |||
| * If the RtpTransceiver has a sendrecv or sendonly direction and | * If the RtpTransceiver has a "sendrecv" or "sendonly" direction and | |||
| more than one "a=rid" line has been generated, an "a=simulcast" | more than one "a=rid" line has been generated, an "a=simulcast" | |||
| line, with direction "send", as defined in [RFC8853], Section 5.1. | line, with direction "send", as defined in [RFC8853], Section 5.1. | |||
| The associated set of rid-ids MUST include all of the rid-ids used | The associated set of rid-ids MUST include all of the rid-ids used | |||
| in the "a=rid" lines for this "m=" section. | in the "a=rid" lines for this "m=" section. | |||
| * If (1) the bundle policy for this PeerConnection is set to "must- | * If (1) the bundle policy for this PeerConnection is set to "must- | |||
| bundle" and this is not the first "m=" section or (2) the bundle | 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 | policy is set to "balanced" and this is not the first "m=" section | |||
| for this media type, an "a=bundle-only" line. | for this media type, an "a=bundle-only" line. | |||
| skipping to change at page 44, line 11 ¶ | skipping to change at line 2000 ¶ | |||
| * If the RTP/RTCP multiplexing policy is "require", an "a=rtcp-mux- | * If the RTP/RTCP multiplexing policy is "require", an "a=rtcp-mux- | |||
| only" line, as specified in [RFC8858], Section 4. | only" line, as specified in [RFC8858], Section 4. | |||
| * An "a=rtcp-rsize" line, as specified in [RFC5506], Section 5. | * An "a=rtcp-rsize" line, as specified in [RFC5506], Section 5. | |||
| Lastly, if a data channel has been created, an "m=" section MUST be | Lastly, if a data channel has been created, an "m=" section MUST be | |||
| generated for data. The <media> field MUST be set to "application", | generated for data. The <media> field MUST be set to "application", | |||
| and the <proto> field MUST be set to "UDP/DTLS/SCTP" [RFC8841]. The | and the <proto> field MUST be set to "UDP/DTLS/SCTP" [RFC8841]. The | |||
| <fmt> value MUST be set to "webrtc-datachannel" as specified in | <fmt> value MUST be set to "webrtc-datachannel" as specified in | |||
| [RFC8841], Section 4.2.2. | [RFC8841], Section 4.4.2. | |||
| Within the data "m=" section, an "a=mid" line MUST be generated and | Within the data "m=" section, an "a=mid" line MUST be generated and | |||
| included as described above, along with an "a=sctp-port" line | included as described above, along with an "a=sctp-port" line | |||
| referencing the SCTP port number, as defined in [RFC8841], | referencing the SCTP port number, as defined in [RFC8841], | |||
| Section 5.1; and, if appropriate, an "a=max-message-size" line, as | Section 5.1; and, if appropriate, an "a=max-message-size" line, as | |||
| defined in [RFC8841], Section 6.1. | defined in [RFC8841], Section 6.1. | |||
| As discussed above, the following attributes of category IDENTICAL or | As discussed above, the following attributes of category IDENTICAL or | |||
| TRANSPORT are included only if the data "m=" section either has a | TRANSPORT are included only if the data "m=" section either has a | |||
| unique address or is associated with the BUNDLE-tag (e.g., if it is | unique address or is associated with the BUNDLE-tag (e.g., if it is | |||
| skipping to change at page 44, line 36 ¶ | skipping to change at line 2025 ¶ | |||
| * "a=ice-pwd" | * "a=ice-pwd" | |||
| * "a=fingerprint" | * "a=fingerprint" | |||
| * "a=setup" | * "a=setup" | |||
| * "a=tls-id" | * "a=tls-id" | |||
| Once all "m=" sections have been generated, a session-level "a=group" | Once all "m=" sections have been generated, a session-level "a=group" | |||
| attribute MUST be added as specified in [RFC5888]. This attribute | attribute MUST be added as specified in [RFC5888]. This attribute | |||
| MUST have semantics "BUNDLE" and MUST include the mid identifiers of | MUST have semantics "BUNDLE" and MUST include the MID identifiers of | |||
| each "m=" section. The effect of this is that the JSEP | each "m=" section. The effect of this is that the JSEP | |||
| implementation offers all "m=" sections as one bundle group. | implementation offers all "m=" sections as one bundle group. | |||
| However, whether the "m=" sections are bundle-only or not depends on | However, whether the "m=" sections are bundle-only or not depends on | |||
| the bundle policy. | the bundle policy. | |||
| The next step is to generate session-level lip sync groups as defined | The next step is to generate session-level lip sync groups as defined | |||
| in [RFC5888], Section 7. For each MediaStream referenced by more | in [RFC5888], Section 7. For each MediaStream referenced by more | |||
| than one RtpTransceiver (by passing those MediaStreams as arguments | than one RtpTransceiver (by passing those MediaStreams as arguments | |||
| to the addTrack and addTransceiver methods), a group of type "LS" | to the addTrack and addTransceiver methods), a group of type "LS" | |||
| MUST be added that contains the MID values for each RtpTransceiver. | MUST be added that contains the MID values for each RtpTransceiver. | |||
| skipping to change at page 49, line 6 ¶ | skipping to change at line 2235 ¶ | |||
| section. | section. | |||
| The "a=group:BUNDLE" attribute MUST include the MID identifiers | The "a=group:BUNDLE" attribute MUST include the MID identifiers | |||
| specified in the bundle group in the most recent answer, minus any | specified in the bundle group in the most recent answer, minus any | |||
| "m=" sections that have been marked as rejected, plus any newly added | "m=" sections that have been marked as rejected, plus any newly added | |||
| or re-enabled "m=" sections. In other words, the bundle attribute | or re-enabled "m=" sections. In other words, the bundle attribute | |||
| MUST contain all "m=" sections that were previously bundled, as long | MUST contain all "m=" sections that were previously bundled, as long | |||
| as they are still alive, as well as any new "m=" sections. | as they are still alive, as well as any new "m=" sections. | |||
| Note that if bundling has been negotiated, unbundling is no longer | Note that if bundling has been negotiated, unbundling is no longer | |||
| possible, and media sections will not be marked as bundle-only. This | possible, and media sections will not be marked as bundle-only. | |||
| is by design, but could cause issues in the rare case of sending a | Although this is by design, it could cause issues in the rare case of | |||
| subsequent offer as an initial offer to a non-bundle-aware endpoint | sending a subsequent offer as an initial offer to a non-bundle-aware | |||
| via Third Party Call Control (3PCC), as discussed in [RFC9143], | endpoint via Third Party Call Control (3PCC), as discussed in | |||
| Section 7.6. | [RFC9143], Section 7.6. | |||
| "a=group:LS" attributes are generated in the same way as for initial | "a=group:LS" attributes are generated in the same way as for initial | |||
| offers, with the additional stipulation that any lip sync groups that | offers, with the additional stipulation that any lip sync groups that | |||
| were present in the most recent answer MUST continue to exist and | were present in the most recent answer MUST continue to exist and | |||
| MUST contain any previously existing MID identifiers, as long as the | MUST contain any previously existing MID identifiers, as long as the | |||
| identified "m=" sections still exist and are not rejected, and the | identified "m=" sections still exist and are not rejected, and the | |||
| group still contains at least two MID identifiers. This ensures that | group still contains at least two MID identifiers. This ensures that | |||
| any synchronized "recvonly" "m=" sections continue to be synchronized | any synchronized "recvonly" "m=" sections continue to be synchronized | |||
| in the new offer. | in the new offer. | |||
| 5.2.3. Options Handling | 5.2.3. Options Handling | |||
| The createOffer method takes as a parameter an RTCOfferOptions | The createOffer method takes as a parameter an RTCOfferOptions | |||
| object. Special processing is performed when generating an SDP | object. Special processing is performed when generating an SDP | |||
| description if the following options are present. | description if the following options are present. | |||
| 5.2.3.1. IceRestart | 5.2.3.1. IceRestart | |||
| If the IceRestart option is specified, with a value of "true", the | If the IceRestart option is specified, with a value of "true", the | |||
| offer MUST indicate an ICE restart by generating new ICE ufrag and | offer MUST indicate an ICE restart by generating new ICE ufrag and | |||
| pwd attributes, as specified in [RFC8839], Section 4.4.3.1.1. If | pwd attributes, as specified in [RFC8839], Section 4.4.1.1.1. If | |||
| this option is specified on an initial offer, it has no effect (since | this option is specified on an initial offer, it has no effect (since | |||
| a new ICE ufrag and pwd are already generated). Similarly, if the | a new ICE ufrag and pwd are already generated). Similarly, if the | |||
| ICE configuration has changed, this option has no effect, since new | ICE configuration has changed, this option has no effect, since new | |||
| ufrag and pwd attributes will be generated automatically. This | ufrag and pwd attributes will be generated automatically. This | |||
| option is primarily useful for reestablishing connectivity in cases | option is primarily useful for reestablishing connectivity in cases | |||
| where failures are detected by the application. | where failures are detected by the application. | |||
| 5.2.3.2. VoiceActivityDetection | 5.2.3.2. VoiceActivityDetection | |||
| Silence suppression, also known as discontinuous transmission | Silence suppression, also known as discontinuous transmission | |||
| ("DTX"), can reduce the bandwidth used for audio by switching to a | ("DTX"), can reduce the bandwidth used for audio by switching to a | |||
| special encoding when voice activity is not detected, at the cost of | special encoding when voice activity is not detected, at the cost of | |||
| some fidelity. | some fidelity. | |||
| If the "VoiceActivityDetection" option is specified, with a value of | If the VoiceActivityDetection option is specified, with a value of | |||
| "true", the offer MUST indicate support for silence suppression in | "true", the offer MUST indicate support for silence suppression in | |||
| the audio it receives by including comfort noise ("CN") codecs for | the audio it receives by including comfort noise ("CN") codecs for | |||
| each offered audio codec, as specified in [RFC3389], Section 5.1, | each offered audio codec, as specified in [RFC3389], Section 5.1, | |||
| except for codecs that have their own internal silence suppression | except for codecs that have their own internal silence suppression | |||
| support. For codecs that have their own internal silence suppression | support. For codecs that have their own internal silence suppression | |||
| support, the appropriate fmtp parameters for that codec MUST be | support, the appropriate fmtp parameters for each such codec MUST be | |||
| specified to indicate that silence suppression for received audio is | specified to indicate that silence suppression for received audio is | |||
| desired. For example, when using the Opus codec [RFC6716], the | desired. For example, when using the Opus codec [RFC6716], the | |||
| "usedtx=1" parameter, specified in [RFC7587], would be used in the | "usedtx=1" parameter, specified in [RFC7587], would be used in the | |||
| offer. | offer. | |||
| If the "VoiceActivityDetection" option is specified, with a value of | If the VoiceActivityDetection option is specified, with a value of | |||
| "false", the JSEP implementation MUST NOT emit "CN" codecs. For | "false", the JSEP implementation MUST NOT emit "CN" codecs. For | |||
| codecs that have their own internal silence suppression support, the | codecs that have their own internal silence suppression support, the | |||
| appropriate fmtp parameters for that codec MUST be specified to | appropriate fmtp parameters for each such codec MUST be specified to | |||
| indicate that silence suppression for received audio is not desired. | indicate that silence suppression for received audio is not desired. | |||
| For example, when using the Opus codec, the "usedtx=0" parameter | For example, when using the Opus codec, the "usedtx=0" parameter | |||
| would be specified in the offer. In addition, the implementation | would be specified in the offer. In addition, the implementation | |||
| MUST NOT use silence suppression for media it generates, regardless | MUST NOT use silence suppression for media it generates, regardless | |||
| of whether the "CN" codecs or related fmtp parameters appear in the | of whether the "CN" codecs or related fmtp parameters appear in the | |||
| peer's description. The impact of these rules is that silence | peer's description. The impact of these rules is that silence | |||
| suppression in JSEP depends on mutual agreement of both sides, which | suppression in JSEP depends on mutual agreement of both sides, which | |||
| ensures consistent handling regardless of which codec is used. | ensures consistent handling regardless of which codec is used. | |||
| The "VoiceActivityDetection" option does not have any impact on the | The VoiceActivityDetection option does not have any impact on the | |||
| setting of the "vad" value in the signaling of the client-to-mixer | setting of the "vad" value in the signaling of the client-to-mixer | |||
| audio level header extension described in [RFC6464], Section 4. | audio level header extension described in [RFC6464], Section 4. | |||
| 5.3. Generating an Answer | 5.3. Generating an Answer | |||
| When createAnswer is called, a new SDP description MUST be created | When createAnswer is called, a new SDP description MUST be created | |||
| that is compatible with the supplied remote description as well as | that is compatible with the supplied remote description as well as | |||
| the requirements specified in [RFC8834]. The exact details of this | the requirements specified in [RFC8834]. The exact details of this | |||
| process are explained below. | process are explained below. | |||
| skipping to change at page 52, line 28 ¶ | skipping to change at line 2400 ¶ | |||
| 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 | a=recvonly | |||
| The example in Section 7.2 shows a more involved case of "LS" group | The example in Section 7.2 shows a more involved case of "LS" group | |||
| generation. | generation. | |||
| The next step is to generate a "m=" section for each "m=" section | The next step is to generate an "m=" section for each "m=" section | |||
| that is present in the remote offer, as specified in [RFC3264], | that is present in the remote offer, as specified in [RFC3264], | |||
| Section 6. For the purposes of this discussion, any session-level | Section 6. For the purposes of this discussion, any session-level | |||
| attributes in the offer that are also valid as media-level attributes | attributes in the offer that are also valid as media-level attributes | |||
| are considered to be present in each "m=" section. Each offered "m=" | are considered to be present in each "m=" section. Each offered "m=" | |||
| section will have an associated RtpTransceiver, as described in | section will have an associated RtpTransceiver, as described in | |||
| Section 5.10. If there are more RtpTransceivers than there are "m=" | Section 5.10. If there are more RtpTransceivers than there are "m=" | |||
| sections, the unmatched RtpTransceivers will need to be associated in | sections, the unmatched RtpTransceivers will need to be associated in | |||
| a subsequent offer. | a subsequent offer. | |||
| For each offered "m=" section, if any of the following conditions are | For each offered "m=" section, if any of the following conditions are | |||
| skipping to change at page 54, line 30 ¶ | skipping to change at line 2498 ¶ | |||
| * If "rtx" is present in the offer, for each primary codec where RTP | * If "rtx" is present in the offer, for each primary codec where RTP | |||
| retransmission should be used, a corresponding "a=rtpmap" line | retransmission should be used, a corresponding "a=rtpmap" line | |||
| indicating "rtx" with the clock rate of the primary codec and an | indicating "rtx" with the clock rate of the primary codec and an | |||
| "a=fmtp" line that references the payload type of the primary | "a=fmtp" line that references the payload type of the primary | |||
| codec, as specified in [RFC4588], Section 8.1. | codec, as specified in [RFC4588], Section 8.1. | |||
| * For each FEC mechanism supported by the application, "a=rtpmap" | * For each FEC mechanism supported by the application, "a=rtpmap" | |||
| and "a=fmtp" lines, as specified in [RFC4566], Section 6. The FEC | and "a=fmtp" lines, as specified in [RFC4566], Section 6. The FEC | |||
| mechanisms that MUST be supported are specified in [RFC8854], | mechanisms that MUST be supported are specified in [RFC8854], | |||
| Section 7, and specific usage for each media type is outlined in | Section 7, and specific usage for each media type is outlined in | |||
| Sections 4 and 5. | Sections 4 and 5 of [RFC8854]. | |||
| * If this "m=" section is for media with configurable durations of | * If this "m=" section is for media with configurable durations of | |||
| media per packet, e.g., audio, an "a=maxptime" line, as described | media per packet, e.g., audio, an "a=maxptime" line, as described | |||
| in Section 5.2. | in Section 5.2. | |||
| * If this "m=" section is for video media and there are known | * If this "m=" section is for video media and there are known | |||
| limitations on the size of images that can be decoded, an | limitations on the size of images that can be decoded, an | |||
| "a=imageattr" line, as specified in Section 3.6. | "a=imageattr" line, as specified in Section 3.6. | |||
| * For each RTP header extension supported by the application and | * For each RTP header extension supported by the application and | |||
| skipping to change at page 54, line 52 ¶ | skipping to change at line 2520 ¶ | |||
| [RFC5285], Section 5. The list of header extensions that SHOULD/ | [RFC5285], Section 5. The list of header extensions that SHOULD/ | |||
| MUST be supported is specified in [RFC8834], Section 5.2. Any | MUST be supported is specified in [RFC8834], Section 5.2. Any | |||
| header extensions that require encryption MUST be specified as | header extensions that require encryption MUST be specified as | |||
| indicated in [RFC6904], Section 4. | indicated in [RFC6904], Section 4. | |||
| * For each RTCP feedback mechanism supported by the application and | * For each RTCP feedback mechanism supported by the application and | |||
| present in the offer, an "a=rtcp-fb" line, as specified in | present in the offer, an "a=rtcp-fb" line, as specified in | |||
| [RFC4585], Section 4.2. The list of RTCP feedback mechanisms that | [RFC4585], Section 4.2. The list of RTCP feedback mechanisms that | |||
| SHOULD/MUST be supported is specified in [RFC8834], Section 5.1. | SHOULD/MUST be supported is specified in [RFC8834], Section 5.1. | |||
| * If the RtpTransceiver has a sendrecv or sendonly direction: | * If the RtpTransceiver has a "sendrecv" or "sendonly" direction: | |||
| - For each MediaStream that was associated with the transceiver | - For each MediaStream that was associated with the transceiver | |||
| when it was created via addTrack or addTransceiver, an "a=msid" | when it was created via addTrack or addTransceiver, an "a=msid" | |||
| line, as specified in [RFC8830], Section 2, but omitting the | line, as specified in [RFC8830], Section 2, but omitting the | |||
| "appdata" field. | "appdata" field. | |||
| Each "m=" section that is not bundled into another "m=" section MUST | Each "m=" section that is not bundled into another "m=" section MUST | |||
| contain the following attributes (which are of category IDENTICAL or | contain the following attributes (which are of category IDENTICAL or | |||
| TRANSPORT): | TRANSPORT): | |||
| skipping to change at page 56, line 24 ¶ | skipping to change at line 2587 ¶ | |||
| * "a=setup" | * "a=setup" | |||
| * "a=tls-id" | * "a=tls-id" | |||
| Note that if media "m=" sections are bundled into a data "m=" | Note that if media "m=" sections are bundled into a data "m=" | |||
| section, then certain TRANSPORT and IDENTICAL attributes may also | section, then certain TRANSPORT and IDENTICAL attributes may also | |||
| appear in the data "m=" section even if they would otherwise only be | appear in the data "m=" section even if they would otherwise only be | |||
| appropriate for a media "m=" section (e.g., "a=rtcp-mux"). | appropriate for a media "m=" section (e.g., "a=rtcp-mux"). | |||
| If "a=group" attributes with semantics of "BUNDLE" are offered, | If "a=group" attributes with semantics "BUNDLE" are offered, | |||
| corresponding session-level "a=group" attributes MUST be added as | corresponding session-level "a=group" attributes MUST be added as | |||
| specified in [RFC5888]. These attributes MUST have semantics | specified in [RFC5888]. These attributes MUST have semantics | |||
| "BUNDLE" and MUST include all mid identifiers from the offered bundle | "BUNDLE" and MUST include all MID identifiers from the offered bundle | |||
| groups that have not been rejected. Note that regardless of the | groups that have not been rejected. Note that regardless of the | |||
| presence of "a=bundle-only" in the offer, all "m=" sections in the | presence of "a=bundle-only" in the offer, all "m=" sections in the | |||
| answer MUST NOT have an "a=bundle-only" line. | answer MUST NOT have an "a=bundle-only" line. | |||
| Attributes that are common between all "m=" sections MAY be moved to | Attributes that are common between all "m=" sections MAY be moved to | |||
| the session level if explicitly defined to be valid at the session | the session level if explicitly defined to be valid at the session | |||
| level. | level. | |||
| The attributes prohibited in the creation of offers are also | The attributes prohibited in the creation of offers are also | |||
| prohibited in the creation of answers. | prohibited in the creation of answers. | |||
| skipping to change at page 58, line 28 ¶ | skipping to change at line 2677 ¶ | |||
| same rules as for an initial answer. | same rules as for an initial answer. | |||
| 5.3.3. Options Handling | 5.3.3. Options Handling | |||
| The createAnswer method takes as a parameter an RTCAnswerOptions | The createAnswer method takes as a parameter an RTCAnswerOptions | |||
| object. The set of parameters for RTCAnswerOptions is different than | object. The set of parameters for RTCAnswerOptions is different than | |||
| those supported in RTCOfferOptions; the IceRestart option is | those supported in RTCOfferOptions; the IceRestart option is | |||
| unnecessary, as ICE credentials will automatically be changed for all | unnecessary, as ICE credentials will automatically be changed for all | |||
| "m=" sections where the offerer chose to perform ICE restart. | "m=" sections where the offerer chose to perform ICE restart. | |||
| The following options are supported in RTCAnswerOptions. | The following option is supported in RTCAnswerOptions. | |||
| 5.3.3.1. VoiceActivityDetection | 5.3.3.1. VoiceActivityDetection | |||
| Silence suppression in the answer is handled as described in | Silence suppression in the answer is handled as described in | |||
| Section 5.2.3.2, with one exception: if support for silence | Section 5.2.3.2, with one exception: if support for silence | |||
| suppression was not indicated in the offer, the | suppression was not indicated in the offer, the | |||
| VoiceActivityDetection parameter has no effect, and the answer MUST | VoiceActivityDetection parameter has no effect, and the answer MUST | |||
| be generated as if VoiceActivityDetection was set to "false". This | be generated as if VoiceActivityDetection was set to "false". This | |||
| is done on a per-codec basis (e.g., if the offerer somehow offered | is done 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 with CN | VoiceActivityDetection to "true" would result in an answer with "CN" | |||
| codecs and "usedtx=0"). The impact of this rule is that an answerer | codecs and "usedtx=0"). The impact of this rule is that an answerer | |||
| will not try to use silence suppression with any endpoint that does | will not try to use silence suppression with any endpoint that does | |||
| not offer it, making silence suppression support bilateral even with | not offer it, making silence suppression support bilateral even with | |||
| non-JSEP endpoints. | non-JSEP endpoints. | |||
| 5.4. Modifying an Offer or Answer | 5.4. Modifying an Offer or Answer | |||
| The SDP returned from createOffer or createAnswer MUST NOT be changed | The SDP returned from createOffer or createAnswer MUST NOT be changed | |||
| before passing it to setLocalDescription. If precise control over | before passing it to setLocalDescription. If precise control over | |||
| the SDP is needed, the aforementioned createOffer/createAnswer | the SDP is needed, the aforementioned createOffer/createAnswer | |||
| skipping to change at page 61, line 8 ¶ | skipping to change at line 2796 ¶ | |||
| MUST be returned. Note that this implies that once the answerer has | MUST be returned. Note that this implies that once the answerer has | |||
| performed setLocalDescription with its answer, this cannot be rolled | performed setLocalDescription with its answer, this cannot be rolled | |||
| back. | back. | |||
| The effect of rollback MUST be the same regardless of whether | The effect of rollback MUST be the same regardless of whether | |||
| setLocalDescription or setRemoteDescription is called. | setLocalDescription or setRemoteDescription is called. | |||
| In order to process rollback, a JSEP implementation abandons the | In order to process rollback, a JSEP implementation abandons the | |||
| current offer/answer transaction, sets the signaling state to | current offer/answer transaction, sets the signaling state to | |||
| "stable", and sets the pending local and/or remote description (see | "stable", and sets the pending local and/or remote description (see | |||
| Sections 4.1.14 and 4.1.16) to "null". Any resources or candidates | Sections 4.1.14 and 4.1.16) to null. Any resources or candidates | |||
| that were allocated by the abandoned local description are discarded; | that were allocated by the abandoned local description are discarded; | |||
| any media that is received is processed according to the previous | any media that is received is processed according to the previous | |||
| local and remote descriptions. | local and remote descriptions. | |||
| A rollback disassociates any RtpTransceivers that were associated | A rollback disassociates any RtpTransceivers that were associated | |||
| with "m=" sections by the application of the rolled-back session | with "m=" sections by the application of the rolled-back session | |||
| description (see Sections 5.10 and 5.9). This means that some | description (see Sections 5.10 and 5.9). This means that some | |||
| RtpTransceivers that were previously associated will no longer be | RtpTransceivers that were previously associated will no longer be | |||
| associated with any "m=" section; in such cases, the value of the | associated with any "m=" section; in such cases, the value of the | |||
| RtpTransceiver's mid property MUST be set to "null", and the mapping | RtpTransceiver's mid property MUST be set to null, and the mapping | |||
| between the transceiver and its "m=" section index MUST be discarded. | between the transceiver and its "m=" section index MUST be discarded. | |||
| RtpTransceivers that were created by applying a remote offer that was | RtpTransceivers that were created by applying a remote offer that was | |||
| subsequently rolled back MUST be stopped and removed from the | subsequently rolled back MUST be stopped and removed from the | |||
| PeerConnection. However, an RtpTransceiver MUST NOT be removed if a | PeerConnection. However, an RtpTransceiver MUST NOT be removed if a | |||
| track was attached to the RtpTransceiver via the addTrack method. | track was attached to the RtpTransceiver via the addTrack method. | |||
| This is so that an application may call addTrack, then call | This is so that an application may call addTrack, then call | |||
| setRemoteDescription with an offer, then roll back that offer, then | setRemoteDescription with an offer, then roll back that offer, then | |||
| call createOffer and have an "m=" section for the added track appear | call createOffer and have an "m=" section for the added track appear | |||
| in the generated offer. | in the generated offer. | |||
| skipping to change at page 62, line 40 ¶ | skipping to change at line 2870 ¶ | |||
| Section 5.2. | Section 5.2. | |||
| * The "b=" line, if present, MUST be parsed as specified in | * The "b=" line, if present, MUST be parsed as specified in | |||
| [RFC4566], Section 5.8, and the bwtype and bandwidth values | [RFC4566], Section 5.8, and the bwtype and bandwidth values | |||
| stored. | stored. | |||
| Finally, the attribute lines are processed. Specific processing MUST | Finally, the attribute lines are processed. Specific processing MUST | |||
| be applied for the following session-level attribute ("a=") lines: | be applied for the following session-level attribute ("a=") lines: | |||
| * Any "a=group" lines are parsed as specified in [RFC5888], | * Any "a=group" lines are parsed as specified in [RFC5888], | |||
| Section 5, and the group's semantics and mids are stored. | Section 5, and the group's semantics and MID values are stored. | |||
| * If present, a single "a=ice-lite" line is parsed as specified in | * If present, a single "a=ice-lite" line is parsed as specified in | |||
| [RFC8839], Section 5.3, and a value indicating the presence of | [RFC8839], Section 5.3, and a value indicating the presence of an | |||
| ice-lite is stored. | "a=ice-lite" line is stored. | |||
| * If present, a single "a=ice-ufrag" line is parsed as specified in | * If present, a single "a=ice-ufrag" line is parsed as specified in | |||
| [RFC8839], Section 5.4, and the ufrag value is stored. | [RFC8839], Section 5.4, and the ufrag value is stored. | |||
| * If present, a single "a=ice-pwd" line is parsed as specified in | * If present, a single "a=ice-pwd" line is parsed as specified in | |||
| [RFC8839], Section 5.4, and the password value is stored. | [RFC8839], Section 5.4, and the password value is stored. | |||
| * If present, a single "a=ice-options" line is parsed as specified | * If present, a single "a=ice-options" line is parsed as specified | |||
| in [RFC8839], Section 5.6, and the set of specified options is | in [RFC8839], Section 5.6, and the set of specified options is | |||
| stored. | stored. | |||
| skipping to change at page 70, line 20 ¶ | skipping to change at line 3229 ¶ | |||
| candidates, as described in [RFC8445], Section 6.1.2, and start | candidates, as described in [RFC8445], Section 6.1.2, and start | |||
| connectivity checks with the appropriate credentials. | connectivity checks with the appropriate credentials. | |||
| * If an "a=end-of-candidates" attribute is present, process the end- | * If an "a=end-of-candidates" attribute is present, process the end- | |||
| of-candidates indication as described in [RFC8838], Section 14. | of-candidates indication as described in [RFC8838], Section 14. | |||
| * If the "m=" section <proto> value indicates use of RTP: | * If the "m=" section <proto> value indicates use of RTP: | |||
| - If the "m=" section is being recycled (see Section 5.2.2), | - If the "m=" section is being recycled (see Section 5.2.2), | |||
| disassociate the currently associated RtpTransceiver by setting | disassociate the currently associated RtpTransceiver by setting | |||
| its mid property to "null", and discard the mapping between the | its mid property to null, and discard the mapping between the | |||
| transceiver and its "m=" section index. | transceiver and its "m=" section index. | |||
| - If the "m=" section is not associated with any RtpTransceiver | - If the "m=" section is not associated with any RtpTransceiver | |||
| (possibly because it was disassociated in the previous step), | (possibly because it was disassociated in the previous step), | |||
| either find an RtpTransceiver or create one according to the | either find an RtpTransceiver or create one according to the | |||
| following steps: | following steps: | |||
| o If the "m=" section is sendrecv or recvonly, and there are | o If the "m=" section is "sendrecv" or "recvonly", and there | |||
| RtpTransceivers of the same type that were added to the | are RtpTransceivers of the same type that were added to the | |||
| PeerConnection by addTrack and are not associated with any | PeerConnection by addTrack and are not associated with any | |||
| "m=" section and are not stopped, find the first (according | "m=" section and are not stopped, find the first (according | |||
| to the canonical order described in Section 5.2.1) such | to the canonical order described in Section 5.2.1) such | |||
| RtpTransceiver. | RtpTransceiver. | |||
| o If no RtpTransceiver was found in the previous step, create | o If no RtpTransceiver was found in the previous step, create | |||
| one with a recvonly direction. | one with a "recvonly" direction. | |||
| o Associate the found or created RtpTransceiver with the "m=" | o Associate the found or created RtpTransceiver with the "m=" | |||
| section by setting the value of the RtpTransceiver's mid | section by setting the value of the RtpTransceiver's mid | |||
| property to the MID of the "m=" section, and establish a | property to the MID of the "m=" section, and establish a | |||
| mapping between the transceiver and the index of the "m=" | mapping between the transceiver and the index of the "m=" | |||
| section. If the "m=" section does not include a MID (i.e., | section. If the "m=" section does not include a MID (i.e., | |||
| the remote endpoint does not support the MID extension), | the remote endpoint does not support the MID extension), | |||
| generate a value for the RtpTransceiver mid property, | generate a value for the RtpTransceiver mid property, | |||
| following the guidance for "a=mid" mentioned in | following the guidance for "a=mid" mentioned in | |||
| Section 5.2.1. | Section 5.2.1. | |||
| skipping to change at page 71, line 19 ¶ | skipping to change at line 3277 ¶ | |||
| - For each specified "rtx" media format, establish a mapping | - For each specified "rtx" media format, establish a mapping | |||
| between the RTX payload type and its associated primary payload | between the RTX payload type and its associated primary payload | |||
| type, as described in [RFC4588], Section 4. If any referenced | type, as described in [RFC4588], Section 4. If any referenced | |||
| primary payload types are not present, this MUST result in an | primary payload types are not present, this MUST result in an | |||
| error. Note that RTX payload types may refer to primary | error. Note that RTX payload types may refer to primary | |||
| payload types that are not supported by the local media | payload types that are not supported by the local media | |||
| implementation, in which case the RTX payload type MUST also be | implementation, in which case the RTX payload type MUST also be | |||
| ignored. | ignored. | |||
| - For each specified fmtp parameter that is supported by the | - For each specified fmtp parameter that is supported by the | |||
| local implementation, enable them on the associated media | local application, enable them on the associated media formats. | |||
| formats. | ||||
| - For each specified Synchronization Source (SSRC) that is | - For each specified Synchronization Source (SSRC) that is | |||
| signaled in the "m=" section, prepare to demux RTP streams | signaled in the "m=" section, prepare to demux RTP streams | |||
| intended for this "m=" section using that SSRC, as described in | intended for this "m=" section using that SSRC, as described in | |||
| [RFC9143], Section 9.2. | [RFC9143], Section 9.2. | |||
| - For each specified RTP header extension that is also supported | - For each specified RTP header extension that is also supported | |||
| by the local application, establish a mapping between the | by the local application, establish a mapping between the | |||
| extension ID and URI, as described in [RFC5285], Section 5. | extension ID and URI, as described in [RFC5285], Section 5. | |||
| Specifically, this means that the implementation records the | Specifically, this means that the implementation records the | |||
| extension ID to be used in outgoing RTP packets when sending | extension ID to be used in outgoing RTP packets when sending | |||
| each specified header extension. If any indicated RTP header | each specified header extension. If any indicated RTP header | |||
| extension is not supported by the local application, it MUST be | extension is not supported by the local application, it MUST be | |||
| ignored. | ignored. | |||
| - For each specified RTCP feedback mechanism that is also | - For each specified RTCP feedback mechanism that is also | |||
| supported by the local application, enable them on the | supported by the local application, enable them on the | |||
| associated media formats. | associated media formats. | |||
| - For any specified "TIAS" ("Transport Independent Application | - For any specified "TIAS" ("Transport Independent Application | |||
| Specific Maximum") bandwidth value, set this value as a | Specific (maximum)") bandwidth value, set this value as a | |||
| constraint on the maximum RTP bitrate to be used when sending | constraint on the maximum RTP bitrate to be used when sending | |||
| media, as specified in [RFC3890]. If a "TIAS" value is not | media, as specified in [RFC3890]. If a "TIAS" value is not | |||
| present but an "AS" value is specified, generate a "TIAS" value | present but an "AS" value is specified, generate a "TIAS" value | |||
| using this formula: | using this formula: | |||
| TIAS = AS * 1000 * 0.95 - (50 * 40 * 8) | TIAS = AS * 1000 * 0.95 - (50 * 40 * 8) | |||
| The 1000 changes the unit from kbps to bps (as required by | The 1000 changes the unit from kbps to bps (as required by | |||
| TIAS), and the 0.95 is to allocate 5% to RTCP. An estimate of | TIAS), and the 0.95 is to allocate 5% to RTCP. An estimate of | |||
| header overhead is then subtracted out, in which the 50 is | header overhead is then subtracted out, in which the 50 is | |||
| skipping to change at page 73, line 9 ¶ | skipping to change at line 3359 ¶ | |||
| In addition to the steps mentioned above for processing a local or | In addition to the steps mentioned above for processing a local or | |||
| remote description, the following steps are performed when processing | remote description, the following steps are performed when processing | |||
| a description of type "pranswer" or "answer". | a description of type "pranswer" or "answer". | |||
| For each "m=" section, the following steps MUST be performed: | For each "m=" section, the following steps MUST be performed: | |||
| * If the "m=" section has been rejected (i.e., the <port> value is | * If the "m=" section has been rejected (i.e., the <port> value is | |||
| set to zero in the answer), stop any reception or transmission of | set to zero in the answer), stop any reception or transmission of | |||
| media for this section, and, unless a non-rejected "m=" section is | media for this section, and, unless a non-rejected "m=" section is | |||
| bundled with this "m=" section, discard any associated ICE | bundled with this "m=" section, discard any associated ICE | |||
| components, as described in [RFC8839], Section 4.4.3.1. | components, as described in the second bullet item in [RFC8839], | |||
| Section 4.4.3.1. | ||||
| * If the remote DTLS fingerprint has been changed or the value of | * If the remote DTLS fingerprint has been changed or the value of | |||
| the "a=tls-id" attribute has changed, tear down the DTLS | the "a=tls-id" attribute has changed, tear down the DTLS | |||
| connection. This includes the case when the PeerConnection state | connection. This includes the case when the PeerConnection state | |||
| is "have-remote-pranswer". If a DTLS connection needs to be torn | 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 | down but the answer does not indicate an ICE restart or, in the | |||
| case of "have-remote-pranswer", new ICE credentials, an error MUST | case of "have-remote-pranswer", new ICE credentials, an error MUST | |||
| be generated. If an ICE restart is performed without a change in | be generated. If an ICE restart is performed without a change in | |||
| the tls-id value or fingerprint, then the same DTLS connection is | the tls-id value or fingerprint, then the same DTLS connection is | |||
| continued over the new ICE channel. Note that although JSEP | continued over the new ICE channel. Note that although JSEP | |||
| skipping to change at page 76, line 11 ¶ | skipping to change at line 3501 ¶ | |||
| section is defined in [RFC9143], Section 9.2. When not bundling, the | section is defined in [RFC9143], Section 9.2. When not bundling, the | |||
| proper "m=" section is clear from the ICE component over which the | proper "m=" section is clear from the ICE component over which the | |||
| RTP/RTCP is received. | RTP/RTCP is received. | |||
| Once the proper "m=" section or sections are known, RTP/RTCP is | Once the proper "m=" section or sections are known, RTP/RTCP is | |||
| delivered to the RtpTransceiver(s) associated with the "m=" | delivered to the RtpTransceiver(s) associated with the "m=" | |||
| section(s) and further processing of the RTP/RTCP is done at the | section(s) and further processing of the RTP/RTCP is done at the | |||
| RtpTransceiver level. This includes using the RID mechanism | RtpTransceiver level. This includes using the RID mechanism | |||
| [RFC8851] and its associated RtpStreamId and RepairedRtpStreamId | [RFC8851] and its associated RtpStreamId and RepairedRtpStreamId | |||
| identifiers to distinguish between multiple encoded streams and | identifiers to distinguish between multiple encoded streams and | |||
| determine which Source RTP stream should be repaired by a given | determine which Source RTP Stream should be repaired by a given | |||
| redundancy RTP stream. | redundancy RTP stream. | |||
| 7. Examples | 7. Examples | |||
| Note that this example section shows several SDP fragments. To | Note that this example section shows several SDP fragments. To | |||
| accommodate RFC line-length restrictions, some of the SDP lines have | accommodate RFC line-length restrictions, some of the SDP lines have | |||
| been split into multiple lines, where leading whitespace indicates | been split into multiple lines, where leading whitespace indicates | |||
| that a line is a continuation of the previous line. In addition, | that a line is a continuation of the previous line. In addition, | |||
| some blank lines have been added to improve readability but are not | some blank lines have been added to improve readability but are not | |||
| valid in SDP. | valid in SDP. | |||
| skipping to change at page 80, line 41 ¶ | skipping to change at line 3713 ¶ | |||
| 7.2. Detailed Example | 7.2. Detailed Example | |||
| This section shows a more involved example of a session between two | This section shows a more involved example of a session between two | |||
| JSEP endpoints. Trickle ICE is used in full trickle mode, with a | JSEP endpoints. Trickle ICE is used in full trickle mode, with a | |||
| bundle policy of "must-bundle", an RTCP mux policy of "require", and | bundle policy of "must-bundle", an RTCP mux policy of "require", and | |||
| a single TURN server. Initially, both Alice and Bob establish an | a single TURN server. Initially, both Alice and Bob establish an | |||
| audio channel and a data channel. Later, Bob adds two video flows -- | audio channel and a data channel. Later, Bob adds two video flows -- | |||
| one for his video feed and one for screen sharing, both supporting | one for his video feed and one for screen sharing, both supporting | |||
| FEC -- with the video feed configured for simulcast. Alice accepts | FEC -- with the video feed configured for simulcast. Alice accepts | |||
| these video flows but does not add video flows of her own, so they | these video flows but does not add video flows of her own, so they | |||
| are handled as recvonly. Alice also specifies a maximum video | are handled as "recvonly". Alice also specifies a maximum video | |||
| decoder resolution. | decoder resolution. | |||
| // 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 | |||
| skipping to change at page 86, line 24 ¶ | skipping to change at line 3944 ¶ | |||
| 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 | raddr 198.51.100.200 rport 11200 | |||
| The SDP for |offer-B2| is shown below. In addition to the new "m=" | The SDP for |offer-B2| is shown below. In addition to the new "m=" | |||
| sections for video, both of which are offering FEC and one of which | sections for video, both of which are offering FEC and one of which | |||
| is offering simulcast, note the increment of the version number in | is offering simulcast, note the increment of the version number in | |||
| the "o=" line; changes to the "c=" line, indicating the local | the "o=" line; changes to the "c=" line, indicating the local | |||
| candidate that was selected; and the inclusion of gathered candidates | candidate that was selected; and the inclusion of gathered candidates | |||
| as a=candidate lines. | as "a=candidate" lines. | |||
| v=0 | v=0 | |||
| o=- 7729291447651054566 2 IN IP4 0.0.0.0 | o=- 7729291447651054566 2 IN IP4 0.0.0.0 | |||
| s=- | s=- | |||
| t=0 0 | t=0 0 | |||
| a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
| a=group:BUNDLE a1 d1 v1 v2 | a=group:BUNDLE a1 d1 v1 v2 | |||
| a=group:LS a1 v1 | a=group:LS a1 v1 | |||
| m=audio 12200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 12200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
| skipping to change at page 88, line 18 ¶ | skipping to change at line 4035 ¶ | |||
| 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 | a=msid:81317484-2ed4-49d7-9eb7-1414322a7aae | |||
| The SDP for |answer-B2| is shown below. In addition to the | 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 the | received resolution, note the use of "a=setup:passive" to maintain | |||
| existing DTLS roles. | the existing DTLS roles. | |||
| 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 | |||
| skipping to change at page 90, line 15 ¶ | skipping to change at line 4128 ¶ | |||
| 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 | |||
| 7.3. Early Transport Warmup Example | 7.3. Early Transport Warmup Example | |||
| This example demonstrates the early-warmup technique described in | This example demonstrates the early-warmup technique described in | |||
| Section 4.1.10.1. Here, Alice's endpoint sends an offer to Bob's | Section 4.1.10.1. Here, Alice's endpoint sends an offer to Bob's | |||
| endpoint to start an audio/video call. Bob immediately responds with | endpoint to start an audio/video call. Bob immediately responds with | |||
| an answer that accepts the audio/video "m=" sections but marks them | an answer that accepts the audio/video "m=" sections but marks them | |||
| as sendonly (from his perspective), meaning that Alice will not yet | as "sendonly" (from his perspective), meaning that Alice will not yet | |||
| send media. This allows the JSEP implementation to start negotiating | send media. This allows the JSEP implementation to start negotiating | |||
| ICE and DTLS immediately. Bob's endpoint then prompts him to answer | ICE and DTLS immediately. Bob's endpoint then prompts him to answer | |||
| the call, and when he does, his endpoint sends a second offer, which | the call, and when he does, his endpoint sends a second offer, which | |||
| enables the audio and video "m=" sections, and thereby bidirectional | enables the audio and video "m=" sections, and thereby bidirectional | |||
| media transmission. The advantage of such a flow is that as soon as | media transmission. The advantage of such a flow is that as soon as | |||
| the first answer is received, the implementation can proceed with ICE | the first answer is received, the implementation can proceed with ICE | |||
| and DTLS negotiation and establish the session transport. If the | and DTLS negotiation and establish the session transport. If the | |||
| transport setup completes before the second offer is sent, then media | transport setup completes before the second offer is sent, then media | |||
| can be transmitted by the callee immediately upon answering the call, | can be transmitted by the callee immediately upon answering the call, | |||
| minimizing perceived post-dial delay. The second offer/answer | minimizing perceived post-dial delay. The second offer/answer | |||
| skipping to change at page 97, line 37 ¶ | skipping to change at line 4484 ¶ | |||
| JSEP implementation MUST be prepared for the JavaScript to pass in | JSEP implementation MUST be prepared for the JavaScript to pass in | |||
| bogus data instead. | bogus data instead. | |||
| Conversely, the application programmer needs to be aware that the | Conversely, the application programmer needs to be aware that the | |||
| JavaScript does not have complete control of endpoint behavior. One | JavaScript does not have complete control of endpoint behavior. One | |||
| case that bears particular mention is that editing ICE candidates out | case that bears particular mention is that editing ICE candidates out | |||
| of the SDP or suppressing trickled candidates does not have the | of the SDP or suppressing trickled candidates does not have the | |||
| expected behavior: implementations will still perform checks from | expected behavior: implementations will still perform checks from | |||
| those candidates even if they are not sent to the other side. Thus, | those candidates even if they are not sent to the other side. Thus, | |||
| for instance, it is not possible to prevent the remote peer from | for instance, it is not possible to prevent the remote peer from | |||
| learning your public IP address by removing server-reflexive | learning an application's public IP address by removing server- | |||
| candidates. Applications that wish to conceal their public IP | reflexive candidates. Applications that wish to conceal their public | |||
| address MUST instead configure the ICE agent to use only relay | IP address MUST instead configure the ICE agent to use only relay | |||
| candidates. | candidates. | |||
| 9. IANA Considerations | 9. IANA Considerations | |||
| This document has no IANA actions. | This document has no IANA actions. | |||
| 10. References | 10. References | |||
| 10.1. Normative References | 10.1. Normative References | |||
| skipping to change at page 102, line 40 ¶ | skipping to change at line 4718 ¶ | |||
| Protocol (SDP) Attributes When Multiplexing", RFC 8859, | Protocol (SDP) Attributes When Multiplexing", RFC 8859, | |||
| DOI 10.17487/RFC8859, January 2021, | DOI 10.17487/RFC8859, January 2021, | |||
| <https://www.rfc-editor.org/info/rfc8859>. | <https://www.rfc-editor.org/info/rfc8859>. | |||
| [RFC9143] Holmberg, C., Alvestrand, H., and C. Jennings, | [RFC9143] Holmberg, C., Alvestrand, H., and C. Jennings, | |||
| "Negotiating Media Multiplexing Using the Session | "Negotiating Media Multiplexing Using the Session | |||
| Description Protocol (SDP)", RFC 9143, | Description Protocol (SDP)", RFC 9143, | |||
| DOI 10.17487/RFC9143, February 2022, | DOI 10.17487/RFC9143, February 2022, | |||
| <https://www.rfc-editor.org/info/rfc9143>. | <https://www.rfc-editor.org/info/rfc9143>. | |||
| [RFC9147] Rescorla, E., Tschofenig, H., and N. Modadugu, "The | ||||
| Datagram Transport Layer Security (DTLS) Protocol Version | ||||
| 1.3", RFC 9147, DOI 10.17487/RFC9147, April 2022, | ||||
| <https://www.rfc-editor.org/info/rfc9147>. | ||||
| 10.2. Informative References | 10.2. Informative References | |||
| [RFC3389] Zopf, R., "Real-time Transport Protocol (RTP) Payload for | [RFC3389] Zopf, R., "Real-time Transport Protocol (RTP) Payload for | |||
| Comfort Noise (CN)", RFC 3389, DOI 10.17487/RFC3389, | Comfort Noise (CN)", RFC 3389, DOI 10.17487/RFC3389, | |||
| September 2002, <https://www.rfc-editor.org/info/rfc3389>. | September 2002, <https://www.rfc-editor.org/info/rfc3389>. | |||
| [RFC3556] Casner, S., "Session Description Protocol (SDP) Bandwidth | [RFC3556] Casner, S., "Session Description Protocol (SDP) Bandwidth | |||
| Modifiers for RTP Control Protocol (RTCP) Bandwidth", | Modifiers for RTP Control Protocol (RTCP) Bandwidth", | |||
| RFC 3556, DOI 10.17487/RFC3556, July 2003, | RFC 3556, DOI 10.17487/RFC3556, July 2003, | |||
| <https://www.rfc-editor.org/info/rfc3556>. | <https://www.rfc-editor.org/info/rfc3556>. | |||
| skipping to change at page 104, line 35 ¶ | skipping to change at line 4812 ¶ | |||
| [SDP4WebRTC] | [SDP4WebRTC] | |||
| Nandakumar, S. and C. F. Jennings, "Annotated Example SDP | Nandakumar, S. and C. F. Jennings, "Annotated Example SDP | |||
| for WebRTC", Work in Progress, Internet-Draft, draft-ietf- | for WebRTC", Work in Progress, Internet-Draft, draft-ietf- | |||
| rtcweb-sdp-14, 17 December 2020, | rtcweb-sdp-14, 17 December 2020, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-rtcweb- | <https://datatracker.ietf.org/doc/html/draft-ietf-rtcweb- | |||
| sdp-14>. | sdp-14>. | |||
| [TS26.114] 3GPP, "3rd Generation Partnership Project; Technical | [TS26.114] 3GPP, "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 16)", 3GPP TS 26.114 | handling and interaction (Release 18)", 3GPP TS 26.114 | |||
| V16.3.0, September 2019, | V18.4.0, September 2023, | |||
| <https://www.3gpp.org/DynaReport/26114.htm>. | <https://www.3gpp.org/DynaReport/26114.htm>. | |||
| [W3C.webrtc] | [W3C.webrtc] | |||
| Jennings, C., Ed., Boström, H., Ed., and J. Bruaroey, Ed., | Jennings, C., Ed., Castelli, F., Ed., Boström, H., Ed., | |||
| "WebRTC 1.0: Real-time Communication Between Browsers", | and J-I. Bruaroey, Ed., "WebRTC: Real-time Communication | |||
| World Wide Web Consortium Recommendation, January 2021, | Between Browsers", W3C Recommendation, March 2023, | |||
| <https://www.w3.org/TR/2021/REC-webrtc-20210126/>. | <https://www.w3.org/TR/2023/REC-webrtc-20230306/>. | |||
| Appendix A. SDP ABNF Syntax | Appendix A. SDP ABNF Syntax | |||
| For the syntax validation performed in Section 5.8, the following | For the syntax validation performed in Section 5.8, the following | |||
| list of ABNF definitions is used: | list of ABNF definitions is used: | |||
| +=========================+==========================+ | +=========================+===============================+ | |||
| | Attribute | Reference | | | Attribute | Reference | | |||
| +=========================+==========================+ | +=========================+===============================+ | |||
| | ptime | Section 6 of [RFC4566] | | | ptime | Section 6 of [RFC4566] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | maxptime | Section 6 of [RFC4566] | | | maxptime | Section 6 of [RFC4566] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | rtpmap | Section 6 of [RFC4566] | | | rtpmap | Section 6 of [RFC4566] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | recvonly | Section 9 of [RFC4566] | | | recvonly | Sections 6 and 9 of [RFC4566] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | sendrecv | Section 9 of [RFC4566] | | | sendrecv | Sections 6 and 9 of [RFC4566] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | sendonly | Section 9 of [RFC4566] | | | sendonly | Sections 6 and 9 of [RFC4566] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | inactive | Section 9 of [RFC4566] | | | inactive | Sections 6 and 9 of [RFC4566] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | fmtp | Section 9 of [RFC4566] | | | fmtp | Sections 6 and 9 of [RFC4566] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | rtcp | Section 2.1 of [RFC3605] | | | rtcp | Section 2.1 of [RFC3605] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | setup | Section 4 of [RFC4145] | | | setup | Section 4 of [RFC4145] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | fingerprint | Section 5 of [RFC8122] | | | fingerprint | Section 5 of [RFC8122] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | rtcp-fb | Section 4.2 of [RFC4585] | | | rtcp-fb | Section 4.2 of [RFC4585] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | extmap | Section 7 of [RFC5285] | | | extmap | Section 7 of [RFC5285] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | mid | Section 4 of [RFC5888] | | | mid | Section 4 of [RFC5888] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | group | Section 5 of [RFC5888] | | | group | Section 5 of [RFC5888] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | imageattr | Section 3.1 of [RFC6236] | | | imageattr | Section 3.1 of [RFC6236] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | extmap (encrypt option) | Section 4 of [RFC6904] | | | extmap (encrypt option) | Section 4 of [RFC6904] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | candidate | Section 5.1 of [RFC8839] | | | candidate | Section 5.1 of [RFC8839] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | remote-candidates | Section 5.2 of [RFC8839] | | | remote-candidates | Section 5.2 of [RFC8839] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | ice-lite | Section 5.3 of [RFC8839] | | | ice-lite | Section 5.3 of [RFC8839] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | ice-ufrag | Section 5.4 of [RFC8839] | | | ice-ufrag | Section 5.4 of [RFC8839] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | ice-pwd | Section 5.4 of [RFC8839] | | | ice-pwd | Section 5.4 of [RFC8839] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | ice-options | Section 5.6 of [RFC8839] | | | ice-options | Section 5.6 of [RFC8839] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | msid | Section 3 of [RFC8830] | | | msid | Section 3 of [RFC8830] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | rid | Section 10 of [RFC8851] | | | rid | Section 10 of [RFC8851] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | simulcast | Section 5.1 of [RFC8853] | | | simulcast | Section 5.1 of [RFC8853] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| | tls-id | Section 4 of [RFC8842] | | | tls-id | Section 4 of [RFC8842] | | |||
| +-------------------------+--------------------------+ | +-------------------------+-------------------------------+ | |||
| Table 1: SDP ABNF References | Table 1: SDP ABNF References | |||
| Acknowledgements | Acknowledgements | |||
| Harald Alvestrand, Taylor Brandstetter, Suhas Nandakumar, and Peter | Harald Alvestrand, Taylor Brandstetter, Suhas Nandakumar, and Peter | |||
| Thatcher provided significant text for this document. Bernard Aboba, | Thatcher provided significant text for RFC 8829 (and thereby this | |||
| Adam Bergkvist, Jan-Ivar Bruaroey, Dan Burnett, Ben Campbell, Alissa | document). Bernard Aboba, Adam Bergkvist, Jan-Ivar Bruaroey, Dan | |||
| Cooper, Richard Ejzak, Stefan Håkansson, Ted Hardie, Christer | Burnett, Ben Campbell, Alissa Cooper, Richard Ejzak, Stefan | |||
| Holmberg, Andrew Hutton, Randell Jesup, Matthew Kaufman, Anant | Håkansson, Ted Hardie, Christer Holmberg, Andrew Hutton, Randell | |||
| Narayanan, Adam Roach, Robert Sparks, Neil Stratford, Martin Thomson, | Jesup, Matthew Kaufman, Anant Narayanan, Adam Roach, Robert Sparks, | |||
| Sean Turner, and Magnus Westerlund all provided valuable feedback on | Neil Stratford, Martin Thomson, Sean Turner, and Magnus Westerlund | |||
| this document. | all provided valuable feedback on RFC 8829 (and thereby this | |||
| document). | ||||
| Authors' Addresses | Authors' Addresses | |||
| Justin Uberti | Justin Uberti | |||
| Email: justin@uberti.name | Email: justin@uberti.name | |||
| Cullen Jennings | Cullen Jennings | |||
| Cisco | Cisco | |||
| 400 3rd Avenue SW | 400 3rd Avenue SW | |||
| Calgary AB T2P 4H2 | Calgary AB T2P 4H2 | |||
| End of changes. 75 change blocks. | ||||
| 322 lines changed or deleted | 326 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||