rfc8829xml2.original.xml | rfc8829.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="us-ascii"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="std" conse | |||
<?rfc toc="yes" ?> | nsus="true" docName="draft-ietf-rtcweb-jsep-26" indexInclude="true" ipr="trust20 | |||
<?rfc symrefs="yes" ?> | 0902" number="8829" prepTime="2021-01-19T20:18:44" scripts="Common,Latin" sortRe | |||
<?rfc iprnotified="no" ?> | fs="true" submissionType="IETF" symRefs="true" tocDepth="4" tocInclude="true" xm | |||
<?rfc strict="yes" ?> | l:lang="en"> | |||
<?rfc compact="yes" ?> | <link href="https://datatracker.ietf.org/doc/draft-ietf-rtcweb-jsep-26" rel="p | |||
<?rfc sortrefs="yes" ?> | rev"/> | |||
<?rfc colonspace="yes" ?> | <link href="https://dx.doi.org/10.17487/rfc8829" rel="alternate"/> | |||
<?rfc rfcedstyle="no" ?> | <link href="urn:issn:2070-1721" rel="alternate"/> | |||
<?rfc docmapping="yes" ?> | ||||
<?rfc tocdepth="4"?> | ||||
<rfc category="std" docName="draft-ietf-rtcweb-jsep-26" | ||||
ipr="trust200902"> | ||||
<front> | <front> | |||
<title abbrev="JSEP">JavaScript Session Establishment | <title abbrev="JSEP">JavaScript Session Establishment Protocol (JSEP)</title | |||
Protocol</title> | > | |||
<seriesInfo name="RFC" value="8829" stream="IETF"/> | ||||
<author fullname="Justin Uberti" initials="J." surname="Uberti"> | <author fullname="Justin Uberti" initials="J." surname="Uberti"> | |||
<organization>Google</organization> | <organization showOnFrontPage="true">Google</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>747 6th St S</street> | <street>747 6th Street South</street> | |||
<city>Kirkland</city> | <city>Kirkland</city> | |||
<region>WA</region> | <region>WA</region> | |||
<code>98033</code> | <code>98033</code> | |||
<country>USA</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<email>justin@uberti.name</email> | <email>justin@uberti.name</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Cullen Jennings" initials="C." | <author fullname="Cullen Jennings" initials="C." surname="Jennings"> | |||
surname="Jennings"> | <organization showOnFrontPage="true">Cisco</organization> | |||
<organization>Cisco</organization> | ||||
<address> | <address> | |||
<postal> | <postal> | |||
<street>400 3rd Avenue SW</street> | <street>400 3rd Avenue SW</street> | |||
<city>Calgary</city> | <city>Calgary</city> | |||
<region>AB</region> | <region>AB</region> | |||
<code>T2P 4H2</code> | <code>T2P 4H2</code> | |||
<country>Canada</country> | <country>Canada</country> | |||
</postal> | </postal> | |||
<email>fluffy@iii.ca</email> | <email>fluffy@iii.ca</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Eric Rescorla" initials="E.K." surname="Rescorla" | <author fullname="Eric Rescorla" initials="E." surname="Rescorla" role="edit | |||
role="editor"> | or"> | |||
<organization>Mozilla</organization> | <organization showOnFrontPage="true">Mozilla</organization> | |||
<address> | <address> | |||
<postal> | ||||
<street>331 Evelyn Ave</street> | ||||
<city>Mountain View</city> | ||||
<region>CA</region> | ||||
<code>94041</code> | ||||
<country>USA</country> | ||||
</postal> | ||||
<email>ekr@rtfm.com</email> | <email>ekr@rtfm.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date /> | <date month="01" year="2021"/> | |||
<area>RAI</area> | <keyword>webrtc</keyword> | |||
<abstract> | <keyword>sdp</keyword> | |||
<keyword>negotiation</keyword> | ||||
<t>This document describes the mechanisms for allowing a | <keyword>signaling</keyword> | |||
<keyword>peerconnection</keyword> | ||||
<keyword>api</keyword> | ||||
<keyword>ice</keyword> | ||||
<keyword>rtp</keyword> | ||||
<keyword>offer</keyword> | ||||
<keyword>answer</keyword> | ||||
<abstract pn="section-abstract"> | ||||
<t indent="0" pn="section-abstract-1">This document describes the mechanis | ||||
ms for allowing a | ||||
JavaScript application to control the signaling plane of a | JavaScript application to control the signaling plane of a | |||
multimedia session via the interface specified in the W3C | multimedia session via the interface specified in the W3C | |||
RTCPeerConnection API, and discusses how this relates to existing | RTCPeerConnection API and discusses how this relates to existing | |||
signaling protocols.</t> | signaling protocols.</t> | |||
</abstract> | </abstract> | |||
<boilerplate> | ||||
<section anchor="status-of-memo" numbered="false" removeInRFC="false" toc= | ||||
"exclude" pn="section-boilerplate.1"> | ||||
<name slugifiedName="name-status-of-this-memo">Status of This Memo</name | ||||
> | ||||
<t indent="0" pn="section-boilerplate.1-1"> | ||||
This is an Internet Standards Track document. | ||||
</t> | ||||
<t indent="0" pn="section-boilerplate.1-2"> | ||||
This document is a product of the Internet Engineering Task Force | ||||
(IETF). It represents the consensus of the IETF community. It has | ||||
received public review and has been approved for publication by | ||||
the Internet Engineering Steering Group (IESG). Further | ||||
information on Internet Standards is available in Section 2 of | ||||
RFC 7841. | ||||
</t> | ||||
<t indent="0" pn="section-boilerplate.1-3"> | ||||
Information about the current status of this document, any | ||||
errata, and how to provide feedback on it may be obtained at | ||||
<eref target="https://www.rfc-editor.org/info/rfc8829" brackets="non | ||||
e"/>. | ||||
</t> | ||||
</section> | ||||
<section anchor="copyright" numbered="false" removeInRFC="false" toc="excl | ||||
ude" pn="section-boilerplate.2"> | ||||
<name slugifiedName="name-copyright-notice">Copyright Notice</name> | ||||
<t indent="0" pn="section-boilerplate.2-1"> | ||||
Copyright (c) 2021 IETF Trust and the persons identified as the | ||||
document authors. All rights reserved. | ||||
</t> | ||||
<t indent="0" pn="section-boilerplate.2-2"> | ||||
This document is subject to BCP 78 and the IETF Trust's Legal | ||||
Provisions Relating to IETF Documents | ||||
(<eref target="https://trustee.ietf.org/license-info" brackets="none | ||||
"/>) in effect on the date of | ||||
publication of this document. Please review these documents | ||||
carefully, as they describe your rights and restrictions with | ||||
respect to this document. Code Components extracted from this | ||||
document must include Simplified BSD License text as described in | ||||
Section 4.e of the Trust Legal Provisions and are provided without | ||||
warranty as described in the Simplified BSD License. | ||||
</t> | ||||
</section> | ||||
</boilerplate> | ||||
<toc> | ||||
<section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" p | ||||
n="section-toc.1"> | ||||
<name slugifiedName="name-table-of-contents">Table of Contents</name> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="section-to | ||||
c.1-1"> | ||||
<li pn="section-toc.1-1.1"> | ||||
<t indent="0" pn="section-toc.1-1.1.1"><xref derivedContent="1" form | ||||
at="counter" sectionFormat="of" target="section-1"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-introduction">Introduction</xref>< | ||||
/t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.1.2"> | ||||
<li pn="section-toc.1-1.1.2.1"> | ||||
<t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.1.1">< | ||||
xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1. | ||||
1"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-ge | ||||
neral-design-of-jsep">General Design of JSEP</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.1.2.2"> | ||||
<t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.2.1">< | ||||
xref derivedContent="1.2" format="counter" sectionFormat="of" target="section-1. | ||||
2"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-ot | ||||
her-approaches-considered">Other Approaches Considered</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.1.2.3"> | ||||
<t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.3.1">< | ||||
xref derivedContent="1.3" format="counter" sectionFormat="of" target="section-1. | ||||
3"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-co | ||||
ntradiction-regarding-bun">Contradiction regarding bundle-only "m=" sections</xr | ||||
ef></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.2"> | ||||
<t indent="0" pn="section-toc.1-1.2.1"><xref derivedContent="2" form | ||||
at="counter" sectionFormat="of" target="section-2"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-terminology">Terminology</xref></t | ||||
> | ||||
</li> | ||||
<li pn="section-toc.1-1.3"> | ||||
<t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" form | ||||
at="counter" sectionFormat="of" target="section-3"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-semantics-and-syntax">Semantics an | ||||
d Syntax</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.3.2"> | ||||
<li pn="section-toc.1-1.3.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.1.1"><xref derivedContent= | ||||
"3.1" format="counter" sectionFormat="of" target="section-3.1"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-signaling-model">Signa | ||||
ling Model</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.2.1"><xref derivedContent= | ||||
"3.2" format="counter" sectionFormat="of" target="section-3.2"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-session-descriptions-a | ||||
nd-st">Session Descriptions and State Machine</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.3.1"><xref derivedContent= | ||||
"3.3" format="counter" sectionFormat="of" target="section-3.3"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-session-description-fo | ||||
rmat">Session Description Format</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.4"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.4.1"><xref derivedContent= | ||||
"3.4" format="counter" sectionFormat="of" target="section-3.4"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-session-description-co | ||||
ntrol">Session Description Control</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.3.2.4.2"> | ||||
<li pn="section-toc.1-1.3.2.4.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.4.2.1.1"><xref derived | ||||
Content="3.4.1" format="counter" sectionFormat="of" target="section-3.4.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-rtptransce | ||||
ivers">RtpTransceivers</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.4.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.4.2.2.1"><xref derived | ||||
Content="3.4.2" format="counter" sectionFormat="of" target="section-3.4.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-rtpsenders | ||||
">RtpSenders</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.4.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.4.2.3.1"><xref derived | ||||
Content="3.4.3" format="counter" sectionFormat="of" target="section-3.4.3"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-rtpreceive | ||||
rs">RtpReceivers</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.5"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.5.1"><xref derivedContent= | ||||
"3.5" format="counter" sectionFormat="of" target="section-3.5"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-ice">ICE</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.3.2.5.2"> | ||||
<li pn="section-toc.1-1.3.2.5.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.5.2.1.1"><xref derived | ||||
Content="3.5.1" format="counter" sectionFormat="of" target="section-3.5.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-ice-gather | ||||
ing-overview">ICE Gathering Overview</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.5.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.5.2.2.1"><xref derived | ||||
Content="3.5.2" format="counter" sectionFormat="of" target="section-3.5.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-ice-candid | ||||
ate-trickling">ICE Candidate Trickling</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn | ||||
="section-toc.1-1.3.2.5.2.2.2"> | ||||
<li pn="section-toc.1-1.3.2.5.2.2.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.5.2.2.2.1.1"><xref | ||||
derivedContent="3.5.2.1" format="counter" sectionFormat="of" target="section-3. | ||||
5.2.1"/>. <xref derivedContent="" format="title" sectionFormat="of" target="nam | ||||
e-ice-candidate-format">ICE Candidate Format</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.5.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.5.2.3.1"><xref derived | ||||
Content="3.5.3" format="counter" sectionFormat="of" target="section-3.5.3"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-ice-candid | ||||
ate-policy">ICE Candidate Policy</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.5.2.4"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.5.2.4.1"><xref derived | ||||
Content="3.5.4" format="counter" sectionFormat="of" target="section-3.5.4"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-ice-candid | ||||
ate-pool">ICE Candidate Pool</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.5.2.5"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.5.2.5.1"><xref derived | ||||
Content="3.5.5" format="counter" sectionFormat="of" target="section-3.5.5"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-ice-versio | ||||
ns">ICE Versions</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.6"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.6.1"><xref derivedContent= | ||||
"3.6" format="counter" sectionFormat="of" target="section-3.6"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-video-size-negotiation | ||||
">Video Size Negotiation</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.3.2.6.2"> | ||||
<li pn="section-toc.1-1.3.2.6.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.6.2.1.1"><xref derived | ||||
Content="3.6.1" format="counter" sectionFormat="of" target="section-3.6.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-creating-a | ||||
n-imageattr-attri">Creating an imageattr Attribute</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.6.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.6.2.2.1"><xref derived | ||||
Content="3.6.2" format="counter" sectionFormat="of" target="section-3.6.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-interpreti | ||||
ng-imageattr-attr">Interpreting imageattr Attributes</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.7"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.7.1"><xref derivedContent= | ||||
"3.7" format="counter" sectionFormat="of" target="section-3.7"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-simulcast">Simulcast</ | ||||
xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.8"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.8.1"><xref derivedContent= | ||||
"3.8" format="counter" sectionFormat="of" target="section-3.8"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-interactions-with-fork | ||||
ing">Interactions with Forking</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.3.2.8.2"> | ||||
<li pn="section-toc.1-1.3.2.8.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.8.2.1.1"><xref derived | ||||
Content="3.8.1" format="counter" sectionFormat="of" target="section-3.8.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-sequential | ||||
-forking">Sequential Forking</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3.2.8.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.3.2.8.2.2.1"><xref derived | ||||
Content="3.8.2" format="counter" sectionFormat="of" target="section-3.8.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-parallel-f | ||||
orking">Parallel Forking</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.4"> | ||||
<t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" form | ||||
at="counter" sectionFormat="of" target="section-4"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-interface">Interface</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.4.2"> | ||||
<li pn="section-toc.1-1.4.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.1"><xref derivedContent= | ||||
"4.1" format="counter" sectionFormat="of" target="section-4.1"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-peerconnection">PeerCo | ||||
nnection</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.4.2.1.2"> | ||||
<li pn="section-toc.1-1.4.2.1.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.1.1"><xref derived | ||||
Content="4.1.1" format="counter" sectionFormat="of" target="section-4.1.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-constructo | ||||
r">Constructor</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.2.1"><xref derived | ||||
Content="4.1.2" format="counter" sectionFormat="of" target="section-4.1.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-addtrack"> | ||||
addTrack</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.3.1"><xref derived | ||||
Content="4.1.3" format="counter" sectionFormat="of" target="section-4.1.3"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-removetrac | ||||
k">removeTrack</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.4"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.4.1"><xref derived | ||||
Content="4.1.4" format="counter" sectionFormat="of" target="section-4.1.4"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-addtransce | ||||
iver">addTransceiver</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.5"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.5.1"><xref derived | ||||
Content="4.1.5" format="counter" sectionFormat="of" target="section-4.1.5"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-onaddtrack | ||||
-event">onaddtrack Event</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.6"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.6.1"><xref derived | ||||
Content="4.1.6" format="counter" sectionFormat="of" target="section-4.1.6"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-createdata | ||||
channel">createDataChannel</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.7"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.7.1"><xref derived | ||||
Content="4.1.7" format="counter" sectionFormat="of" target="section-4.1.7"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-ondatachan | ||||
nel-event">ondatachannel Event</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.8"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.8.1"><xref derived | ||||
Content="4.1.8" format="counter" sectionFormat="of" target="section-4.1.8"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-createoffe | ||||
r">createOffer</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.9"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.9.1"><xref derived | ||||
Content="4.1.9" format="counter" sectionFormat="of" target="section-4.1.9"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-createansw | ||||
er">createAnswer</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.10"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.10.1"><xref derive | ||||
dContent="4.1.10" format="counter" sectionFormat="of" target="section-4.1.10"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-sessiond | ||||
escriptiontype">SessionDescriptionType</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn | ||||
="section-toc.1-1.4.2.1.2.10.2"> | ||||
<li pn="section-toc.1-1.4.2.1.2.10.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.10.2.1.1"><xre | ||||
f derivedContent="4.1.10.1" format="counter" sectionFormat="of" target="section- | ||||
4.1.10.1"/>. <xref derivedContent="" format="title" sectionFormat="of" target=" | ||||
name-use-of-provisional-answers">Use of Provisional Answers</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.10.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.10.2.2.1"><xre | ||||
f derivedContent="4.1.10.2" format="counter" sectionFormat="of" target="section- | ||||
4.1.10.2"/>. <xref derivedContent="" format="title" sectionFormat="of" target=" | ||||
name-rollback">Rollback</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.11"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.11.1"><xref derive | ||||
dContent="4.1.11" format="counter" sectionFormat="of" target="section-4.1.11"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-setlocal | ||||
description">setLocalDescription</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.12"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.12.1"><xref derive | ||||
dContent="4.1.12" format="counter" sectionFormat="of" target="section-4.1.12"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-setremot | ||||
edescription">setRemoteDescription</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.13"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.13.1"><xref derive | ||||
dContent="4.1.13" format="counter" sectionFormat="of" target="section-4.1.13"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-currentl | ||||
ocaldescription">currentLocalDescription</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.14"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.14.1"><xref derive | ||||
dContent="4.1.14" format="counter" sectionFormat="of" target="section-4.1.14"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-pendingl | ||||
ocaldescription">pendingLocalDescription</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.15"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.15.1"><xref derive | ||||
dContent="4.1.15" format="counter" sectionFormat="of" target="section-4.1.15"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-currentr | ||||
emotedescription">currentRemoteDescription</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.16"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.16.1"><xref derive | ||||
dContent="4.1.16" format="counter" sectionFormat="of" target="section-4.1.16"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-pendingr | ||||
emotedescription">pendingRemoteDescription</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.17"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.17.1"><xref derive | ||||
dContent="4.1.17" format="counter" sectionFormat="of" target="section-4.1.17"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-cantrick | ||||
leicecandidates">canTrickleIceCandidates</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.18"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.18.1"><xref derive | ||||
dContent="4.1.18" format="counter" sectionFormat="of" target="section-4.1.18"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-setconfi | ||||
guration">setConfiguration</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.19"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.19.1"><xref derive | ||||
dContent="4.1.19" format="counter" sectionFormat="of" target="section-4.1.19"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-addiceca | ||||
ndidate">addIceCandidate</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.1.2.20"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.1.2.20.1"><xref derive | ||||
dContent="4.1.20" format="counter" sectionFormat="of" target="section-4.1.20"/>. | ||||
<xref derivedContent="" format="title" sectionFormat="of" target="name-onicecan | ||||
didate-event">onicecandidate Event</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.2.1"><xref derivedContent= | ||||
"4.2" format="counter" sectionFormat="of" target="section-4.2"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-rtptransceiver">RtpTra | ||||
nsceiver</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.4.2.2.2"> | ||||
<li pn="section-toc.1-1.4.2.2.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.2.2.1.1"><xref derived | ||||
Content="4.2.1" format="counter" sectionFormat="of" target="section-4.2.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-stop">stop | ||||
</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.2.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.2.2.2.1"><xref derived | ||||
Content="4.2.2" format="counter" sectionFormat="of" target="section-4.2.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-stopped">s | ||||
topped</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.2.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.2.2.3.1"><xref derived | ||||
Content="4.2.3" format="counter" sectionFormat="of" target="section-4.2.3"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-setdirecti | ||||
on">setDirection</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.2.2.4"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.2.2.4.1"><xref derived | ||||
Content="4.2.4" format="counter" sectionFormat="of" target="section-4.2.4"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-direction" | ||||
>direction</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.2.2.5"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.2.2.5.1"><xref derived | ||||
Content="4.2.5" format="counter" sectionFormat="of" target="section-4.2.5"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-currentdir | ||||
ection">currentDirection</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4.2.2.2.6"> | ||||
<t indent="0" pn="section-toc.1-1.4.2.2.2.6.1"><xref derived | ||||
Content="4.2.6" format="counter" sectionFormat="of" target="section-4.2.6"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-setcodecpr | ||||
eferences">setCodecPreferences</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.5"> | ||||
<t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" form | ||||
at="counter" sectionFormat="of" target="section-5"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-sdp-interaction-procedures">SDP In | ||||
teraction Procedures</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.5.2"> | ||||
<li pn="section-toc.1-1.5.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.1.1"><xref derivedContent= | ||||
"5.1" format="counter" sectionFormat="of" target="section-5.1"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-requirements-overview" | ||||
>Requirements Overview</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.5.2.1.2"> | ||||
<li pn="section-toc.1-1.5.2.1.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.1.2.1.1"><xref derived | ||||
Content="5.1.1" format="counter" sectionFormat="of" target="section-5.1.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-usage-requ | ||||
irements">Usage Requirements</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.1.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.1.2.2.1"><xref derived | ||||
Content="5.1.2" format="counter" sectionFormat="of" target="section-5.1.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-profile-na | ||||
mes-and-interoper">Profile Names and Interoperability</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.2.1"><xref derivedContent= | ||||
"5.2" format="counter" sectionFormat="of" target="section-5.2"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-constructing-an-offer" | ||||
>Constructing an Offer</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.5.2.2.2"> | ||||
<li pn="section-toc.1-1.5.2.2.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.2.2.1.1"><xref derived | ||||
Content="5.2.1" format="counter" sectionFormat="of" target="section-5.2.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-initial-of | ||||
fers">Initial Offers</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.2.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.2.2.2.1"><xref derived | ||||
Content="5.2.2" format="counter" sectionFormat="of" target="section-5.2.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-subsequent | ||||
-offers">Subsequent Offers</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.2.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.2.2.3.1"><xref derived | ||||
Content="5.2.3" format="counter" sectionFormat="of" target="section-5.2.3"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-options-ha | ||||
ndling">Options Handling</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn | ||||
="section-toc.1-1.5.2.2.2.3.2"> | ||||
<li pn="section-toc.1-1.5.2.2.2.3.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.2.2.3.2.1.1"><xref | ||||
derivedContent="5.2.3.1" format="counter" sectionFormat="of" target="section-5. | ||||
2.3.1"/>. <xref derivedContent="" format="title" sectionFormat="of" target="nam | ||||
e-icerestart">IceRestart</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.2.2.3.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.2.2.3.2.2.1"><xref | ||||
derivedContent="5.2.3.2" format="counter" sectionFormat="of" target="section-5. | ||||
2.3.2"/>. <xref derivedContent="" format="title" sectionFormat="of" target="nam | ||||
e-voiceactivitydetection">VoiceActivityDetection</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.3.1"><xref derivedContent= | ||||
"5.3" format="counter" sectionFormat="of" target="section-5.3"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-generating-an-answer"> | ||||
Generating an Answer</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.5.2.3.2"> | ||||
<li pn="section-toc.1-1.5.2.3.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.3.2.1.1"><xref derived | ||||
Content="5.3.1" format="counter" sectionFormat="of" target="section-5.3.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-initial-an | ||||
swers">Initial Answers</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.3.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.3.2.2.1"><xref derived | ||||
Content="5.3.2" format="counter" sectionFormat="of" target="section-5.3.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-subsequent | ||||
-answers">Subsequent Answers</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.3.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.3.2.3.1"><xref derived | ||||
Content="5.3.3" format="counter" sectionFormat="of" target="section-5.3.3"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-options-ha | ||||
ndling-2">Options Handling</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn | ||||
="section-toc.1-1.5.2.3.2.3.2"> | ||||
<li pn="section-toc.1-1.5.2.3.2.3.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.3.2.3.2.1.1"><xref | ||||
derivedContent="5.3.3.1" format="counter" sectionFormat="of" target="section-5. | ||||
3.3.1"/>. <xref derivedContent="" format="title" sectionFormat="of" target="nam | ||||
e-voiceactivitydetection-2">VoiceActivityDetection</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.4"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.4.1"><xref derivedContent= | ||||
"5.4" format="counter" sectionFormat="of" target="section-5.4"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-modifying-an-offer-or- | ||||
answe">Modifying an Offer or Answer</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.5"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.5.1"><xref derivedContent= | ||||
"5.5" format="counter" sectionFormat="of" target="section-5.5"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-processing-a-local-des | ||||
cript">Processing a Local Description</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.6"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.6.1"><xref derivedContent= | ||||
"5.6" format="counter" sectionFormat="of" target="section-5.6"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-processing-a-remote-de | ||||
scrip">Processing a Remote Description</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.7"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.7.1"><xref derivedContent= | ||||
"5.7" format="counter" sectionFormat="of" target="section-5.7"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-processing-a-rollback" | ||||
>Processing a Rollback</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.8"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.8.1"><xref derivedContent= | ||||
"5.8" format="counter" sectionFormat="of" target="section-5.8"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-parsing-a-session-desc | ||||
ripti">Parsing a Session Description</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.5.2.8.2"> | ||||
<li pn="section-toc.1-1.5.2.8.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.8.2.1.1"><xref derived | ||||
Content="5.8.1" format="counter" sectionFormat="of" target="section-5.8.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-session-le | ||||
vel-parsing">Session-Level Parsing</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.8.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.8.2.2.1"><xref derived | ||||
Content="5.8.2" format="counter" sectionFormat="of" target="section-5.8.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-media-sect | ||||
ion-parsing">Media Section Parsing</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.8.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.8.2.3.1"><xref derived | ||||
Content="5.8.3" format="counter" sectionFormat="of" target="section-5.8.3"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-semantics- | ||||
verification">Semantics Verification</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.9"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.9.1"><xref derivedContent= | ||||
"5.9" format="counter" sectionFormat="of" target="section-5.9"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-applying-a-local-descr | ||||
iptio">Applying a Local Description</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.10"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.10.1"><xref derivedContent | ||||
="5.10" format="counter" sectionFormat="of" target="section-5.10"/>. <xref deriv | ||||
edContent="" format="title" sectionFormat="of" target="name-applying-a-remote-de | ||||
scripti">Applying a Remote Description</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5.2.11"> | ||||
<t indent="0" pn="section-toc.1-1.5.2.11.1"><xref derivedContent | ||||
="5.11" format="counter" sectionFormat="of" target="section-5.11"/>. <xref deriv | ||||
edContent="" format="title" sectionFormat="of" target="name-applying-an-answer"> | ||||
Applying an Answer</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.6"> | ||||
<t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" form | ||||
at="counter" sectionFormat="of" target="section-6"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-processing-rtp-rtcp">Processing RT | ||||
P/RTCP</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7"> | ||||
<t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" form | ||||
at="counter" sectionFormat="of" target="section-7"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-examples">Examples</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.7.2"> | ||||
<li pn="section-toc.1-1.7.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.7.2.1.1"><xref derivedContent= | ||||
"7.1" format="counter" sectionFormat="of" target="section-7.1"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-simple-example">Simple | ||||
Example</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.7.2.2.1"><xref derivedContent= | ||||
"7.2" format="counter" sectionFormat="of" target="section-7.2"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-detailed-example">Deta | ||||
iled Example</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7.2.3"> | ||||
<t indent="0" pn="section-toc.1-1.7.2.3.1"><xref derivedContent= | ||||
"7.3" format="counter" sectionFormat="of" target="section-7.3"/>. <xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-early-transport-warmup | ||||
-exam">Early Transport Warmup Example</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.8"> | ||||
<t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" form | ||||
at="counter" sectionFormat="of" target="section-8"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-security-considerations">Security | ||||
Considerations</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.9"> | ||||
<t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" form | ||||
at="counter" sectionFormat="of" target="section-9"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-iana-considerations">IANA Consider | ||||
ations</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.10"> | ||||
<t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="10" fo | ||||
rmat="counter" sectionFormat="of" target="section-10"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-references">References</xref></t | ||||
> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.10.2"> | ||||
<li pn="section-toc.1-1.10.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.10.2.1.1"><xref derivedContent | ||||
="10.1" format="counter" sectionFormat="of" target="section-10.1"/>. <xref deri | ||||
vedContent="" format="title" sectionFormat="of" target="name-normative-reference | ||||
s">Normative References</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.10.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.10.2.2.1"><xref derivedContent | ||||
="10.2" format="counter" sectionFormat="of" target="section-10.2"/>. <xref deri | ||||
vedContent="" format="title" sectionFormat="of" target="name-informative-referen | ||||
ces">Informative References</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.11"> | ||||
<t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="Append | ||||
ix A" format="default" sectionFormat="of" target="section-appendix.a"/>. <xref | ||||
derivedContent="" format="title" sectionFormat="of" target="name-sdp-abnf-syntax | ||||
">SDP ABNF Syntax</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.12"> | ||||
<t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="" form | ||||
at="none" sectionFormat="of" target="section-appendix.b"/><xref derivedContent=" | ||||
" format="title" sectionFormat="of" target="name-acknowledgements">Acknowledgeme | ||||
nts</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.13"> | ||||
<t indent="0" pn="section-toc.1-1.13.1"><xref derivedContent="" form | ||||
at="none" sectionFormat="of" target="section-appendix.c"/><xref derivedContent=" | ||||
" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Add | ||||
resses</xref></t> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
</toc> | ||||
</front> | </front> | |||
<middle> | <middle> | |||
<section title="Introduction" anchor="sec.introduction"> | <section anchor="sec.introduction" numbered="true" toc="include" removeInRFC | |||
="false" pn="section-1"> | ||||
<t>This document describes how the W3C WEBRTC RTCPeerConnection | <name slugifiedName="name-introduction">Introduction</name> | |||
<t indent="0" pn="section-1-1">This document describes how the W3C Web Rea | ||||
l-Time Communication (WebRTC) RTCPeerConnection | ||||
interface | interface | |||
<xref target="W3C.webrtc"></xref> is used to control the setup, | <xref target="W3C.webrtc" format="default" sectionFormat="of" derivedConte | |||
management and teardown of a multimedia session.</t> | nt="W3C.webrtc"/> is used to control the setup, | |||
<section title="General Design of JSEP" | management, and teardown of a multimedia session.</t> | |||
anchor="sec.general-design-of-jsep"> | <section anchor="sec.general-design-of-jsep" numbered="true" toc="include" | |||
removeInRFC="false" pn="section-1.1"> | ||||
<t>WebRTC call setup has been designed to focus on controlling | <name slugifiedName="name-general-design-of-jsep">General Design of JSEP | |||
the media plane, leaving signaling plane behavior up to the | </name> | |||
<t indent="0" pn="section-1.1-1">WebRTC call setup has been designed to | ||||
focus on controlling | ||||
the media plane, leaving signaling-plane behavior up to the | ||||
application as much as possible. The rationale is that | application as much as possible. The rationale is that | |||
different applications may prefer to use different protocols, | different applications may prefer to use different protocols, | |||
such as the existing SIP call signaling protocol, or something | such as the existing SIP call signaling protocol, or something | |||
custom to the particular application, perhaps for a novel use | custom to the particular application, perhaps for a novel use | |||
case. In this approach, the key information that needs to be | case. In this approach, the key information that needs to be | |||
exchanged is the multimedia session description, which | exchanged is the multimedia session description, which | |||
specifies the necessary transport and media configuration | specifies the transport and media configuration | |||
information necessary to establish the media plane.</t> | information necessary to establish the media plane.</t> | |||
<t indent="0" pn="section-1.1-2">With these considerations in mind, this | ||||
<t>With these considerations in mind, this document describes | document describes | |||
the JavaScript Session Establishment Protocol (JSEP) that | the JavaScript Session Establishment Protocol (JSEP), which | |||
allows for full control of the signaling state machine from | allows for full control of the signaling state machine from | |||
JavaScript. As described above, JSEP assumes a model in which a | JavaScript. As described above, JSEP assumes a model in which a | |||
JavaScript application executes inside a runtime containing | JavaScript application executes inside a runtime containing | |||
WebRTC APIs (the "JSEP implementation"). The JSEP | WebRTC APIs (the "JSEP implementation"). The JSEP | |||
implementation is almost entirely divorced from the core | implementation is almost entirely divorced from the core | |||
signaling flow, which is instead handled by the JavaScript | signaling flow, which is instead handled by the JavaScript | |||
making use of two interfaces: (1) passing in local and remote | making use of two interfaces: (1) passing in local and remote | |||
session descriptions and (2) interacting with the ICE state | session descriptions and (2) interacting with the Interactive | |||
machine. The combination of the JSEP implementation and the | Connectivity Establishment (ICE) state | |||
machine <xref target="RFC8445" format="default" sectionFormat="of" deriv | ||||
edContent="RFC8445"/>. The combination of the JSEP implementation and the | ||||
JavaScript application is referred to throughout this document | JavaScript application is referred to throughout this document | |||
as a "JSEP endpoint".</t> | as a "JSEP endpoint".</t> | |||
<t indent="0" pn="section-1.1-3">In this document, the use of JSEP is de | ||||
<t>In this document, the use of JSEP is described as if it | scribed as if it | |||
always occurs between two JSEP endpoints. Note though in many | always occurs between two JSEP endpoints. Note, though, that in many | |||
cases it will actually be between a JSEP endpoint and some kind | cases it will actually be between a JSEP endpoint and some kind | |||
of server, such as a gateway or MCU. This distinction is | of server, such as a gateway or Multipoint Control Unit (MCU). This dist inction is | |||
invisible to the JSEP endpoint; it just follows the | invisible to the JSEP endpoint; it just follows the | |||
instructions it is given via the API.</t> | instructions it is given via the API.</t> | |||
<t indent="0" pn="section-1.1-4">JSEP's handling of session descriptions | ||||
<t>JSEP's handling of session descriptions is simple and | is simple and | |||
straightforward. Whenever an offer/answer exchange is needed, | straightforward. Whenever an offer/answer exchange is needed, | |||
the initiating side creates an offer by calling a createOffer() | the initiating side creates an offer by calling a createOffer | |||
API. The application then uses that offer to set up its local | API. The application then uses that offer to set up its local | |||
config via the setLocalDescription() API. The offer is finally | configuration via the setLocalDescription API. The offer is finally | |||
sent off to the remote side over its preferred signaling | sent off to the remote side over its preferred signaling | |||
mechanism (e.g., WebSockets); upon receipt of that offer, the | mechanism (e.g., WebSockets); upon receipt of that offer, the | |||
remote party installs it using the setRemoteDescription() | remote party installs it using the setRemoteDescription | |||
API.</t> | API.</t> | |||
<t indent="0" pn="section-1.1-5">To complete the offer/answer exchange, | ||||
<t>To complete the offer/answer exchange, the remote party uses | the remote party uses | |||
the createAnswer() API to generate an appropriate answer, | the createAnswer API to generate an appropriate answer, | |||
applies it using the setLocalDescription() API, and sends the | applies it using the setLocalDescription API, and sends the | |||
answer back to the initiator over the signaling channel. When | answer back to the initiator over the signaling channel. When | |||
the initiator gets that answer, it installs it using the | the initiator gets that answer, it installs it using the | |||
setRemoteDescription() API, and initial setup is complete. This | setRemoteDescription API, and initial setup is complete. This | |||
process can be repeated for additional offer/answer | process can be repeated for additional offer/answer | |||
exchanges.</t> | exchanges.</t> | |||
<t indent="0" pn="section-1.1-6">Regarding ICE | ||||
<t>Regarding ICE | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten | |||
<xref target="RFC8445"></xref>, JSEP decouples the ICE state | t="RFC8445"/>, JSEP decouples the ICE state | |||
machine from the overall signaling state machine, as the ICE | machine from the overall signaling state machine. The ICE | |||
state machine must remain in the JSEP implementation, because | state machine must remain in the JSEP implementation because | |||
only the implementation has the necessary knowledge of | only the implementation has the necessary knowledge of | |||
candidates and other transport information. Performing this | candidates and other transport information. Performing this | |||
separation provides additional flexibility in protocols that | separation provides additional flexibility in protocols that | |||
decouple session descriptions from transport. For instance, in | decouple session descriptions from transport. For instance, in | |||
traditional SIP, each offer or answer is self-contained, | traditional SIP, each offer or answer is self-contained, | |||
including both the session descriptions and the transport | including both the session descriptions and the transport | |||
information. However, | information. However, | |||
<xref target="I-D.ietf-mmusic-trickle-ice-sip" /> allows SIP to | <xref target="RFC8840" format="default" sectionFormat="of" derivedConten | |||
be used with trickle ICE | t="RFC8840"/> allows SIP to | |||
<xref target="I-D.ietf-ice-trickle" />, in which the session | be used with Trickle ICE | |||
<xref target="RFC8838" format="default" sectionFormat="of" derivedConten | ||||
t="RFC8838"/>, in which the session | ||||
description can be sent immediately and the transport | description can be sent immediately and the transport | |||
information can be sent when available. Sending transport | information can be sent when available. Sending transport | |||
information separately can allow for faster ICE and DTLS | information separately can allow for faster ICE and DTLS | |||
startup, since ICE checks can start as soon as any transport | startup, since ICE checks can start as soon as any transport | |||
information is available rather than waiting for all of it. | information is available rather than waiting for all of it. | |||
JSEP's decoupling of the ICE and signaling state machines | JSEP's decoupling of the ICE and signaling state machines | |||
allows it to accommodate either model.</t> | allows it to accommodate either model.</t> | |||
<t indent="0" pn="section-1.1-7">Although it abstracts signaling, the JS | ||||
<t>Through its abstraction of signaling, the JSEP approach does | EP approach | |||
require the application to be aware of the signaling process. | requires that the application be aware of the signaling process. | |||
While the application does not need to understand the contents | While the application does not need to understand the contents | |||
of session descriptions to set up a call, the application must | of session descriptions to set up a call, the application must | |||
call the right APIs at the right times, convert the session | call the right APIs at the right times, convert the session | |||
descriptions and ICE information into the defined messages of | descriptions and ICE information into the defined messages of | |||
its chosen signaling protocol, and perform the reverse | its chosen signaling protocol, and perform the reverse | |||
conversion on the messages it receives from the other side.</t> | conversion on the messages it receives from the other side.</t> | |||
<t indent="0" pn="section-1.1-8">One way to make life easier for the app | ||||
<t>One way to make life easier for the application is to | lication is to | |||
provide a JavaScript library that hides this complexity from | provide a JavaScript library that hides this complexity from | |||
the developer; said library would implement a given signaling | the developer; said library would implement a given signaling | |||
protocol along with its state machine and serialization code, | protocol along with its state machine and serialization code, | |||
presenting a higher level call-oriented interface to the | presenting a higher-level call-oriented interface to the | |||
application developer. For example, libraries exist to adapt | application developer. For example, libraries exist to provide | |||
the JSEP API into an API suitable for a SIP or XMPP. Thus, JSEP | implementations of the SIP <xref target="RFC3261" format="default" secti | |||
onFormat="of" derivedContent="RFC3261"/> and Extensible Messaging | ||||
and Presence Protocol (XMPP) <xref target="RFC6120" format="default" sec | ||||
tionFormat="of" derivedContent="RFC6120"/> signaling | ||||
protocols atop the JSEP API. | ||||
Thus, JSEP | ||||
provides greater control for the experienced developer without | provides greater control for the experienced developer without | |||
forcing any additional complexity on the novice developer.</t> | forcing any additional complexity on the novice developer.</t> | |||
</section> | </section> | |||
<section title="Other Approaches Considered" | <section anchor="sec.other-approaches-consider" numbered="true" toc="inclu | |||
anchor="sec.other-approaches-consider"> | de" removeInRFC="false" pn="section-1.2"> | |||
<name slugifiedName="name-other-approaches-considered">Other Approaches | ||||
<t>One approach that was considered instead of JSEP was to | Considered</name> | |||
<t indent="0" pn="section-1.2-1">One approach that was considered instea | ||||
d of JSEP was to | ||||
include a lightweight signaling protocol. Instead of providing | include a lightweight signaling protocol. Instead of providing | |||
session descriptions to the API, the API would produce and | session descriptions to the API, the API would produce and | |||
consume messages from this protocol. While providing a more | consume messages from this protocol. While providing a more | |||
high-level API, this put more control of signaling within the | high-level API, this put more control of signaling within the | |||
JSEP implementation, forcing it to have to understand and | JSEP implementation, forcing it to have to understand and | |||
handle concepts like signaling glare (see | handle concepts like signaling glare (see | |||
<xref target="RFC3264" />, Section 4).</t> | <xref target="RFC3264" sectionFormat="comma" section="4" format="default | |||
" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-4" derivedContent="RFC | ||||
<t>A second approach that was considered but not chosen was to | 3264"/>).</t> | |||
<t indent="0" pn="section-1.2-2">A second approach that was considered b | ||||
ut not chosen was to | ||||
decouple the management of the media control objects from | decouple the management of the media control objects from | |||
session descriptions, instead offering APIs that would control | session descriptions, instead offering APIs that would control | |||
each component directly. This was rejected based on the | each component directly. This was rejected based on the | |||
argument that requiring exposure of this level of complexity to | argument that requiring exposure of this level of complexity to | |||
the application programmer would not be beneficial; it would | the application programmer would not be beneficial; it would | |||
result in an API where even a simple example would require a | (1) result in an API where even a simple example would require a | |||
significant amount of code to orchestrate all the needed | significant amount of code to orchestrate all the needed | |||
interactions, as well as creating a large API surface that | interactions and (2) create a large API surface that | |||
needed to be agreed upon and documented. In addition, these API | would need to be agreed upon and documented. | |||
In addition, these API | ||||
points could be called in any order, resulting in a more | points could be called in any order, resulting in a more | |||
complex set of interactions with the media subsystem than the | complex set of interactions with the media subsystem than the | |||
JSEP approach, which specifies how session descriptions are to | JSEP approach, which specifies how session descriptions are to | |||
be evaluated and applied.</t> | be evaluated and applied.</t> | |||
<t indent="0" pn="section-1.2-3">One variation on JSEP that was consider | ||||
<t>One variation on JSEP that was considered was to keep the | ed was to keep the | |||
basic session description-oriented API, but to move the | basic session-description-oriented API but to move the | |||
mechanism for generating offers and answers out of the JSEP | mechanism for generating offers and answers out of the JSEP | |||
implementation. Instead of providing createOffer/createAnswer | implementation. Instead of providing createOffer/createAnswer | |||
methods within the implementation, this approach would instead | methods within the implementation, this approach would instead | |||
expose a getCapabilities API which would provide the | expose a getCapabilities API, which would provide the | |||
application with the information it needed in order to generate | application with the information it needed in order to generate | |||
its own session descriptions. This increases the amount of work | its own session descriptions. This increases the amount of work | |||
that the application needs to do; it needs to know how to | that the application needs to do; it needs to know how to | |||
generate session descriptions from capabilities, and especially | generate session descriptions from capabilities, and especially | |||
how to generate the correct answer from an arbitrary offer and | how to generate the correct answer from an arbitrary offer and | |||
the supported capabilities. While this could certainly be | the supported capabilities. While this could certainly be | |||
addressed by using a library like the one mentioned above, it | addressed by using a library like the one mentioned above, it | |||
basically forces the use of said library even for a simple | basically forces the use of said library even for a simple | |||
example. Providing createOffer/createAnswer avoids this | example. Providing createOffer/createAnswer avoids this | |||
problem.</t> | problem.</t> | |||
</section> | </section> | |||
<section numbered="true" removeInRFC="false" toc="include" pn="section-1.3 | ||||
"> | ||||
<name slugifiedName="name-contradiction-regarding-bun">Contradiction reg | ||||
arding bundle-only "m=" sections</name> | ||||
<t indent="0" pn="section-1.3-1">Since the approval of the WebRTC specif | ||||
ication documents, the IETF has become | ||||
aware of an inconsistency between the document specifying JSEP and the document | ||||
specifying BUNDLE (this RFC and <xref target="RFC8843" format="default" sectionF | ||||
ormat="of" derivedContent="RFC8843"/>, respectively). Rather than delaying publ | ||||
ication further to come to a resolution, the documents are being published as th | ||||
ey were originally approved. The IETF intends to restart work on these technolo | ||||
gies, and revised versions of these documents will be published as soon as a res | ||||
olution becomes available.</t> | ||||
<t indent="0" pn="section-1.3-2">The specific issue involves the handlin | ||||
g of "m=" sections that are designated as bundle-only, as discussed in <xref tar | ||||
get="sec.pc-constructor" format="default" sectionFormat="of" derivedContent="Sec | ||||
tion 4.1.1"/> of this RFC. Currently, there is divergence between JSEP and BUNDL | ||||
E, as well as between these specifications and existing browser implementations: | ||||
</t> | ||||
<ul bare="false" empty="false" indent="3" spacing="normal" pn="section-1 | ||||
.3-3"> | ||||
<li pn="section-1.3-3.1">JSEP prescribes that said "m=" sections shoul | ||||
d use port zero and add an "a=bundle-only" attribute in initial offers, but not | ||||
in answers or subsequent offers.</li> | ||||
<li pn="section-1.3-3.2">BUNDLE prescribes that these "m=" sections sh | ||||
ould be marked as described in the previous point, but in all offers and answers | ||||
.</li> | ||||
<li pn="section-1.3-3.3">Most current browsers do not mark any "m=" se | ||||
ctions with port zero and instead use the same port for all bundled "m=" section | ||||
s; one follows the JSEP behavior.</li> | ||||
</ul> | ||||
</section> | ||||
</section> | </section> | |||
<section title="Terminology" anchor="sec.terminology"> | <section anchor="sec.terminology" numbered="true" toc="include" removeInRFC= | |||
"false" pn="section-2"> | ||||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | <name slugifiedName="name-terminology">Terminology</name> | |||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and | <t indent="0" pn="section-2-1">The key words "<bcp14>MUST</bcp14>", "<bcp1 | |||
"OPTIONAL" in this document are to be interpreted as described in | 4>MUST NOT</bcp14>", | |||
"<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | ||||
<xref target="RFC2119"></xref>.</t> | "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | |||
"<bcp14>SHOULD NOT</bcp14>", | ||||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | ||||
to be interpreted as described in BCP 14 <xref target="RFC2119" format="defa | ||||
ult" sectionFormat="of" derivedContent="RFC2119"/> | ||||
<xref target="RFC8174" format="default" sectionFormat="of" derivedConten | ||||
t="RFC8174"/> when, and only when, they appear in all capitals, | ||||
as shown here.</t> | ||||
</section> | </section> | |||
<section title="Semantics and Syntax" | <section anchor="sec.semantics-and-syntax" numbered="true" toc="include" rem | |||
anchor="sec.semantics-and-syntax"> | oveInRFC="false" pn="section-3"> | |||
<section title="Signaling Model" anchor="sec.signaling-model"> | <name slugifiedName="name-semantics-and-syntax">Semantics and Syntax</name | |||
> | ||||
<t>JSEP does not specify a particular signaling model or state | <section anchor="sec.signaling-model" numbered="true" toc="include" remove | |||
InRFC="false" pn="section-3.1"> | ||||
<name slugifiedName="name-signaling-model">Signaling Model</name> | ||||
<t indent="0" pn="section-3.1-1">JSEP does not specify a particular sign | ||||
aling model or state | ||||
machine, other than the generic need to exchange session | machine, other than the generic need to exchange session | |||
descriptions in the fashion described by | descriptions in the fashion described by | |||
<xref target="RFC3264"></xref> (offer/answer) in order for both | <xref target="RFC3264" format="default" sectionFormat="of" derivedConten t="RFC3264"/> (offer/answer) in order for both | |||
sides of the session to know how to conduct the session. JSEP | sides of the session to know how to conduct the session. JSEP | |||
provides mechanisms to create offers and answers, as well as to | provides mechanisms to create offers and answers, as well as to | |||
apply them to a session. However, the JSEP implementation is | apply them to a session. However, the JSEP implementation is | |||
totally decoupled from the actual mechanism by which these | totally decoupled from the actual mechanism by which these | |||
offers and answers are communicated to the remote side, | offers and answers are communicated to the remote side, | |||
including addressing, retransmission, forking, and glare | including addressing, retransmission, forking, and glare | |||
handling. These issues are left entirely up to the application; | handling. These issues are left entirely up to the application; | |||
the application has complete control over which offers and | the application has complete control over which offers and | |||
answers get handed to the implementation, and when.</t> | answers get handed to the implementation, and when.</t> | |||
<figure anchor="fig-sigModel" title="JSEP Signaling Model"> | <figure anchor="fig-sigModel" align="left" suppress-title="false" pn="fi | |||
<artwork> | gure-1"> | |||
<![CDATA[ | <name slugifiedName="name-jsep-signaling-model">JSEP Signaling Model</ | |||
+-----------+ +-----------+ | name> | |||
| Web App |<--- App-Specific Signaling -->| Web App | | <artwork name="" type="ascii-art" align="left" alt="" pn="section-3.1- | |||
+-----------+ +-----------+ | 2.1"> | |||
^ ^ | +-----------+ +-----------+ | |||
| SDP | SDP | | Web App |<--- App-Specific Signaling -->| Web App | | |||
V V | +-----------+ +-----------+ | |||
+-----------+ +-----------+ | ^ ^ | |||
| JSEP |<----------- Media ------------>| JSEP | | | SDP | SDP | |||
| Impl. | | Impl. | | V V | |||
+-----------+ +-----------+ | +-----------+ +-----------+ | |||
]]> | | JSEP |<----------- Media ------------>| JSEP | | |||
</artwork> | | Impl. | | Impl. | | |||
+-----------+ +-----------+ </artwork> | ||||
</figure> | </figure> | |||
</section> | </section> | |||
<section title="Session Descriptions and State Machine" | <section anchor="sec.session-descriptions-and-state-machine" numbered="tru | |||
anchor="sec.session-descriptions-and-state-machine"> | e" toc="include" removeInRFC="false" pn="section-3.2"> | |||
<name slugifiedName="name-session-descriptions-and-st">Session Descripti | ||||
<t>In order to establish the media plane, the JSEP | ons and State Machine</name> | |||
<t indent="0" pn="section-3.2-1">In order to establish the media plane, | ||||
the JSEP | ||||
implementation needs specific parameters to indicate what to | implementation needs specific parameters to indicate what to | |||
transmit to the remote side, as well as how to handle the media | transmit to the remote side, as well as how to handle the media | |||
that is received. These parameters are determined by the | that is received. These parameters are determined by the | |||
exchange of session descriptions in offers and answers, and | exchange of session descriptions in offers and answers, and | |||
there are certain details to this process that must be handled | there are certain details to this process that must be handled | |||
in the JSEP APIs.</t> | in the JSEP APIs.</t> | |||
<t indent="0" pn="section-3.2-2">Whether a session description applies t | ||||
<t>Whether a session description applies to the local side or | o the local side or | |||
the remote side affects the meaning of that description. For | the remote side affects the meaning of that description. For | |||
example, the list of codecs sent to a remote party indicates | example, the list of codecs sent to a remote party indicates | |||
what the local side is willing to receive, which, when | what the local side is willing to receive, which, when | |||
intersected with the set of codecs the remote side supports, | intersected with the set of codecs the remote side supports, | |||
specifies what the remote side should send. However, not all | specifies what the remote side should send. However, not all | |||
parameters follow this rule; some parameters are declarative | parameters follow this rule; some parameters are declarative, | |||
and the remote side MUST either accept them or reject them | and the remote side must either accept them or reject them | |||
altogether. An example of such a parameter is the DTLS | altogether. An example of such a parameter is the TLS | |||
fingerprints | fingerprints <xref target="RFC8122" format="default" sectionFormat="of" | |||
<xref target="RFC8122"></xref>, which are calculated based on | derivedContent="RFC8122"/> | |||
the local certificate(s) offered, and are not subject to | as used in the context of DTLS <xref target="RFC6347" format="default" s | |||
negotiation.</t> | ectionFormat="of" derivedContent="RFC6347"/>; | |||
these fingerprints are calculated based on | ||||
<t>In addition, various RFCs put different conditions on the | the local certificate(s) offered and are not subject to | |||
negotiation. | ||||
</t> | ||||
<t indent="0" pn="section-3.2-3">In addition, various RFCs put different | ||||
conditions on the | ||||
format of offers versus answers. For example, an offer may | format of offers versus answers. For example, an offer may | |||
propose an arbitrary number of m= sections (i.e., media | propose an arbitrary number of "m=" sections (i.e., media | |||
descriptions as described in | descriptions as described in | |||
<xref target="RFC4566" />, Section 5.14), but an answer must | <xref target="RFC4566" sectionFormat="comma" section="5.14" format="defa ult" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.14" derivedConten t="RFC4566"/>), but an answer must | |||
contain the exact same number as the offer.</t> | contain the exact same number as the offer.</t> | |||
<t indent="0" pn="section-3.2-4">Lastly, while the exact media parameter | ||||
<t>Lastly, while the exact media parameters are only known only | s are known only | |||
after an offer and an answer have been exchanged, the offerer | after an offer and an answer have been exchanged, the offerer | |||
may receive ICE checks, and possibly media (e.g., in the case | may receive ICE checks, and possibly media (e.g., in the case | |||
of a re-offer after a connection has been established) before | of a re-offer after a connection has been established) before | |||
it receives an answer. To properly process incoming media in | it receives an answer. To properly process incoming media in | |||
this case, the offerer's media handler must be aware of the | this case, the offerer's media handler must be aware of the | |||
details of the offer before the answer arrives.</t> | details of the offer before the answer arrives.</t> | |||
<t indent="0" pn="section-3.2-5">Therefore, in order to handle session d | ||||
<t>Therefore, in order to handle session descriptions properly, | escriptions properly, | |||
the JSEP implementation needs: | the JSEP implementation needs: | |||
<list style="numbers"> | </t> | |||
<ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-3. | ||||
<t>To know if a session description pertains to the local or | 2-6"> | |||
remote side.</t> | <li pn="section-3.2-6.1" derivedCounter="1.">To know if a session desc | |||
ription pertains to the local or | ||||
<t>To know if a session description is an offer or an | remote side.</li> | |||
answer.</t> | <li pn="section-3.2-6.2" derivedCounter="2.">To know if a session desc | |||
ription is an offer or an | ||||
<t>To allow the offer to be specified independently of the | answer.</li> | |||
answer.</t> | <li pn="section-3.2-6.3" derivedCounter="3.">To allow the offer to be | |||
</list>JSEP addresses this by adding both setLocalDescription | specified independently of the | |||
answer.</li> | ||||
</ol> | ||||
<t indent="0" pn="section-3.2-7">JSEP addresses this by adding both setL | ||||
ocalDescription | ||||
and setRemoteDescription methods and having session description | and setRemoteDescription methods and having session description | |||
objects contain a type field indicating the type of session | objects contain a type field indicating the type of session | |||
description being supplied. This satisfies the requirements | description being supplied. This satisfies the requirements | |||
listed above for both the offerer, who first calls | listed above for both the offerer, who first calls | |||
setLocalDescription(sdp [offer]) and then later | setLocalDescription(sdp [offer]) and then later | |||
setRemoteDescription(sdp [answer]), as well as for the | setRemoteDescription(sdp [answer]), and the | |||
answerer, who first calls setRemoteDescription(sdp [offer]) and | answerer, who first calls setRemoteDescription(sdp [offer]) and | |||
then later setLocalDescription(sdp [answer]).</t> | then later setLocalDescription(sdp [answer]).</t> | |||
<t indent="0" pn="section-3.2-8">During the offer/answer exchange, the o | ||||
<t>During the offer/answer exchange, the outstanding offer is | utstanding offer is | |||
considered to be "pending" at the offerer and the answerer, as | considered to be "pending" at the offerer and the answerer, as | |||
it may either be accepted or rejected. If this is a re-offer, | it may be either accepted or rejected. If this is a re-offer, | |||
each side will also have "current" local and remote | each side will also have "current" local and remote | |||
descriptions, which reflect the result of the last offer/answer | descriptions, which reflect the result of the last offer/answer | |||
exchange. Sections | exchange. Sections | |||
<xref target="sec.pendinglocaldescription" />, | <xref target="sec.pendinglocaldescription" format="counter" sectionForma | |||
<xref target="sec.pendingremotedescription" />, | t="of" derivedContent="4.1.14"/>, | |||
<xref target="sec.currentlocaldescription" />, and | <xref target="sec.pendingremotedescription" format="counter" sectionForm | |||
<xref target="sec.currentremotedescription" />, provide more | at="of" derivedContent="4.1.16"/>, | |||
<xref target="sec.currentlocaldescription" format="counter" sectionForma | ||||
t="of" derivedContent="4.1.13"/>, and | ||||
<xref target="sec.currentremotedescription" format="counter" sectionForm | ||||
at="of" derivedContent="4.1.15"/> provide more | ||||
detail on pending and current descriptions.</t> | detail on pending and current descriptions.</t> | |||
<t indent="0" pn="section-3.2-9">JSEP also allows for an answer to be tr | ||||
<t>JSEP also allows for an answer to be treated as provisional | eated as provisional | |||
by the application. Provisional answers provide a way for an | by the application. Provisional answers provide a way for an | |||
answerer to communicate initial session parameters back to the | answerer to communicate initial session parameters back to the | |||
offerer, in order to allow the session to begin, while allowing | offerer, in order to allow the session to begin, while allowing | |||
a final answer to be specified later. This concept of a final | a final answer to be specified later. This concept of a final | |||
answer is important to the offer/answer model; when such an | answer is important to the offer/answer model; when such an | |||
answer is received, any extra resources allocated by the caller | answer is received, any extra resources allocated by the caller | |||
can be released, now that the exact session configuration is | can be released, now that the exact session configuration is | |||
known. These "resources" can include things like extra ICE | known. These "resources" can include things like extra ICE | |||
components, TURN candidates, or video decoders. Provisional | components, Traversal Using Relays around NAT (TURN) candidates, or vide o decoders. Provisional | |||
answers, on the other hand, do no such deallocation; as a | answers, on the other hand, do no such deallocation; as a | |||
result, multiple dissimilar provisional answers, with their own | result, multiple dissimilar provisional answers, with their own | |||
codec choices, transport parameters, etc., can be received and | codec choices, transport parameters, etc., can be received and | |||
applied during call setup. Note that the final answer itself | applied during call setup. Note that the final answer itself | |||
may be different than any received provisional answers.</t> | may be different than any received provisional answers.</t> | |||
<t indent="0" pn="section-3.2-10">In | ||||
<t>In | <xref target="RFC3264" format="default" sectionFormat="of" derivedConten | |||
<xref target="RFC3264"></xref>, the constraint at the signaling | t="RFC3264"/>, the constraint at the signaling | |||
level is that only one offer can be outstanding for a given | level is that only one offer can be outstanding for a given | |||
session, but at the media stack level, a new offer can be | session, but at the JSEP level, a new offer can be | |||
generated at any point. For example, when using SIP for | generated at any point. For example, when using SIP for | |||
signaling, if one offer is sent, then cancelled using a SIP | signaling, if one offer is sent and is then canceled using a SIP | |||
CANCEL, another offer can be generated even though no answer | CANCEL, another offer can be generated even though no answer | |||
was received for the first offer. To support this, the JSEP | was received for the first offer. To support this, the JSEP | |||
media layer can provide an offer via the createOffer() method | media layer can provide an offer via the createOffer method | |||
whenever the JavaScript application needs one for the | whenever the JavaScript application needs one for the | |||
signaling. The answerer can send back zero or more provisional | signaling. The answerer can send back zero or more provisional | |||
answers, and finally end the offer-answer exchange by sending a | answers and then finally end the offer/answer exchange by sending a | |||
final answer. The state machine for this is as follows:</t> | final answer. The state machine for this is as follows:</t> | |||
<figure anchor="fig-state-machine" align="left" suppress-title="false" p | ||||
<t> | n="figure-2"> | |||
<figure anchor="fig-state-machine" | <name slugifiedName="name-jsep-state-machine">JSEP State Machine</name | |||
title="JSEP State Machine"> | > | |||
<artwork> | <artwork name="" type="ascii-art" align="left" alt="" pn="section-3.2- | |||
<![CDATA[ | 11.1"> | |||
setRemote(OFFER) setLocal(PRANSWER) | setRemote(OFFER) setLocal(PRANSWER) | |||
/-----\ /-----\ | /-----\ /-----\ | |||
| | | | | | | | | | |||
v | v | | v | v | | |||
+---------------+ | +---------------+ | | +---------------+ | +---------------+ | | |||
| |----/ | |----/ | | |----/ | |----/ | |||
| have- | setLocal(PRANSWER) | have- | | | have- | setLocal(PRANSWER) | have- | | |||
| remote-offer |------------------- >| local-pranswer| | | remote-offer |------------------- >| local-pranswer| | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
+---------------+ +---------------+ | +---------------+ +---------------+ | |||
^ | | | ^ | | | |||
| | setLocal(ANSWER) | | | | setLocal(ANSWER) | | |||
setRemote(OFFER) | | | setRemote(OFFER) | | | |||
| V setLocal(ANSWER) | | | V setLocal(ANSWER) | | |||
+---------------+ | | +---------------+ | | |||
| | | | | | | | |||
| |<---------------------------+ | | |<---------------------------+ | |||
| stable | | | stable | | |||
| |<---------------------------+ | | |<---------------------------+ | |||
| | | | | | | | |||
+---------------+ setRemote(ANSWER) | | +---------------+ setRemote(ANSWER) | | |||
^ | | | ^ | | | |||
| | setLocal(OFFER) | | | | setLocal(OFFER) | | |||
setRemote(ANSWER) | | | setRemote(ANSWER) | | | |||
| V | | | V | | |||
+---------------+ +---------------+ | +---------------+ +---------------+ | |||
| | | | | | | | | | |||
| have- | setRemote(PRANSWER) |have- | | | have- | setRemote(PRANSWER) |have- | | |||
| local-offer |------------------- >|remote-pranswer| | | local-offer |------------------- >|remote-pranswer| | |||
| | | | | | | | | | |||
| |----\ | |----\ | | |----\ | |----\ | |||
+---------------+ | +---------------+ | | +---------------+ | +---------------+ | | |||
^ | ^ | | ^ | ^ | | |||
| | | | | | | | | | |||
\-----/ \-----/ | \-----/ \-----/ | |||
setLocal(OFFER) setRemote(PRANSWER) | setLocal(OFFER) setRemote(PRANSWER) </artwork> | |||
]]> | </figure> | |||
</artwork> | <t indent="0" pn="section-3.2-12">Aside from these state transitions, th | |||
</figure> | ere is no other | |||
</t> | ||||
<t>Aside from these state transitions there is no other | ||||
difference between the handling of provisional ("pranswer") and | difference between the handling of provisional ("pranswer") and | |||
final ("answer") answers.</t> | final ("answer") answers.</t> | |||
</section> | </section> | |||
<section title="Session Description Format" | <section anchor="sec.session-description-forma" numbered="true" toc="inclu | |||
anchor="sec.session-description-forma"> | de" removeInRFC="false" pn="section-3.3"> | |||
<name slugifiedName="name-session-description-format">Session Descriptio | ||||
<t>JSEP's session descriptions use SDP syntax for their | n Format</name> | |||
<t indent="0" pn="section-3.3-1">JSEP's session descriptions use Session | ||||
Description Protocol (SDP) syntax for their | ||||
internal representation. While this format is not optimal for | internal representation. While this format is not optimal for | |||
manipulation from JavaScript, it is widely accepted, and | manipulation from JavaScript, it is widely accepted and is | |||
frequently updated with new features; any alternate encoding of | frequently updated with new features; any alternate encoding of | |||
session descriptions would have to keep pace with the changes | session descriptions would have to keep pace with the changes | |||
to SDP, at least until the time that this new encoding eclipsed | to SDP, at least until the time that this new encoding eclipsed | |||
SDP in popularity.</t> | SDP in popularity.</t> | |||
<t indent="0" pn="section-3.3-2">However, to provide for future flexibil | ||||
<t>However, to provide for future flexibility, the SDP syntax | ity, the SDP syntax | |||
is encapsulated within a SessionDescription object, which can | is encapsulated within a SessionDescription object, which can | |||
be constructed from SDP, and be serialized out to SDP. If | be constructed from SDP and be serialized out to SDP. If | |||
future specifications agree on a JSON format for session | future specifications agree on a JSON format for session | |||
descriptions, we could easily enable this object to generate | descriptions, we could easily enable this object to generate | |||
and consume that JSON.</t> | and consume that JSON.</t> | |||
<t indent="0" pn="section-3.3-3">As detailed below, most applications sh | ||||
<t>As detailed below, most applications should be able to treat | ould be able to treat | |||
the SessionDescriptions produced and consumed by these various | the SessionDescriptions produced and consumed by these various | |||
API calls as opaque blobs; that is, the application will not | API calls as opaque blobs; that is, the application will not | |||
need to read or change them.</t> | need to read or change them.</t> | |||
</section> | </section> | |||
<section title="Session Description Control" | <section anchor="sec.session-description-ctrl" numbered="true" toc="includ | |||
anchor="sec.session-description-ctrl"> | e" removeInRFC="false" pn="section-3.4"> | |||
<name slugifiedName="name-session-description-control">Session Descripti | ||||
<t>In order to give the application control over various common | on Control</name> | |||
session parameters, JSEP provides control surfaces which tell | <t indent="0" pn="section-3.4-1">In order to give the application contro | |||
l over various common | ||||
session parameters, JSEP provides control surfaces that tell | ||||
the JSEP implementation how to generate session descriptions. | the JSEP implementation how to generate session descriptions. | |||
This avoids the need for JavaScript to modify session | This avoids the need for JavaScript to modify session | |||
descriptions in most cases.</t> | descriptions in most cases.</t> | |||
<t indent="0" pn="section-3.4-2">Changes to these objects result in chan | ||||
<t>Changes to these objects result in changes to the session | ges to the session | |||
descriptions generated by subsequent createOffer/Answer | descriptions generated by subsequent createOffer/createAnswer | |||
calls.</t> | calls.</t> | |||
<section title="RtpTransceivers" anchor="sec.rtptransceivers"> | <section anchor="sec.rtptransceivers" numbered="true" toc="include" remo | |||
veInRFC="false" pn="section-3.4.1"> | ||||
<t>RtpTransceivers allow the application to control the RTP | <name slugifiedName="name-rtptransceivers">RtpTransceivers</name> | |||
media associated with one m= section. Each RtpTransceiver has | <t indent="0" pn="section-3.4.1-1">RtpTransceivers allow the applicati | |||
on to control the RTP | ||||
media associated with one "m=" section. Each RtpTransceiver has | ||||
an RtpSender and an RtpReceiver, which an application can use | an RtpSender and an RtpReceiver, which an application can use | |||
to control the sending and receiving of RTP media. The | to control the sending and receiving of RTP media. The | |||
application may also modify the RtpTransceiver directly, for | application may also modify the RtpTransceiver directly, for | |||
instance, by stopping it.</t> | instance, by stopping it.</t> | |||
<t indent="0" pn="section-3.4.1-2">RtpTransceivers generally have a 1: | ||||
<t>RtpTransceivers generally have a 1:1 mapping with m= | 1 mapping with "m=" | |||
sections, although there may be more RtpTransceivers than m= | sections, although there may be more RtpTransceivers than "m=" | |||
sections when RtpTransceivers are created but not yet | sections when RtpTransceivers are created but not yet | |||
associated with a m= section, or if RtpTransceivers have been | associated with an "m=" section, or if RtpTransceivers have been | |||
stopped and disassociated from m= sections. An RtpTransceiver | stopped and disassociated from "m=" sections. An RtpTransceiver | |||
is said to be associated with an m= section if its mid | is said to be associated with an "m=" section if its | |||
property is non-null; otherwise it is said to be | media identification (mid) property is non-null; otherwise, it is said | |||
disassociated. The associated m= section is determined using | to be | |||
a mapping between transceivers and m= section indices, formed | disassociated. The associated "m=" section is determined using | |||
a mapping between transceivers and "m=" section indices, formed | ||||
when creating an offer or applying a remote offer.</t> | when creating an offer or applying a remote offer.</t> | |||
<t indent="0" pn="section-3.4.1-3">An RtpTransceiver is never associat | ||||
<t>An RtpTransceiver is never associated with more than one | ed with more than one | |||
m= section, and once a session description is applied, a m= | "m=" section, and once a session description is applied, an "m=" | |||
section is always associated with exactly one RtpTransceiver. | section is always associated with exactly one RtpTransceiver. | |||
However, in certain cases where a m= section has been | However, in certain cases where an "m=" section has been | |||
rejected, as discussed in | rejected, as discussed in | |||
<xref target="sec.subsequent-offers" /> below, that m= section | <xref target="sec.subsequent-offers" format="default" sectionFormat="o f" derivedContent="Section 5.2.2"/> below, that "m=" section | |||
will be "recycled" and associated with a new RtpTransceiver | will be "recycled" and associated with a new RtpTransceiver | |||
with a new mid value.</t> | with a new MID value.</t> | |||
<t indent="0" pn="section-3.4.1-4">RtpTransceivers can be created expl | ||||
<t>RtpTransceivers can be created explicitly by the | icitly by the | |||
application or implicitly by calling setRemoteDescription | application or implicitly by calling setRemoteDescription | |||
with an offer that adds new m= sections.</t> | with an offer that adds new "m=" sections.</t> | |||
</section> | </section> | |||
<section title="RtpSenders" anchor="sec.rtpsenders"> | <section anchor="sec.rtpsenders" numbered="true" toc="include" removeInR | |||
FC="false" pn="section-3.4.2"> | ||||
<t>RtpSenders allow the application to control how RTP media | <name slugifiedName="name-rtpsenders">RtpSenders</name> | |||
<t indent="0" pn="section-3.4.2-1">RtpSenders allow the application to | ||||
control how RTP media | ||||
is sent. An RtpSender is conceptually responsible for the | is sent. An RtpSender is conceptually responsible for the | |||
outgoing RTP stream(s) described by an m= section. This | outgoing RTP stream(s) described by an "m=" section. This | |||
includes encoding the attached MediaStreamTrack, sending RTP | includes encoding the attached MediaStreamTrack, sending RTP | |||
media packets, and generating/processing RTCP for the | media packets, and generating/processing the RTP Control Protocol (RTC P) for the | |||
outgoing RTP streams(s).</t> | outgoing RTP streams(s).</t> | |||
</section> | </section> | |||
<section title="RtpReceivers" anchor="sec.rtpreceivers"> | <section anchor="sec.rtpreceivers" numbered="true" toc="include" removeI | |||
nRFC="false" pn="section-3.4.3"> | ||||
<t>RtpReceivers allow the application to inspect how RTP | <name slugifiedName="name-rtpreceivers">RtpReceivers</name> | |||
<t indent="0" pn="section-3.4.3-1">RtpReceivers allow the application | ||||
to inspect how RTP | ||||
media is received. An RtpReceiver is conceptually responsible | media is received. An RtpReceiver is conceptually responsible | |||
for the incoming RTP stream(s) described by an m= section. | for the incoming RTP stream(s) described by an "m=" section. | |||
This includes processing received RTP media packets, decoding | This includes processing received RTP media packets, decoding | |||
the incoming stream(s) to produce a remote MediaStreamTrack, | the incoming stream(s) to produce a remote MediaStreamTrack, | |||
and generating/processing RTCP for the incoming RTP | and generating/processing RTCP for the incoming RTP | |||
stream(s).</t> | stream(s).</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="ICE" anchor="sec.ice"> | <section anchor="sec.ice" numbered="true" toc="include" removeInRFC="false | |||
<section title="ICE Gathering Overview" | " pn="section-3.5"> | |||
anchor="sec.ice-gather-overview"> | <name slugifiedName="name-ice">ICE</name> | |||
<section anchor="sec.ice-gather-overview" numbered="true" toc="include" | ||||
<t>JSEP gathers ICE candidates as needed by the application. | removeInRFC="false" pn="section-3.5.1"> | |||
<name slugifiedName="name-ice-gathering-overview">ICE Gathering Overvi | ||||
ew</name> | ||||
<t indent="0" pn="section-3.5.1-1">JSEP gathers ICE candidates as need | ||||
ed by the application. | ||||
Collection of ICE candidates is referred to as a gathering | Collection of ICE candidates is referred to as a gathering | |||
phase, and this is triggered either by the addition of a new | phase, and this is triggered either by the addition of a new | |||
or recycled m= section to the local session description, or | or recycled "m=" section to the local session description or by | |||
new ICE credentials in the description, indicating an ICE | new ICE credentials in the description, indicating an ICE | |||
restart. Use of new ICE credentials can be triggered | restart. Use of new ICE credentials can be triggered | |||
explicitly by the application, or implicitly by the JSEP | explicitly by the application or implicitly by the JSEP | |||
implementation in response to changes in the ICE | implementation in response to changes in the ICE | |||
configuration.</t> | configuration.</t> | |||
<t indent="0" pn="section-3.5.1-2">When the ICE configuration changes | ||||
<t>When the ICE configuration changes in a way that requires | in a way that requires | |||
a new gathering phase, a 'needs-ice-restart' bit is set. When | a new gathering phase, a 'needs-ice-restart' bit is set. When | |||
this bit is set, calls to the createOffer API will generate | this bit is set, calls to the createOffer API will generate | |||
new ICE credentials. This bit is cleared by a call to the | new ICE credentials. This bit is cleared by a call to the | |||
setLocalDescription API with new ICE credentials from either | setLocalDescription API with new ICE credentials from either | |||
an offer or an answer, i.e., from either a local- or | an offer or an answer, i.e., from either a locally or | |||
remote-initiated ICE restart.</t> | remotely initiated ICE restart.</t> | |||
<t indent="0" pn="section-3.5.1-3">When a new gathering phase starts, | ||||
<t>When a new gathering phase starts, the ICE agent will | the ICE agent will | |||
notify the application that gathering is occurring through an | notify the application that gathering is occurring through a state | |||
event. Then, when each new ICE candidate becomes available, | change event. Then, when each new ICE candidate becomes available, | |||
the ICE agent will supply it to the application via an | the ICE agent will supply it to the application via an | |||
additional event; these candidates will also automatically be | onicecandidate event; these candidates will also automatically be | |||
added to the current and/or pending local session | added to the current and/or pending local session | |||
description. Finally, when all candidates have been gathered, | description. Finally, when all candidates have been gathered, | |||
an event will be dispatched to signal that the gathering | a final onicecandidate event will be dispatched to signal that the | |||
process is complete.</t> | gathering process is complete.</t> | |||
<t indent="0" pn="section-3.5.1-4">Note that gathering phases only gat | ||||
<t>Note that gathering phases only gather the candidates | her the candidates | |||
needed by new/recycled/restarting m= sections; other m= | needed by new/recycled/restarting "m=" sections; other "m=" | |||
sections continue to use their existing candidates. Also, if | sections continue to use their existing candidates. Also, if | |||
an m= section is bundled (either by a successful bundle | an "m=" section is bundled (either by a successful bundle | |||
negotiation or by being marked as bundle-only), then | negotiation or by being marked as bundle-only), then | |||
candidates will be gathered and exchanged for that m= section | candidates will be gathered and exchanged for that "m=" section | |||
if and only if its MID is a BUNDLE-tag, as described in | if and only if its MID item is a BUNDLE-tag, as described in | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />.</t> | <xref target="RFC8843" format="default" sectionFormat="of" derivedCont | |||
ent="RFC8843"/>.</t> | ||||
</section> | </section> | |||
<section title="ICE Candidate Trickling" | <section anchor="sec.ice-candidate-trickling" numbered="true" toc="inclu | |||
anchor="sec.ice-candidate-trickling"> | de" removeInRFC="false" pn="section-3.5.2"> | |||
<name slugifiedName="name-ice-candidate-trickling">ICE Candidate Trick | ||||
<t>Candidate trickling is a technique through which a caller | ling</name> | |||
<t indent="0" pn="section-3.5.2-1">Candidate trickling is a technique | ||||
through which a caller | ||||
may incrementally provide candidates to the callee after the | may incrementally provide candidates to the callee after the | |||
initial offer has been dispatched; the semantics of "Trickle | initial offer has been dispatched; the semantics of "Trickle | |||
ICE" are defined in | ICE" are defined in | |||
<xref target="I-D.ietf-ice-trickle"></xref>. This process | <xref target="RFC8838" format="default" sectionFormat="of" derivedCont ent="RFC8838"/>. This process | |||
allows the callee to begin acting upon the call and setting | allows the callee to begin acting upon the call and setting | |||
up the ICE (and perhaps DTLS) connections immediately, | up the ICE (and perhaps DTLS) connections immediately, | |||
without having to wait for the caller to gather all possible | without having to wait for the caller to gather all possible | |||
candidates. This results in faster media setup in cases where | candidates. This results in faster media setup in cases where | |||
gathering is not performed prior to initiating the call.</t> | gathering is not performed prior to initiating the call.</t> | |||
<t indent="0" pn="section-3.5.2-2">JSEP supports optional candidate tr | ||||
<t>JSEP supports optional candidate trickling by providing | ickling by providing | |||
APIs, as described above, that provide control and feedback | APIs, as described above, that provide control and feedback | |||
on the ICE candidate gathering process. Applications that | on the ICE candidate gathering process. Applications that | |||
support candidate trickling can send the initial offer | support candidate trickling can send the initial offer | |||
immediately and send individual candidates when they get the | immediately and send individual candidates when they get | |||
notified of a new candidate; applications that do not support | notified of a new candidate; applications that do not support | |||
this feature can simply wait for the indication that | this feature can simply wait for the indication that | |||
gathering is complete, and then create and send their offer, | gathering is complete, and then create and send their offer, | |||
with all the candidates, at this time.</t> | with all the candidates, at that time.</t> | |||
<t indent="0" pn="section-3.5.2-3">Upon receipt of trickled candidates | ||||
<t>Upon receipt of trickled candidates, the receiving | , the receiving | |||
application will supply them to its ICE agent. This triggers | application will supply them to its ICE agent. This triggers | |||
the ICE agent to start using the new remote candidates for | the ICE agent to start using the new remote candidates for | |||
connectivity checks.</t> | connectivity checks.</t> | |||
<section title="ICE Candidate Format" | <section anchor="sec.ice-candidate-format" numbered="true" toc="includ | |||
anchor="sec.ice-candidate-format"> | e" removeInRFC="false" pn="section-3.5.2.1"> | |||
<name slugifiedName="name-ice-candidate-format">ICE Candidate Format | ||||
<t>In JSEP, ICE candidates are abstracted by an | </name> | |||
<t indent="0" pn="section-3.5.2.1-1">In JSEP, ICE candidates are abs | ||||
tracted by an | ||||
IceCandidate object, and as with session descriptions, SDP | IceCandidate object, and as with session descriptions, SDP | |||
syntax is used for the internal representation.</t> | syntax is used for the internal representation.</t> | |||
<t indent="0" pn="section-3.5.2.1-2">The candidate details are speci | ||||
<t>The candidate details are specified in an IceCandidate | fied in an IceCandidate | |||
field, using the same SDP syntax as the | field, using the same SDP syntax as the | |||
"candidate-attribute" field defined in | "candidate-attribute" field defined in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | <xref target="RFC8839" sectionFormat="comma" section="5.1" format="d | |||
Section 4.1. Note that this | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.1" derivedCont | |||
ent="RFC8839"/>. Note that this | ||||
field does not contain an "a=" prefix, as indicated in the | field does not contain an "a=" prefix, as indicated in the | |||
following example:</t> | following example:</t> | |||
<figure> | <sourcecode name="" type="sdp" markers="false" pn="section-3.5.2.1-3 | |||
<artwork> | "> | |||
<![CDATA[ | candidate:1 1 UDP 1694498815 192.0.2.33 10000 typ host</sourcecode> | |||
candidate:1 1 UDP 1694498815 192.0.2.33 10000 typ host | <t indent="0" pn="section-3.5.2.1-4">The IceCandidate object contain | |||
]]> | s a field to indicate | |||
</artwork> | which ICE username fragment (ufrag) it is associated with, as define | |||
</figure> | d in | |||
<xref target="RFC8839" sectionFormat="comma" section="5.4" format="d | ||||
<t>The IceCandidate object contains a field to indicate | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedCont | |||
which ICE ufrag it is associated with, as defined in | ent="RFC8839"/>. This value is used | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | ||||
Section 4.4. This value is used | ||||
to determine which session description (and thereby which | to determine which session description (and thereby which | |||
gathering phase) this IceCandidate belongs to, which helps | gathering phase) this IceCandidate belongs to, which helps | |||
resolve ambiguities during ICE restarts. If this field is | resolve ambiguities during ICE restarts. If this field is | |||
absent in a received IceCandidate (perhaps when | absent in a received IceCandidate (perhaps when | |||
communicating with a non-JSEP endpoint), the most recently | communicating with a non-JSEP endpoint), the most recently | |||
received session description is assumed.</t> | received session description is assumed.</t> | |||
<t indent="0" pn="section-3.5.2.1-5">The IceCandidate object also co | ||||
<t>The IceCandidate object also contains fields to indicate | ntains fields to indicate | |||
which m= section it is associated with, which can be | which "m=" section it is associated with, which can be | |||
identified in one of two ways, either by a m= section | identified in one of two ways: either by an "m=" section | |||
index, or a MID. The m= section index is a zero-based | index or by a MID. The "m=" section index is a zero-based | |||
index, with index N referring to the N+1th m= section in | index, with index N referring to the N+1th "m=" section in | |||
the session description referenced by this IceCandidate. | the session description referenced by this IceCandidate. | |||
The MID is a "media stream identification" value, as | The MID is a "media stream identification" value, as | |||
defined in | defined in | |||
<xref target="RFC5888"></xref>, Section 4, which provides a | <xref target="RFC5888" sectionFormat="comma" section="4" format="def | |||
more robust way to identify the m= section in the session | ault" derivedLink="https://rfc-editor.org/rfc/rfc5888#section-4" derivedContent= | |||
"RFC5888"/>, which provides a | ||||
more robust way to identify the "m=" section in the session | ||||
description, using the MID of the associated RtpTransceiver | description, using the MID of the associated RtpTransceiver | |||
object (which may have been locally generated by the | object (which may have been locally generated by the | |||
answerer when interacting with a non-JSEP endpoint that | answerer when interacting with a non-JSEP endpoint that | |||
does not support the MID attribute, as discussed in | does not support the MID attribute, as discussed in | |||
<xref target="sec.applying-a-remote-desc" /> below). If the | <xref target="sec.applying-a-remote-desc" format="default" sectionFo | |||
MID field is present in a received IceCandidate, it MUST be | rmat="of" derivedContent="Section 5.10"/> below). If the | |||
used for identification; otherwise, the m= section index is | MID field is present in a received IceCandidate, it <bcp14>MUST</bcp | |||
14> be | ||||
used for identification; otherwise, the "m=" section index is | ||||
used instead.</t> | used instead.</t> | |||
<t indent="0" pn="section-3.5.2.1-6">Implementations <bcp14>MUST</bc | ||||
<t>When creating an IceCandidate object, JSEP | p14> | |||
implementations MUST populate each of the candidate, ufrag, | ||||
m= section index, and MID fields. Implementations MUST also | ||||
be prepared to receive objects with some fields missing, as | be prepared to receive objects with some fields missing, as | |||
mentioned above.</t> | mentioned above.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="ICE Candidate Policy" | <section anchor="sec.ice-candidate-policy" numbered="true" toc="include" | |||
anchor="sec.ice-candidate-policy"> | removeInRFC="false" pn="section-3.5.3"> | |||
<name slugifiedName="name-ice-candidate-policy">ICE Candidate Policy</ | ||||
<t>Typically, when gathering ICE candidates, the JSEP | name> | |||
<t indent="0" pn="section-3.5.3-1">Typically, when gathering ICE candi | ||||
dates, the JSEP | ||||
implementation will gather all possible forms of initial | implementation will gather all possible forms of initial | |||
candidates - host, server reflexive, and relay. However, in | candidates -- host, server-reflexive, and relay. | |||
However, in | ||||
certain cases, applications may want to have more specific | certain cases, applications may want to have more specific | |||
control over the gathering process, due to privacy or related | control over the gathering process, due to privacy or related | |||
concerns. For example, one may want to only use relay | concerns. For example, one may want to only use relay | |||
candidates, to leak as little location information as | candidates, to leak as little location information as | |||
possible (keeping in mind that this choice comes with | possible (keeping in mind that this choice comes with | |||
corresponding operational costs). To accomplish this, JSEP | corresponding operational costs). To accomplish this, JSEP | |||
allows the application to restrict which ICE candidates are | allows the application to restrict which ICE candidates are | |||
used in a session. Note that this filtering is applied on top | used in a session. Note that this filtering is applied on top | |||
of any restrictions the implementation chooses to enforce | of any restrictions the implementation chooses to enforce | |||
regarding which IP addresses are permitted for the | regarding which IP addresses are permitted for the | |||
application, as discussed in | application, as discussed in | |||
<xref target="I-D.ietf-rtcweb-ip-handling" />.</t> | <xref target="RFC8828" format="default" sectionFormat="of" derivedCont | |||
ent="RFC8828"/>.</t> | ||||
<t>There may also be cases where the application wants to | <t indent="0" pn="section-3.5.3-2">There may also be cases where the a | |||
pplication wants to | ||||
change which types of candidates are used while the session | change which types of candidates are used while the session | |||
is active. A prime example is where a callee may initially | is active. A prime example is where a callee may initially | |||
want to use only relay candidates, to avoid leaking location | want to use only relay candidates, to avoid leaking location | |||
information to an arbitrary caller, but then change to use | information to an arbitrary caller, but then change to use | |||
all candidates (for lower operational cost) once the user has | all candidates (for lower operational cost) once the user has | |||
indicated they want to take the call. For this scenario, the | indicated that they want to take the call. For this scenario, the | |||
JSEP implementation MUST allow the candidate policy to be | JSEP implementation <bcp14>MUST</bcp14> allow the candidate policy to | |||
be | ||||
changed in mid-session, subject to the aforementioned | changed in mid-session, subject to the aforementioned | |||
interactions with local policy.</t> | interactions with local policy.</t> | |||
<t indent="0" pn="section-3.5.3-3">To administer the ICE candidate pol | ||||
<t>To administer the ICE candidate policy, the JSEP | icy, the JSEP | |||
implementation will determine the current setting at the | implementation will determine the current setting at the | |||
start of each gathering phase. Then, during the gathering | start of each gathering phase. Then, during the gathering | |||
phase, the implementation MUST NOT expose candidates | phase, the implementation <bcp14>MUST NOT</bcp14> expose candidates | |||
disallowed by the current policy to the application, use them | disallowed by the current policy to the application, use them | |||
as the source of connectivity checks, or indirectly expose | as the source of connectivity checks, or indirectly expose | |||
them via other fields, such as the raddr/rport attributes for | them via other fields, such as the raddr/rport attributes for | |||
other ICE candidates. Later, if a different policy is | other ICE candidates. Later, if a different policy is | |||
specified by the application, the application can apply it by | specified by the application, the application can apply it by | |||
kicking off a new gathering phase via an ICE restart.</t> | kicking off a new gathering phase via an ICE restart.</t> | |||
</section> | </section> | |||
<section title="ICE Candidate Pool" | <section anchor="sec.ice-candidate-pool" numbered="true" toc="include" r | |||
anchor="sec.ice-candidate-pool"> | emoveInRFC="false" pn="section-3.5.4"> | |||
<name slugifiedName="name-ice-candidate-pool">ICE Candidate Pool</name | ||||
<t>JSEP applications typically inform the JSEP implementation | > | |||
<t indent="0" pn="section-3.5.4-1">JSEP applications typically inform | ||||
the JSEP implementation | ||||
to begin ICE gathering via the information supplied to | to begin ICE gathering via the information supplied to | |||
setLocalDescription, as the local description indicates the | setLocalDescription, as the local description indicates the | |||
number of ICE components which will be needed and for which | number of ICE components that will be needed and for which | |||
candidates must be gathered. However, to accelerate cases | candidates must be gathered. However, to accelerate cases | |||
where the application knows the number of ICE components to | where the application knows the number of ICE components to | |||
use ahead of time, it may ask the implementation to gather a | use ahead of time, it may ask the implementation to gather a | |||
pool of potential ICE candidates to help ensure rapid media | pool of potential ICE candidates to help ensure rapid media | |||
setup.</t> | setup.</t> | |||
<t indent="0" pn="section-3.5.4-2">When setLocalDescription is eventua | ||||
<t>When setLocalDescription is eventually called, and the | lly called and the | |||
JSEP implementation goes to gather the needed ICE candidates, | JSEP implementation prepares to gather the needed ICE candidates, | |||
it SHOULD start by checking if any candidates are available | it <bcp14>SHOULD</bcp14> start by checking if any candidates are avail | |||
in the pool. If there are candidates in the pool, they SHOULD | able | |||
in the pool. If there are candidates in the pool, they <bcp14>SHOULD</ | ||||
bcp14> | ||||
be handed to the application immediately via the ICE | be handed to the application immediately via the ICE | |||
candidate event. If the pool becomes depleted, either because | candidate event. If the pool becomes depleted, either because | |||
a larger-than-expected number of ICE components is used, or | a larger-than-expected number of ICE components are used or | |||
because the pool has not had enough time to gather | because the pool has not had enough time to gather | |||
candidates, the remaining candidates are gathered as usual. | candidates, the remaining candidates are gathered as usual. | |||
This only occurs for the first offer/answer exchange, after | This only occurs for the first offer/answer exchange, after | |||
which the candidate pool is emptied and no longer used.</t> | which the candidate pool is emptied and no longer used.</t> | |||
<t indent="0" pn="section-3.5.4-3">One example of where this concept i | ||||
<t>One example of where this concept is useful is an | s useful is an | |||
application that expects an incoming call at some point in | application that expects an incoming call at some point in | |||
the future, and wants to minimize the time it takes to | the future, and wants to minimize the time it takes to | |||
establish connectivity, to avoid clipping of initial media. | establish connectivity, to avoid clipping of initial media. | |||
By pre-gathering candidates into the pool, it can exchange | By pre-gathering candidates into the pool, it can exchange | |||
and start sending connectivity checks from these candidates | and start sending connectivity checks from these candidates | |||
almost immediately upon receipt of a call. Note though that | almost immediately upon receipt of a call. Note, though, that | |||
by holding on to these pre-gathered candidates, which will be | by holding on to these pre-gathered candidates, which will be | |||
kept alive as long as they may be needed, the application | kept alive as long as they may be needed, the application | |||
will consume resources on the STUN/TURN servers it is | will consume resources on the STUN/TURN servers it is | |||
using.</t> | using. ("STUN" stands for "Session Traversal Utilities for NAT".)</t> | |||
</section> | </section> | |||
<section title="ICE Versions"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-3 | |||
<t>While this specification formally relies on <xref | .5.5"> | |||
target="RFC8445"></xref>, at the time of its publication, the | <name slugifiedName="name-ice-versions">ICE Versions</name> | |||
<t indent="0" pn="section-3.5.5-1">While this specification formally r | ||||
elies on <xref target="RFC8445" format="default" sectionFormat="of" derivedConte | ||||
nt="RFC8445"/>, at the time of its publication, the | ||||
majority of WebRTC implementations support the version | majority of WebRTC implementations support the version | |||
of ICE described in <xref target="RFC5245"></xref>. The use of | of ICE described in <xref target="RFC5245" format="default" sectionFor | |||
the "ice2" attribute defined in <xref target="RFC8445"></xref> | mat="of" derivedContent="RFC5245"/>. The "ice2" attribute defined in <xref targe | |||
t="RFC8445" format="default" sectionFormat="of" derivedContent="RFC8445"/> | ||||
can be used to detect the version in use by a remote endpoint | can be used to detect the version in use by a remote endpoint | |||
and to provide a smooth transition from the older specification | and to provide a smooth transition from the older specification | |||
to the newer one. Implementations MUST be able to accept remote | to the newer one. Implementations <bcp14>MUST</bcp14> be able to acce pt remote | |||
descriptions that do not have the "ice2" attribute.</t> | descriptions that do not have the "ice2" attribute.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.imageattr" title="Video Size Negotiation"> | <section anchor="sec.imageattr" numbered="true" toc="include" removeInRFC= | |||
"false" pn="section-3.6"> | ||||
<t>Video size negotiation is the process through which a | <name slugifiedName="name-video-size-negotiation">Video Size Negotiation | |||
</name> | ||||
<t indent="0" pn="section-3.6-1">Video size negotiation is the process t | ||||
hrough which a | ||||
receiver can use the "a=imageattr" SDP attribute | receiver can use the "a=imageattr" SDP attribute | |||
<xref target="RFC6236" /> to indicate what video frame sizes it | <xref target="RFC6236" format="default" sectionFormat="of" derivedConten t="RFC6236"/> to indicate what video frame sizes it | |||
is capable of receiving. A receiver may have hard limits on | is capable of receiving. A receiver may have hard limits on | |||
what its video decoder can process, or it may have some maximum | what its video decoder can process, or it may have some maximum | |||
set by policy. By specifying these limits in an "a=imageattr" | set by policy. By specifying these limits in an "a=imageattr" | |||
attribute, JSEP endpoints can attempt to ensure that the remote | attribute, JSEP endpoints can attempt to ensure that the remote | |||
sender transmits video at an acceptable resolution. However, | sender transmits video at an acceptable resolution. However, | |||
when communicating with a non-JSEP endpoint that does not | when communicating with a non-JSEP endpoint that does not | |||
understand this attribute, any signaled limits may be exceeded, | understand this attribute, any signaled limits may be exceeded, | |||
and the JSEP implementation MUST handle this gracefully, e.g., | and the JSEP implementation <bcp14>MUST</bcp14> handle this gracefully, e.g., | |||
by discarding the video.</t> | by discarding the video.</t> | |||
<t indent="0" pn="section-3.6-2">Note that certain codecs support transm | ||||
<t>Note that certain codecs support transmission of samples | ission of samples | |||
with aspect ratios other than 1.0 (i.e., non-square pixels). | with aspect ratios other than 1.0 (i.e., non-square pixels). | |||
JSEP implementations will not transmit non-square pixels, but | JSEP implementations will not transmit non-square pixels but | |||
SHOULD receive and render such video with the correct aspect | <bcp14>SHOULD</bcp14> receive and render such video with the correct asp | |||
ect | ||||
ratio. However, sample aspect ratio has no impact on the size | ratio. However, sample aspect ratio has no impact on the size | |||
negotiation described below; all dimensions are measured in | negotiation described below; all dimensions are measured in | |||
pixels, whether square or not.</t> | pixels, whether square or not.</t> | |||
<section anchor="sec.creating-imageattr" | <section anchor="sec.creating-imageattr" numbered="true" toc="include" r | |||
title="Creating an imageattr Attribute"> | emoveInRFC="false" pn="section-3.6.1"> | |||
<name slugifiedName="name-creating-an-imageattr-attri">Creating an ima | ||||
<t>The receiver will first intersect any known local limits | geattr Attribute</name> | |||
(e.g., hardware decoder capababilities, local policy) to | <t indent="0" pn="section-3.6.1-1">The receiver will first combine any | |||
known local limits | ||||
(e.g., hardware decoder capabilities or local policy) to | ||||
determine the absolute minimum and maximum sizes it can | determine the absolute minimum and maximum sizes it can | |||
receive. If there are no known local limits, the | receive. If there are no known local limits, the | |||
"a=imageattr" attribute SHOULD be omitted. If these local | "a=imageattr" attribute <bcp14>SHOULD</bcp14> be omitted. If these loc al | |||
limits preclude receiving any video, i.e., the degenerate | limits preclude receiving any video, i.e., the degenerate | |||
case of no permitted resolutions, the "a=imageattr" attribute | case of no permitted resolutions, the "a=imageattr" attribute | |||
MUST be omitted, and the m= section MUST be marked as | <bcp14>MUST</bcp14> be omitted, and the "m=" section <bcp14>MUST</bcp1 4> be marked as | |||
sendonly/inactive, as appropriate.</t> | sendonly/inactive, as appropriate.</t> | |||
<t indent="0" pn="section-3.6.1-2">Otherwise, an "a=imageattr" attribu | ||||
<t>Otherwise, an "a=imageattr" attribute is created with | te is created with a | |||
"recv" direction, and the resulting resolution space formed | "recv" direction, and the resulting resolution space formed | |||
from the aforementioned intersection is used to specify its | from the aforementioned intersection is used to specify its | |||
minimum and maximum x= and y= values.</t> | minimum and maximum "x=" and "y=" values.</t> | |||
<t indent="0" pn="section-3.6.1-3">The rules here express a single set | ||||
<t>The rules here express a single set of preferences, and | of preferences, and | |||
therefore, the "a=imageattr" q= value is not important. It | therefore, the "a=imageattr" "q=" value is not important. It | |||
SHOULD be set to 1.0.</t> | <bcp14>SHOULD</bcp14> be set to "1.0".</t> | |||
<t indent="0" pn="section-3.6.1-4">The "a=imageattr" field is payload | ||||
<t>The "a=imageattr" field is payload type specific. When all | type specific. When all | |||
video codecs supported have the same capabilities, use of a | video codecs supported have the same capabilities, use of a | |||
single attribute, with the wildcard payload type (*), is | single attribute, with the wildcard payload type (*), is | |||
RECOMMENDED. However, when the supported video codecs have | <bcp14>RECOMMENDED</bcp14>. However, when the supported video codecs h | |||
different limitations, specific "a=imageattr" attributes MUST | ave | |||
different limitations, specific "a=imageattr" attributes <bcp14>MUST</ | ||||
bcp14> | ||||
be inserted for each payload type.</t> | be inserted for each payload type.</t> | |||
<t indent="0" pn="section-3.6.1-5">As an example, consider a system wi | ||||
<t>As an example, consider a system with a multiformat video | th a multiformat video | |||
decoder, which is capable of decoding any resolution from | decoder, which is capable of decoding any resolution from | |||
48x48 to 720p, In this case, the implementation would | 48x48 to 720p. In this case, the implementation would | |||
generate this attribute:</t> | generate this attribute:</t> | |||
<sourcecode type="sdp" markers="false" pn="section-3.6.1-6"> | ||||
<t>a=imageattr:* recv [x=[48:1280],y=[48:720],q=1.0]</t> | a=imageattr:* recv [x=[48:1280],y=[48:720],q=1.0] | |||
</sourcecode> | ||||
<t>This declaration indicates that the receiver is capable of | <t indent="0" pn="section-3.6.1-7">This declaration indicates that the | |||
receiver is capable of | ||||
decoding any image resolution from 48x48 up to 1280x720 | decoding any image resolution from 48x48 up to 1280x720 | |||
pixels.</t> | pixels.</t> | |||
</section> | </section> | |||
<section anchor="sec.interpreting-imageattr" | <section anchor="sec.interpreting-imageattr" numbered="true" toc="includ | |||
title="Interpreting imageattr Attributes"> | e" removeInRFC="false" pn="section-3.6.2"> | |||
<name slugifiedName="name-interpreting-imageattr-attr">Interpreting im | ||||
<t> | ageattr Attributes</name> | |||
<xref target="RFC6236" /> defines "a=imageattr" to be an | <t indent="0" pn="section-3.6.2-1"> | |||
<xref target="RFC6236" format="default" sectionFormat="of" derivedCont | ||||
ent="RFC6236"/> defines "a=imageattr" to be an | ||||
advisory field. This means that it does not absolutely | advisory field. This means that it does not absolutely | |||
constrain the video formats that the sender can use, but | constrain the video formats that the sender can use but | |||
gives an indication of the preferred values.</t> | gives an indication of the preferred values.</t> | |||
<t indent="0" pn="section-3.6.2-2">This specification prescribes behav | ||||
<t>This specification prescribes more specific behavior. When | ior that is more specific. When | |||
a MediaStreamTrack, which is producing video of a certain | a MediaStreamTrack, which is producing video of a certain | |||
resolution (the "track resolution"), is attached to a | resolution (the "track resolution"), is attached to an | |||
RtpSender, which is encoding the track video at the same or | RtpSender, which is encoding the track video at the same or | |||
lower resolution(s) (the "encoder resolutions"), and a remote | lower resolution(s) (the "encoder resolutions"), and a remote | |||
description is applied that references the sender and | description is applied that references the sender and | |||
contains valid "a=imageattr recv" attributes, it MUST follow | contains valid "a=imageattr recv" attributes, it <bcp14>MUST</bcp14> f | |||
the rules below to ensure the sender does not transmit a | ollow | |||
the rules below to ensure that the sender does not transmit a | ||||
resolution that would exceed the size criteria specified in | resolution that would exceed the size criteria specified in | |||
the attributes. These rules MUST be followed as long as the | the attributes. These rules <bcp14>MUST</bcp14> be followed as long as the | |||
attributes remain present in the remote description, | attributes remain present in the remote description, | |||
including cases in which the track changes its resolution, or | including cases in which the track changes its resolution or | |||
is replaced with a different track.</t> | is replaced with a different track.</t> | |||
<t indent="0" pn="section-3.6.2-3">Depending on how the RtpSender is c | ||||
<t>Depending on how the RtpSender is configured, it may be | onfigured, it may be | |||
producing a single encoding at a certain resolution, or, if | producing a single encoding at a certain resolution or, if | |||
simulcast | simulcast | |||
<xref target="sec.simulcast" /> has been negotiated, multiple | (<xref target="sec.simulcast" format="default" sectionFormat="of" deri vedContent="Section 3.7"/>) has been negotiated, multiple | |||
encodings, each at their own specific resolution. In | encodings, each at their own specific resolution. In | |||
addition, depending on the configuration, each encoding may | addition, depending on the configuration, each encoding may | |||
have the flexibility to reduce resolution when needed, or may | have the flexibility to reduce resolution when needed or may | |||
be locked to a specific output resolution.</t> | be locked to a specific output resolution.</t> | |||
<t indent="0" pn="section-3.6.2-4">For each encoding being produced by | ||||
<t>For each encoding being produced by the RtpSender, the set | the RtpSender, the set | |||
of "a=imageattr recv" attributes in the corresponding m= | of "a=imageattr recv" attributes in the corresponding "m=" | |||
section of the remote description is processed to determine | section of the remote description is processed to determine | |||
what should be transmitted. Only attributes that reference | what should be transmitted. Only attributes that reference | |||
the media format selected for the encoding are considered; | the media format selected for the encoding are considered; | |||
each such attribute is evaluated individually, starting with | each such attribute is evaluated individually, starting with | |||
the attribute with the highest "q=" value. If multiple | the attribute with the highest "q=" value. If multiple | |||
attributes have the same "q=" value, they are evaluated in | attributes have the same "q=" value, they are evaluated in | |||
the order they appear in their containing m= section. Note | the order they appear in their containing "m=" section. Note | |||
that while JSEP endpoints will include at most one | that while JSEP endpoints will include at most one | |||
"a=imageattr recv" attribute per media format, JSEP endpoints | "a=imageattr recv" attribute per media format, JSEP endpoints | |||
may receive session descriptions from non-JSEP endpoints with | may receive session descriptions from non-JSEP endpoints with | |||
m= sections that contain multiple such attributes.</t> | "m=" sections that contain multiple such attributes.</t> | |||
<t indent="0" pn="section-3.6.2-5">For each "a=imageattr recv" attribu | ||||
<t>For each "a=imageattr recv" attribute, the following rules | te, the following rules | |||
are applied. If this processing is successful, the encoding | are applied. If this processing is successful, the encoding | |||
is transmitted accordingly, and no further attributes are | is transmitted accordingly, and no further attributes are | |||
considered for that encoding. Otherwise, the next attribute | considered for that encoding. Otherwise, the next attribute | |||
is evaluated, in the aforementioned order. If none of the | is evaluated, in the aforementioned order. If none of the | |||
supplied attributes can be processed successfully, the | supplied attributes can be processed successfully, the | |||
encoding MUST NOT be transmitted, and an error SHOULD be | encoding <bcp14>MUST NOT</bcp14> be transmitted, and an error <bcp14>S HOULD</bcp14> be | |||
raised to the application. | raised to the application. | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>The limits from the attribute are compared to the | -3.6.2-6"> | |||
<li pn="section-3.6.2-6.1">The limits from the attribute are compare | ||||
d to the | ||||
encoder resolution. Only the specific limits mentioned | encoder resolution. Only the specific limits mentioned | |||
below are considered; any other values, such as picture | below are considered; any other values, such as picture | |||
aspect ratio, MUST be ignored. When considering a | aspect ratio, <bcp14>MUST</bcp14> be ignored. When considering a | |||
MediaStreamTrack that is producing rotated video, the | MediaStreamTrack that is producing rotated video, the | |||
unrotated resolution MUST be used for the checks. This is | unrotated resolution <bcp14>MUST</bcp14> be used for the checks. Thi s is | |||
required regardless of whether the receiver supports | required regardless of whether the receiver supports | |||
performing receive-side rotation (e.g., through CVO | performing receive-side rotation (e.g., through Coordination of | |||
<xref target="TS26.114" />), as it significantly simplifies | Video Orientation (CVO) | |||
the matching logic.</t> | <xref target="TS26.114" format="default" sectionFormat="of" derivedC | |||
ontent="TS26.114"/>), as it significantly simplifies | ||||
<t>If the attribute includes a "sar=" (sample aspect ratio) | the matching logic.</li> | |||
value set to something other than "1.0", indicating the | <li pn="section-3.6.2-6.2">If the attribute includes a "sar=" (sampl | |||
e aspect ratio) | ||||
value set to something other than "1.0", indicating that the | ||||
receiver wants to receive non-square pixels, this cannot be | receiver wants to receive non-square pixels, this cannot be | |||
satisfied and the attribute MUST NOT be used.</t> | satisfied and the attribute <bcp14>MUST NOT</bcp14> be used.</li> | |||
<li pn="section-3.6.2-6.3">If the encoder resolution exceeds the max | ||||
<t>If the encoder resolution exceeds the maximum size | imum size | |||
permitted by the attribute, and the encoder is allowed to | permitted by the attribute and the encoder is allowed to | |||
adjust its resolution, the encoder SHOULD apply downscaling | adjust its resolution, the encoder <bcp14>SHOULD</bcp14> apply downs | |||
in order to satisfy the limits. Downscaling MUST NOT change | caling | |||
in order to satisfy the limits. Downscaling <bcp14>MUST NOT</bcp14> | ||||
change | ||||
the picture aspect ratio of the encoding, ignoring any | the picture aspect ratio of the encoding, ignoring any | |||
trivial differences due to rounding. For example, if the | trivial differences due to rounding. For example, if the | |||
encoder resolution is 1280x720, and the attribute specified | encoder resolution is 1280x720 and the attribute specified | |||
a maximum of 640x480, the expected output resolution would | a maximum of 640x480, the expected output resolution would | |||
be 640x360. If downscaling cannot be applied, the attribute | be 640x360. If downscaling cannot be applied, the attribute | |||
MUST NOT be used.</t> | <bcp14>MUST NOT</bcp14> be used.</li> | |||
<li pn="section-3.6.2-6.4">If the encoder resolution is less than th | ||||
<t>If the encoder resolution is less than the minimum size | e minimum size | |||
permitted by the attribute, the attribute MUST NOT be used; | permitted by the attribute, the attribute <bcp14>MUST NOT</bcp14> be | |||
the encoder MUST NOT apply upscaling. JSEP implementations | used; | |||
SHOULD avoid this situation by allowing receipt of | the encoder <bcp14>MUST NOT</bcp14> apply upscaling. JSEP implementa | |||
tions | ||||
<bcp14>SHOULD</bcp14> avoid this situation by allowing receipt of | ||||
arbitrarily small resolutions, perhaps via fallback to a | arbitrarily small resolutions, perhaps via fallback to a | |||
software decoder.</t> | software decoder.</li> | |||
<li pn="section-3.6.2-6.5">If the encoder resolution is within the m | ||||
<t>If the encoder resolution is within the maximum and | aximum and | |||
minimum sizes, no action is needed.</t> | minimum sizes, no action is needed.</li> | |||
</list></t> | </ul> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Simulcast" anchor="sec.simulcast"> | <section anchor="sec.simulcast" numbered="true" toc="include" removeInRFC= | |||
"false" pn="section-3.7"> | ||||
<t>JSEP supports simulcast transmission of a MediaStreamTrack, | <name slugifiedName="name-simulcast">Simulcast</name> | |||
<t indent="0" pn="section-3.7-1">JSEP supports simulcast transmission of | ||||
a MediaStreamTrack, | ||||
where multiple encodings of the source media can be transmitted | where multiple encodings of the source media can be transmitted | |||
within the context of a single m= section. The current JSEP API | within the context of a single "m=" section. The current JSEP API | |||
is designed to allow applications to send simulcasted media but | is designed to allow applications to send simulcasted media but | |||
only to receive a single encoding. This allows for multi-user | only to receive a single encoding. This allows for multi-user | |||
scenarios where each sending client sends multiple encodings to | scenarios where each sending client sends multiple encodings to | |||
a server, which then, for each receiving client, chooses the | a server, which then, for each receiving client, chooses the | |||
appropriate encoding to forward.</t> | appropriate encoding to forward.</t> | |||
<t indent="0" pn="section-3.7-2">Applications request support for simulc | ||||
<t>Applications request support for simulcast by configuring | ast by configuring | |||
multiple encodings on an RtpSender. Upon generation of an offer | multiple encodings on an RtpSender. Upon generation of an offer | |||
or answer, these encodings are indicated via SDP markings on | or answer, these encodings are indicated via SDP markings on | |||
the corresponding m= section, as described below. Receivers | the corresponding "m=" section, as described below. Receivers | |||
that understand simulcast and are willing to receive it will | that understand simulcast and are willing to receive it will | |||
also include SDP markings to indicate their support, and JSEP | also include SDP markings to indicate their support, and JSEP | |||
endpoints will use these markings to determine whether | endpoints will use these markings to determine whether | |||
simulcast is permitted for a given RtpSender. If simulcast | simulcast is permitted for a given RtpSender. If simulcast | |||
support is not negotiated, the RtpSender will only use the | support is not negotiated, the RtpSender will only use the | |||
first configured encoding.</t> | first configured encoding.</t> | |||
<t indent="0" pn="section-3.7-3">Note that the exact simulcast parameter | ||||
<t>Note that the exact simulcast parameters are up to the | s are up to the | |||
sending application. While the aforementioned SDP markings are | sending application. While the aforementioned SDP markings are | |||
provided to ensure the remote side can receive and demux | provided to ensure that the remote side can receive and demux | |||
multiple simulcast encodings, the specific resolutions and | multiple simulcast encodings, the specific resolutions and | |||
bitrates to be used for each encoding are purely a send-side | bitrates to be used for each encoding are purely a send-side | |||
decision in JSEP.</t> | decision in JSEP.</t> | |||
<t indent="0" pn="section-3.7-4">JSEP currently does not provide a mecha | ||||
<t>JSEP currently does not provide a mechanism to configure | nism to configure | |||
receipt of simulcast. This means that if simulcast is offered | receipt of simulcast. This means that if simulcast is offered | |||
by the remote endpoint, the answer generated by a JSEP endpoint | by the remote endpoint, the answer generated by a JSEP endpoint | |||
will not indicate support for receipt of simulcast, and as such | will not indicate support for receipt of simulcast, and as such | |||
the remote endpoint will only send a single encoding per m= | the remote endpoint will only send a single encoding per "m=" | |||
section.</t> | section.</t> | |||
<t indent="0" pn="section-3.7-5">In addition, JSEP does not provide a me | ||||
<t>In addition, JSEP does not provide a mechanism to handle an | chanism to handle an | |||
incoming offer requesting simulcast from the JSEP endpoint. | incoming offer requesting simulcast from the JSEP endpoint. | |||
This means that setting up simulcast in the case where the JSEP | This means that setting up simulcast in the case where the JSEP | |||
endpoint receives the initial offer requires out-of-band | endpoint receives the initial offer requires out-of-band | |||
signaling or SDP inspection. However, in the case where the | signaling or SDP inspection. However, in the case where the | |||
JSEP endpoint sets up simulcast in its in initial offer, any | JSEP endpoint sets up simulcast in its initial offer, any | |||
established simulcast streams will continue to work upon | established simulcast streams will continue to work upon | |||
receipt of an incoming re-offer. Future versions of this | receipt of an incoming re-offer. Future versions of this | |||
specification may add additional APIs to handle the incoming | specification may add additional APIs to handle the incoming | |||
initial offer scenario.</t> | initial offer scenario.</t> | |||
<t indent="0" pn="section-3.7-6">When using JSEP to transmit multiple en | ||||
<t>When using JSEP to transmit multiple encodings from a | codings from an | |||
RtpSender, the techniques from | RtpSender, the techniques from | |||
<xref target="I-D.ietf-mmusic-sdp-simulcast" /> and | <xref target="RFC8853" format="default" sectionFormat="of" derivedConten | |||
<xref target="I-D.ietf-mmusic-rid" /> are used. Specifically, | t="RFC8853"/> and | |||
when multiple encodings have been configured for a RtpSender, | <xref target="RFC8851" format="default" sectionFormat="of" derivedConten | |||
the m= section for the RtpSender will include an "a=simulcast" | t="RFC8851"/> are used. Specifically, | |||
when multiple encodings have been configured for an RtpSender, | ||||
the "m=" section for the RtpSender will include an "a=simulcast" | ||||
attribute, as defined in | attribute, as defined in | |||
<xref target="I-D.ietf-mmusic-sdp-simulcast" />, Section 6.2, | <xref target="RFC8853" sectionFormat="comma" section="5.1" format="defau lt" derivedLink="https://rfc-editor.org/rfc/rfc8853#section-5.1" derivedContent= "RFC8853"/>, | |||
with a "send" simulcast stream description that lists each | with a "send" simulcast stream description that lists each | |||
desired encoding, and no "recv" simulcast stream description. | desired encoding, and no "recv" simulcast stream description. | |||
The m= section will also include an "a=rid" attribute for each | The "m=" section will also include an "a=rid" attribute for each | |||
encoding, as specified in | encoding, as specified in | |||
<xref target="I-D.ietf-mmusic-rid" />, Section 4; the use of | <xref target="RFC8851" sectionFormat="comma" section="4" format="default | |||
RID identifiers allows the individual encodings to be | " derivedLink="https://rfc-editor.org/rfc/rfc8851#section-4" derivedContent="RFC | |||
disambiguated even though they are all part of the same m= | 8851"/>; the use of | |||
Restriction Identifiers (RIDs, also called rid-ids or RtpStreamIds) | ||||
allows the individual encodings to be | ||||
disambiguated even though they are all part of the same "m=" | ||||
section.</t> | section.</t> | |||
</section> | </section> | |||
<section title="Interactions With Forking" | <section anchor="sec.interactions-with-forking" numbered="true" toc="inclu | |||
anchor="sec.interactions-with-forking"> | de" removeInRFC="false" pn="section-3.8"> | |||
<name slugifiedName="name-interactions-with-forking">Interactions with F | ||||
<t>Some call signaling systems allow various types of forking | orking</name> | |||
<t indent="0" pn="section-3.8-1">Some call signaling systems allow vario | ||||
us types of forking | ||||
where an SDP Offer may be provided to more than one device. For | where an SDP Offer may be provided to more than one device. For | |||
example, SIP | example, SIP | |||
<xref target="RFC3261"></xref> defines both a "Parallel Search" | <xref target="RFC3261" format="default" sectionFormat="of" derivedConten | |||
and "Sequential Search". Although these are primarily signaling | t="RFC3261"/> defines both a "parallel search" | |||
level issues that are outside the scope of JSEP, they do have | and "sequential search". Although these are primarily signaling-level is | |||
sues that are outside the scope of JSEP, they do have | ||||
some impact on the configuration of the media plane that is | some impact on the configuration of the media plane that is | |||
relevant. When forking happens at the signaling layer, the | relevant. When forking happens at the signaling layer, the | |||
JavaScript application responsible for the signaling needs to | JavaScript application responsible for the signaling needs to | |||
make the decisions about what media should be sent or received | make the decisions about what media should be sent or received | |||
at any point of time, as well as which remote endpoint it | at any point in time, as well as which remote endpoint it | |||
should communicate with; JSEP is used to make sure the media | should communicate with; JSEP is used to make sure the media | |||
engine can make the RTP and media perform as required by the | engine can make the RTP and media perform as required by the | |||
application. The basic operations that the applications can | application. The basic operations that the applications can | |||
have the media engine do are: | have the media engine do are as follows: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3 | ||||
<t>Start exchanging media with a given remote peer, but keep | .8-2"> | |||
all the resources reserved in the offer.</t> | <li pn="section-3.8-2.1">Start exchanging media with a given remote pe | |||
er, but keep | ||||
<t>Start exchanging media with a given remote peer, and free | all the resources reserved in the offer.</li> | |||
any resources in the offer that are not being used.</t> | <li pn="section-3.8-2.2">Start exchanging media with a given remote pe | |||
</list></t> | er, and free | |||
<section title="Sequential Forking" | any resources in the offer that are not being used.</li> | |||
anchor="sec.sequential-forking"> | </ul> | |||
<section anchor="sec.sequential-forking" numbered="true" toc="include" r | ||||
<t>Sequential forking involves a call being dispatched to | emoveInRFC="false" pn="section-3.8.1"> | |||
<name slugifiedName="name-sequential-forking">Sequential Forking</name | ||||
> | ||||
<t indent="0" pn="section-3.8.1-1">Sequential forking involves a call | ||||
being dispatched to | ||||
multiple remote callees, where each callee can accept the | multiple remote callees, where each callee can accept the | |||
call, but only one active session ever exists at a time; no | call, but only one active session ever exists at a time; no | |||
mixing of received media is performed.</t> | mixing of received media is performed.</t> | |||
<t indent="0" pn="section-3.8.1-2">JSEP handles sequential forking wel | ||||
<t>JSEP handles sequential forking well, allowing the | l, allowing the | |||
application to easily control the policy for selecting the | application to easily control the policy for selecting the | |||
desired remote endpoint. When an answer arrives from one of | desired remote endpoint. When an answer arrives from one of | |||
the callees, the application can choose to apply it either as | the callees, the application can choose to apply it as either | |||
a provisional answer, leaving open the possibility of using a | (1) a provisional answer, leaving open the possibility of using a | |||
different answer in the future, or apply it as a final | different answer in the future or (2) a final | |||
answer, ending the setup flow.</t> | answer, ending the setup flow.</t> | |||
<t indent="0" pn="section-3.8.1-3">In a "first-one-wins" situation, th | ||||
<t>In a "first-one-wins" situation, the first answer will be | e first answer will be | |||
applied as a final answer, and the application will reject | applied as a final answer, and the application will reject | |||
any subsequent answers. In SIP parlance, this would be ACK + | any subsequent answers. In SIP parlance, this would be ACK + | |||
BYE.</t> | BYE.</t> | |||
<t indent="0" pn="section-3.8.1-4">In a "last-one-wins" situation, all | ||||
<t>In a "last-one-wins" situation, all answers would be | answers would be | |||
applied as provisional answers, and any previous call leg | applied as provisional answers, and any previous call leg | |||
will be terminated. At some point, the application will end | will be terminated. At some point, the application will end | |||
the setup process, perhaps with a timer; at this point, the | the setup process, perhaps with a timer; at this point, the | |||
application could reapply the pending remote description as a | application could reapply the pending remote description as a | |||
final answer.</t> | final answer.</t> | |||
</section> | </section> | |||
<section title="Parallel Forking" | <section anchor="sec.parallel-forking" numbered="true" toc="include" rem | |||
anchor="sec.parallel-forking"> | oveInRFC="false" pn="section-3.8.2"> | |||
<name slugifiedName="name-parallel-forking">Parallel Forking</name> | ||||
<t>Parallel forking involves a call being dispatched to | <t indent="0" pn="section-3.8.2-1">Parallel forking involves a call be | |||
ing dispatched to | ||||
multiple remote callees, where each callee can accept the | multiple remote callees, where each callee can accept the | |||
call, and multiple simultaneous active signaling sessions can | call and multiple simultaneous active signaling sessions can | |||
be established as a result. If multiple callees send media at | be established as a result. If multiple callees send media at | |||
the same time, the possibilities for handling this are | the same time, the possibilities for handling this are | |||
described in | described in | |||
<xref target="RFC3960"></xref>, Section 3.1. Most SIP devices | <xref target="RFC3960" sectionFormat="comma" section="3.1" format="def ault" derivedLink="https://rfc-editor.org/rfc/rfc3960#section-3.1" derivedConten t="RFC3960"/>. Most SIP devices | |||
today only support exchanging media with a single device at a | today only support exchanging media with a single device at a | |||
time, and do not try to mix multiple early media audio | time and do not try to mix multiple early media audio | |||
sources, as that could result in a confusing situation. For | sources, as that could result in a confusing situation. For | |||
example, consider having a European ringback tone mixed | example, consider having a European ringback tone mixed | |||
together with the North American ringback tone - the | together with the North American ringback tone -- the | |||
resulting sound would not be like either tone, and would | resulting sound would not be like either tone and would | |||
confuse the user. If the signaling application wishes to only | confuse the user. If the signaling application wishes to only | |||
exchange media with one of the remote endpoints at a time, | exchange media with one of the remote endpoints at a time, | |||
then from a media engine point of view, this is exactly like | then from a media engine point of view, this is exactly like | |||
the sequential forking case.</t> | the sequential forking case.</t> | |||
<t indent="0" pn="section-3.8.2-2">In the parallel forking case where | ||||
<t>In the parallel forking case where the JavaScript | the JavaScript | |||
application wishes to simultaneously exchange media with | application wishes to simultaneously exchange media with | |||
multiple peers, the flow is slightly more complex, but the | multiple peers, the flow is slightly more complex, but the | |||
JavaScript application can follow the strategy that | JavaScript application can follow the strategy that | |||
<xref target="RFC3960"></xref> describes using UPDATE. The | <xref target="RFC3960" format="default" sectionFormat="of" derivedCont ent="RFC3960"/> describes, using UPDATE. The | |||
UPDATE approach allows the signaling to set up a separate | UPDATE approach allows the signaling to set up a separate | |||
media flow for each peer that it wishes to exchange media | media flow for each peer that it wishes to exchange media | |||
with. In JSEP, this offer used in the UPDATE would be formed | with. In JSEP, this offer used in the UPDATE would be formed | |||
by simply creating a new PeerConnection (see | by simply creating a new PeerConnection (see | |||
<xref target="sec.peerconnection" />) and making sure that | <xref target="sec.peerconnection" format="default" sectionFormat="of" derivedContent="Section 4.1"/>) and making sure that | |||
the same local media streams have been added into this new | the same local media streams have been added into this new | |||
PeerConnection. Then the new PeerConnection object would | PeerConnection. Then the new PeerConnection object would | |||
produce a SDP offer that could be used by the signaling to | produce an SDP offer that could be used by the signaling to | |||
perform the UPDATE strategy discussed in | perform the UPDATE strategy discussed in | |||
<xref target="RFC3960"></xref>.</t> | <xref target="RFC3960" format="default" sectionFormat="of" derivedCont | |||
ent="RFC3960"/>.</t> | ||||
<t>As a result of sharing the media streams, the application | <t indent="0" pn="section-3.8.2-3">As a result of sharing the media st | |||
reams, the application | ||||
will end up with N parallel PeerConnection sessions, each | will end up with N parallel PeerConnection sessions, each | |||
with a local and remote description and their own local and | with a local and remote description and their own local and | |||
remote addresses. The media flow from these sessions can be | remote addresses. The media flow from these sessions can be | |||
managed using setDirection (see | managed using setDirection (see | |||
<xref target="sec.transceiver-set-direction" />), or the | <xref target="sec.transceiver-set-direction" format="default" sectionF ormat="of" derivedContent="Section 4.2.3"/>), or the | |||
application can choose to play out the media from all | application can choose to play out the media from all | |||
sessions mixed together. Of course, if the application wants | sessions mixed together. Of course, if the application wants | |||
to only keep a single session, it can simply terminate the | to only keep a single session, it can simply terminate the | |||
sessions that it no longer needs.</t> | sessions that it no longer needs.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Interface" anchor="sec.interface"> | <section anchor="sec.interface" numbered="true" toc="include" removeInRFC="f | |||
alse" pn="section-4"> | ||||
<t>This section details the basic operations that must be present | <name slugifiedName="name-interface">Interface</name> | |||
<t indent="0" pn="section-4-1">This section details the basic operations t | ||||
hat must be present | ||||
to implement JSEP functionality. The actual API exposed in the | to implement JSEP functionality. The actual API exposed in the | |||
W3C API may have somewhat different syntax, but should map easily | W3C API may have somewhat different syntax but should map easily | |||
to these concepts.</t> | to these concepts. | |||
<section title="PeerConnection" anchor="sec.peerconnection"> | </t> | |||
<section title="Constructor" anchor="sec.pc-constructor"> | <section anchor="sec.peerconnection" numbered="true" toc="include" removeI | |||
nRFC="false" pn="section-4.1"> | ||||
<t>The PeerConnection constructor allows the application to | <name slugifiedName="name-peerconnection">PeerConnection</name> | |||
<section anchor="sec.pc-constructor" numbered="true" toc="include" remov | ||||
eInRFC="false" pn="section-4.1.1"> | ||||
<name slugifiedName="name-constructor">Constructor</name> | ||||
<t indent="0" pn="section-4.1.1-1">The PeerConnection constructor allo | ||||
ws the application to | ||||
specify global parameters for the media session, such as the | specify global parameters for the media session, such as the | |||
STUN/TURN servers and credentials to use when gathering | STUN/TURN servers and credentials to use when gathering | |||
candidates, as well as the initial ICE candidate policy and | candidates, as well as the initial ICE candidate policy and | |||
pool size, and also the bundle policy to use.</t> | pool size, and also the bundle policy to use.</t> | |||
<t indent="0" pn="section-4.1.1-2">If an ICE candidate policy is speci | ||||
<t>If an ICE candidate policy is specified, it functions as | fied, it functions as | |||
described in | described in | |||
<xref target="sec.ice-candidate-policy" />, causing the JSEP | <xref target="sec.ice-candidate-policy" format="default" sectionFormat ="of" derivedContent="Section 3.5.3"/>, causing the JSEP | |||
implementation to only surface the permitted candidates | implementation to only surface the permitted candidates | |||
(including any implementation-internal filtering) to the | (including any implementation-internal filtering) to the | |||
application, and only use those candidates for connectivity | application and only use those candidates for connectivity | |||
checks. The set of available policies is as follows: | checks. The set of available policies is as follows: | |||
<list style="hanging"> | </t> | |||
<t hangText="all:">All candidates permitted by | <dl newline="false" spacing="normal" indent="3" pn="section-4.1.1-3"> | |||
implementation policy will be gathered and used.</t> | <dt pn="section-4.1.1-3.1">all:</dt> | |||
<dd pn="section-4.1.1-3.2">All candidates permitted by | ||||
<t></t> | implementation policy will be gathered and used.</dd> | |||
<t hangText="relay:">All candidates except relay candidates | <dt pn="section-4.1.1-3.3">relay:</dt> | |||
<dd pn="section-4.1.1-3.4">All candidates except relay candidates | ||||
will be filtered out. This obfuscates the location | will be filtered out. This obfuscates the location | |||
information that might be ascertained by the remote peer | information that might be ascertained by the remote peer | |||
from the received candidates. Depending on how the | from the received candidates. Depending on how the | |||
application deploys and chooses relay servers, this could | application deploys and chooses relay servers, this could | |||
obfuscate location to a metro or possibly even global | obfuscate location to a metro or possibly even global | |||
level.</t> | level.</dd> | |||
</list></t> | </dl> | |||
<t indent="0" pn="section-4.1.1-4">The default ICE candidate policy <b | ||||
<t>The default ICE candidate policy MUST be set to "all" as | cp14>MUST</bcp14> be set to "all", as | |||
this is generally the desired policy, and also typically | this is generally the desired policy and also typically | |||
reduces use of application TURN server resources | reduces the use of application TURN server resources | |||
significantly.</t> | significantly.</t> | |||
<t indent="0" pn="section-4.1.1-5">If a size is specified for the ICE | ||||
<t>If a size is specified for the ICE candidate pool, this | candidate pool, this | |||
indicates the number of ICE components to pre-gather | indicates the number of ICE components to pre-gather | |||
candidates for. Because pre-gathering results in utilizing | candidates for. Because pre‑gathering results in utilizing | |||
STUN/TURN server resources for potentially long periods of | STUN/TURN server resources for potentially long periods of | |||
time, this must only occur upon application request, and | time, this <bcp14>MUST</bcp14> only occur upon application request, an | |||
therefore the default candidate pool size MUST be zero.</t> | d | |||
therefore the default candidate pool size <bcp14>MUST</bcp14> be zero. | ||||
<t>The application can specify its preferred policy regarding | </t> | |||
<t indent="0" pn="section-4.1.1-6">The application can specify its pre | ||||
ferred policy regarding | ||||
use of bundle, the multiplexing mechanism defined in | use of bundle, the multiplexing mechanism defined in | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation"> | <xref target="RFC8843" format="default" sectionFormat="of" derivedCont | |||
</xref>. Regardless of policy, the application will always | ent="RFC8843"> | |||
try to negotiate bundle onto a single transport, and will | </xref>. Regardless of policy, the application will always | |||
offer a single bundle group across all m= sections; use of | try to negotiate bundle onto a single transport and will | |||
offer a single bundle group across all "m=" sections; use of | ||||
this single transport is contingent upon the answerer | this single transport is contingent upon the answerer | |||
accepting bundle. However, by specifying a policy from the | accepting bundle. However, by specifying a policy from the | |||
list below, the application can control exactly how | list below, the application can control exactly how | |||
aggressively it will try to bundle media streams together, | aggressively it will try to bundle media streams together, | |||
which affects how it will interoperate with a | which affects how it will interoperate with a | |||
non-bundle-aware endpoint. When negotiating with a | non-bundle-aware endpoint. When negotiating with a | |||
non-bundle-aware endpoint, only the streams not marked as | non-bundle-aware endpoint, only the streams not marked as | |||
bundle-only streams will be established.</t> | bundle-only streams will be established.</t> | |||
<t indent="0" pn="section-4.1.1-7">The set of available policies is as | ||||
<t>The set of available policies is as follows: | follows: | |||
<list style="hanging"> | </t> | |||
<t hangText="balanced:">The first m= section of each type | <dl newline="false" spacing="normal" indent="3" pn="section-4.1.1-8"> | |||
<dt pn="section-4.1.1-8.1">balanced:</dt> | ||||
<dd pn="section-4.1.1-8.2">The first "m=" section of each type | ||||
(audio, video, or application) will contain transport | (audio, video, or application) will contain transport | |||
parameters, which will allow an answerer to unbundle that | parameters, which will allow an answerer to unbundle that | |||
section. The second and any subsequent m= section of each | section. The second and any subsequent "m=" sections of each | |||
type will be marked bundle-only. The result is that if | type will be marked bundle-only. The result is that if | |||
there are N distinct media types, then candidates will be | there are N distinct media types, then candidates will be | |||
gathered for for N media streams. This policy balances | gathered for N media streams. This policy balances | |||
desire to multiplex with the need to ensure basic audio and | desire to multiplex with the need to ensure that basic audio and | |||
video can still be negotiated in legacy cases. When acting | video can still be negotiated in legacy cases. When acting | |||
as answerer, if there is no bundle group in the offer, the | as answerer, if there is no bundle group in the offer, the | |||
implementation will reject all but the first m= section of | implementation will reject all but the first "m=" section of | |||
each type.</t> | each type.</dd> | |||
<dt pn="section-4.1.1-8.3">max-compat:</dt> | ||||
<t></t> | <dd pn="section-4.1.1-8.4">All "m=" sections will contain | |||
<t hangText="max-compat:">All m= sections will contain | ||||
transport parameters; none will be marked as bundle-only. | transport parameters; none will be marked as bundle-only. | |||
This policy will allow all streams to be received by | This policy will allow all streams to be received by | |||
non-bundle-aware endpoints, but require separate candidates | non-bundle-aware endpoints but will require separate candidates | |||
to be gathered for each media stream.</t> | to be gathered for each media stream.</dd> | |||
<dt pn="section-4.1.1-8.5">max-bundle:</dt> | ||||
<t></t> | <dd pn="section-4.1.1-8.6">Only the first "m=" section will | |||
<t hangText="max-bundle:">Only the first m= section will | ||||
contain transport parameters; all streams other than the | contain transport parameters; all streams other than the | |||
first will be marked as bundle-only. This policy aims to | first will be marked as bundle-only. This policy aims to | |||
minimize candidate gathering and maximize multiplexing, at | minimize candidate gathering and maximize multiplexing, at | |||
the cost of less compatibility with legacy endpoints. When | the cost of less compatibility with legacy endpoints. When | |||
acting as answerer, the implementation will reject any m= | acting as answerer, the implementation will reject any "m=" | |||
sections other than the first m= section, unless they are | sections other than the first "m=" section, unless they are | |||
in the same bundle group as that m= section.</t> | in the same bundle group as that "m=" section.</dd> | |||
</list></t> | </dl> | |||
<t indent="0" pn="section-4.1.1-9">As it provides the best trade-off b | ||||
<t>As it provides the best tradeoff between performance and | etween performance and | |||
compatibility with legacy endpoints, the default bundle | compatibility with legacy endpoints, the default bundle | |||
policy MUST be set to "balanced".</t> | policy <bcp14>MUST</bcp14> be set to "balanced".</t> | |||
<t indent="0" pn="section-4.1.1-10">The application can specify its pr | ||||
<t>The application can specify its preferred policy regarding | eferred policy regarding | |||
use of RTP/RTCP multiplexing | use of RTP/RTCP multiplexing | |||
<xref target="RFC5761"></xref> using one of the following | <xref target="RFC5761" format="default" sectionFormat="of" derivedCont ent="RFC5761"/> using one of the following | |||
policies: | policies: | |||
<list style="hanging"> | </t> | |||
<t hangText="negotiate:">The JSEP implementation will | <dl newline="false" spacing="normal" indent="3" pn="section-4.1.1-11"> | |||
<dt pn="section-4.1.1-11.1">negotiate:</dt> | ||||
<dd pn="section-4.1.1-11.2">The JSEP implementation will | ||||
gather both RTP and RTCP candidates but also will offer | gather both RTP and RTCP candidates but also will offer | |||
"a=rtcp-mux", thus allowing for compatibility with either | "a=rtcp-mux", thus allowing for compatibility with either | |||
multiplexing or non-multiplexing endpoints.</t> | multiplexing or non-multiplexing endpoints.</dd> | |||
<t hangText="require:">The JSEP implementation will only | <dt pn="section-4.1.1-11.3">require:</dt> | |||
<dd pn="section-4.1.1-11.4">The JSEP implementation will only | ||||
gather RTP candidates and will insert an "a=rtcp-mux-only" | gather RTP candidates and will insert an "a=rtcp-mux-only" | |||
indication into any new m= sections in offers it generates. | indication into any new "m=" sections in offers it generates. | |||
This halves the number of candidates that the offerer needs | This halves the number of candidates that the offerer needs | |||
to gather. Applying a description with an m= section that | to gather. Applying a description with an "m=" section that | |||
does not contain an "a=rtcp-mux" attribute will cause an | does not contain an "a=rtcp-mux" attribute will cause an | |||
error to be returned.</t> | error to be returned.</dd> | |||
</list></t> | </dl> | |||
<t indent="0" pn="section-4.1.1-12">The default multiplexing policy <b | ||||
<t>The default multiplexing policy MUST be set to "require". | cp14>MUST</bcp14> be set to "require". | |||
Implementations MAY choose to reject attempts by the | Implementations <bcp14>MAY</bcp14> choose to reject attempts by the | |||
application to set the multiplexing policy to | application to set the multiplexing policy to | |||
"negotiate".</t> | "negotiate".</t> | |||
</section> | </section> | |||
<section title="addTrack" anchor="sec.addTrack"> | <section anchor="sec.addTrack" numbered="true" toc="include" removeInRFC | |||
="false" pn="section-4.1.2"> | ||||
<t>The addTrack method adds a MediaStreamTrack to the | <name slugifiedName="name-addtrack">addTrack</name> | |||
<t indent="0" pn="section-4.1.2-1">The addTrack method adds a MediaStr | ||||
eamTrack to the | ||||
PeerConnection, using the MediaStream argument to associate | PeerConnection, using the MediaStream argument to associate | |||
the track with other tracks in the same MediaStream, so that | the track with other tracks in the same MediaStream, so that | |||
they can be added to the same "LS" group when creating an | they can be added to the same "LS" (Lip Synchronization) group when cr eating an | |||
offer or answer. Adding tracks to the same "LS" group | offer or answer. Adding tracks to the same "LS" group | |||
indicates that the playback of these tracks should be | indicates that the playback of these tracks should be | |||
synchronized for proper lip sync, as described in | synchronized for proper lip sync, as described in | |||
<xref target="RFC5888"></xref>, Section 7. addTrack attempts | <xref target="RFC5888" sectionFormat="comma" section="7" format="defau | |||
to minimize the number of transceivers as follows: If the | lt" derivedLink="https://rfc-editor.org/rfc/rfc5888#section-7" derivedContent="R | |||
PeerConnection is in the "have-remote-offer" state, the track | FC5888"/>. addTrack attempts | |||
to minimize the number of transceivers as follows: if the | ||||
PeerConnection is in the "have‑remote-offer" state, the track | ||||
will be attached to the first compatible transceiver that was | will be attached to the first compatible transceiver that was | |||
created by the most recent call to setRemoteDescription() and | created by the most recent call to setRemoteDescription and | |||
does not have a local track. Otherwise, a new transceiver | does not have a local track. Otherwise, a new transceiver | |||
will be created, as described in | will be created, as described in | |||
<xref target="sec.addTransceiver" />.</t> | <xref target="sec.addTransceiver" format="default" sectionFormat="of" derivedContent="Section 4.1.4"/>.</t> | |||
</section> | </section> | |||
<section title="removeTrack" anchor="sec.removeTrack"> | <section anchor="sec.removeTrack" numbered="true" toc="include" removeIn | |||
RFC="false" pn="section-4.1.3"> | ||||
<t>The removeTrack method removes a MediaStreamTrack from the | <name slugifiedName="name-removetrack">removeTrack</name> | |||
<t indent="0" pn="section-4.1.3-1">The removeTrack method removes a Me | ||||
diaStreamTrack from the | ||||
PeerConnection, using the RtpSender argument to indicate | PeerConnection, using the RtpSender argument to indicate | |||
which sender should have its track removed. The sender's | which sender should have its track removed. The sender's | |||
track is cleared, and the sender stops sending. Future calls | track is cleared, and the sender stops sending. Future calls | |||
to createOffer will mark the m= section associated with the | to createOffer will mark the "m=" section associated with the | |||
sender as recvonly (if transceiver.direction is sendrecv) or | sender as recvonly (if transceiver.direction is sendrecv) or | |||
as inactive (if transceiver.direction is sendonly).</t> | as inactive (if transceiver.direction is sendonly).</t> | |||
</section> | </section> | |||
<section title="addTransceiver" anchor="sec.addTransceiver"> | <section anchor="sec.addTransceiver" numbered="true" toc="include" remov | |||
eInRFC="false" pn="section-4.1.4"> | ||||
<t>The addTransceiver method adds a new RtpTransceiver to the | <name slugifiedName="name-addtransceiver">addTransceiver</name> | |||
<t indent="0" pn="section-4.1.4-1">The addTransceiver method adds a ne | ||||
w RtpTransceiver to the | ||||
PeerConnection. If a MediaStreamTrack argument is provided, | PeerConnection. If a MediaStreamTrack argument is provided, | |||
then the transceiver will be configured with that media type | then the transceiver will be configured with that media type | |||
and the track will be attached to the transceiver. Otherwise, | and the track will be attached to the transceiver. Otherwise, | |||
the application MUST explicitly specify the type; this mode | the application <bcp14>MUST</bcp14> explicitly specify the type; this mode | |||
is useful for creating recvonly transceivers as well as for | is useful for creating recvonly transceivers as well as for | |||
creating transceivers to which a track can be attached at | creating transceivers to which a track can be attached at | |||
some later point.</t> | some later point.</t> | |||
<t indent="0" pn="section-4.1.4-2">At the time of creation, the applic | ||||
<t>At the time of creation, the application can also specify | ation can also specify | |||
a transceiver direction attribute, a set of MediaStreams | a transceiver direction attribute, a set of MediaStreams | |||
which the transceiver is associated with (allowing LS group | that the transceiver is associated with (allowing "LS" group | |||
assignments), and a set of encodings for the media (used for | assignments), and a set of encodings for the media (used for | |||
simulcast as described in | simulcast as described in | |||
<xref target="sec.simulcast" />).</t> | <xref target="sec.simulcast" format="default" sectionFormat="of" deriv edContent="Section 3.7"/>).</t> | |||
</section> | </section> | |||
<section title="createDataChannel" | <section anchor="sec.onaddtrack" numbered="true" toc="include" removeInR | |||
anchor="sec.createDataChannel"> | FC="false" pn="section-4.1.5"> | |||
<name slugifiedName="name-onaddtrack-event">onaddtrack Event</name> | ||||
<t>The createDataChannel method creates a new data channel | <t indent="0" pn="section-4.1.5-1">The onaddtrack event is dispatched | |||
to the application when a new | ||||
remote track has been signaled as a result of a setRemoteDescription | ||||
call. The new track is supplied as a MediaStreamTrack object in the | ||||
event, along with the MediaStream(s) the track is part of. | ||||
</t> | ||||
</section> | ||||
<section anchor="sec.createDataChannel" numbered="true" toc="include" re | ||||
moveInRFC="false" pn="section-4.1.6"> | ||||
<name slugifiedName="name-createdatachannel">createDataChannel</name> | ||||
<t indent="0" pn="section-4.1.6-1">The createDataChannel method create | ||||
s a new data channel | ||||
and attaches it to the PeerConnection. If no data channel | and attaches it to the PeerConnection. If no data channel | |||
currently exists for this PeerConnection, then a new | currently exists for this PeerConnection, then a new | |||
offer/answer exchange is required. All data channels on a | offer/answer exchange is required. All data channels on a | |||
given PeerConnection share the same SCTP/DTLS association and | given PeerConnection share the same SCTP/DTLS association ("SCTP" stan | |||
therefore the same m= section, so subsequent creation of data | ds | |||
for "Stream Control Transmission Protocol") and | ||||
therefore the same "m=" section, so subsequent creation of data | ||||
channels does not have any impact on the JSEP state.</t> | channels does not have any impact on the JSEP state.</t> | |||
<t indent="0" pn="section-4.1.6-2">The createDataChannel method also i | ||||
<t>The createDataChannel method also includes a number of | ncludes a number of | |||
arguments which are used by the PeerConnection (e.g., | arguments that are used by the PeerConnection (e.g., | |||
maxPacketLifetime) but are not reflected in the SDP and do | maxPacketLifetime) but are not reflected in the SDP and do | |||
not affect the JSEP state.</t> | not affect the JSEP state.</t> | |||
</section> | </section> | |||
<section title="createOffer" anchor="sec.createoffer"> | <section anchor="sec.ondatachannel" numbered="true" toc="include" remove | |||
InRFC="false" pn="section-4.1.7"> | ||||
<t>The createOffer method generates a blob of SDP that | <name slugifiedName="name-ondatachannel-event">ondatachannel Event</na | |||
contains a | me> | |||
<xref target="RFC3264"></xref> offer with the supported | <t indent="0" pn="section-4.1.7-1">The ondatachannel event is dispatch | |||
ed to the application when a | ||||
new data channel has been negotiated by the remote side, which can | ||||
occur at any time after the underlying SCTP/DTLS association has been | ||||
established. The new data channel object is supplied in the event. | ||||
</t> | ||||
</section> | ||||
<section anchor="sec.createoffer" numbered="true" toc="include" removeIn | ||||
RFC="false" pn="section-4.1.8"> | ||||
<name slugifiedName="name-createoffer">createOffer</name> | ||||
<t indent="0" pn="section-4.1.8-1">The createOffer method generates a | ||||
blob of SDP that | ||||
contains an offer per <xref target="RFC3264" format="default" sectionF | ||||
ormat="of" derivedContent="RFC3264"/> with the supported | ||||
configurations for the session, including descriptions of the | configurations for the session, including descriptions of the | |||
media added to this PeerConnection, the codec/RTP/RTCP | media added to this PeerConnection, the codec, RTP, and RTCP | |||
options supported by this implementation, and any candidates | options supported by this implementation, and any candidates | |||
that have been gathered by the ICE agent. An options | that have been gathered by the ICE agent. An options | |||
parameter may be supplied to provide additional control over | parameter may be supplied to provide additional control over | |||
the generated offer. This options parameter allows an | the generated offer. This options parameter allows an | |||
application to trigger an ICE restart, for the purpose of | application to trigger an ICE restart, for the purpose of | |||
reestablishing connectivity.</t> | reestablishing connectivity.</t> | |||
<t indent="0" pn="section-4.1.8-2">In the initial offer, the generated | ||||
<t>In the initial offer, the generated SDP will contain all | SDP will contain all | |||
desired functionality for the session (functionality that is | desired functionality for the session (functionality that is | |||
supported but not desired by default may be omitted); for | supported but not desired by default may be omitted); for | |||
each SDP line, the generation of the SDP will follow the | each SDP line, the generation of the SDP will follow the | |||
process defined for generating an initial offer from the | process defined for generating an initial offer from the | |||
document that specifies the given SDP line. The exact | specification that defines the given SDP line. The exact | |||
handling of initial offer generation is detailed in | handling of initial offer generation is detailed in | |||
<xref target="sec.initial-offers" /> below.</t> | <xref target="sec.initial-offers" format="default" sectionFormat="of" | |||
derivedContent="Section 5.2.1"/> below.</t> | ||||
<t>In the event createOffer is called after the session is | <t indent="0" pn="section-4.1.8-3">In the event createOffer is called | |||
after the session is | ||||
established, createOffer will generate an offer to modify the | established, createOffer will generate an offer to modify the | |||
current session based on any changes that have been made to | current session based on any changes that have been made to | |||
the session, e.g., adding or stopping RtpTransceivers, or | the session, e.g., adding or stopping RtpTransceivers, or | |||
requesting an ICE restart. For each existing stream, the | requesting an ICE restart. For each existing stream, the | |||
generation of each SDP line must follow the process defined | generation of each SDP line <bcp14>MUST</bcp14> follow the process def ined | |||
for generating an updated offer from the RFC that specifies | for generating an updated offer from the RFC that specifies | |||
the given SDP line. For each new stream, the generation of | the given SDP line. For each new stream, the generation of | |||
the SDP must follow the process of generating an initial | the SDP <bcp14>MUST</bcp14> follow the process of generating an initia l | |||
offer, as mentioned above. If no changes have been made, or | offer, as mentioned above. If no changes have been made, or | |||
for SDP lines that are unaffected by the requested changes, | for SDP lines that are unaffected by the requested changes, | |||
the offer will only contain the parameters negotiated by the | the offer will only contain the parameters negotiated by the | |||
last offer-answer exchange. The exact handling of subsequent | last offer/answer exchange. The exact handling of subsequent | |||
offer generation is detailed in | offer generation is detailed in | |||
<xref target="sec.subsequent-offers" />. below.</t> | <xref target="sec.subsequent-offers" format="default" sectionFormat="o | |||
f" derivedContent="Section 5.2.2"/> below.</t> | ||||
<t>Session descriptions generated by createOffer must be | <t indent="0" pn="section-4.1.8-4">Session descriptions generated by c | |||
reateOffer <bcp14>MUST</bcp14> be | ||||
immediately usable by setLocalDescription; if a system has | immediately usable by setLocalDescription; if a system has | |||
limited resources (e.g. a finite number of decoders), | limited resources (e.g., a finite number of decoders), | |||
createOffer should return an offer that reflects the current | createOffer <bcp14>SHOULD</bcp14> return an offer that reflects the cu | |||
rrent | ||||
state of the system, so that setLocalDescription will succeed | state of the system, so that setLocalDescription will succeed | |||
when it attempts to acquire those resources.</t> | when it attempts to acquire those resources.</t> | |||
<t indent="0" pn="section-4.1.8-5">Calling this method may do things s | ||||
<t>Calling this method may do things such as generating new | uch as generating new | |||
ICE credentials, but does not change the PeerConnection | ICE credentials, but it does not change the PeerConnection | |||
state, trigger candidate gathering, or cause media to start | state, trigger candidate gathering, or cause media to start | |||
or stop flowing. Specifically, the offer is not applied, and | or stop flowing. Specifically, the offer is not applied, and | |||
does not become the pending local description, until | does not become the pending local description, until | |||
setLocalDescription is called.</t> | setLocalDescription is called.</t> | |||
</section> | </section> | |||
<section title="createAnswer" anchor="sec.createanswer"> | <section anchor="sec.createanswer" numbered="true" toc="include" removeI | |||
nRFC="false" pn="section-4.1.9"> | ||||
<t>The createAnswer method generates a blob of SDP that | <name slugifiedName="name-createanswer">createAnswer</name> | |||
contains a | <t indent="0" pn="section-4.1.9-1">The createAnswer method generates a | |||
<xref target="RFC3264"></xref> SDP answer with the supported | blob of SDP that | |||
contains an SDP answer per <xref target="RFC3264" format="default" sec | ||||
tionFormat="of" derivedContent="RFC3264"/> with the supported | ||||
configuration for the session that is compatible with the | configuration for the session that is compatible with the | |||
parameters supplied in the most recent call to | parameters supplied in the most recent call to | |||
setRemoteDescription, which MUST have been called prior to | setRemoteDescription; setRemoteDescription <bcp14>MUST</bcp14> have be en called prior to | |||
calling createAnswer. Like createOffer, the returned blob | calling createAnswer. Like createOffer, the returned blob | |||
contains descriptions of the media added to this | contains descriptions of the media added to this | |||
PeerConnection, the codec/RTP/RTCP options negotiated for | PeerConnection, the codec/RTP/RTCP options negotiated for | |||
this session, and any candidates that have been gathered by | this session, and any candidates that have been gathered by | |||
the ICE agent. An options parameter may be supplied to | the ICE agent. An options parameter may be supplied to | |||
provide additional control over the generated answer.</t> | provide additional control over the generated answer.</t> | |||
<t indent="0" pn="section-4.1.9-2">As an answer, the generated SDP wil | ||||
<t>As an answer, the generated SDP will contain a specific | l contain a specific | |||
configuration that specifies how the media plane should be | configuration that specifies how the media plane should be | |||
established; for each SDP line, the generation of the SDP | established; for each SDP line, the generation of the SDP | |||
must follow the process defined for generating an answer from | <bcp14>MUST</bcp14> follow the process defined for generating an answe | |||
the document that specifies the given SDP line. The exact | r from | |||
the specification that defines the given SDP line. The exact | ||||
handling of answer generation is detailed in | handling of answer generation is detailed in | |||
<xref target="sec.generating-an-answer" />. below.</t> | <xref target="sec.generating-an-answer" format="default" sectionFormat | |||
="of" derivedContent="Section 5.3"/> below.</t> | ||||
<t>Session descriptions generated by createAnswer must be | <t indent="0" pn="section-4.1.9-3">Session descriptions generated by c | |||
reateAnswer <bcp14>MUST</bcp14> be | ||||
immediately usable by setLocalDescription; like createOffer, | immediately usable by setLocalDescription; like createOffer, | |||
the returned description should reflect the current state of | the returned description <bcp14>SHOULD</bcp14> reflect the current sta te of | |||
the system.</t> | the system.</t> | |||
<t indent="0" pn="section-4.1.9-4">Calling this method may do things s | ||||
<t>Calling this method may do things such as generating new | uch as generating new | |||
ICE credentials, but does not change the PeerConnection | ICE credentials, but it does not change the PeerConnection | |||
state, trigger candidate gathering, or or cause a media state | state, trigger candidate gathering, or cause a media state | |||
change. Specifically, the answer is not applied, and does not | change. Specifically, the answer is not applied, and does not | |||
become the current local description, until | become the current local description, until | |||
setLocalDescription is called.</t> | setLocalDescription is called.</t> | |||
</section> | </section> | |||
<section title="SessionDescriptionType" | <section anchor="sec.sessiondescriptiontype" numbered="true" toc="includ | |||
anchor="sec.sessiondescriptiontype"> | e" removeInRFC="false" pn="section-4.1.10"> | |||
<name slugifiedName="name-sessiondescriptiontype">SessionDescriptionTy | ||||
<t>Session description objects (RTCSessionDescription) may be | pe</name> | |||
of type "offer", "pranswer", "answer" or "rollback". These | <t indent="0" pn="section-4.1.10-1">Session description objects (RTCSe | |||
ssionDescription) may be | ||||
of type "offer", "pranswer", "answer", or "rollback". These | ||||
types provide information as to how the description parameter | types provide information as to how the description parameter | |||
should be parsed, and how the media state should be | should be parsed and how the media state should be | |||
changed.</t> | changed.</t> | |||
<t indent="0" pn="section-4.1.10-2">"offer" indicates that a descripti | ||||
<t>"offer" indicates that a description should be parsed as | on <bcp14>MUST</bcp14> be parsed as | |||
an offer; said description may include many possible media | an offer; said description may include many possible media | |||
configurations. A description used as an "offer" may be | configurations. A description used as an "offer" may be | |||
applied anytime the PeerConnection is in a stable state, or | applied any time the PeerConnection is in a "stable" state or | |||
as an update to a previously supplied but unanswered | applied as an update to a previously supplied but unanswered | |||
"offer".</t> | "offer".</t> | |||
<t indent="0" pn="section-4.1.10-3">"pranswer" indicates that a descri | ||||
<t>"pranswer" indicates that a description should be parsed | ption <bcp14>MUST</bcp14> be parsed | |||
as an answer, but not a final answer, and so should not | as an answer, but not a final answer, and so <bcp14>MUST NOT</bcp14> | |||
result in the freeing of allocated resources. It may result | result in the freeing of allocated resources. It may result | |||
in the start of media transmission, if the answer does not | in the start of media transmission, if the answer does not | |||
specify an inactive media direction. A description used as a | specify an inactive media direction. A description used as a | |||
"pranswer" may be applied as a response to an "offer", or an | "pranswer" may be applied as a response to an "offer" or as an | |||
update to a previously sent "pranswer".</t> | update to a previously sent "pranswer".</t> | |||
<t indent="0" pn="section-4.1.10-4">"answer" indicates that a descript | ||||
<t>"answer" indicates that a description should be parsed as | ion <bcp14>MUST</bcp14> be parsed as | |||
an answer, the offer-answer exchange should be considered | an answer, the offer/answer exchange <bcp14>MUST</bcp14> be considered | |||
complete, and any resources (decoders, candidates) that are | complete, and any resources (decoders, candidates) that are | |||
no longer needed can be released. A description used as an | no longer needed <bcp14>SHOULD</bcp14> be released. A description used | |||
"answer" may be applied as a response to an "offer", or an | as an | |||
"answer" may be applied as a response to an "offer" or as an | ||||
update to a previously sent "pranswer".</t> | update to a previously sent "pranswer".</t> | |||
<t indent="0" pn="section-4.1.10-5">The only difference between a prov | ||||
<t>The only difference between a provisional and final answer | isional and final answer | |||
is that the final answer results in the freeing of any unused | is that the final answer results in the freeing of any unused | |||
resources that were allocated as a result of the offer. As | resources that were allocated as a result of the offer. As | |||
such, the application can use some discretion on whether an | such, the application can use some discretion on whether an | |||
answer should be applied as provisional or final, and can | answer should be applied as provisional or final and can | |||
change the type of the session description as needed. For | change the type of the session description as needed. For | |||
example, in a serial forking scenario, an application may | example, in a serial forking scenario, an application may | |||
receive multiple "final" answers, one from each remote | receive multiple "final" answers, one from each remote | |||
endpoint. The application could choose to accept the initial | endpoint. The application could choose to accept the initial | |||
answers as provisional answers, and only apply an answer as | answers as provisional answers and only apply an answer as | |||
final when it receives one that meets its criteria (e.g. a | final when it receives one that meets its criteria (e.g., a | |||
live user instead of voicemail).</t> | live user instead of voicemail).</t> | |||
<t indent="0" pn="section-4.1.10-6">"rollback" is a special session de | ||||
<t>"rollback" is a special session description type implying | scription type indicating | |||
that the state machine should be rolled back to the previous | that the state machine <bcp14>MUST</bcp14> be rolled back to the previ | |||
stable state, as described in | ous | |||
<xref target="sec.rollback" />. The contents MUST be | "stable" state, as described in | |||
<xref target="sec.rollback" format="default" sectionFormat="of" derive | ||||
dContent="Section 4.1.10.2"/>. The contents <bcp14>MUST</bcp14> be | ||||
empty.</t> | empty.</t> | |||
<section title="Use of Provisional Answers" | <section anchor="sec.use-of-provisional-answer" numbered="true" toc="i | |||
anchor="sec.use-of-provisional-answer"> | nclude" removeInRFC="false" pn="section-4.1.10.1"> | |||
<name slugifiedName="name-use-of-provisional-answers">Use of Provisi | ||||
<t>Most applications will not need to create answers using | onal Answers</name> | |||
<t indent="0" pn="section-4.1.10.1-1">Most applications will not nee | ||||
d to create answers using | ||||
the "pranswer" type. While it is good practice to send an | the "pranswer" type. While it is good practice to send an | |||
immediate response to an offer, in order to warm up the | immediate response to an offer, in order to warm up the | |||
session transport and prevent media clipping, the preferred | session transport and prevent media clipping, the preferred | |||
handling for a JSEP application is to create and send a | handling for a JSEP application is to create and send a | |||
"sendonly" final answer with a null MediaStreamTrack | "sendonly" final answer with a null MediaStreamTrack | |||
immediately after receiving the offer, which will prevent | immediately after receiving the offer, which will prevent | |||
media from being sent by the caller, and allow media to be | media from being sent by the caller and allow media to be | |||
sent immediately upon answer by the callee. Later, when the | sent immediately upon answer by the callee. Later, when the | |||
callee actually accepts the call, the application can plug | callee actually accepts the call, the application can plug | |||
in the real MediaStreamTrack and create a new "sendrecv" | in the real MediaStreamTrack and create a new "sendrecv" | |||
offer to update the previous offer/answer pair and start | offer to update the previous offer/answer pair and start | |||
bidirectional media flow. While this could also be done | bidirectional media flow. While this could also be done | |||
with a "sendonly" pranswer, followed by a "sendrecv" | with a "sendonly" pranswer followed by a "sendrecv" | |||
answer, the initial pranswer leaves the offer-answer | answer, the initial pranswer leaves the offer/answer | |||
exchange open, which means that the caller cannot send an | exchange open, which means that the caller cannot send an | |||
updated offer during this time.</t> | updated offer during this time. </t> | |||
<t indent="0" pn="section-4.1.10.1-2">As an example, consider a typi | ||||
<t>As an example, consider a typical JSEP application that | cal JSEP application that | |||
wants to set up audio and video as quickly as possible. | wants to set up audio and video as quickly as possible. | |||
When the callee receives an offer with audio and video | When the callee receives an offer with audio and video | |||
MediaStreamTracks, it will send an immediate answer | MediaStreamTracks, it will send an immediate answer | |||
accepting these tracks as sendonly (meaning that the caller | accepting these tracks as sendonly (meaning that the caller | |||
will not send the callee any media yet, and because the | will not send the callee any media yet, and because the | |||
callee has not yet added its own MediaStreamTracks, the | callee has not yet added its own MediaStreamTracks, the | |||
callee will not send any media either). It will then ask | callee will not send any media either). It will then ask | |||
the user to accept the call and acquire the needed local | the user to accept the call and acquire the needed local | |||
tracks. Upon acceptance by the user, the application will | tracks. Upon acceptance by the user, the application will | |||
plug in the tracks it has acquired, which, because ICE and | plug in the tracks it has acquired, which, because ICE handshaking | |||
DTLS handshaking have likely completed by this point, can | and DTLS handshaking have likely completed by this point, can | |||
start transmitting immediately. The application will also | start transmitting immediately. The application will also | |||
send a new offer to the remote side indicating call | send a new offer to the remote side indicating call | |||
acceptance and moving the audio and video to be two-way | acceptance and moving the audio and video to be two-way | |||
media. A detailed example flow along these lines is shown | media. A detailed example flow along these lines is shown | |||
in | in | |||
<xref target="sec.warmup-example"></xref>.</t> | <xref target="sec.warmup-example" format="default" sectionFormat="of | |||
" derivedContent="Section 7.3"/>.</t> | ||||
<t>Of course, some applications may not be able to perform | <t indent="0" pn="section-4.1.10.1-3">Of course, some applications m | |||
this double offer-answer exchange, particularly ones that | ay not be able to perform | |||
this double offer/answer exchange, particularly ones that | ||||
are attempting to gateway to legacy signaling protocols. In | are attempting to gateway to legacy signaling protocols. In | |||
these cases, pranswer can still provide the application | these cases, pranswer can still provide the application | |||
with a mechanism to warm up the transport.</t> | with a mechanism to warm up the transport.</t> | |||
</section> | </section> | |||
<section title="Rollback" anchor="sec.rollback"> | <section anchor="sec.rollback" numbered="true" toc="include" removeInR | |||
FC="false" pn="section-4.1.10.2"> | ||||
<t>In certain situations it may be desirable to "undo" a | <name slugifiedName="name-rollback">Rollback</name> | |||
<t indent="0" pn="section-4.1.10.2-1">In certain situations, it may | ||||
be desirable to "undo" a | ||||
change made to setLocalDescription or setRemoteDescription. | change made to setLocalDescription or setRemoteDescription. | |||
Consider a case where a call is ongoing, and one side wants | Consider a case where a call is ongoing and one side wants | |||
to change some of the session parameters; that side | to change some of the session parameters; that side | |||
generates an updated offer and then calls | generates an updated offer and then calls | |||
setLocalDescription. However, the remote side, either | setLocalDescription. However, the remote side, either | |||
before or after setRemoteDescription, decides it does not | before or after setRemoteDescription, decides it does not | |||
want to accept the new parameters, and sends a reject | want to accept the new parameters and sends a reject | |||
message back to the offerer. Now, the offerer, and possibly | message back to the offerer. Now, the offerer, and possibly | |||
the answerer as well, need to return to a stable state and | the answerer as well, needs to return to a "stable" state and | |||
the previous local/remote description. To support this, we | the previous local/remote description. To support this, we | |||
introduce the concept of "rollback", which discards any | introduce the concept of "rollback", which discards any | |||
proposed changes to the session, returning the state | proposed changes to the session, returning the state | |||
machine to the stable state. A rollback is performed by | machine to the "stable" state. A rollback is performed by | |||
supplying a session description of type "rollback" with | supplying a session description of type "rollback" with | |||
empty contents to either setLocalDescription or | empty contents to either setLocalDescription or | |||
setRemoteDescription.</t> | setRemoteDescription.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="setLocalDescription" | <section anchor="sec.setlocaldescription" numbered="true" toc="include" | |||
anchor="sec.setlocaldescription"> | removeInRFC="false" pn="section-4.1.11"> | |||
<name slugifiedName="name-setlocaldescription">setLocalDescription</na | ||||
<t>The setLocalDescription method instructs the | me> | |||
<t indent="0" pn="section-4.1.11-1">The setLocalDescription method ins | ||||
tructs the | ||||
PeerConnection to apply the supplied session description as | PeerConnection to apply the supplied session description as | |||
its local configuration. The type field indicates whether the | its local configuration. The type field indicates whether the | |||
description should be processed as an offer, provisional | description should be processed as an offer, provisional | |||
answer, final answer, or rollback; offers and answers are | answer, final answer, or rollback; offers and answers are | |||
checked differently, using the various rules that exist for | checked differently, using the various rules that exist for | |||
each SDP line.</t> | each SDP line.</t> | |||
<t indent="0" pn="section-4.1.11-2">This API changes the local media s | ||||
<t>This API changes the local media state; among other | tate; among other | |||
things, it sets up local resources for receiving and decoding | things, it sets up local resources for receiving and decoding | |||
media. In order to successfully handle scenarios where the | media. In order to successfully handle scenarios where the | |||
application wants to offer to change from one media format to | application wants to offer to change from one media format to | |||
a different, incompatible format, the PeerConnection must be | a different, incompatible format, the PeerConnection <bcp14>MUST</bcp1 4> be | |||
able to simultaneously support use of both the current and | able to simultaneously support use of both the current and | |||
pending local descriptions (e.g., support the codecs that | pending local descriptions (e.g., support the codecs that | |||
exist in either description). This dual processing begins | exist in either description). This dual processing begins | |||
when the PeerConnection enters the "have-local-offer" state, | when the PeerConnection enters the "have-local-offer" state, | |||
and continues until setRemoteDescription is called with | and it continues until setRemoteDescription is called with | |||
either a final answer, at which point the PeerConnection can | either (1) a final answer, at which point the PeerConnection can | |||
fully adopt the pending local description, or a rollback, | fully adopt the pending local description or (2) a rollback, | |||
which results in a revert to the current local | which results in a revert to the current local | |||
description.</t> | description.</t> | |||
<t indent="0" pn="section-4.1.11-3">This API indirectly controls the c | ||||
<t>This API indirectly controls the candidate gathering | andidate gathering | |||
process. When a local description is supplied, and the number | process. When a local description is supplied and the number | |||
of transports currently in use does not match the number of | of transports currently in use does not match the number of | |||
transports needed by the local description, the | transports needed by the local description, the | |||
PeerConnection will create transports as needed and begin | PeerConnection will create transports as needed and begin | |||
gathering candidates for each transport, using ones from the | gathering candidates for each transport, using ones from the | |||
candidate pool if available.</t> | candidate pool if available.</t> | |||
<t indent="0" pn="section-4.1.11-4">If (1) setRemoteDescription was pr | ||||
<t>If setRemoteDescription was previously called with an | eviously called with an | |||
offer, and setLocalDescription is called with an answer | offer, (2) setLocalDescription is called with an answer | |||
(provisional or final), and the media directions are | (provisional or final), (3) the media directions are | |||
compatible, and media is available to send, this will result | compatible, and (4) media is available to send, this will result | |||
in the starting of media transmission.</t> | in the starting of media transmission. | |||
</t> | ||||
</section> | </section> | |||
<section title="setRemoteDescription" | <section anchor="sec.setremotedescription" numbered="true" toc="include" | |||
anchor="sec.setremotedescription"> | removeInRFC="false" pn="section-4.1.12"> | |||
<name slugifiedName="name-setremotedescription">setRemoteDescription</ | ||||
<t>The setRemoteDescription method instructs the | name> | |||
<t indent="0" pn="section-4.1.12-1">The setRemoteDescription method in | ||||
structs the | ||||
PeerConnection to apply the supplied session description as | PeerConnection to apply the supplied session description as | |||
the desired remote configuration. As in setLocalDescription, | the desired remote configuration. As in setLocalDescription, | |||
the type field of the description indicates how it should be | the type field of the description indicates how it should be | |||
processed.</t> | processed.</t> | |||
<t indent="0" pn="section-4.1.12-2">This API changes the local media s | ||||
<t>This API changes the local media state; among other | tate; among other | |||
things, it sets up local resources for sending and encoding | things, it sets up local resources for sending and encoding | |||
media.</t> | media. </t> | |||
<t indent="0" pn="section-4.1.12-3">If (1) setLocalDescription was pre | ||||
<t>If setLocalDescription was previously called with an | viously called with an | |||
offer, and setRemoteDescription is called with an answer | offer, (2) setRemoteDescription is called with an answer | |||
(provisional or final), and the media directions are | (provisional or final), (3) the media directions are | |||
compatible, and media is available to send, this will result | compatible, and (4) media is available to send, this will result | |||
in the starting of media transmission.</t> | in the starting of media transmission.</t> | |||
</section> | </section> | |||
<section title="currentLocalDescription" | <section anchor="sec.currentlocaldescription" numbered="true" toc="inclu | |||
anchor="sec.currentlocaldescription"> | de" removeInRFC="false" pn="section-4.1.13"> | |||
<name slugifiedName="name-currentlocaldescription">currentLocalDescrip | ||||
<t>The currentLocalDescription method returns the current | tion</name> | |||
negotiated local description - i.e., the local description | <t indent="0" pn="section-4.1.13-1">The currentLocalDescription method | |||
from the last successful offer/answer exchange - in addition | returns the current | |||
negotiated local description -- i.e., the local description | ||||
from the last successful offer/answer exchange -- in addition | ||||
to any local candidates that have been generated by the ICE | to any local candidates that have been generated by the ICE | |||
agent since the local description was set.</t> | agent since the local description was set.</t> | |||
<t indent="0" pn="section-4.1.13-2">A null object will be returned if | ||||
<t>A null object will be returned if an offer/answer exchange | an offer/answer exchange | |||
has not yet been completed.</t> | has not yet been completed.</t> | |||
</section> | </section> | |||
<section title="pendingLocalDescription" | <section anchor="sec.pendinglocaldescription" numbered="true" toc="inclu | |||
anchor="sec.pendinglocaldescription"> | de" removeInRFC="false" pn="section-4.1.14"> | |||
<name slugifiedName="name-pendinglocaldescription">pendingLocalDescrip | ||||
<t>The pendingLocalDescription method returns a copy of the | tion</name> | |||
local description currently in negotiation - i.e., a local | <t indent="0" pn="section-4.1.14-1">The pendingLocalDescription method | |||
offer set without any corresponding remote answer - in | returns a copy of the | |||
local description currently in negotiation -- i.e., a local | ||||
offer set without any corresponding remote answer -- in | ||||
addition to any local candidates that have been generated by | addition to any local candidates that have been generated by | |||
the ICE agent since the local description was set.</t> | the ICE agent since the local description was set.</t> | |||
<t indent="0" pn="section-4.1.14-2">A null object will be returned if | ||||
<t>A null object will be returned if the state of the | the state of the | |||
PeerConnection is "stable" or "have-remote-offer".</t> | PeerConnection is "stable" or "have-remote-offer".</t> | |||
</section> | </section> | |||
<section title="currentRemoteDescription" | <section anchor="sec.currentremotedescription" numbered="true" toc="incl | |||
anchor="sec.currentremotedescription"> | ude" removeInRFC="false" pn="section-4.1.15"> | |||
<name slugifiedName="name-currentremotedescription">currentRemoteDescr | ||||
<t>The currentRemoteDescription method returns a copy of the | iption</name> | |||
current negotiated remote description - i.e., the remote | <t indent="0" pn="section-4.1.15-1">The currentRemoteDescription metho | |||
description from the last successful offer/answer exchange - | d returns a copy of the | |||
current negotiated remote description -- i.e., the remote | ||||
description from the last successful offer/answer exchange -- | ||||
in addition to any remote candidates that have been supplied | in addition to any remote candidates that have been supplied | |||
via processIceMessage since the remote description was | via processIceMessage since the remote description was | |||
set.</t> | set.</t> | |||
<t indent="0" pn="section-4.1.15-2">A null object will be returned if | ||||
<t>A null object will be returned if an offer/answer exchange | an offer/answer exchange | |||
has not yet been completed.</t> | has not yet been completed.</t> | |||
</section> | </section> | |||
<section title="pendingRemoteDescription" | <section anchor="sec.pendingremotedescription" numbered="true" toc="incl | |||
anchor="sec.pendingremotedescription"> | ude" removeInRFC="false" pn="section-4.1.16"> | |||
<name slugifiedName="name-pendingremotedescription">pendingRemoteDescr | ||||
<t>The pendingRemoteDescription method returns a copy of the | iption</name> | |||
remote description currently in negotiation - i.e., a remote | <t indent="0" pn="section-4.1.16-1">The pendingRemoteDescription metho | |||
offer set without any corresponding local answer - in | d returns a copy of the | |||
remote description currently in negotiation -- i.e., a remote | ||||
offer set without any corresponding local answer -- in | ||||
addition to any remote candidates that have been supplied via | addition to any remote candidates that have been supplied via | |||
processIceMessage since the remote description was set.</t> | processIceMessage since the remote description was set.</t> | |||
<t indent="0" pn="section-4.1.16-2">A null object will be returned if | ||||
<t>A null object will be returned if the state of the | the state of the | |||
PeerConnection is "stable" or "have-local-offer".</t> | PeerConnection is "stable" or "have-local-offer".</t> | |||
</section> | </section> | |||
<section title="canTrickleIceCandidates" | <section anchor="sec.cantrickle" numbered="true" toc="include" removeInR | |||
anchor="sec.cantrickle"> | FC="false" pn="section-4.1.17"> | |||
<name slugifiedName="name-cantrickleicecandidates">canTrickleIceCandid | ||||
<t>The canTrickleIceCandidates property indicates whether the | ates</name> | |||
<t indent="0" pn="section-4.1.17-1">The canTrickleIceCandidates proper | ||||
ty indicates whether the | ||||
remote side supports receiving trickled candidates. There are | remote side supports receiving trickled candidates. There are | |||
three potential values: | three potential values: | |||
<list style="hanging"> | </t> | |||
<t hangText="null:">No SDP has been received from the other | <dl newline="false" spacing="normal" indent="3" pn="section-4.1.17-2"> | |||
<dt pn="section-4.1.17-2.1">null:</dt> | ||||
<dd pn="section-4.1.17-2.2">No SDP has been received from the other | ||||
side, so it is not known if it can handle trickle. This is | side, so it is not known if it can handle trickle. This is | |||
the initial value before setRemoteDescription() is | the initial value before setRemoteDescription is | |||
called.</t> | called.</dd> | |||
<t hangText="true:">SDP has been received from the other | <dt pn="section-4.1.17-2.3">true:</dt> | |||
side indicating that it can support trickle.</t> | <dd pn="section-4.1.17-2.4">SDP has been received from the other | |||
<t hangText="false:">SDP has been received from the other | side indicating that it can support trickle.</dd> | |||
side indicating that it cannot support trickle.</t> | <dt pn="section-4.1.17-2.5">false:</dt> | |||
</list></t> | <dd pn="section-4.1.17-2.6">SDP has been received from the other | |||
side indicating that it cannot support trickle.</dd> | ||||
<t>As described in | </dl> | |||
<xref target="sec.ice-candidate-trickling" />, JSEP | <t indent="0" pn="section-4.1.17-3">As described in | |||
<xref target="sec.ice-candidate-trickling" format="default" sectionFor | ||||
mat="of" derivedContent="Section 3.5.2"/>, JSEP | ||||
implementations always provide candidates to the application | implementations always provide candidates to the application | |||
individually, consistent with what is needed for Trickle ICE. | individually, consistent with what is needed for Trickle ICE. | |||
However, applications can use the canTrickleIceCandidates | However, applications can use the canTrickleIceCandidates | |||
property to determine whether their peer can actually do | property to determine whether their peer can actually do | |||
Trickle ICE, i.e., whether it is safe to send an initial | Trickle ICE, i.e., whether it is safe to send an initial | |||
offer or answer followed later by candidates as they are | offer or answer followed later by candidates as they are | |||
gathered. As "true" is the only value that definitively | gathered. As "true" is the only value that definitively | |||
indicates remote Trickle ICE support, an application which | indicates remote Trickle ICE support, an application that | |||
compares canTrickleIceCandidates against "true" will by | compares canTrickleIceCandidates against "true" will by | |||
default attempt Half Trickle on initial offers and Full | default attempt Half Trickle on initial offers and Full | |||
Trickle on subsequent interactions with a Trickle | Trickle on subsequent interactions with a Trickle | |||
ICE-compatible agent.</t> | ICE-compatible agent.</t> | |||
</section> | </section> | |||
<section title="setConfiguration" | <section anchor="sec.setconfiguration" numbered="true" toc="include" rem | |||
anchor="sec.setconfiguration"> | oveInRFC="false" pn="section-4.1.18"> | |||
<name slugifiedName="name-setconfiguration">setConfiguration</name> | ||||
<t>The setConfiguration method allows the global | <t indent="0" pn="section-4.1.18-1">The setConfiguration method allows | |||
the global | ||||
configuration of the PeerConnection, which was initially set | configuration of the PeerConnection, which was initially set | |||
by constructor parameters, to be changed during the session. | by constructor parameters, to be changed during the session. | |||
The effects of this method call depend on when it is invoked, | The effects of calling this method depend on when it is invoked, | |||
and differ depending on which specific parameters are | and they will differ, depending on which specific parameters are | |||
changed:</t> | changed: </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t> | -4.1.18-2"> | |||
<list style="symbols"> | <li pn="section-4.1.18-2.1">Any changes to the STUN/TURN servers to | |||
use affect the | ||||
<t>Any changes to the STUN/TURN servers to use affect the | ||||
next gathering phase. If an ICE gathering phase has | next gathering phase. If an ICE gathering phase has | |||
already started or completed, the 'needs-ice-restart' bit | already started or completed, the 'needs-ice-restart' bit | |||
mentioned in | mentioned in | |||
<xref target="sec.ice-gather-overview" /> will be set. | <xref target="sec.ice-gather-overview" format="default" sectionFor mat="of" derivedContent="Section 3.5.1"/> will be set. | |||
This will cause the next call to createOffer to generate | This will cause the next call to createOffer to generate | |||
new ICE credentials, for the purpose of forcing an ICE | new ICE credentials, for the purpose of forcing an ICE | |||
restart and kicking off a new gathering phase, in which | restart and kicking off a new gathering phase, in which | |||
the new servers will be used. If the ICE candidate pool | the new servers will be used. If the ICE candidate pool | |||
has a nonzero size, and a local description has not yet | has a nonzero size and a local description has not yet | |||
been applied, any existing candidates will be discarded, | been applied, any existing candidates will be discarded, | |||
and new candidates will be gathered from the new | and new candidates will be gathered from the new | |||
servers.</t> | servers.</li> | |||
<li pn="section-4.1.18-2.2">Any change to the ICE candidate policy a | ||||
<t>Any change to the ICE candidate policy affects the | ffects the | |||
next gathering phase. If an ICE gathering phase has | next gathering phase. If an ICE gathering phase has | |||
already started or completed, the 'needs-ice-restart' bit | already started or completed, the 'needs-ice-restart' bit | |||
will be set. Either way, changes to the policy have no | will be set. Either way, changes to the policy have no | |||
effect on the candidate pool, because pooled candidates | effect on the candidate pool, because pooled candidates | |||
are not made available to the application until a | are not made available to the application until a | |||
gathering phase occurs, and so any necessary filtering | gathering phase occurs, and so any necessary filtering | |||
can still be done on any pooled candidates.</t> | can still be done on any pooled candidates.</li> | |||
<li pn="section-4.1.18-2.3">The ICE candidate pool size <bcp14>MUST | ||||
<t>The ICE candidate pool size MUST NOT be changed after | NOT</bcp14> be changed after | |||
applying a local description. If a local description has | applying a local description. If a local description has | |||
not yet been applied, any changes to the ICE candidate | not yet been applied, any changes to the ICE candidate | |||
pool size take effect immediately; if increased, | pool size take effect immediately; if increased, | |||
additional candidates are pre-gathered; if decreased, the | additional candidates are pre-gathered; if decreased, the | |||
now-superfluous candidates are discarded.</t> | now-superfluous candidates are discarded.</li> | |||
<li pn="section-4.1.18-2.4">The bundle and RTCP-multiplexing policie | ||||
<t>The bundle and RTCP-multiplexing policies MUST NOT be | s <bcp14>MUST NOT</bcp14> be | |||
changed after the construction of the PeerConnection.</t> | changed after the construction of the PeerConnection.</li> | |||
</list> | </ul> | |||
</t> | <t indent="0" pn="section-4.1.18-3">Calling this method may result in | |||
a change to the state of the ICE | ||||
<t>This call may result in a change to the state of the ICE | agent.</t> | |||
Agent.</t> | ||||
</section> | </section> | |||
<section title="addIceCandidate" anchor="sec.addicecandidate"> | <section anchor="sec.addicecandidate" numbered="true" toc="include" remo | |||
veInRFC="false" pn="section-4.1.19"> | ||||
<t>The addIceCandidate method provides an update to the ICE | <name slugifiedName="name-addicecandidate">addIceCandidate</name> | |||
<t indent="0" pn="section-4.1.19-1">The addIceCandidate method provide | ||||
s an update to the ICE | ||||
agent via an IceCandidate object | agent via an IceCandidate object | |||
<xref target="sec.ice-candidate-format" />. If the | (<xref target="sec.ice-candidate-format" format="default" sectionForma | |||
IceCandidate's candidate field is filled in, the IceCandidate | t="of" derivedContent="Section 3.5.2.1"/>). If the | |||
IceCandidate's candidate field is non-null, the IceCandidate | ||||
is treated as a new remote ICE candidate, which will be added | is treated as a new remote ICE candidate, which will be added | |||
to the current and/or pending remote description according to | to the current and/or pending remote description according to | |||
the rules defined for Trickle ICE. Otherwise, the | the rules defined for Trickle ICE. Otherwise, the | |||
IceCandidate is treated as an end-of-candidates indication, | IceCandidate is treated as an end-of-candidates indication, | |||
as defined in | as defined in | |||
<xref target="I-D.ietf-ice-trickle" />.</t> | <xref target="RFC8838" sectionFormat="comma" section="14" format="defa | |||
ult" derivedLink="https://rfc-editor.org/rfc/rfc8838#section-14" derivedContent= | ||||
<t>In either case, the m= section index, MID, and ufrag | "RFC8838"/>.</t> | |||
<t indent="0" pn="section-4.1.19-2">In either case, the "m=" section i | ||||
ndex, MID, and ufrag | ||||
fields from the supplied IceCandidate are used to determine | fields from the supplied IceCandidate are used to determine | |||
which m= section and ICE candidate generation the | which "m=" section and ICE candidate generation the | |||
IceCandidate belongs to, as described in | IceCandidate belongs to, as described in | |||
<xref target="sec.ice-candidate-format" /> above. In the case | <xref target="sec.ice-candidate-format" format="default" sectionFormat | |||
of an end-of-candidates indication, the absence of both the | ="of" derivedContent="Section 3.5.2.1"/> above. In the case | |||
m= section index and MID fields is interpreted to mean that | of an end-of-candidates indication, null values for the | |||
the indication applies to all m= sections in the specified | "m=" section index and MID fields are interpreted to mean that | |||
ICE candidate generation. However, if both fields are absent | the indication applies to all "m=" sections in the specified | |||
for a new remote candidate, this MUST be treated as an | ICE candidate generation. However, if both fields are null | |||
for a new remote candidate, this <bcp14>MUST</bcp14> be treated as an | ||||
invalid condition, as specified below.</t> | invalid condition, as specified below.</t> | |||
<t indent="0" pn="section-4.1.19-3">If any IceCandidate fields contain | ||||
<t>If any IceCandidate fields contain invalid values, or an | invalid values or an | |||
error occurs during the processing of the IceCandidate | error occurs during the processing of the IceCandidate | |||
object, the supplied IceCandidate MUST be ignored and an | object, the supplied IceCandidate <bcp14>MUST</bcp14> be ignored and a | |||
error MUST be returned.</t> | n | |||
error <bcp14>MUST</bcp14> be returned.</t> | ||||
<t>Otherwise, the new remote candidate or end-of-candidates | <t indent="0" pn="section-4.1.19-4">Otherwise, the new remote candidat | |||
e or end-of-candidates | ||||
indication is supplied to the ICE agent. In the case of a new | indication is supplied to the ICE agent. In the case of a new | |||
remote candidate, connectivity checks will be sent to the new | remote candidate, connectivity checks will be sent to the new | |||
candidate.</t> | candidate, assuming setLocalDescription has already been | |||
called to initialize the ICE gathering process.</t> | ||||
</section> | ||||
<section anchor="sec.onicecandidate" numbered="true" toc="include" remov | ||||
eInRFC="false" pn="section-4.1.20"> | ||||
<name slugifiedName="name-onicecandidate-event">onicecandidate Event</ | ||||
name> | ||||
<t indent="0" pn="section-4.1.20-1">The onicecandidate event is dispat | ||||
ched to the application in two | ||||
situations: (1) when the ICE agent has discovered a new allowed local | ||||
ICE candidate during ICE gathering, as outlined in | ||||
<xref target="sec.ice-gather-overview" format="default" sectionFormat= | ||||
"of" derivedContent="Section 3.5.1"/> and | ||||
subject to the restrictions discussed in | ||||
<xref target="sec.ice-candidate-policy" format="default" sectionFormat | ||||
="of" derivedContent="Section 3.5.3"/>, or | ||||
(2) when an ICE gathering phase completes. The event contains a single | ||||
IceCandidate object, as defined in | ||||
<xref target="sec.ice-candidate-format" format="default" sectionFormat | ||||
="of" derivedContent="Section 3.5.2.1"/>.</t> | ||||
<t indent="0" pn="section-4.1.20-2">In the first case, the newly disco | ||||
vered candidate is reflected | ||||
in the IceCandidate object, and all of its fields <bcp14>MUST</bcp14> | ||||
be non-null. | ||||
This candidate will also be added to the current and/or pending local | ||||
description according to the rules defined for Trickle ICE.</t> | ||||
<t indent="0" pn="section-4.1.20-3">In the second case, the event's Ic | ||||
eCandidate object | ||||
<bcp14>MUST</bcp14> have its candidate field set to null to indicate | ||||
that the current gathering phase is complete, i.e., there will be no | ||||
further onicecandidate events in this phase. However, the | ||||
IceCandidate's ufrag field <bcp14>MUST</bcp14> be specified to | ||||
indicate which ICE candidate generation is ending. The IceCandidate's | ||||
"m=" section index and MID fields <bcp14>MAY</bcp14> be specified to i | ||||
ndicate that | ||||
the event applies to a specific "m=" section, or set to null to | ||||
indicate it applies to all "m=" sections in the current ICE candidate | ||||
generation. This event can be used by the application to generate an | ||||
end-of-candidates indication, as defined in | ||||
<xref target="RFC8838" sectionFormat="comma" section="13" format="defa | ||||
ult" derivedLink="https://rfc-editor.org/rfc/rfc8838#section-13" derivedContent= | ||||
"RFC8838"/>.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section title="RtpTransceiver" anchor="sec.transceiver"> | <section anchor="sec.transceiver" numbered="true" toc="include" removeInRF | |||
<section title="stop" anchor="sec.transceiver-stop"> | C="false" pn="section-4.2"> | |||
<name slugifiedName="name-rtptransceiver">RtpTransceiver</name> | ||||
<t>The stop method stops an RtpTransceiver. This will cause | <section anchor="sec.transceiver-stop" numbered="true" toc="include" rem | |||
oveInRFC="false" pn="section-4.2.1"> | ||||
<name slugifiedName="name-stop">stop</name> | ||||
<t indent="0" pn="section-4.2.1-1">The stop method stops an RtpTransce | ||||
iver. This will cause | ||||
future calls to createOffer to generate a zero port for the | future calls to createOffer to generate a zero port for the | |||
associated m= section. See below for more details.</t> | associated "m=" section. See below for more details.</t> | |||
</section> | </section> | |||
<section title="stopped" anchor="sec.transceiver-stopped"> | <section anchor="sec.transceiver-stopped" numbered="true" toc="include" | |||
removeInRFC="false" pn="section-4.2.2"> | ||||
<t>The stopped property indicates whether the transceiver has | <name slugifiedName="name-stopped">stopped</name> | |||
been stopped, either by a call to stopTransceiver or by | <t indent="0" pn="section-4.2.2-1">The stopped property indicates whet | |||
applying an answer that rejects the associated m= section. In | her the transceiver has | |||
either of these cases, it is set to "true", and otherwise | been stopped, either by a call to stop or by | |||
applying an answer that rejects the associated "m=" section. In | ||||
either of these cases, it is set to "true" and otherwise | ||||
will be set to "false".</t> | will be set to "false".</t> | |||
<t indent="0" pn="section-4.2.2-2">A stopped RtpTransceiver does not s | ||||
<t>A stopped RtpTransceiver does not send any outgoing RTP or | end any outgoing RTP or | |||
RTCP or process any incoming RTP or RTCP. It cannot be | RTCP or process any incoming RTP or RTCP. It cannot be | |||
restarted.</t> | restarted.</t> | |||
</section> | </section> | |||
<section title="setDirection" | <section anchor="sec.transceiver-set-direction" numbered="true" toc="inc | |||
anchor="sec.transceiver-set-direction"> | lude" removeInRFC="false" pn="section-4.2.3"> | |||
<name slugifiedName="name-setdirection">setDirection</name> | ||||
<t>The setDirection method sets the direction of a | <t indent="0" pn="section-4.2.3-1">The setDirection method sets the di | |||
rection of a | ||||
transceiver, which affects the direction property of the | transceiver, which affects the direction property of the | |||
associated m= section on future calls to createOffer and | associated "m=" section on future calls to createOffer and | |||
createAnswer. The permitted values for direction are | createAnswer. The permitted values for direction are | |||
"recvonly", "sendrecv", "sendonly", and "inactive", mirroring | "recvonly", "sendrecv", "sendonly", and "inactive", mirroring | |||
the identically-named directional attributes defined in | the identically named direction attributes defined in | |||
<xref target="RFC4566"></xref>, Section 6.</t> | <xref target="RFC4566" sectionFormat="comma" section="6" format="defau | |||
lt" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent="R | ||||
<t>When creating offers, the transceiver direction is | FC4566"/>.</t> | |||
<t indent="0" pn="section-4.2.3-2">When creating offers, the transceiv | ||||
er direction is | ||||
directly reflected in the output, even for re-offers. When | directly reflected in the output, even for re-offers. When | |||
creating answers, the transceiver direction is intersected | creating answers, the transceiver direction is intersected | |||
with the offered direction, as explained in | with the offered direction, as explained in | |||
<xref target="sec.generating-an-answer" /> below.</t> | <xref target="sec.generating-an-answer" format="default" sectionFormat | |||
="of" derivedContent="Section 5.3"/> below.</t> | ||||
<t>Note that while setDirection sets the direction property | <t indent="0" pn="section-4.2.3-3">Note that while setDirection sets t | |||
of the transceiver immediately ( | he direction property | |||
<xref target="sec.transceiver-direction" />), this property | of the transceiver immediately (<xref target="sec.transceiver-directio | |||
n" format="default" sectionFormat="of" derivedContent="Section 4.2.4"/>), this p | ||||
roperty | ||||
does not immediately affect whether the transceiver's | does not immediately affect whether the transceiver's | |||
RtpSender will send or its RtpReceiver will receive. The | RtpSender will send or its RtpReceiver will receive. The | |||
direction in effect is represented by the currentDirection | direction in effect is represented by the currentDirection | |||
property, which is only updated when an answer is | property, which is only updated when an answer is | |||
applied.</t> | applied.</t> | |||
</section> | </section> | |||
<section title="direction" anchor="sec.transceiver-direction"> | <section anchor="sec.transceiver-direction" numbered="true" toc="include | |||
" removeInRFC="false" pn="section-4.2.4"> | ||||
<t>The direction property indicates the last value passed | <name slugifiedName="name-direction">direction</name> | |||
<t indent="0" pn="section-4.2.4-1">The direction property indicates th | ||||
e last value passed | ||||
into setDirection. If setDirection has never been called, it | into setDirection. If setDirection has never been called, it | |||
is set to the direction the transceiver was initialized | is set to the direction the transceiver was initialized | |||
with.</t> | with.</t> | |||
</section> | </section> | |||
<section title="currentDirection" | <section anchor="sec.transceiver-current-direction" numbered="true" toc= | |||
anchor="sec.transceiver-current-direction"> | "include" removeInRFC="false" pn="section-4.2.5"> | |||
<name slugifiedName="name-currentdirection">currentDirection</name> | ||||
<t>The currentDirection property indicates the last | <t indent="0" pn="section-4.2.5-1">The currentDirection property indic | |||
negotiated direction for the transceiver's associated m= | ates the last | |||
negotiated direction for the transceiver's associated "m=" | ||||
section. More specifically, it indicates the | section. More specifically, it indicates the | |||
<xref target="RFC3264"></xref> directional attribute of the | direction attribute <xref target="RFC3264" format="default" sectionFor | |||
associated m= section in the last applied answer (including | mat="of" derivedContent="RFC3264"/> of the | |||
associated "m=" section in the last applied answer (including | ||||
provisional answers), with "send" and "recv" directions | provisional answers), with "send" and "recv" directions | |||
reversed if it was a remote answer. For example, if the | reversed if it was a remote answer. For example, if the | |||
directional attribute for the associated m= section in a | direction attribute for the associated "m=" section in a | |||
remote answer is "recvonly", currentDirection is set to | remote answer is "recvonly", currentDirection is set to | |||
"sendonly".</t> | "sendonly".</t> | |||
<t indent="0" pn="section-4.2.5-2">If an answer that references this t | ||||
<t>If an answer that references this transceiver has not yet | ransceiver has not yet | |||
been applied, or if the transceiver is stopped, | been applied or if the transceiver is stopped, | |||
currentDirection is set to null.</t> | currentDirection is set to "null".</t> | |||
</section> | </section> | |||
<section title="setCodecPreferences" | <section anchor="sec.transceiver-set-codec-preferences" numbered="true" | |||
anchor="sec.transceiver-set-codec-preferences"> | toc="include" removeInRFC="false" pn="section-4.2.6"> | |||
<name slugifiedName="name-setcodecpreferences">setCodecPreferences</na | ||||
<t>The setCodecPreferences method sets the codec preferences | me> | |||
<t indent="0" pn="section-4.2.6-1">The setCodecPreferences method sets | ||||
the codec preferences | ||||
of a transceiver, which in turn affect the presence and order | of a transceiver, which in turn affect the presence and order | |||
of codecs of the associated m= section on future calls to | of codecs of the associated "m=" section on future calls to | |||
createOffer and createAnswer. Note that setCodecPreferences | createOffer and createAnswer. Note that setCodecPreferences | |||
does not directly affect which codec the implementation | does not directly affect which codec the implementation | |||
decides to send. It only affects which codecs the | decides to send. It only affects which codecs the | |||
implementation indicates that it prefers to receive, via the | implementation indicates that it prefers to receive, via the | |||
offer or answer. Even when a codec is excluded by | offer or answer. Even when a codec is excluded by | |||
setCodecPreferences, it still may be used to send until the | setCodecPreferences, it still may be used to send until the | |||
next offer/answer exchange discards it.</t> | next offer/answer exchange discards it.</t> | |||
<t indent="0" pn="section-4.2.6-2">The codec preferences of an RtpTran | ||||
<t>The codec preferences of an RtpTransceiver can cause | sceiver can cause | |||
codecs to be excluded by subsequent calls to createOffer and | codecs to be excluded by subsequent calls to createOffer and | |||
createAnswer, in which case the corresponding media formats | createAnswer, in which case the corresponding media formats | |||
in the associated m= section will be excluded. The codec | in the associated "m=" section will be excluded. The codec | |||
preferences cannot add media formats that would otherwise not | preferences cannot add media formats that would otherwise not | |||
be present.</t> | be present.</t> | |||
<t indent="0" pn="section-4.2.6-3">The codec preferences of an RtpTran | ||||
<t>The codec preferences of an RtpTransceiver can also | sceiver can also | |||
determine the order of codecs in subsequent calls to | determine the order of codecs in subsequent calls to | |||
createOffer and createAnswer, in which case the order of the | createOffer and createAnswer, in which case the order of the | |||
media formats in the associated m= section will follow the | media formats in the associated "m=" section will follow the | |||
specified preferences.</t> | specified preferences.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="SDP Interaction Procedures" | <section anchor="sec.sdp-interaction-procedure" numbered="true" toc="include | |||
anchor="sec.sdp-interaction-procedure"> | " removeInRFC="false" pn="section-5"> | |||
<name slugifiedName="name-sdp-interaction-procedures">SDP Interaction Proc | ||||
<t>This section describes the specific procedures to be followed | edures</name> | |||
<t indent="0" pn="section-5-1">This section describes the specific procedu | ||||
res to be followed | ||||
when creating and parsing SDP objects.</t> | when creating and parsing SDP objects.</t> | |||
<section title="Requirements Overview" | <section anchor="sec.requirements-overview" numbered="true" toc="include" | |||
anchor="sec.requirements-overview"> | removeInRFC="false" pn="section-5.1"> | |||
<name slugifiedName="name-requirements-overview">Requirements Overview</ | ||||
<t>JSEP implementations must comply with the specifications | name> | |||
<t indent="0" pn="section-5.1-1">JSEP implementations <bcp14>MUST</bcp14 | ||||
> comply with the specifications | ||||
listed below that govern the creation and processing of offers | listed below that govern the creation and processing of offers | |||
and answers.</t> | and answers.</t> | |||
<section title="Usage Requirements" | <section anchor="sec.usage-requirements" numbered="true" toc="include" r | |||
anchor="sec.usage-requirements"> | emoveInRFC="false" pn="section-5.1.1"> | |||
<name slugifiedName="name-usage-requirements">Usage Requirements</name | ||||
<t>All session descriptions handled by JSEP implementations, | > | |||
both local and remote, MUST indicate support for the | <t indent="0" pn="section-5.1.1-1">All session descriptions handled by | |||
JSEP implementations, | ||||
both local and remote, <bcp14>MUST</bcp14> indicate support for the | ||||
following specifications. If any of these are absent, this | following specifications. If any of these are absent, this | |||
omission MUST be treated as an error. | omission <bcp14>MUST</bcp14> be treated as an error. | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>ICE, as specified in | -5.1.1-2"> | |||
<xref target="RFC8445"></xref>, MUST be used. Note that the | <li pn="section-5.1.1-2.1">ICE, as specified in | |||
remote endpoint may use a Lite implementation; | <xref target="RFC8445" format="default" sectionFormat="of" derivedCo | |||
implementations MUST properly handle remote endpoints which | ntent="RFC8445"/>, <bcp14>MUST</bcp14> be used. Note that the | |||
do ICE-Lite.</t> | remote endpoint may use a lite implementation; | |||
implementations <bcp14>MUST</bcp14> properly handle remote endpoints | ||||
<t>DTLS | that | |||
<xref target="RFC6347" /> or DTLS-SRTP | use ICE-lite. The remote endpoint may also use | |||
<xref target="RFC5763"></xref>, MUST be used, as | an older version of ICE; implementations <bcp14>MUST</bcp14> properly handle rem | |||
ote endpoints that use ICE | ||||
as specified in <xref target="RFC5245" format="default" sectionFormat="of" deriv | ||||
edContent="RFC5245"/>.</li> | ||||
<li pn="section-5.1.1-2.2">DTLS | ||||
<xref target="RFC6347" format="default" sectionFormat="of" derivedCo | ||||
ntent="RFC6347"/> or DTLS-SRTP | ||||
<xref target="RFC5763" format="default" sectionFormat="of" derivedCo | ||||
ntent="RFC5763"/> <bcp14>MUST</bcp14> be used, as | ||||
appropriate for the media type, as specified in | appropriate for the media type, as specified in | |||
<xref target="I-D.ietf-rtcweb-security-arch" /></t> | <xref target="RFC8827" format="default" sectionFormat="of" derivedCo | |||
</list></t> | ntent="RFC8827"/>.</li> | |||
</ul> | ||||
<t>The SDES SRTP keying mechanism from | <t indent="0" pn="section-5.1.1-3">The SDP security descriptions mecha | |||
<xref target="RFC4568" /> MUST NOT be used, as discussed in | nism for SRTP keying | |||
<xref target="I-D.ietf-rtcweb-security-arch" />.</t> | <xref target="RFC4568" format="default" sectionFormat="of" derivedCont | |||
ent="RFC4568"/> <bcp14>MUST NOT</bcp14> be used, as discussed in | ||||
<xref target="RFC8827" format="default" sectionFormat="of" derivedCont | ||||
ent="RFC8827"/>.</t> | ||||
</section> | </section> | |||
<section title="Profile Names and Interoperability" | <section anchor="sec.profile-names" numbered="true" toc="include" remove | |||
anchor="sec.profile-names"> | InRFC="false" pn="section-5.1.2"> | |||
<name slugifiedName="name-profile-names-and-interoper">Profile Names a | ||||
<t>For media m= sections, JSEP implementations MUST support | nd Interoperability</name> | |||
<t indent="0" pn="section-5.1.2-1">For media "m=" sections, JSEP imple | ||||
mentations <bcp14>MUST</bcp14> support | ||||
the "UDP/TLS/RTP/SAVPF" profile specified in | the "UDP/TLS/RTP/SAVPF" profile specified in | |||
<xref target="RFC5764"></xref> as well as the "TCP/DTLS/RTP/SAVPF" | <xref target="RFC5764" format="default" sectionFormat="of" derivedCont | |||
profile specified in <xref target="RFC7850"></xref>, and MUST indicate | ent="RFC5764"/> as well as the "TCP/DTLS/RTP/SAVPF" | |||
one of these profiles for each media m= line they produce in an offer. | profile specified in <xref target="RFC7850" format="default" sectionFo | |||
For data m= sections, implementations MUST support the | rmat="of" derivedContent="RFC7850"/> and <bcp14>MUST</bcp14> indicate | |||
"UDP/DTLS/SCTP" profile as well as the "TCP/DTLS/SCTP" profile, and | one of these profiles for each media "m=" line they produce in an offe | |||
MUST indicate one of these profiles for each data m= line they produce | r. | |||
For data "m=" sections, implementations <bcp14>MUST</bcp14> support th | ||||
e | ||||
"UDP/DTLS/SCTP" profile as well as the "TCP/DTLS/SCTP" profile and | ||||
<bcp14>MUST</bcp14> indicate one of these profiles for each data "m=" | ||||
line they produce | ||||
in an offer. The exact profile to use is determined by the protocol | in an offer. The exact profile to use is determined by the protocol | |||
associated with the current default or selected ICE candidate, as | associated with the current default or selected ICE candidate, as | |||
described in | described in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp"></xref>, Section 3.2.1.2. | <xref target="RFC8839" sectionFormat="comma" section="4.2.1.2" format= | |||
</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-4.2.1.2" deriv | |||
edContent="RFC8839"/>.</t> | ||||
<t>Unfortunately, in an attempt at compatibility, some | <t indent="0" pn="section-5.1.2-2">Unfortunately, in an attempt at com | |||
patibility, some | ||||
endpoints generate other profile strings even when they mean | endpoints generate other profile strings even when they mean | |||
to support one of these profiles. For instance, an endpoint | to support one of these profiles. For instance, an endpoint | |||
might generate "RTP/AVP" but supply "a=fingerprint" and | might generate "RTP/AVP" but supply "a=fingerprint" and | |||
"a=rtcp-fb" attributes, indicating its willingness to support | "a=rtcp-fb" attributes, indicating its willingness to support | |||
"UDP/TLS/RTP/SAVPF" or "TCP/DTLS/RTP/SAVPF". In order to | "UDP/TLS/RTP/SAVPF" or "TCP/DTLS/RTP/SAVPF". In order to | |||
simplify compatibility with such endpoints, JSEP | simplify compatibility with such endpoints, JSEP | |||
implementations MUST follow the following rules when | implementations <bcp14>MUST</bcp14> follow the following rules when | |||
processing the media m= sections in a received offer:</t> | processing the media "m=" sections in a received offer:</t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t> | -5.1.2-3"> | |||
<list style="symbols"> | <li pn="section-5.1.2-3.1"> | |||
<t indent="0" pn="section-5.1.2-3.1.1">Any profile in the offer ma | ||||
<t>Any profile in the offer matching one of the following | tching one of the following | |||
MUST be accepted: | <bcp14>MUST</bcp14> be accepted: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="sec | ||||
<t>"RTP/AVP" (Defined in | tion-5.1.2-3.1.2"> | |||
<xref target="RFC4566"></xref>, Section 8.2.2)</t> | <li pn="section-5.1.2-3.1.2.1">"RTP/AVP" (defined in | |||
<xref target="RFC4566" sectionFormat="comma" section="8.2.2" for | ||||
<t>"RTP/AVPF" (Defined in | mat="default" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-8.2.2" der | |||
<xref target="RFC4585"></xref>, Section 9)</t> | ivedContent="RFC4566"/>)</li> | |||
<li pn="section-5.1.2-3.1.2.2">"RTP/AVPF" (defined in | ||||
<t>"RTP/SAVP" (Defined in | <xref target="RFC4585" sectionFormat="comma" section="9" format= | |||
<xref target="RFC3711"></xref>, Section 12)</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc4585#section-9" derivedCont | |||
ent="RFC4585"/>)</li> | ||||
<t>"RTP/SAVPF" (Defined in | <li pn="section-5.1.2-3.1.2.3">"RTP/SAVP" (defined in | |||
<xref target="RFC5124"></xref>, Section 6)</t> | <xref target="RFC3711" sectionFormat="comma" section="12" format | |||
="default" derivedLink="https://rfc-editor.org/rfc/rfc3711#section-12" derivedCo | ||||
<t>"TCP/DTLS/RTP/SAVP" (Defined in | ntent="RFC3711"/>)</li> | |||
<xref target="RFC7850"></xref>, Section 3.4)</t> | <li pn="section-5.1.2-3.1.2.4">"RTP/SAVPF" (defined in | |||
<xref target="RFC5124" sectionFormat="comma" section="6" format= | ||||
<t>"TCP/DTLS/RTP/SAVPF" (Defined in | "default" derivedLink="https://rfc-editor.org/rfc/rfc5124#section-6" derivedCont | |||
<xref target="RFC7850"></xref>, Section 3.5)</t> | ent="RFC5124"/>)</li> | |||
<li pn="section-5.1.2-3.1.2.5">"TCP/DTLS/RTP/SAVP" (defined in | ||||
<t>"UDP/TLS/RTP/SAVP" (Defined in | <xref target="RFC7850" sectionFormat="comma" section="3.4" forma | |||
<xref target="RFC5764"></xref>, Section 9)</t> | t="default" derivedLink="https://rfc-editor.org/rfc/rfc7850#section-3.4" derived | |||
Content="RFC7850"/>)</li> | ||||
<t>"UDP/TLS/RTP/SAVPF" (Defined in | <li pn="section-5.1.2-3.1.2.6">"TCP/DTLS/RTP/SAVPF" (defined in | |||
<xref target="RFC5764"></xref>, Section 9)</t> | <xref target="RFC7850" sectionFormat="comma" section="3.5" forma | |||
</list></t> | t="default" derivedLink="https://rfc-editor.org/rfc/rfc7850#section-3.5" derived | |||
Content="RFC7850"/>)</li> | ||||
<t>The profile in any "m=" line in any generated answer | <li pn="section-5.1.2-3.1.2.7">"UDP/TLS/RTP/SAVP" (defined in | |||
MUST exactly match the profile provided in the offer.</t> | <xref target="RFC5764" sectionFormat="comma" section="9" format= | |||
"default" derivedLink="https://rfc-editor.org/rfc/rfc5764#section-9" derivedCont | ||||
<t>Because DTLS-SRTP is REQUIRED, the choice of SAVP or | ent="RFC5764"/>)</li> | |||
<li pn="section-5.1.2-3.1.2.8">"UDP/TLS/RTP/SAVPF" (defined in | ||||
<xref target="RFC5764" sectionFormat="comma" section="9" format= | ||||
"default" derivedLink="https://rfc-editor.org/rfc/rfc5764#section-9" derivedCont | ||||
ent="RFC5764"/>)</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-5.1.2-3.2">The profile in any "m=" line in any gener | ||||
ated answer | ||||
<bcp14>MUST</bcp14> exactly match the profile provided in the offe | ||||
r.</li> | ||||
<li pn="section-5.1.2-3.3">Because DTLS-SRTP is <bcp14>REQUIRED</bcp | ||||
14>, the choice of SAVP or | ||||
AVP has no effect; support for DTLS-SRTP is determined by | AVP has no effect; support for DTLS-SRTP is determined by | |||
the presence of one or more "a=fingerprint" attribute. | the presence of one or more "a=fingerprint" attributes. | |||
Note that lack of an "a=fingerprint" attribute will lead | Note that lack of an "a=fingerprint" attribute will lead | |||
to negotiation failure.</t> | to negotiation failure.</li> | |||
<li pn="section-5.1.2-3.4">The use of AVPF or AVP simply controls th | ||||
<t>The use of AVPF or AVP simply controls the timing | e timing | |||
rules used for RTCP feedback. If AVPF is provided, or an | rules used for RTCP feedback. If AVPF is provided or an | |||
"a=rtcp-fb" attribute is present, assume AVPF timing, | "a=rtcp-fb" attribute is present, assume AVPF timing, | |||
i.e., a default value of "trr-int=0". Otherwise, assume | i.e., a default value of "trr-int=0". Otherwise, assume | |||
that AVPF is being used in an AVP compatible mode and use | that AVPF is being used in an AVP-compatible mode and use | |||
a value of "trr-int=4000".</t> | a value of "trr-int=4000".</li> | |||
<li pn="section-5.1.2-3.5">For data "m=" sections, implementations < | ||||
<t>For data m= sections, implementations MUST support | bcp14>MUST</bcp14> support | |||
receiving the "UDP/DTLS/SCTP", "TCP/DTLS/SCTP", or | receiving the "UDP/DTLS/SCTP", "TCP/DTLS/SCTP", or | |||
"DTLS/SCTP" (for backwards compatibility) profiles.</t> | "DTLS/SCTP" (for backwards compatibility) profiles.</li> | |||
</list> | </ul> | |||
</t> | <t indent="0" pn="section-5.1.2-4">Note that re-offers by JSEP impleme | |||
ntations <bcp14>MUST</bcp14> use the | ||||
<t>Note that re-offers by JSEP implementations MUST use the | ||||
correct profile strings even if the initial offer/answer | correct profile strings even if the initial offer/answer | |||
exchange used an (incorrect) older profile string. This | exchange used an (incorrect) older profile string. This | |||
simplifies JSEP behavior, with minimal downside, as any | simplifies JSEP behavior, with minimal downside, as any | |||
remote endpoint that fails to handle such a re-offer will | remote endpoint that fails to handle such a re-offer will | |||
also fail to handle a JSEP endpoint's initial offer.</t> | also fail to handle a JSEP endpoint's initial offer.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec-create-offer" title="Constructing an Offer"> | <section anchor="sec-create-offer" numbered="true" toc="include" removeInR | |||
FC="false" pn="section-5.2"> | ||||
<t>When createOffer is called, a new SDP description must be | <name slugifiedName="name-constructing-an-offer">Constructing an Offer</ | |||
name> | ||||
<t indent="0" pn="section-5.2-1">When createOffer is called, a new SDP d | ||||
escription <bcp14>MUST</bcp14> be | ||||
created that includes the functionality specified in | created that includes the functionality specified in | |||
<xref target="I-D.ietf-rtcweb-rtp-usage"></xref>. The exact | <xref target="RFC8834" format="default" sectionFormat="of" derivedConten t="RFC8834"/>. The exact | |||
details of this process are explained below.</t> | details of this process are explained below.</t> | |||
<section title="Initial Offers" anchor="sec.initial-offers"> | <section anchor="sec.initial-offers" numbered="true" toc="include" remov | |||
eInRFC="false" pn="section-5.2.1"> | ||||
<t>When createOffer is called for the first time, the result | <name slugifiedName="name-initial-offers">Initial Offers</name> | |||
<t indent="0" pn="section-5.2.1-1">When createOffer is called for the | ||||
first time, the result | ||||
is known as the initial offer.</t> | is known as the initial offer.</t> | |||
<t indent="0" pn="section-5.2.1-2">The first step in generating an ini | ||||
<t>The first step in generating an initial offer is to | tial offer is to | |||
generate session-level attributes, as specified in | generate session-level attributes, as specified in | |||
<xref target="RFC4566"></xref>, Section 5. Specifically: | <xref target="RFC4566" sectionFormat="comma" section="5" format="defau | |||
<list style="symbols"> | lt" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5" derivedContent="R | |||
FC4566"/>. Specifically: | ||||
<t>The first SDP line MUST be "v=0", as specified in | </t> | |||
<xref target="RFC4566"></xref>, Section 5.1</t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section | |||
-5.2.1-3"> | ||||
<t>The second SDP line MUST be an "o=" line, as specified | <li pn="section-5.2.1-3.1">The first SDP line <bcp14>MUST</bcp14> be | |||
"v=0" as defined in | ||||
<xref target="RFC4566" sectionFormat="comma" section="5.1" format="d | ||||
efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.1" derivedCont | ||||
ent="RFC4566"/>.</li> | ||||
<li pn="section-5.2.1-3.2">The second SDP line <bcp14>MUST</bcp14> b | ||||
e an "o=" line as defined | ||||
in | in | |||
<xref target="RFC4566"></xref>, Section 5.2. The value of | <xref target="RFC4566" sectionFormat="comma" section="5.2" format="d | |||
the <username> field SHOULD be "-". The sess-id MUST | efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.2" derivedCont | |||
ent="RFC4566"/>. | ||||
The value of | ||||
the <username> field <bcp14>SHOULD</bcp14> be "-". The <ses | ||||
s-id> <bcp14>MUST</bcp14> | ||||
be representable by a 64-bit signed integer, and the | be representable by a 64-bit signed integer, and the | |||
value MUST be less than (2**63)-1. It is RECOMMENDED that the | value <bcp14>MUST</bcp14> be less than | |||
sess-id be constructed by generating a 64-bit quantity with | 2<sup>63</sup>-1. | |||
It is <bcp14>RECOMMENDED</bcp14> that the | ||||
<sess-id> be constructed by generating a 64-bit quantity with | ||||
the highest bit set to zero and the remaining 63 | the highest bit set to zero and the remaining 63 | |||
bits being cryptographically random. The value of the | bits being cryptographically random. The value of the | |||
<nettype> <addrtype> <unicast-address> | <nettype> <addrtype> <unicast-address> | |||
tuple SHOULD be set to a non-meaningful address, such as IN | tuple <bcp14>SHOULD</bcp14> be set to a non-meaningful address, such as IN | |||
IP4 0.0.0.0, to prevent leaking a local IP address in this | IP4 0.0.0.0, to prevent leaking a local IP address in this | |||
field; this problem is discussed in | field; this problem is discussed in | |||
<xref target="I-D.ietf-rtcweb-ip-handling" />. As mentioned in | <xref target="RFC8828" format="default" sectionFormat="of" derivedCo | |||
<xref target="RFC4566"></xref>, the entire o= line needs to | ntent="RFC8828"/>. As mentioned in | |||
<xref target="RFC4566" format="default" sectionFormat="of" derivedCo | ||||
ntent="RFC4566"/>, the entire "o=" line needs to | ||||
be unique, but selecting a random number for | be unique, but selecting a random number for | |||
<sess-id> is sufficient to accomplish this.</t> | <sess-id> is sufficient to accomplish this.</li> | |||
<li pn="section-5.2.1-3.3">The third SDP line <bcp14>MUST</bcp14> be | ||||
<t>The third SDP line MUST be a "s=" line, as specified in | a "s=" line as defined in | |||
<xref target="RFC4566"></xref>, Section 5.3; to match the | <xref target="RFC4566" sectionFormat="comma" section="5.3" format="d | |||
"o=" line, a single dash SHOULD be used as the session | efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.3" derivedCont | |||
name, e.g. "s=-". Note that this differs from the advice in | ent="RFC4566"/>; to match the | |||
"o=" line, a single dash <bcp14>SHOULD</bcp14> be used as the sessio | ||||
n | ||||
name, e.g., "s=-". Note that this differs from the advice in | ||||
<xref target="RFC4566" /> which proposes a single space, but | <xref target="RFC4566" format="default" sectionFormat="of" derivedCo ntent="RFC4566"/>, which proposes a single space, but | |||
as both "o=" and "s=" are meaningless in JSEP, having the | as both "o=" and "s=" are meaningless in JSEP, having the | |||
same meaningless value seems clearer.</t> | same meaningless value seems clearer.</li> | |||
<li pn="section-5.2.1-3.4">Session Information ("i="), URI ("u="), E | ||||
<t>Session Information ("i="), URI ("u="), Email Address | mail Address | |||
("e="), Phone Number ("p="), Repeat Times ("r="), and Time | ("e="), Phone Number ("p="), Repeat Times ("r="), and Time | |||
Zones ("z=") lines are not useful in this context and | Zones ("z=") lines are not useful in this context and | |||
SHOULD NOT be included.</t> | <bcp14>SHOULD NOT</bcp14> be included.</li> | |||
<li pn="section-5.2.1-3.5">Encryption Keys ("k=") lines do not provi | ||||
<t>Encryption Keys ("k=") lines do not provide sufficient | de sufficient | |||
security and MUST NOT be included.</t> | security and <bcp14>MUST NOT</bcp14> be included.</li> | |||
<li pn="section-5.2.1-3.6">A "t=" line <bcp14>MUST</bcp14> be added, | ||||
<t>A "t=" line MUST be added, as specified in | as specified in | |||
<xref target="RFC4566"></xref>, Section 5.9; both | <xref target="RFC4566" sectionFormat="comma" section="5.9" format="d | |||
<start-time> and <stop-time> SHOULD be set to | efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.9" derivedCont | |||
zero, e.g. "t=0 0".</t> | ent="RFC4566"/>; both | |||
<start-time> and <stop-time> <bcp14>SHOULD</bcp14> be se | ||||
<t>An "a=ice-options" line with the "trickle" and "ice2" | t to | |||
options MUST be added, as specified in <xref | zero, e.g., "t=0 0".</li> | |||
target="I-D.ietf-ice-trickle"></xref>, Section 3 and | <li pn="section-5.2.1-3.7">An "a=ice-options" line with the "trickle | |||
<xref target="RFC8445"></xref>, Section 10.</t> | " and "ice2" | |||
options <bcp14>MUST</bcp14> be added, as specified in <xref target=" | ||||
<t>If WebRTC identity is being used, an "a=identity" line | RFC8840" sectionFormat="comma" section="4.1.1" format="default" derivedLink="htt | |||
as described in | ps://rfc-editor.org/rfc/rfc8840#section-4.1.1" derivedContent="RFC8840"/> and | |||
<xref target="I-D.ietf-rtcweb-security-arch" />, Section | <xref target="RFC8445" sectionFormat="comma" section="10" format="de | |||
5.</t> | fault" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-10" derivedConten | |||
</list></t> | t="RFC8445"/>. | |||
</li> | ||||
<t>The next step is to generate m= sections, as specified in | <li pn="section-5.2.1-3.8">If WebRTC identity is being used, an "a=i | |||
<xref target="RFC4566" />, Section 5.14. An m= section is | dentity" line | |||
<bcp14>MUST</bcp14> be added, as described in | ||||
<xref target="RFC8827" sectionFormat="comma" section="5" format="def | ||||
ault" derivedLink="https://rfc-editor.org/rfc/rfc8827#section-5" derivedContent= | ||||
"RFC8827"/>.</li> | ||||
</ul> | ||||
<t indent="0" pn="section-5.2.1-4">The next step is to generate "m=" s | ||||
ections, as specified in | ||||
<xref target="RFC4566" sectionFormat="comma" section="5.14" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.14" derivedCont | ||||
ent="RFC4566"/>. An "m=" section is | ||||
generated for each RtpTransceiver that has been added to the | generated for each RtpTransceiver that has been added to the | |||
PeerConnection, excluding any stopped RtpTransceivers; this | PeerConnection, excluding any stopped RtpTransceivers; this | |||
is done in the order the RtpTransceivers were added to the | is done in the order the RtpTransceivers were added to the | |||
PeerConnection. If there are no such RtpTransceivers, no m= | PeerConnection. If there are no such RtpTransceivers, no "m=" | |||
sections are generated; more can be added later, as discussed | sections are generated; more can be added later, as discussed | |||
in | in | |||
<xref target="RFC3264" />, Section 5.</t> | <xref target="RFC3264" sectionFormat="comma" section="5" format="defau | |||
lt" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-5" derivedContent="R | ||||
<t>For each m= section generated for an RtpTransceiver, | FC3264"/>.</t> | |||
<t indent="0" pn="section-5.2.1-5">For each "m=" section generated for | ||||
an RtpTransceiver, | ||||
establish a mapping between the transceiver and the index of | establish a mapping between the transceiver and the index of | |||
the generated m= section.</t> | the generated "m=" section.</t> | |||
<t indent="0" pn="section-5.2.1-6">Each "m=" section, provided it is n | ||||
<t>Each m= section, provided it is not marked as bundle-only, | ot marked as bundle-only, | |||
MUST generate a unique set of ICE credentials and gather its | <bcp14>MUST</bcp14> contain a unique set of ICE credentials and | |||
own unique set of ICE candidates. Bundle-only m= sections | a unique set of ICE candidates. Bundle-only "m=" sections | |||
MUST NOT contain any ICE credentials and MUST NOT gather any | <bcp14>MUST NOT</bcp14> contain any ICE credentials and <bcp14>MUST NO | |||
T</bcp14> gather any | ||||
candidates.</t> | candidates.</t> | |||
<t indent="0" pn="section-5.2.1-7">For DTLS, all "m=" sections <bcp14> | ||||
<t>For DTLS, all m= sections MUST use all the certificate(s) | MUST</bcp14> use any and all certificates | |||
that have been specified for the PeerConnection; as a result, | that have been specified for the PeerConnection; as a result, | |||
they MUST all have the same | they <bcp14>MUST</bcp14> all have the same fingerprint value or values | |||
<xref target="RFC8122"></xref> fingerprint value(s), or these | <xref target="RFC8122" format="default" sectionFormat="of" derivedCont | |||
value(s) MUST be session-level attributes.</t> | ent="RFC8122"/>, or these | |||
values <bcp14>MUST</bcp14> be session-level attributes.</t> | ||||
<t>Each m= section should be generated as specified in | <t indent="0" pn="section-5.2.1-8">Each "m=" section <bcp14>MUST</bcp1 | |||
<xref target="RFC4566"></xref>, Section 5.14. For the m= line | 4> be generated as specified in | |||
itself, the following rules MUST be followed: | <xref target="RFC4566" sectionFormat="comma" section="5.14" format="de | |||
<list style="symbols"> | fault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.14" derivedCont | |||
ent="RFC4566"/>. For the "m=" line | ||||
<t>If the m= section is marked as bundle-only, then the | itself, the following rules <bcp14>MUST</bcp14> be followed: | |||
port value MUST be set to 0. Otherwise, the port value is | </t> | |||
set to the port of the default ICE candidate for this m= | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section | |||
-5.2.1-9"> | ||||
<li pn="section-5.2.1-9.1">If the "m=" section is marked as bundle-o | ||||
nly, then the | ||||
<port> value <bcp14>MUST</bcp14> be set to zero. Otherwise, th | ||||
e <port> value is | ||||
set to the port of the default ICE candidate for this "m=" | ||||
section, but given that no candidates are available yet, | section, but given that no candidates are available yet, | |||
the "dummy" port value of 9 (Discard) MUST be used, as | the default port value of 9 (Discard) <bcp14>MUST</bcp14> be used, a s | |||
indicated in | indicated in | |||
<xref target="I-D.ietf-ice-trickle"></xref>, Section | <xref target="RFC8840" sectionFormat="comma" section="4.1.1" format= | |||
5.1.</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc8840#section-4.1.1" derived | |||
Content="RFC8840"/>.</li> | ||||
<t>To properly indicate use of DTLS, the <proto> | <li pn="section-5.2.1-9.2">To properly indicate use of DTLS, the < | |||
field MUST be set to "UDP/TLS/RTP/SAVPF", as specified in | ;proto> | |||
<xref target="RFC5764" />, Section 8.</t> | field <bcp14>MUST</bcp14> be set to "UDP/TLS/RTP/SAVPF", as specifie | |||
d in | ||||
<t>If codec preferences have been set for the associated | <xref target="RFC5764" sectionFormat="comma" section="8" format="def | |||
transceiver, media formats MUST be generated in the | ault" derivedLink="https://rfc-editor.org/rfc/rfc5764#section-8" derivedContent= | |||
corresponding order, and MUST exclude any codecs not | "RFC5764"/>.</li> | |||
present in the codec preferences.</t> | <li pn="section-5.2.1-9.3">If codec preferences have been set for th | |||
e associated | ||||
<t>Unless excluded by the above restrictions, the media | transceiver, media formats <bcp14>MUST</bcp14> be generated in the | |||
formats MUST include the mandatory audio/video codecs as | corresponding order and <bcp14>MUST</bcp14> exclude any codecs not | |||
present in the codec preferences.</li> | ||||
<li pn="section-5.2.1-9.4">Unless excluded by the above restrictions | ||||
, the media | ||||
formats <bcp14>MUST</bcp14> include the mandatory audio/video codecs | ||||
as | ||||
specified in | specified in | |||
<xref target="RFC7874"></xref>, Section 3, and | <xref target="RFC7874" sectionFormat="comma" section="3" format="def | |||
<xref target="RFC7742"></xref>, Section 5.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc7874#section-3" derivedContent= | |||
</list></t> | "RFC7874"/> and | |||
<xref target="RFC7742" sectionFormat="comma" section="5" format="def | ||||
<t>The m= line MUST be followed immediately by a "c=" line, | ault" derivedLink="https://rfc-editor.org/rfc/rfc7742#section-5" derivedContent= | |||
"RFC7742"/>.</li> | ||||
</ul> | ||||
<t indent="0" pn="section-5.2.1-10">The "m=" line <bcp14>MUST</bcp14> | ||||
be followed immediately by a "c=" line, | ||||
as specified in | as specified in | |||
<xref target="RFC4566"></xref>, Section 5.7. Again, as no | <xref target="RFC4566" sectionFormat="comma" section="5.7" format="def | |||
candidates are available yet, the "c=" line must contain the | ault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.7" derivedConten | |||
"dummy" value "IN IP4 0.0.0.0", as defined in | t="RFC4566"/>. Again, as no | |||
<xref target="I-D.ietf-ice-trickle"></xref>, Section 5.1.</t> | candidates are available yet, the "c=" line <bcp14>MUST</bcp14> contai | |||
n the | ||||
<t> | default value "IN IP4 0.0.0.0", as defined in | |||
<xref target="I-D.ietf-mmusic-sdp-mux-attributes" /> groups | <xref target="RFC8840" sectionFormat="comma" section="4.1.1" format="d | |||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8840#section-4.1.1" derivedCo | ||||
ntent="RFC8840"/>.</t> | ||||
<t indent="0" pn="section-5.2.1-11"> | ||||
<xref target="RFC8859" format="default" sectionFormat="of" derivedCont | ||||
ent="RFC8859"/> groups | ||||
SDP attributes into different categories. To avoid | SDP attributes into different categories. To avoid | |||
unnecessary duplication when bundling, attributes of category | unnecessary duplication when bundling, attributes of category | |||
IDENTICAL or TRANSPORT MUST NOT be repeated in bundled m= | IDENTICAL or TRANSPORT <bcp14>MUST NOT</bcp14> be repeated in bundled "m=" | |||
sections, repeating the guidance from | sections, repeating the guidance from | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />, | <xref target="RFC8843" sectionFormat="comma" section="7.1.3" format="d | |||
Section 8.1. This includes m= sections for which bundling has | efault" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-7.1.3" derivedCo | |||
been negotiated and is still desired, as well as m= sections | ntent="RFC8843"/>. | |||
This includes "m=" sections for which bundling has | ||||
been negotiated and is still desired, as well as "m=" sections | ||||
marked as bundle-only.</t> | marked as bundle-only.</t> | |||
<t indent="0" pn="section-5.2.1-12">The following attributes, which ar | ||||
<t>The following attributes, which are of a category other | e of a category other | |||
than IDENTICAL or TRANSPORT, MUST be included in each m= | than IDENTICAL or TRANSPORT, <bcp14>MUST</bcp14> be included in each " | |||
m=" | ||||
section:</t> | section:</t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t> | -5.2.1-13"> | |||
<list style="symbols"> | <li pn="section-5.2.1-13.1">An "a=mid" line, as specified in | |||
<xref target="RFC5888" sectionFormat="comma" section="4" format="d | ||||
<t>An "a=mid" line, as specified in | efault" derivedLink="https://rfc-editor.org/rfc/rfc5888#section-4" derivedConten | |||
<xref target="RFC5888"></xref>, Section 4. All MID values | t="RFC5888"/>. All MID values | |||
MUST be generated in a fashion that does not leak user | <bcp14>MUST</bcp14> be generated in a fashion that does not leak u | |||
ser | ||||
information, e.g., randomly or using a per-PeerConnection | information, e.g., randomly or using a per-PeerConnection | |||
counter, and SHOULD be 3 bytes or less, to allow them to | counter, and <bcp14>SHOULD</bcp14> be 3 bytes or less, to allow th em to | |||
efficiently fit into the RTP header extension defined in | efficiently fit into the RTP header extension defined in | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation"> | <xref target="RFC8843" sectionFormat="comma" section="15.2" format | |||
</xref>, Section 14. Note that this does not set the | ="default" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-15.2" derived | |||
Content="RFC8843"/>. | ||||
Note that this does not set the | ||||
RtpTransceiver mid property, as that only occurs when the | RtpTransceiver mid property, as that only occurs when the | |||
description is applied. The generated MID value can be | description is applied. The generated MID value can be | |||
considered a "proposed" MID at this point.</t> | considered a "proposed" MID at this point.</li> | |||
<li pn="section-5.2.1-13.2">A direction attribute that is the same a | ||||
<t>A direction attribute which is the same as that of the | s that of the | |||
associated transceiver.</t> | associated transceiver.</li> | |||
<li pn="section-5.2.1-13.3">For each media format on the "m=" line, | ||||
<t>For each media format on the m= line, "a=rtpmap" and | "a=rtpmap" and "a=fmtp" lines, as specified in | |||
"a=fmtp" lines, as specified in | <xref target="RFC4566" sectionFormat="comma" section="6" format="d | |||
<xref target="RFC4566"></xref>, Section 6, and | efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedConten | |||
<xref target="RFC3264"></xref>, Section 5.1.</t> | t="RFC4566"/> and | |||
<xref target="RFC3264" sectionFormat="comma" section="5.1" format= | ||||
<t>For each primary codec where RTP retransmission should | "default" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-5.1" derivedCo | |||
ntent="RFC3264"/>.</li> | ||||
<li pn="section-5.2.1-13.4">For each primary codec where RTP retrans | ||||
mission should | ||||
be used, a corresponding "a=rtpmap" line indicating "rtx" | be used, a corresponding "a=rtpmap" line indicating "rtx" | |||
with the clock rate of the primary codec and an "a=fmtp" | with the clock rate of the primary codec and an "a=fmtp" | |||
line that references the payload type of the primary | line that references the payload type of the primary | |||
codec, as specified in | codec, as specified in | |||
<xref target="RFC4588"></xref>, Section 8.1.</t> | <xref target="RFC4588" sectionFormat="comma" section="8.1" format= | |||
"default" derivedLink="https://rfc-editor.org/rfc/rfc4588#section-8.1" derivedCo | ||||
<t>For each supported FEC mechanism, "a=rtpmap" and | ntent="RFC4588"/>.</li> | |||
<li pn="section-5.2.1-13.5">For each supported Forward Error Correct | ||||
ion (FEC) mechanism, "a=rtpmap" and | ||||
"a=fmtp" lines, as specified in | "a=fmtp" lines, as specified in | |||
<xref target="RFC4566"></xref>, Section 6. The FEC | <xref target="RFC4566" sectionFormat="comma" section="6" format="d | |||
mechanisms that MUST be supported are specified in | efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedConten | |||
<xref target="I-D.ietf-rtcweb-fec"></xref>, Section 6, | t="RFC4566"/>. The FEC | |||
mechanisms that <bcp14>MUST</bcp14> be supported are specified in | ||||
<xref target="RFC8854" sectionFormat="comma" section="7" format="d | ||||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8854#section-7" derivedConten | ||||
t="RFC8854"/>, | ||||
and specific usage for each media type is outlined in | and specific usage for each media type is outlined in | |||
Sections 4 and 5.</t> | Sections <xref target="sec.interface" format="counter" sectionForm | |||
at="of" derivedContent="4"/> and <xref target="sec.sdp-interaction-procedure" fo | ||||
<t>If this m= section is for media with configurable | rmat="counter" sectionFormat="of" derivedContent="5"/>.</li> | |||
<li pn="section-5.2.1-13.6">If this "m=" section is for media with c | ||||
onfigurable | ||||
durations of media per packet, e.g., audio, an | durations of media per packet, e.g., audio, an | |||
"a=maxptime" line, indicating the maximum amount of | "a=maxptime" line, indicating the maximum amount of | |||
media, specified in milliseconds, that can be | media, specified in milliseconds, that can be | |||
encapsulated in each packet, as specified in | encapsulated in each packet, as specified in | |||
<xref target="RFC4566"></xref>, Section 6. This value is | <xref target="RFC4566" sectionFormat="comma" section="6" format="d efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedConten t="RFC4566"/>. This value is | |||
set to the smallest of the maximum duration values across | set to the smallest of the maximum duration values across | |||
all the codecs included in the m= section.</t> | all the codecs included in the "m=" section.</li> | |||
<li pn="section-5.2.1-13.7">If this "m=" section is for video media | ||||
<t>If this m= section is for video media, and there are | and there are | |||
known limitations on the size of images which can be | known limitations on the size of images that can be | |||
decoded, an "a=imageattr" line, as specified in | decoded, an "a=imageattr" line, as specified in | |||
<xref target="sec.imageattr"></xref>.</t> | <xref target="sec.imageattr" format="default" sectionFormat="of" d | |||
erivedContent="Section 3.6"/>.</li> | ||||
<t>For each supported RTP header extension, an "a=extmap" | <li pn="section-5.2.1-13.8">For each supported RTP header extension, | |||
an "a=extmap" | ||||
line, as specified in | line, as specified in | |||
<xref target="RFC5285"></xref>, Section 5. The list of | <xref target="RFC5285" sectionFormat="comma" section="5" format="d | |||
header extensions that SHOULD/MUST be supported is | efault" derivedLink="https://rfc-editor.org/rfc/rfc5285#section-5" derivedConten | |||
t="RFC5285"/>. | ||||
The list of | ||||
header extensions that <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp14> b | ||||
e supported is | ||||
specified in | specified in | |||
<xref target="I-D.ietf-rtcweb-rtp-usage"></xref>, Section | <xref target="RFC8834" sectionFormat="comma" section="5.2" format= | |||
5.2. Any header extensions that require encryption MUST | "default" derivedLink="https://rfc-editor.org/rfc/rfc8834#section-5.2" derivedCo | |||
ntent="RFC8834"/>. Any header extensions that require encryption <bcp14>MUST</bc | ||||
p14> | ||||
be specified as indicated in | be specified as indicated in | |||
<xref target="RFC6904"></xref>, Section 4.</t> | <xref target="RFC6904" sectionFormat="comma" section="4" format="d | |||
efault" derivedLink="https://rfc-editor.org/rfc/rfc6904#section-4" derivedConten | ||||
<t>For each supported RTCP feedback mechanism, an | t="RFC6904"/>.</li> | |||
<li pn="section-5.2.1-13.9">For each supported RTCP feedback mechani | ||||
sm, an | ||||
"a=rtcp-fb" line, as specified in | "a=rtcp-fb" line, as specified in | |||
<xref target="RFC4585"></xref>, Section 4.2. The list of | <xref target="RFC4585" sectionFormat="comma" section="4.2" format= | |||
RTCP feedback mechanisms that SHOULD/MUST be supported is | "default" derivedLink="https://rfc-editor.org/rfc/rfc4585#section-4.2" derivedCo | |||
ntent="RFC4585"/>. The list of | ||||
RTCP feedback mechanisms that <bcp14>SHOULD</bcp14>/<bcp14>MUST</b | ||||
cp14> be supported is | ||||
specified in | specified in | |||
<xref target="I-D.ietf-rtcweb-rtp-usage"></xref>, Section | <xref target="RFC8834" sectionFormat="comma" section="5.1" format= | |||
5.1.</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc8834#section-5.1" derivedCo | |||
ntent="RFC8834"/>.</li> | ||||
<t>If the RtpTransceiver has a sendrecv or sendonly | <li pn="section-5.2.1-13.10"> | |||
<t indent="0" pn="section-5.2.1-13.10.1">If the RtpTransceiver has | ||||
a sendrecv or sendonly | ||||
direction: | direction: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="sec | ||||
<t>For each MediaStream that was associated with the | tion-5.2.1-13.10.2"> | |||
<li pn="section-5.2.1-13.10.2.1">For each MediaStream that was a | ||||
ssociated with the | ||||
transceiver when it was created via addTrack or | transceiver when it was created via addTrack or | |||
addTransceiver, an "a=msid" line, as specified in | addTransceiver, an "a=msid" line, as specified in | |||
<xref target="I-D.ietf-mmusic-msid"></xref>, Section 2, | <xref target="RFC8830" sectionFormat="comma" section="2" format= | |||
but omitting the "appdata" field.</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc8830#section-2" derivedCont | |||
</list></t> | ent="RFC8830"/>, | |||
but omitting the "appdata" field.</li> | ||||
<t>If the RtpTransceiver has a sendrecv or sendonly | </ul> | |||
direction, and the application has specified RID values | </li> | |||
<li pn="section-5.2.1-13.11">If the RtpTransceiver has a sendrecv or | ||||
sendonly | ||||
direction, and the application has specified a rid-id for an encod | ||||
ing, | ||||
or has specified more than one encoding in the | or has specified more than one encoding in the | |||
RtpSenders's parameters, an "a=rid" line for each | RtpSenders's parameters, an "a=rid" line for each | |||
encoding specified. The "a=rid" line is specified in | encoding specified. The "a=rid" line is specified in | |||
<xref target="I-D.ietf-mmusic-rid"></xref>, and its | <xref target="RFC8851" format="default" sectionFormat="of" derived | |||
direction MUST be "send". If the application has chosen a | Content="RFC8851"/>, and its | |||
RID value, it MUST be used as the rid-identifier; | direction <bcp14>MUST</bcp14> be "send". If the application has ch | |||
otherwise a RID value MUST be generated by the | osen a | |||
implementation. RID values MUST be generated in a fashion | rid-id, it <bcp14>MUST</bcp14> be used; | |||
otherwise, a rid-id <bcp14>MUST</bcp14> be generated by the | ||||
implementation. rid-ids <bcp14>MUST</bcp14> be generated in a fash | ||||
ion | ||||
that does not leak user information, e.g., randomly or | that does not leak user information, e.g., randomly or | |||
using a per-PeerConnection counter, and SHOULD be 3 bytes | using a per-PeerConnection counter (see guidance at the end | |||
of <xref target="RFC8852" sectionFormat="comma" section="3.3" form | ||||
at="default" derivedLink="https://rfc-editor.org/rfc/rfc8852#section-3.3" derive | ||||
dContent="RFC8852"/>), and <bcp14>SHOULD</bcp14> be 3 bytes | ||||
or less, to allow them to efficiently fit into the RTP | or less, to allow them to efficiently fit into the RTP | |||
header extension defined in | header extensions defined in | |||
<xref target="I-D.ietf-avtext-rid"></xref>, Section 3. If | <xref target="RFC8852" sectionFormat="comma" section="3.3" format= | |||
no encodings have been specified, or only one encoding is | "default" derivedLink="https://rfc-editor.org/rfc/rfc8852#section-3.3" derivedCo | |||
specified but without a RID value, then no "a=rid" lines | ntent="RFC8852"/>. | |||
are generated.</t> | If no encodings have been specified, or only one encoding is | |||
specified but without a rid-id, then no "a=rid" lines | ||||
<t>If the RtpTransceiver has a sendrecv or sendonly | are generated.</li> | |||
<li pn="section-5.2.1-13.12">If the RtpTransceiver has a sendrecv or | ||||
sendonly | ||||
direction and more than one "a=rid" line has been | direction and more than one "a=rid" line has been | |||
generated, an "a=simulcast" line, with direction "send", | generated, an "a=simulcast" line, with direction "send", | |||
as defined in | as defined in | |||
<xref target="I-D.ietf-mmusic-sdp-simulcast"></xref>, | <xref target="RFC8853" sectionFormat="comma" section="5.1" format= | |||
Section 6.2. The list of RIDs MUST include all of the RID | "default" derivedLink="https://rfc-editor.org/rfc/rfc8853#section-5.1" derivedCo | |||
identifiers used in the "a=rid" lines for this m= | ntent="RFC8853"/>. The associated set of rid-ids <bcp14>MUST</bcp14> | |||
section.</t> | include all of the rid-ids used in the "a=rid" lines for this "m=" | |||
section.</li> | ||||
<t>If the bundle policy for this PeerConnection is set to | <li pn="section-5.2.1-13.13">If (1) the bundle policy for this PeerC | |||
"max-bundle", and this is not the first m= section, or | onnection is set to | |||
the bundle policy is set to "balanced", and this is not | "max-bundle" and this is not the first "m=" section or (2) | |||
the first m= section for this media type, an | the bundle policy is set to "balanced" and this is not | |||
"a=bundle-only" line.</t> | the first "m=" section for this media type, an | |||
</list> | "a=bundle-only" line.</li> | |||
</t> | </ul> | |||
<t indent="0" pn="section-5.2.1-14">The following attributes, which ar | ||||
<t>The following attributes, which are of category IDENTICAL | e of category IDENTICAL | |||
or TRANSPORT, MUST appear only in "m=" sections which either | or TRANSPORT, <bcp14>MUST</bcp14> appear only in "m=" sections that ei | |||
have a unique address or which are associated with the | ther | |||
bundle-tag. (In initial offers, this means those "m=" | have a unique address or are associated with the | |||
sections which do not contain an "a=bundle-only" | BUNDLE-tag. (In initial offers, this means those "m=" | |||
sections that do not contain an "a=bundle-only" | ||||
attribute.)</t> | attribute.)</t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t> | -5.2.1-15"> | |||
<list style="symbols"> | <li pn="section-5.2.1-15.1">"a=ice-ufrag" and "a=ice-pwd" lines, as | |||
specified in | ||||
<t>"a=ice-ufrag" and "a=ice-pwd" lines, as specified in | <xref target="RFC8839" sectionFormat="comma" section="5.4" format= | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp"></xref>, | "default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedCo | |||
Section 4.4.</t> | ntent="RFC8839"/>.</li> | |||
<li pn="section-5.2.1-15.2">For each desired digest algorithm, one o | ||||
<t>For each desired digest algorithm, one or more | r more | |||
"a=fingerprint" lines for each of the endpoint's | "a=fingerprint" lines for each of the endpoint's | |||
certificates, as specified in | certificates, as specified in | |||
<xref target="RFC8122"></xref>, Section 5.</t> | <xref target="RFC8122" sectionFormat="comma" section="5" format="d | |||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8122#section-5" derivedConten | ||||
<t>An "a=setup" line, as specified in | t="RFC8122"/>.</li> | |||
<xref target="RFC4145"></xref>, Section 4, and clarified | <li pn="section-5.2.1-15.3">An "a=setup" line, as specified in | |||
<xref target="RFC4145" sectionFormat="comma" section="4" format="d | ||||
efault" derivedLink="https://rfc-editor.org/rfc/rfc4145#section-4" derivedConten | ||||
t="RFC4145"/> and clarified | ||||
for use in DTLS-SRTP scenarios in | for use in DTLS-SRTP scenarios in | |||
<xref target="RFC5763"></xref>, Section 5. The role value | <xref target="RFC5763" sectionFormat="comma" section="5" format="d | |||
in the offer MUST be "actpass".</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc5763#section-5" derivedConten | |||
t="RFC5763"/>. The role value | ||||
<t>An "a=tls-id" line, as specified in | in the offer <bcp14>MUST</bcp14> be "actpass".</li> | |||
<xref target="I-D.ietf-mmusic-dtls-sdp" />, Section | <li pn="section-5.2.1-15.4">An "a=tls-id" line, as specified in | |||
5.2.</t> | <xref target="RFC8842" sectionFormat="comma" section="5.2" format= | |||
"default" derivedLink="https://rfc-editor.org/rfc/rfc8842#section-5.2" derivedCo | ||||
<t>An "a=rtcp" line, as specified in | ntent="RFC8842"/>.</li> | |||
<xref target="RFC3605"></xref>, Section 2.1, containing | <li pn="section-5.2.1-15.5">An "a=rtcp" line, as specified in | |||
the dummy value "9 IN IP4 0.0.0.0", because no candidates | <xref target="RFC3605" sectionFormat="comma" section="2.1" format= | |||
have yet been gathered.</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc3605#section-2.1" derivedCo | |||
ntent="RFC3605"/>, containing | ||||
<t>An "a=rtcp-mux" line, as specified in | the default value "9 IN IP4 0.0.0.0", because no candidates | |||
<xref target="RFC5761"></xref>, Section 5.1.3.</t> | have yet been gathered.</li> | |||
<li pn="section-5.2.1-15.6">An "a=rtcp-mux" line, as specified in | ||||
<t>If the RTP/RTCP multiplexing policy is "require", an | <xref target="RFC5761" sectionFormat="comma" section="5.1.3" forma | |||
t="default" derivedLink="https://rfc-editor.org/rfc/rfc5761#section-5.1.3" deriv | ||||
edContent="RFC5761"/>.</li> | ||||
<li pn="section-5.2.1-15.7">If the RTP/RTCP multiplexing policy is " | ||||
require", an | ||||
"a=rtcp-mux-only" line, as specified in | "a=rtcp-mux-only" line, as specified in | |||
<xref target="I-D.ietf-mmusic-mux-exclusive" />, Section | <xref target="RFC8858" sectionFormat="comma" section="4" format="d | |||
4.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8858#section-4" derivedConten | |||
t="RFC8858"/>.</li> | ||||
<t>An "a=rtcp-rsize" line, as specified in | <li pn="section-5.2.1-15.8">An "a=rtcp-rsize" line, as specified in | |||
<xref target="RFC5506"></xref>, Section 5.</t> | <xref target="RFC5506" sectionFormat="comma" section="5" format="d | |||
</list> | efault" derivedLink="https://rfc-editor.org/rfc/rfc5506#section-5" derivedConten | |||
</t> | t="RFC5506"/>.</li> | |||
</ul> | ||||
<t>Lastly, if a data channel has been created, a m= section | <t indent="0" pn="section-5.2.1-16">Lastly, if a data channel has been | |||
MUST be generated for data. The <media> field MUST be | created, an "m=" section | |||
set to "application" and the <proto> field MUST be set | <bcp14>MUST</bcp14> be generated for data. The <media> field <bc | |||
p14>MUST</bcp14> be | ||||
set to "application", and the <proto> field <bcp14>MUST</bcp14> | ||||
be set | ||||
to "UDP/DTLS/SCTP" | to "UDP/DTLS/SCTP" | |||
<xref target="I-D.ietf-mmusic-sctp-sdp"></xref>. The "fmt" | <xref target="RFC8841" format="default" sectionFormat="of" derivedCont | |||
value MUST be set to "webrtc-datachannel" as specified in | ent="RFC8841"/>. The <fmt> | |||
<xref target="I-D.ietf-mmusic-sctp-sdp"></xref>, Section | value <bcp14>MUST</bcp14> be set to "webrtc-datachannel" as specified | |||
4.1.</t> | in | |||
<xref target="RFC8841" sectionFormat="comma" section="4.2.2" format="d | ||||
<t>Within the data m= section, an "a=mid" line MUST be | efault" derivedLink="https://rfc-editor.org/rfc/rfc8841#section-4.2.2" derivedCo | |||
ntent="RFC8841"/>. | ||||
</t> | ||||
<t indent="0" pn="section-5.2.1-17">Within the data "m=" section, an " | ||||
a=mid" line <bcp14>MUST</bcp14> be | ||||
generated and included as described above, along with an | generated and included as described above, along with an | |||
"a=sctp-port" line referencing the SCTP port number, as | "a=sctp-port" line referencing the SCTP port number, as | |||
defined in | defined in | |||
<xref target="I-D.ietf-mmusic-sctp-sdp"></xref>, Section 5.1, | <xref target="RFC8841" sectionFormat="comma" section="5.1" format="def ault" derivedLink="https://rfc-editor.org/rfc/rfc8841#section-5.1" derivedConten t="RFC8841"/>; | |||
and, if appropriate, an "a=max-message-size" line, as defined | and, if appropriate, an "a=max-message-size" line, as defined | |||
in | in | |||
<xref target="I-D.ietf-mmusic-sctp-sdp"></xref>, Section | <xref target="RFC8841" sectionFormat="comma" section="6.1" format="def | |||
6.1.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc8841#section-6.1" derivedConten | |||
t="RFC8841"/>.</t> | ||||
<t>As discussed above, the following attributes of category | <t indent="0" pn="section-5.2.1-18">As discussed above, the following | |||
IDENTICAL or TRANSPORT are included only if the data m= | attributes of category | |||
IDENTICAL or TRANSPORT are included only if the data "m=" | ||||
section either has a unique address or is associated with the | section either has a unique address or is associated with the | |||
bundle-tag (e.g., if it is the only m= section): | BUNDLE-tag (e.g., if it is the only "m=" section): | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>"a=ice-ufrag"</t> | -5.2.1-19"> | |||
<li pn="section-5.2.1-19.1">"a=ice-ufrag"</li> | ||||
<t>"a=ice-pwd"</t> | <li pn="section-5.2.1-19.2">"a=ice-pwd"</li> | |||
<li pn="section-5.2.1-19.3">"a=fingerprint"</li> | ||||
<t>"a=fingerprint"</t> | <li pn="section-5.2.1-19.4">"a=setup"</li> | |||
<li pn="section-5.2.1-19.5">"a=tls-id"</li> | ||||
<t>"a=setup"</t> | </ul> | |||
<t indent="0" pn="section-5.2.1-20">Once all "m=" sections have been g | ||||
<t>"a=tls-id"</t> | enerated, a session-level | |||
</list></t> | "a=group" attribute <bcp14>MUST</bcp14> be added as specified in | |||
<xref target="RFC5888" format="default" sectionFormat="of" derivedCont | ||||
<t>Once all m= sections have been generated, a session-level | ent="RFC5888"/>. This attribute <bcp14>MUST</bcp14> have | |||
"a=group" attribute MUST be added as specified in | semantics "BUNDLE" and <bcp14>MUST</bcp14> include the mid identifiers | |||
<xref target="RFC5888"></xref>. This attribute MUST have | of | |||
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 | |||
However, whether the m= sections are bundle-only or not | ||||
depends on the bundle policy.</t> | depends on the bundle policy.</t> | |||
<t indent="0" pn="section-5.2.1-21">The next step is to generate sessi | ||||
<t>The next step is to generate session-level lip sync groups | on-level lip sync groups | |||
as defined in | as defined in | |||
<xref target="RFC5888" />, Section 7. For each MediaStream | <xref target="RFC5888" sectionFormat="comma" section="7" format="defau lt" derivedLink="https://rfc-editor.org/rfc/rfc5888#section-7" derivedContent="R FC5888"/>. For each MediaStream | |||
referenced by more than one RtpTransceiver (by passing those | referenced by more than one RtpTransceiver (by passing those | |||
MediaStreams as arguments to the addTrack and addTransceiver | MediaStreams as arguments to the addTrack and addTransceiver | |||
methods), a group of type "LS" MUST be added that contains | methods), a group of type "LS" <bcp14>MUST</bcp14> be added that conta | |||
the mid values for each RtpTransceiver.</t> | ins | |||
the MID values for each RtpTransceiver.</t> | ||||
<t>Attributes which SDP permits to either be at the session | <t indent="0" pn="section-5.2.1-22">Attributes that SDP permits to be | |||
level or the media level SHOULD generally be at the media | at either the session | |||
level or the media level <bcp14>SHOULD</bcp14> generally be at the med | ||||
ia | ||||
level even if they are identical. This assists development | level even if they are identical. This assists development | |||
and debugging by making it easier to understand individual | and debugging by making it easier to understand individual | |||
media sections, especially if one of a set of initially | media sections, especially if one of a set of initially | |||
identical attributes is subsequently changed. However, | identical attributes is subsequently changed. However, | |||
implementations MAY choose to aggregate attributes at the | implementations <bcp14>MAY</bcp14> choose to aggregate attributes at t | |||
session level and JSEP implementations MUST be prepared to | he | |||
session level, and JSEP implementations <bcp14>MUST</bcp14> be prepare | ||||
d to | ||||
receive attributes in either location.</t> | receive attributes in either location.</t> | |||
<t indent="0" pn="section-5.2.1-23">Attributes other than the ones spe | ||||
<t>Attributes other than the ones specified above MAY be | cified above <bcp14>MAY</bcp14> be | |||
included, except for the following attributes which are | included, except for the following attributes, which are | |||
specifically incompatible with the requirements of | specifically incompatible with the requirements of | |||
<xref target="I-D.ietf-rtcweb-rtp-usage"></xref>, and MUST | <xref target="RFC8834" format="default" sectionFormat="of" derivedCont | |||
NOT be included: | ent="RFC8834"/> and <bcp14>MUST NOT</bcp14> be included: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>"a=crypto"</t> | -5.2.1-24"> | |||
<li pn="section-5.2.1-24.1">"a=crypto"</li> | ||||
<t>"a=key-mgmt"</t> | <li pn="section-5.2.1-24.2">"a=key-mgmt"</li> | |||
<li pn="section-5.2.1-24.3">"a=ice-lite"</li> | ||||
<t>"a=ice-lite"</t> | </ul> | |||
</list></t> | <t indent="0" pn="section-5.2.1-25">Note that when bundle is used, any | |||
additional attributes | ||||
<t>Note that when bundle is used, any additional attributes | that are added <bcp14>MUST</bcp14> follow the advice in | |||
that are added MUST follow the advice in | <xref target="RFC8859" format="default" sectionFormat="of" derivedCont | |||
<xref target="I-D.ietf-mmusic-sdp-mux-attributes"></xref> on | ent="RFC8859"/> on | |||
how those attributes interact with bundle.</t> | how those attributes interact with bundle.</t> | |||
<t indent="0" pn="section-5.2.1-26">Note that these requirements are i | ||||
<t>Note that these requirements are in some cases stricter | n some cases stricter | |||
than those of SDP. Implementations MUST be prepared to accept | than those of SDP. Implementations <bcp14>MUST</bcp14> be prepared to | |||
accept | ||||
compliant SDP even if it would not conform to the | compliant SDP even if it would not conform to the | |||
requirements for generating SDP in this specification.</t> | requirements for generating SDP in this specification.</t> | |||
</section> | </section> | |||
<section title="Subsequent Offers" | <section anchor="sec.subsequent-offers" numbered="true" toc="include" re | |||
anchor="sec.subsequent-offers"> | moveInRFC="false" pn="section-5.2.2"> | |||
<name slugifiedName="name-subsequent-offers">Subsequent Offers</name> | ||||
<t>When createOffer is called a second (or later) time, or is | <t indent="0" pn="section-5.2.2-1">When createOffer is called a second | |||
(or later) time or is | ||||
called after a local description has already been installed, | called after a local description has already been installed, | |||
the processing is somewhat different than for an initial | the processing is somewhat different than for an initial | |||
offer.</t> | offer.</t> | |||
<t indent="0" pn="section-5.2.2-2">If the previous offer was not appli | ||||
<t>If the previous offer was not applied using | ed using | |||
setLocalDescription, meaning the PeerConnection is still in | setLocalDescription, meaning the PeerConnection is still in | |||
the "stable" state, the steps for generating an initial offer | the "stable" state, the steps for generating an initial offer | |||
should be followed, subject to the following restriction: | <bcp14>MUST</bcp14> be followed, subject to the following restriction: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>The fields of the "o=" line MUST stay the same except | -5.2.2-3"> | |||
for the <session-version> field, which MUST increment | <li pn="section-5.2.2-3.1">The fields of the "o=" line <bcp14>MUST</ | |||
bcp14> stay the same except | ||||
for the <session-version> field, which <bcp14>MUST</bcp14> inc | ||||
rement | ||||
by one on each call to createOffer if the offer might | by one on each call to createOffer if the offer might | |||
differ from the output of the previous call to createOffer; | differ from the output of the previous call to createOffer; | |||
implementations MAY opt to increment | implementations <bcp14>MAY</bcp14> opt to increment | |||
<session-version> on every call. The value of the | <session-version> on every call. The value of the | |||
generated <session-version> is independent of the | generated <session-version> is independent of the | |||
<session-version> of the current local description; | <session-version> of the current local description; | |||
in particular, in the case where the current version is N, | in particular, in the case where the current version is N, | |||
an offer is created and applied with version N+1, and then | an offer is created and applied with version N+1, and then | |||
that offer is rolled back so that the current version is | that offer is rolled back so that the current version is | |||
again N, the next generated offer will still have version | again N, the next generated offer will still have version | |||
N+2.</t> | N+2.</li> | |||
</list></t> | </ul> | |||
<t indent="0" pn="section-5.2.2-4">Note that if the application create | ||||
<t>Note that if the application creates an offer by reading | s an offer by reading | |||
currentLocalDescription instead of calling createOffer, the | currentLocalDescription instead of calling createOffer, the | |||
returned SDP may be different than when setLocalDescription | returned SDP may be different than when setLocalDescription | |||
was originally called, due to the addition of gathered ICE | was originally called, due to the addition of gathered ICE | |||
candidates, but the <session-version> will not have | candidates, but the <session-version> will not have | |||
changed. There are no known scenarios in which this causes | changed. There are no known scenarios in which this causes | |||
problems, but if this is a concern, the solution is simply to | problems, but if this is a concern, the solution is simply to | |||
use createOffer to ensure a unique | use createOffer to ensure a unique | |||
<session-version>.</t> | <session-version>.</t> | |||
<t indent="0" pn="section-5.2.2-5">If the previous offer was applied u | ||||
<t>If the previous offer was applied using | sing | |||
setLocalDescription, but a corresponding answer from the | setLocalDescription, but a corresponding answer from the | |||
remote side has not yet been applied, meaning the | remote side has not yet been applied, meaning the | |||
PeerConnection is still in the "have-local-offer" state, an | PeerConnection is still in the "have-local-offer" state, an | |||
offer is generated by following the steps in the "stable" | offer is generated by following the steps in the "stable" | |||
state above, along with these exceptions: | state above, along with these exceptions: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>The "s=" and "t=" lines MUST stay the same.</t> | -5.2.2-6"> | |||
<li pn="section-5.2.2-6.1">The "s=" and "t=" lines <bcp14>MUST</bcp1 | ||||
<t>If any RtpTransceiver has been added, and there exists | 4> stay the same.</li> | |||
an m= section with a zero port in the current local | <li pn="section-5.2.2-6.2">If any RtpTransceiver has been added and | |||
description or the current remote description, that m= | there exists | |||
section MUST be recycled by generating an m= section for | an "m=" section with a zero port in the current local | |||
the added RtpTransceiver as if the m= section were being | description or the current remote description, that "m=" | |||
section <bcp14>MUST</bcp14> be recycled by generating an "m=" sectio | ||||
n for | ||||
the added RtpTransceiver as if the "m=" section were being | ||||
added to the session description (including a new MID | added to the session description (including a new MID | |||
value), and placing it at the same index as the m= section | value) and placing it at the same index as the "m=" section | |||
with a zero port.</t> | with a zero port.</li> | |||
<li pn="section-5.2.2-6.3">If an RtpTransceiver is stopped and is no | ||||
<t>If an RtpTransceiver is stopped and is not associated | t associated | |||
with an m= section, an m= section MUST NOT be generated for | with an "m=" section, an "m=" section <bcp14>MUST NOT</bcp14> be gen | |||
it. This prevents adding back RtpTransceivers whose m= | erated for | |||
it. This prevents adding back RtpTransceivers whose "m=" | ||||
sections were recycled and used for a new RtpTransceiver in | sections were recycled and used for a new RtpTransceiver in | |||
a previous offer/ answer exchange, as described above.</t> | a previous offer/ answer exchange, as described above.</li> | |||
<li pn="section-5.2.2-6.4">If an RtpTransceiver has been stopped and | ||||
<t>If an RtpTransceiver has been stopped and is associated | is associated | |||
with an m= section, and the m= section is not being | with an "m=" section, and the "m=" section is not being | |||
recycled as described above, an m= section MUST be | recycled as described above, an "m=" section <bcp14>MUST</bcp14> be | |||
generated for it with the port set to zero and all "a=msid" | generated for it with the port set to zero and all "a=msid" | |||
lines removed.</t> | lines removed.</li> | |||
<li pn="section-5.2.2-6.5">For RtpTransceivers that are not stopped, | ||||
<t>For RtpTransceivers that are not stopped, the "a=msid" | the "a=msid" | |||
line(s) MUST stay the same if they are present in the | line or lines <bcp14>MUST</bcp14> stay the same if they are present | |||
in the | ||||
current description, regardless of changes to the | current description, regardless of changes to the | |||
transceiver's direction or track. If no "a=msid" line is | transceiver's direction or track. If no "a=msid" line is | |||
present in the current description, "a=msid" line(s) MUST | present in the current description, "a=msid" line(s) <bcp14>MUST</bc p14> | |||
be generated according to the same rules as for an initial | be generated according to the same rules as for an initial | |||
offer.</t> | offer.</li> | |||
<li pn="section-5.2.2-6.6">Each "m=" and "c=" line <bcp14>MUST</bcp1 | ||||
<t>Each "m=" and c=" line MUST be filled in with the port, | 4> be filled in with the port, | |||
relevant RTP profile, and address of the default candidate for the | relevant RTP profile, and address of the default candidate for the | |||
m= section, as described in | "m=" section, as described in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp"></xref>, | <xref target="RFC8839" sectionFormat="comma" section="4.2.1.2" forma | |||
Section 3.2.1.2, and clarified in | t="default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-4.2.1.2" der | |||
<xref target="sec.profile-names"/>. | ivedContent="RFC8839"/> and clarified in | |||
If no RTP candidates have yet been gathered, dummy | <xref target="sec.profile-names" format="default" sectionFormat="of" | |||
values MUST still be used, as described above.</t> | derivedContent="Section 5.1.2"/>. | |||
If no RTP candidates have yet been gathered, default | ||||
<t>Each "a=mid" line MUST stay the same.</t> | values <bcp14>MUST</bcp14> still be used, as described above.</li> | |||
<li pn="section-5.2.2-6.7">Each "a=mid" line <bcp14>MUST</bcp14> sta | ||||
<t>Each "a=ice-ufrag" and "a=ice-pwd" line MUST stay the | y the same.</li> | |||
same, unless the ICE configuration has changed (either | <li pn="section-5.2.2-6.8">Each "a=ice-ufrag" and "a=ice-pwd" line < | |||
changes to the supported STUN/TURN servers, or the ICE | bcp14>MUST</bcp14> stay the | |||
candidate policy), or the "IceRestart" option ( | same, unless the ICE configuration has changed (e.g., changes to | |||
<xref target="sec.icerestart" /> was specified. If the m= | either the supported STUN/TURN servers or the ICE | |||
section is bundled into another m= section, it still MUST | candidate policy) or the IceRestart option | |||
NOT contain any ICE credentials.</t> | (<xref target="sec.icerestart" format="default" sectionFormat="of" d | |||
erivedContent="Section 5.2.3.1"/>) was specified. | ||||
<t>If the m= section is not bundled into another m= | If the "m=" | |||
section, its "a=rtcp" attribute line MUST be filled in with | section is bundled into another "m=" section, it still <bcp14>MUST N | |||
OT</bcp14> contain any ICE credentials.</li> | ||||
<li pn="section-5.2.2-6.9">If the "m=" section is not bundled into a | ||||
nother "m=" | ||||
section, its "a=rtcp" attribute line <bcp14>MUST</bcp14> be filled i | ||||
n with | ||||
the port and address of the default RTCP candidate, as | the port and address of the default RTCP candidate, as | |||
indicated in | indicated in | |||
<xref target="RFC5761"></xref>, Section 5.1.3. If no RTCP | <xref target="RFC5761" sectionFormat="comma" section="5.1.3" format= | |||
candidates have yet been gathered, dummy values MUST be | "default" derivedLink="https://rfc-editor.org/rfc/rfc5761#section-5.1.3" derived | |||
used, as described in the initial offer section above.</t> | Content="RFC5761"/>. If no RTCP | |||
candidates have yet been gathered, default values <bcp14>MUST</bcp14 | ||||
<t>If the m= section is not bundled into another m= | > be | |||
used, as described in <xref target="sec.initial-offers" format="defa | ||||
ult" sectionFormat="of" derivedContent="Section 5.2.1"/> above.</li> | ||||
<li pn="section-5.2.2-6.10">If the "m=" section is not bundled into | ||||
another "m=" | ||||
section, for each candidate that has been gathered during | section, for each candidate that has been gathered during | |||
the most recent gathering phase (see | the most recent gathering phase (see | |||
<xref target="sec.ice-gather-overview"></xref>), an | <xref target="sec.ice-gather-overview" format="default" sectionForma | |||
"a=candidate" line MUST be added, as defined in | t="of" derivedContent="Section 3.5.1"/>), an | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp"></xref>, Section 4.1. | "a=candidate" line <bcp14>MUST</bcp14> be added, as defined in | |||
<xref target="RFC8839" sectionFormat="comma" section="5.1" format="d | ||||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.1" derivedCont | ||||
ent="RFC8839"/>. | ||||
If candidate gathering for the section has completed, an | If candidate gathering for the section has completed, an | |||
"a=end-of-candidates" attribute MUST be added, as described | "a=end-of-candidates" attribute <bcp14>MUST</bcp14> be added, as des cribed | |||
in | in | |||
<xref target="I-D.ietf-ice-trickle"></xref>, Section 9.3. | <xref target="RFC8840" sectionFormat="comma" section="8.2" format="d | |||
If the m= section is bundled into another m= section, both | efault" derivedLink="https://rfc-editor.org/rfc/rfc8840#section-8.2" derivedCont | |||
"a=candidate" and "a=end-of-candidates" MUST be | ent="RFC8840"/>. | |||
omitted.</t> | If the "m=" section is bundled into another "m=" section, both | |||
"a=candidate" and "a=end-of-candidates" <bcp14>MUST</bcp14> be | ||||
<t>For RtpTransceivers that are still present, the "a=rid" | omitted. | |||
lines MUST stay the same.</t> | </li> | |||
<li pn="section-5.2.2-6.11">For RtpTransceivers that are still prese | ||||
<t>For RtpTransceivers that are still present, any | nt, the "a=rid" | |||
"a=simulcast" line MUST stay the same.</t> | lines <bcp14>MUST</bcp14> stay the same.</li> | |||
</list></t> | <li pn="section-5.2.2-6.12">For RtpTransceivers that are still prese | |||
nt, any | ||||
<t>If the previous offer was applied using | "a=simulcast" line <bcp14>MUST</bcp14> stay the same.</li> | |||
</ul> | ||||
<t indent="0" pn="section-5.2.2-7">If the previous offer was applied u | ||||
sing | ||||
setLocalDescription, and a corresponding answer from the | setLocalDescription, and a corresponding answer from the | |||
remote side has been applied using setRemoteDescription, | remote side has been applied using setRemoteDescription, | |||
meaning the PeerConnection is in the "have-remote-pranswer" | meaning the PeerConnection is in the "have-remote-pranswer" | |||
or "stable" states, an offer is generated based on the | state or the "stable" state, an offer is generated based on the | |||
negotiated session descriptions by following the steps | negotiated session descriptions by following the steps | |||
mentioned for the "have-local-offer" state above.</t> | mentioned for the "have-local-offer" state above.</t> | |||
<t indent="0" pn="section-5.2.2-8">In addition, for each existing, non | ||||
<t>In addition, for each existing, non-recycled, non-rejected | -recycled, non-rejected | |||
m= section in the new offer, the following adjustments are | "m=" section in the new offer, the following adjustments are | |||
made based on the contents of the corresponding m= section in | made based on the contents of the corresponding "m=" section in | |||
the current local or remote description, as appropriate: | the current local or remote description, as appropriate: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>The m= line and corresponding "a=rtpmap" and "a=fmtp" | -5.2.2-9"> | |||
lines MUST only include media formats which have not been | <li pn="section-5.2.2-9.1">The "m=" line and corresponding "a=rtpmap | |||
" and "a=fmtp" | ||||
lines <bcp14>MUST</bcp14> only include media formats that have not b | ||||
een | ||||
excluded by the codec preferences of the associated | excluded by the codec preferences of the associated | |||
transceiver, and MUST include all currently available | transceiver and also <bcp14>MUST</bcp14> include all currently avail able | |||
formats. Media formats that were previously offered but are | formats. Media formats that were previously offered but are | |||
no longer available (e.g., a shared hardware codec) MAY be | no longer available (e.g., a shared hardware codec) <bcp14>MAY</bcp1 | |||
excluded.</t> | 4> be | |||
excluded.</li> | ||||
<t>Unless codec preferences have been set for the | <li pn="section-5.2.2-9.2">Unless codec preferences have been set fo | |||
associated transceiver, the media formats on the m= line | r the | |||
MUST be generated in the same order as in the most recent | associated transceiver, the media formats on the "m=" line | |||
<bcp14>MUST</bcp14> be generated in the same order as in the most re | ||||
cent | ||||
answer. Any media formats that were not present in the most | answer. Any media formats that were not present in the most | |||
recent answer MUST be added after all existing formats.</t> | recent answer <bcp14>MUST</bcp14> be added after all existing format | |||
s.</li> | ||||
<t>The RTP header extensions MUST only include those that | <li pn="section-5.2.2-9.3">The RTP header extensions <bcp14>MUST</bc | |||
are present in the most recent answer.</t> | p14> only include those that | |||
are present in the most recent answer.</li> | ||||
<t>The RTCP feedback mechanisms MUST only include those | <li pn="section-5.2.2-9.4">The RTCP feedback mechanisms <bcp14>MUST< | |||
/bcp14> only include those | ||||
that are present in the most recent answer, except for the | that are present in the most recent answer, except for the | |||
case of format-specific mechanisms that are referencing a | case of format-specific mechanisms that are referencing a | |||
newly-added media format.</t> | newly added media format.</li> | |||
<li pn="section-5.2.2-9.5">The "a=rtcp" line <bcp14>MUST NOT</bcp14> | ||||
<t>The "a=rtcp" line MUST NOT be added if the most recent | be added if the most recent | |||
answer included an "a=rtcp-mux" line.</t> | answer included an "a=rtcp-mux" line.</li> | |||
<li pn="section-5.2.2-9.6">The "a=rtcp-mux" line <bcp14>MUST</bcp14> | ||||
<t>The "a=rtcp-mux" line MUST be the same as that in the | be the same as that in the | |||
most recent answer.</t> | most recent answer.</li> | |||
<li pn="section-5.2.2-9.7">The "a=rtcp-mux-only" line <bcp14>MUST NO | ||||
<t>The "a=rtcp-mux-only" line MUST NOT be added.</t> | T</bcp14> be added.</li> | |||
<li pn="section-5.2.2-9.8">The "a=rtcp-rsize" line <bcp14>MUST NOT</ | ||||
<t>The "a=rtcp-rsize" line MUST NOT be added unless present | bcp14> be added unless present | |||
in the most recent answer.</t> | in the most recent answer.</li> | |||
<li pn="section-5.2.2-9.9">An "a=bundle-only" line, as defined in | ||||
<t>An "a=bundle-only" line MUST NOT be added, as indicated | <xref target="RFC8843" sectionFormat="comma" section="6" format="def | |||
in | ault" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-6" derivedContent= | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />, | "RFC8843"/>, | |||
Section 6. Instead, JSEP implementations MUST simply omit | <bcp14>MUST NOT</bcp14> be added. | |||
Instead, JSEP implementations <bcp14>MUST</bcp14> simply omit | ||||
parameters in the IDENTICAL and TRANSPORT categories for | parameters in the IDENTICAL and TRANSPORT categories for | |||
bundled m= sections, as described in | bundled "m=" sections, as described in | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />, | <xref target="RFC8843" sectionFormat="comma" section="7.1.3" format= | |||
Section 8.1.</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-7.1.3" derived | |||
Content="RFC8843"/>.</li> | ||||
<t>Note that if media m= sections are bundled into a data | <li pn="section-5.2.2-9.10">Note that if media "m=" sections are bun | |||
m= section, then certain TRANSPORT and IDENTICAL attributes | dled into a data | |||
may appear in the data m= section even if they would | "m=" section, then certain TRANSPORT and IDENTICAL attributes | |||
otherwise only be appropriate for a media m= section (e.g., | may appear in the data "m=" section even if they would | |||
otherwise only be appropriate for a media "m=" section (e.g., | ||||
"a=rtcp-mux"). This cannot happen in initial offers because | "a=rtcp-mux"). This cannot happen in initial offers because | |||
in the initial offer JSEP implementations always list media | in the initial offer JSEP implementations always list media | |||
m= sections (if any) before the data m= section (if any), | "m=" sections (if any) before the data "m=" section (if any), | |||
and at least one of those media m= sections will not have | and at least one of those media "m=" sections will not have | |||
the "a=bundle-only" attribute. Therefore, in initial | the "a=bundle-only" attribute. Therefore, in initial | |||
offers, any "a=bundle-only" m= sections will be bundled | offers, any "a=bundle-only" "m=" sections will be bundled | |||
into a preceding non-bundle-only media m= section.</t> | into a preceding non-bundle-only media "m=" section.</li> | |||
</list></t> | </ul> | |||
<t indent="0" pn="section-5.2.2-10">The "a=group:BUNDLE" attribute <bc | ||||
<t>The "a=group:BUNDLE" attribute MUST include the MID | p14>MUST</bcp14> include the MID | |||
identifiers specified in the bundle group in the most recent | identifiers specified in the bundle group in the most recent | |||
answer, minus any m= sections that have been marked as | answer, minus any "m=" sections that have been marked as | |||
rejected, plus any newly added or re-enabled m= sections. In | rejected, plus any newly added or re-enabled "m=" sections. In | |||
other words, the bundle attribute must contain all m= | other words, the bundle attribute <bcp14>MUST</bcp14> contain all "m=" | |||
sections that were previously bundled, as long as they are | sections that were previously bundled, as long as they are | |||
still alive, as well as any new m= sections.</t> | still alive, as well as any new "m=" sections.</t> | |||
<t indent="0" pn="section-5.2.2-11">"a=group:LS" attributes are genera | ||||
<t>"a=group:LS" attributes are generated in the same way as | ted in the same way as | |||
for initial offers, with the additional stipulation that any | for initial offers, with the additional stipulation that any | |||
lip sync groups that were present in the most recent answer | lip sync groups that were present in the most recent answer | |||
MUST continue to exist and MUST contain any previously | <bcp14>MUST</bcp14> continue to exist and <bcp14>MUST</bcp14> contain | |||
existing MID identifiers, as long as the identified m= | any previously | |||
existing MID identifiers, as long as the identified "m=" | ||||
sections still exist and are not rejected, and the group | sections still exist and are not rejected, and the group | |||
still contains at least two MID identifiers. This ensures | still contains at least two MID identifiers. This ensures | |||
that any synchronized "recvonly" m= sections continue to be | that any synchronized "recvonly" "m=" sections continue to be | |||
synchronized in the new offer.</t> | synchronized in the new offer.</t> | |||
</section> | </section> | |||
<section title="Options Handling" | <section anchor="sec.options-handling1" numbered="true" toc="include" re | |||
anchor="sec.options-handling1"> | moveInRFC="false" pn="section-5.2.3"> | |||
<name slugifiedName="name-options-handling">Options Handling</name> | ||||
<t>The createOffer method takes as a parameter an | <t indent="0" pn="section-5.2.3-1">The createOffer method takes as a p | |||
arameter an | ||||
RTCOfferOptions object. Special processing is performed when | RTCOfferOptions object. Special processing is performed when | |||
generating a SDP description if the following options are | generating an SDP description if the following options are | |||
present.</t> | present.</t> | |||
<section title="IceRestart" anchor="sec.icerestart"> | <section anchor="sec.icerestart" numbered="true" toc="include" removeI | |||
nRFC="false" pn="section-5.2.3.1"> | ||||
<t>If the "IceRestart" option is specified, with a value of | <name slugifiedName="name-icerestart">IceRestart</name> | |||
"true", the offer MUST indicate an ICE restart by | <t indent="0" pn="section-5.2.3.1-1">If the IceRestart option is spe | |||
cified, with a value of | ||||
"true", the offer <bcp14>MUST</bcp14> indicate an ICE restart by | ||||
generating new ICE ufrag and pwd attributes, as specified | generating new ICE ufrag and pwd attributes, as specified | |||
in | in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp"></xref>, | <xref target="RFC8839" sectionFormat="comma" section="4.4.3.1.1" for | |||
Section 3.4.1.1.1. If this | mat="default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-4.4.3.1.1" | |||
derivedContent="RFC8839"/>. If this | ||||
option is specified on an initial offer, it has no effect | option is specified on an initial offer, it has no effect | |||
(since a new ICE ufrag and pwd are already generated). | (since a new ICE ufrag and pwd are already generated). | |||
Similarly, if the ICE configuration has changed, this | Similarly, if the ICE configuration has changed, this | |||
option has no effect, since new ufrag and pwd attributes | option has no effect, since new ufrag and pwd attributes | |||
will be generated automatically. This option is primarily | will be generated automatically. This option is primarily | |||
useful for reestablishing connectivity in cases where | useful for reestablishing connectivity in cases where | |||
failures are detected by the application.</t> | failures are detected by the application.</t> | |||
</section> | </section> | |||
<section title="VoiceActivityDetection" | <section anchor="sec.voiceactivitydetection1" numbered="true" toc="inc | |||
anchor="sec.voiceactivitydetection1"> | lude" removeInRFC="false" pn="section-5.2.3.2"> | |||
<name slugifiedName="name-voiceactivitydetection">VoiceActivityDetec | ||||
<t>Silence suppression, also known as discontinuous | tion</name> | |||
<t indent="0" pn="section-5.2.3.2-1">Silence suppression, also known | ||||
as discontinuous | ||||
transmission ("DTX"), can reduce the bandwidth used for | transmission ("DTX"), can reduce the bandwidth used for | |||
audio by switching to a special encoding when voice | audio by switching to a special encoding when voice | |||
activity is not detected, at the cost of some fidelity.</t> | activity is not detected, at the cost of some fidelity.</t> | |||
<t indent="0" pn="section-5.2.3.2-2">If the "VoiceActivityDetection" | ||||
<t>If the "VoiceActivityDetection" option is specified, | option is specified, | |||
with a value of "true", the offer MUST indicate support for | with a value of "true", the offer <bcp14>MUST</bcp14> indicate suppo | |||
rt for | ||||
silence suppression in the audio it receives by including | silence suppression in the audio it receives by including | |||
comfort noise ("CN") codecs for each offered audio codec, | comfort noise ("CN") codecs for each offered audio codec, | |||
as specified in | as specified in | |||
<xref target="RFC3389"></xref>, Section 5.1, except for | <xref target="RFC3389" sectionFormat="comma" section="5.1" format="d efault" derivedLink="https://rfc-editor.org/rfc/rfc3389#section-5.1" derivedCont ent="RFC3389"/>, except for | |||
codecs that have their own internal silence suppression | codecs that have their own internal silence suppression | |||
support. For codecs that have their own internal silence | support. For codecs that have their own internal silence | |||
suppression support, the appropriate fmtp parameters for | suppression support, the appropriate fmtp parameters for | |||
that codec MUST be specified to indicate that silence | that codec <bcp14>MUST</bcp14> be specified to indicate that silence | |||
suppression for received audio is desired. For example, | suppression for received audio is desired. For example, | |||
when using the Opus codec | when using the Opus codec | |||
<xref target="RFC6716" />, the "usedtx=1" parameter, | <xref target="RFC6716" format="default" sectionFormat="of" derivedCo ntent="RFC6716"/>, the "usedtx=1" parameter, | |||
specified in | specified in | |||
<xref target="RFC7587" />, would be used in the offer.</t> | <xref target="RFC7587" format="default" sectionFormat="of" derivedCo | |||
ntent="RFC7587"/>, would be used in the offer.</t> | ||||
<t>If the "VoiceActivityDetection" option is specified, | <t indent="0" pn="section-5.2.3.2-3">If the "VoiceActivityDetection" | |||
with a value of "false", the JSEP implementation MUST NOT | option is specified, | |||
with a value of "false", the JSEP implementation <bcp14>MUST NOT</bc | ||||
p14> | ||||
emit "CN" codecs. For codecs that have their own internal | emit "CN" codecs. For codecs that have their own internal | |||
silence suppression support, the appropriate fmtp | silence suppression support, the appropriate fmtp | |||
parameters for that codec MUST be specified to indicate | parameters for that codec <bcp14>MUST</bcp14> be specified to indica te | |||
that silence suppression for received audio is not desired. | that silence suppression for received audio is not desired. | |||
For example, when using the Opus codec, the "usedtx=0" | For example, when using the Opus codec, the "usedtx=0" | |||
parameter would be specified in the offer. In addition, the | parameter would be specified in the offer. In addition, the | |||
implementation MUST NOT use silence suppression for media | implementation <bcp14>MUST NOT</bcp14> use silence suppression for m edia | |||
it generates, regardless of whether the "CN" codecs or | it generates, regardless of whether the "CN" codecs or | |||
related fmtp parameters appear in the peer's description. | related fmtp parameters appear in the peer's description. | |||
The impact of these rules is that silence suppression in | The impact of these rules is that silence suppression in | |||
JSEP depends on mutual agreement of both sides, which | JSEP depends on mutual agreement of both sides, which | |||
ensures consistent handling regardless of which codec is | ensures consistent handling regardless of which codec is | |||
used.</t> | used.</t> | |||
<t indent="0" pn="section-5.2.3.2-4">The "VoiceActivityDetection" op | ||||
<t>The "VoiceActivityDetection" option does not have any | tion does not have any | |||
impact on the setting of the "vad" value in the signaling | impact on the setting of the "vad" value in the signaling | |||
of the client to mixer audio level header extension | of the client-to-mixer audio level header extension | |||
described in | described in | |||
<xref target="RFC6464"></xref>, Section 4.</t> | <xref target="RFC6464" sectionFormat="comma" section="4" format="def ault" derivedLink="https://rfc-editor.org/rfc/rfc6464#section-4" derivedContent= "RFC6464"/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Generating an Answer" | <section anchor="sec.generating-an-answer" numbered="true" toc="include" r | |||
anchor="sec.generating-an-answer"> | emoveInRFC="false" pn="section-5.3"> | |||
<name slugifiedName="name-generating-an-answer">Generating an Answer</na | ||||
<t>When createAnswer is called, a new SDP description must be | me> | |||
<t indent="0" pn="section-5.3-1">When createAnswer is called, a new SDP | ||||
description <bcp14>MUST</bcp14> be | ||||
created that is compatible with the supplied remote description | created that is compatible with the supplied remote description | |||
as well as the requirements specified in | as well as the requirements specified in | |||
<xref target="I-D.ietf-rtcweb-rtp-usage"></xref>. The exact | <xref target="RFC8834" format="default" sectionFormat="of" derivedConten t="RFC8834"/>. The exact | |||
details of this process are explained below.</t> | details of this process are explained below.</t> | |||
<section title="Initial Answers" anchor="sec.initial-answers"> | <section anchor="sec.initial-answers" numbered="true" toc="include" remo | |||
veInRFC="false" pn="section-5.3.1"> | ||||
<t>When createAnswer is called for the first time after a | <name slugifiedName="name-initial-answers">Initial Answers</name> | |||
<t indent="0" pn="section-5.3.1-1">When createAnswer is called for the | ||||
first time after a | ||||
remote description has been provided, the result is known as | remote description has been provided, the result is known as | |||
the initial answer. If no remote description has been | the initial answer. If no remote description has been | |||
installed, an answer cannot be generated, and an error MUST | installed, an answer cannot be generated, and an error <bcp14>MUST</bc p14> | |||
be returned.</t> | be returned.</t> | |||
<t indent="0" pn="section-5.3.1-2">Note that the remote description SD | ||||
<t>Note that the remote description SDP may not have been | P may not have been | |||
created by a JSEP endpoint and may not conform to all the | created by a JSEP endpoint and may not conform to all the | |||
requirements listed in | requirements listed in | |||
<xref target="sec-create-offer"></xref>. For many cases, this | <xref target="sec-create-offer" format="default" sectionFormat="of" de rivedContent="Section 5.2"/>. For many cases, this | |||
is not a problem. However, if any mandatory SDP attributes | is not a problem. However, if any mandatory SDP attributes | |||
are missing, or functionality listed as mandatory-to-use | are missing or functionality listed as mandatory-to-use | |||
above is not present, this MUST be treated as an error, and | above is not present, this <bcp14>MUST</bcp14> be treated as an error | |||
MUST cause the affected m= sections to be marked as | and | |||
<bcp14>MUST</bcp14> cause the affected "m=" sections to be marked as | ||||
rejected.</t> | rejected.</t> | |||
<t indent="0" pn="section-5.3.1-3">The first step in generating an ini | ||||
<t>The first step in generating an initial answer is to | tial answer is to | |||
generate session-level attributes. The process here is | generate session-level attributes. The process here is | |||
identical to that indicated in the initial offers section | identical to that indicated in <xref target="sec.initial-offers" forma | |||
above, except that the "a=ice-options" line, with the | t="default" sectionFormat="of" derivedContent="Section 5.2.1"/> above, except th | |||
at the "a=ice-options" line, with the | ||||
"trickle" option as specified in | "trickle" option as specified in | |||
<xref target="I-D.ietf-ice-trickle"></xref>, Section 3, | <xref target="RFC8840" sectionFormat="comma" section="4.1.3" format="d efault" derivedLink="https://rfc-editor.org/rfc/rfc8840#section-4.1.3" derivedCo ntent="RFC8840"/> | |||
and the "ice2" option as specified in | and the "ice2" option as specified in | |||
<xref target="RFC8445"></xref>, Section 10, is | <xref target="RFC8445" sectionFormat="comma" section="10" format="defa ult" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-10" derivedContent= "RFC8445"/>, is | |||
only included if such an option was present in the offer.</t> | only included if such an option was present in the offer.</t> | |||
<t indent="0" pn="section-5.3.1-4">The next step is to generate sessio | ||||
<t>The next step is to generate session-level lip sync | n-level lip sync | |||
groups, as defined in | groups, as defined in | |||
<xref target="RFC5888" />, Section 7. For each group of type | <xref target="RFC5888" sectionFormat="comma" section="7" format="defau lt" derivedLink="https://rfc-editor.org/rfc/rfc5888#section-7" derivedContent="R FC5888"/>. For each group of type | |||
"LS" present in the offer, select the local RtpTransceivers | "LS" present in the offer, select the local RtpTransceivers | |||
that are referenced by the MID values in the specified group, | that are referenced by the MID values in the specified group, | |||
and determine which of them either reference a common local | and determine which of them either reference a common local | |||
MediaStream (specified in the calls to | MediaStream (specified in the calls to | |||
addTrack/addTransceiver used to create them), or have no | addTrack/addTransceiver used to create them) or have no | |||
MediaStream to reference because they were not created by | MediaStream to reference because they were not created by | |||
addTrack/addTransceiver. If at least two such RtpTransceivers | addTrack/addTransceiver. If at least two such RtpTransceivers | |||
exist, a group of type "LS" with the mid values of these | exist, a group of type "LS" with the MID values of these | |||
RtpTransceivers MUST be added. Otherwise the offered "LS" | RtpTransceivers <bcp14>MUST</bcp14> be added. Otherwise, the offered " | |||
group MUST be ignored and no corresponding group generated in | LS" | |||
group <bcp14>MUST</bcp14> be ignored and no corresponding group genera | ||||
ted in | ||||
the answer.</t> | the answer.</t> | |||
<t indent="0" pn="section-5.3.1-5">As a simple example, consider the f | ||||
<t>As a simple example, consider the following offer of a | ollowing offer of a | |||
single audio and single video track contained in the same | single audio and single video track contained in the same | |||
MediaStream. SDP lines not relevant to this example have been | MediaStream. SDP lines not relevant to this example have been | |||
removed for clarity. As explained in | removed for clarity. As explained in | |||
<xref target="sec-create-offer" />, a group of type "LS" has | <xref target="sec-create-offer" format="default" sectionFormat="of" de rivedContent="Section 5.2"/>, a group of type "LS" has | |||
been added that references each track's RtpTransceiver.</t> | been added that references each track's RtpTransceiver.</t> | |||
<sourcecode name="" type="sdp" markers="false" pn="section-5.3.1-6"> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 10000 UDP/TLS/RTP/SAVPF 0 | m=audio 10000 UDP/TLS/RTP/SAVPF 0 | |||
a=mid:a1 | a=mid:a1 | |||
a=msid:ms1 | a=msid:ms1 | |||
m=video 10001 UDP/TLS/RTP/SAVPF 96 | m=video 10001 UDP/TLS/RTP/SAVPF 96 | |||
a=mid:v1 | a=mid:v1 | |||
a=msid:ms1 | a=msid:ms1</sourcecode> | |||
]]> | <t indent="0" pn="section-5.3.1-7">If the answerer uses a single Media | |||
</artwork> | Stream when it adds its | |||
</figure> | ||||
</t> | ||||
<t>If the answerer uses a single MediaStream when it adds its | ||||
tracks, both of its transceivers will reference this stream, | tracks, both of its transceivers will reference this stream, | |||
and so the subsequent answer will contain a "LS" group | and so the subsequent answer will contain a "LS" group | |||
identical to that in the offer, as shown below:</t> | identical to that in the offer, as shown below:</t> | |||
<sourcecode name="" type="sdp" markers="false" pn="section-5.3.1-8"> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 20000 UDP/TLS/RTP/SAVPF 0 | m=audio 20000 UDP/TLS/RTP/SAVPF 0 | |||
a=mid:a1 | a=mid:a1 | |||
a=msid:ms2 | a=msid:ms2 | |||
m=video 20001 UDP/TLS/RTP/SAVPF 96 | m=video 20001 UDP/TLS/RTP/SAVPF 96 | |||
a=mid:v1 | a=mid:v1 | |||
a=msid:ms2 | a=msid:ms2</sourcecode> | |||
]]> | <t indent="0" pn="section-5.3.1-9">However, if the answerer groups its | |||
</artwork> | tracks into separate | |||
</figure> | ||||
</t> | ||||
<t>However, if the answerer groups its tracks into separate | ||||
MediaStreams, its transceivers will reference different | MediaStreams, its transceivers will reference different | |||
streams, and so the subsequent answer will not contain a "LS" | streams, and so the subsequent answer will not contain a "LS" | |||
group.</t> | group.</t> | |||
<sourcecode name="" type="sdp" markers="false" pn="section-5.3.1-10"> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
m=audio 20000 UDP/TLS/RTP/SAVPF 0 | m=audio 20000 UDP/TLS/RTP/SAVPF 0 | |||
a=mid:a1 | a=mid:a1 | |||
a=msid:ms2a | a=msid:ms2a | |||
m=video 20001 UDP/TLS/RTP/SAVPF 96 | m=video 20001 UDP/TLS/RTP/SAVPF 96 | |||
a=mid:v1 | a=mid:v1 | |||
a=msid:ms2b | a=msid:ms2b</sourcecode> | |||
]]> | <t indent="0" pn="section-5.3.1-11">Finally, if the answerer does not | |||
</artwork> | add any tracks, its | |||
</figure> | ||||
</t> | ||||
<t>Finally, if the answerer does not add any tracks, its | ||||
transceivers will not reference any MediaStreams, causing the | transceivers will not reference any MediaStreams, causing the | |||
preferences of the offerer to be maintained, and so the | preferences of the offerer to be maintained, and so the | |||
subsequent answer will contain an identical "LS" group.</t> | subsequent answer will contain an identical "LS" group.</t> | |||
<sourcecode name="" type="sdp" markers="false" pn="section-5.3.1-12"> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 20000 UDP/TLS/RTP/SAVPF 0 | m=audio 20000 UDP/TLS/RTP/SAVPF 0 | |||
a=mid:a1 | a=mid:a1 | |||
a=recvonly | a=recvonly | |||
m=video 20001 UDP/TLS/RTP/SAVPF 96 | m=video 20001 UDP/TLS/RTP/SAVPF 96 | |||
a=mid:v1 | a=mid:v1 | |||
a=recvonly | a=recvonly</sourcecode> | |||
]]> | <t indent="0" pn="section-5.3.1-13">The example in <xref target="sec.d | |||
</artwork> | etailed-example" format="default" sectionFormat="of" derivedContent="Section 7.2 | |||
</figure> | "/> shows a more involved case of "LS" group | |||
</t> | ||||
<t>The | ||||
<xref target="sec.detailed-example" /> example later in this | ||||
document shows a more involved case of "LS" group | ||||
generation.</t> | generation.</t> | |||
<t indent="0" pn="section-5.3.1-14">The next step is to generate an "m | ||||
<t>The next step is to generate m= sections for each m= | =" section for each "m=" | |||
section that is present in the remote offer, as specified in | section that is present in the remote offer, as specified in | |||
<xref target="RFC3264"></xref>, Section 6. For the purposes | <xref target="RFC3264" sectionFormat="comma" section="6" format="defau lt" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-6" derivedContent="R FC3264"/>. For the purposes | |||
of this discussion, any session-level attributes in the offer | of this discussion, any session-level attributes in the offer | |||
that are also valid as media-level attributes are considered | that are also valid as media-level attributes are considered | |||
to be present in each m= section. Each offered m= section | to be present in each "m=" section. Each offered "m=" section | |||
will have an associated RtpTransceiver, as described in | will have an associated RtpTransceiver, as described in | |||
<xref target="sec.applying-a-remote-desc" />. If there are | <xref target="sec.applying-a-remote-desc" format="default" sectionForm | |||
more RtpTransceivers than there are m= sections, the | at="of" derivedContent="Section 5.10"/>. If there are | |||
more RtpTransceivers than there are "m=" sections, the | ||||
unmatched RtpTransceivers will need to be associated in a | unmatched RtpTransceivers will need to be associated in a | |||
subsequent offer.</t> | subsequent offer.</t> | |||
<t indent="0" pn="section-5.3.1-15">For each offered "m=" section, if | ||||
<t>For each offered m= section, if any of the following | any of the following | |||
conditions are true, the corresponding m= section in the | conditions are true, the corresponding "m=" section in the | |||
answer MUST be marked as rejected by setting the port in the | answer <bcp14>MUST</bcp14> be marked as rejected by setting the <po | |||
m= line to zero, as indicated in | rt> in the | |||
<xref target="RFC3264"></xref>, Section 6, and further | "m=" line to zero, as indicated in | |||
processing for this m= section can be skipped: | <xref target="RFC3264" sectionFormat="comma" section="6" format="defau | |||
<list style="symbols"> | lt" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-6" derivedContent="R | |||
FC3264"/>, and further | ||||
<t>The associated RtpTransceiver has been stopped.</t> | processing for this "m=" section can be skipped: | |||
</t> | ||||
<t>None of the offered media formats are supported and, if | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section | |||
applicable, allowed by codec preferences.</t> | -5.3.1-16"> | |||
<li pn="section-5.3.1-16.1">The associated RtpTransceiver has been s | ||||
<t>The bundle policy is "max-bundle", and this is not the | topped.</li> | |||
first m= section or in the same bundle group as the first | <li pn="section-5.3.1-16.2">There is no offered media format that is | |||
m= section.</t> | both supported | |||
and, if applicable, allowed by codec preferences.</li> | ||||
<t>The bundle policy is "balanced", and this is not the | <li pn="section-5.3.1-16.3">The bundle policy is "max-bundle", and t | |||
first m= section for this media type or in the same bundle | his is not the | |||
group as the first m= section for this media type.</t> | first "m=" section or in the same bundle group as the first | |||
"m=" section.</li> | ||||
<t>This m= section is in a bundle group, and the group's | <li pn="section-5.3.1-16.4">The bundle policy is "balanced", and thi | |||
offerer tagged m= section is being rejected due to one of | s is not the | |||
the above reasons. This requires all m= sections in the | first "m=" section for this media type or in the same bundle | |||
group as the first "m=" section for this media type.</li> | ||||
<li pn="section-5.3.1-16.5">This "m=" section is in a bundle group, | ||||
and the group's | ||||
offerer tagged "m=" section is being rejected due to one of | ||||
the above reasons. This requires all "m=" sections in the | ||||
bundle group to be rejected, as specified in | bundle group to be rejected, as specified in | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />, | <xref target="RFC8843" sectionFormat="comma" section="7.3.3" format= | |||
Section 7.3.3.</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-7.3.3" derived | |||
</list></t> | Content="RFC8843"/>.</li> | |||
</ul> | ||||
<t>Otherwise, each m= section in the answer should then be | <t indent="0" pn="section-5.3.1-17">Otherwise, each "m=" section in th | |||
e answer <bcp14>MUST</bcp14> then be | ||||
generated as specified in | generated as specified in | |||
<xref target="RFC3264"></xref>, Section 6.1. For the m= line | <xref target="RFC3264" sectionFormat="comma" section="6.1" format="def | |||
itself, the following rules must be followed: | ault" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-6.1" derivedConten | |||
<list style="symbols"> | t="RFC3264"/>. For the "m=" line | |||
itself, the following rules <bcp14>MUST</bcp14> be followed:</t> | ||||
<t>The port value would normally be set to the port of the | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section | |||
default ICE candidate for this m= section, but given that | -5.3.1-18"> | |||
no candidates are available yet, the "dummy" port value of | <li pn="section-5.3.1-18.1">The <port> value would normally be | |||
9 (Discard) MUST be used, as indicated in | set to the port of the | |||
<xref target="I-D.ietf-ice-trickle"></xref>, Section | default ICE candidate for this "m=" section, but given that | |||
5.1.</t> | no candidates are available yet, the default <port> value of | |||
9 (Discard) <bcp14>MUST</bcp14> be used, as indicated in | ||||
<t>The <proto> field MUST be set to exactly match the | <xref target="RFC8840" sectionFormat="comma" section="4.1.1" format= | |||
<proto> field for the corresponding m= line in the | "default" derivedLink="https://rfc-editor.org/rfc/rfc8840#section-4.1.1" derived | |||
offer.</t> | Content="RFC8840"/>.</li> | |||
<li pn="section-5.3.1-18.2">The <proto> field <bcp14>MUST</bcp | ||||
<t>If codec preferences have been set for the associated | 14> be set to exactly match the | |||
transceiver, media formats MUST be generated in the | <proto> field for the corresponding "m=" line in the | |||
offer.</li> | ||||
<li pn="section-5.3.1-18.3">If codec preferences have been set for t | ||||
he associated | ||||
transceiver, media formats <bcp14>MUST</bcp14> be generated in the | ||||
corresponding order, regardless of what was offered, and | corresponding order, regardless of what was offered, and | |||
MUST exclude any codecs not present in the codec | <bcp14>MUST</bcp14> exclude any codecs not present in the codec | |||
preferences.</t> | preferences.</li> | |||
<li pn="section-5.3.1-18.4">Otherwise, the media formats on the "m=" | ||||
<t>Otherwise, the media formats on the m= line MUST be | line <bcp14>MUST</bcp14> be | |||
generated in the same order as those offered in the current | generated in the same order as those offered in the current | |||
remote description, excluding any currently unsupported | remote description, excluding any currently unsupported | |||
formats. Any currently available media formats that are not | formats. Any currently available media formats that are not | |||
present in the current remote description MUST be added | present in the current remote description <bcp14>MUST</bcp14> be add | |||
after all existing formats.</t> | ed | |||
after all existing formats.</li> | ||||
<t>In either case, the media formats in the answer MUST | <li pn="section-5.3.1-18.5">In either case, the media formats in the | |||
include at least one format that is present in the offer, | answer <bcp14>MUST</bcp14> | |||
but MAY include formats that are locally supported but not | include at least one format that is present in the offer | |||
but <bcp14>MAY</bcp14> include formats that are locally supported bu | ||||
t not | ||||
present in the offer, as mentioned in | present in the offer, as mentioned in | |||
<xref target="RFC3264" />, Section 6.1. If no common format | <xref target="RFC3264" sectionFormat="comma" section="6.1" format="d | |||
exists, the m= section is rejected as described above.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-6.1" derivedCont | |||
</list></t> | ent="RFC3264"/>. If no common format | |||
exists, the "m=" section is rejected as described above.</li> | ||||
<t>The m= line MUST be followed immediately by a "c=" line, | </ul> | |||
<t indent="0" pn="section-5.3.1-19">The "m=" line <bcp14>MUST</bcp14> | ||||
be followed immediately by a "c=" line, | ||||
as specified in | as specified in | |||
<xref target="RFC4566"></xref>, Section 5.7. Again, as no | <xref target="RFC4566" sectionFormat="comma" section="5.7" format="def | |||
candidates are available yet, the "c=" line must contain the | ault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.7" derivedConten | |||
"dummy" value "IN IP4 0.0.0.0", as defined in | t="RFC4566"/>. Again, as no | |||
<xref target="I-D.ietf-ice-trickle"></xref>, Section 5.1.</t> | candidates are available yet, the "c=" line <bcp14>MUST</bcp14> contai | |||
n the | ||||
<t>If the offer supports bundle, all m= sections to be | default value "IN IP4 0.0.0.0", as defined in | |||
bundled must use the same ICE credentials and candidates; all | <xref target="RFC8840" sectionFormat="comma" section="4.1.3" format="d | |||
m= sections not being bundled must use unique ICE credentials | efault" derivedLink="https://rfc-editor.org/rfc/rfc8840#section-4.1.3" derivedCo | |||
and candidates. Each m= section MUST contain the following | ntent="RFC8840"/>.</t> | |||
<t indent="0" pn="section-5.3.1-20">If the offer supports bundle, all | ||||
"m=" sections to be | ||||
bundled <bcp14>MUST</bcp14> use the same ICE credentials and candidate | ||||
s; all | ||||
"m=" sections not being bundled <bcp14>MUST</bcp14> use unique ICE cre | ||||
dentials | ||||
and candidates. Each "m=" section <bcp14>MUST</bcp14> contain the foll | ||||
owing | ||||
attributes (which are of attribute types other than IDENTICAL | attributes (which are of attribute types other than IDENTICAL | |||
and TRANSPORT): | or TRANSPORT): | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>If and only if present in the offer, an "a=mid" line, as | -5.3.1-21"> | |||
<li pn="section-5.3.1-21.1">If and only if present in the offer, an | ||||
"a=mid" line, as | ||||
specified in | specified in | |||
<xref target="RFC5888"></xref>, Section 9.1. The "mid" | <xref target="RFC5888" sectionFormat="comma" section="9.1" format="d | |||
value MUST match that specified in the offer.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc5888#section-9.1" derivedCont | |||
ent="RFC5888"/>. The MID | ||||
<t>A direction attribute, determined by applying the rules | value <bcp14>MUST</bcp14> match that specified in the offer.</li> | |||
<li pn="section-5.3.1-21.2">A direction attribute, determined by app | ||||
lying the rules | ||||
regarding the offered direction specified in | regarding the offered direction specified in | |||
<xref target="RFC3264" />, Section 6.1, and then | <xref target="RFC3264" sectionFormat="comma" section="6.1" format="d efault" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-6.1" derivedCont ent="RFC3264"/>, and then | |||
intersecting with the direction of the associated | intersecting with the direction of the associated | |||
RtpTransceiver. For example, in the case where an m= | RtpTransceiver. For example, in the case where an "m=" | |||
section is offered as "sendonly", and the local transceiver | section is offered as "sendonly" and the local transceiver | |||
is set to "sendrecv", the result in the answer is a | is set to "sendrecv", the result in the answer is a | |||
"recvonly" direction.</t> | "recvonly" direction.</li> | |||
<li pn="section-5.3.1-21.3">For each media format on the "m=" line, | ||||
<t>For each media format on the m= line, "a=rtpmap" and | "a=rtpmap" and "a=fmtp" lines, as specified in | |||
"a=fmtp" lines, as specified in | <xref target="RFC4566" sectionFormat="comma" section="6" format="def | |||
<xref target="RFC4566"></xref>, Section 6, and | ault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent= | |||
<xref target="RFC3264"></xref>, Section 6.1.</t> | "RFC4566"/> and | |||
<xref target="RFC3264" sectionFormat="comma" section="6.1" format="d | ||||
<t>If "rtx" is present in the offer, for each primary codec | efault" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-6.1" derivedCont | |||
ent="RFC3264"/>.</li> | ||||
<li pn="section-5.3.1-21.4">If "rtx" is present in the offer, for ea | ||||
ch primary codec | ||||
where RTP retransmission should be used, a corresponding | where RTP retransmission should be used, a corresponding | |||
"a=rtpmap" line indicating "rtx" with the clock rate of the | "a=rtpmap" line indicating "rtx" with the clock rate of the | |||
primary codec and an "a=fmtp" line that references the | primary codec and an "a=fmtp" line that references the | |||
payload type of the primary codec, as specified in | payload type of the primary codec, as specified in | |||
<xref target="RFC4588"></xref>, Section 8.1.</t> | <xref target="RFC4588" sectionFormat="comma" section="8.1" format="d | |||
efault" derivedLink="https://rfc-editor.org/rfc/rfc4588#section-8.1" derivedCont | ||||
<t>For each supported FEC mechanism, "a=rtpmap" and | ent="RFC4588"/>.</li> | |||
<li pn="section-5.3.1-21.5">For each supported FEC mechanism, "a=rtp | ||||
map" and | ||||
"a=fmtp" lines, as specified in | "a=fmtp" lines, as specified in | |||
<xref target="RFC4566"></xref>, Section 6. The FEC | <xref target="RFC4566" sectionFormat="comma" section="6" format="def | |||
mechanisms that MUST be supported are specified in | ault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent= | |||
<xref target="I-D.ietf-rtcweb-fec"></xref>, Section 6, and | "RFC4566"/>. The FEC | |||
mechanisms that <bcp14>MUST</bcp14> be supported are specified in | ||||
<xref target="RFC8854" sectionFormat="comma" section="7" format="def | ||||
ault" derivedLink="https://rfc-editor.org/rfc/rfc8854#section-7" derivedContent= | ||||
"RFC8854"/>, and | ||||
specific usage for each media type is outlined in Sections | specific usage for each media type is outlined in Sections | |||
4 and 5.</t> | <xref target="sec.interface" format="counter" sectionFormat="of" der | |||
ivedContent="4"/> and <xref target="sec.sdp-interaction-procedure" format="count | ||||
<t>If this m= section is for media with configurable | er" sectionFormat="of" derivedContent="5"/>.</li> | |||
<li pn="section-5.3.1-21.6">If this "m=" section is for media with c | ||||
onfigurable | ||||
durations of media per packet, e.g., audio, an "a=maxptime" | durations of media per packet, e.g., audio, an "a=maxptime" | |||
line, as described in | line, as described in | |||
<xref target="sec-create-offer" />.</t> | <xref target="sec-create-offer" format="default" sectionFormat="of" | |||
derivedContent="Section 5.2"/>.</li> | ||||
<t>If this m= section is for video media, and there are | <li pn="section-5.3.1-21.7">If this "m=" section is for video media | |||
known limitations on the size of images which can be | and there are | |||
known limitations on the size of images that can be | ||||
decoded, an "a=imageattr" line, as specified in | decoded, an "a=imageattr" line, as specified in | |||
<xref target="sec.imageattr"></xref>.</t> | <xref target="sec.imageattr" format="default" sectionFormat="of" der | |||
ivedContent="Section 3.6"/>.</li> | ||||
<t>For each supported RTP header extension that is present | <li pn="section-5.3.1-21.8">For each supported RTP header extension | |||
that is present | ||||
in the offer, an "a=extmap" line, as specified in | in the offer, an "a=extmap" line, as specified in | |||
<xref target="RFC5285"></xref>, Section 5. The list of | <xref target="RFC5285" sectionFormat="comma" section="5" format="def | |||
header extensions that SHOULD/MUST be supported is | ault" derivedLink="https://rfc-editor.org/rfc/rfc5285#section-5" derivedContent= | |||
"RFC5285"/>. The list of | ||||
header extensions that <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp14> be | ||||
supported is | ||||
specified in | specified in | |||
<xref target="I-D.ietf-rtcweb-rtp-usage"></xref>, Section | <xref target="RFC8834" sectionFormat="comma" section="5.2" format="d | |||
5.2. Any header extensions that require encryption MUST be | efault" derivedLink="https://rfc-editor.org/rfc/rfc8834#section-5.2" derivedCont | |||
ent="RFC8834"/>. Any header extensions that require encryption <bcp14>MUST</bcp1 | ||||
4> be | ||||
specified as indicated in | specified as indicated in | |||
<xref target="RFC6904"></xref>, Section 4.</t> | <xref target="RFC6904" sectionFormat="comma" section="4" format="def | |||
ault" derivedLink="https://rfc-editor.org/rfc/rfc6904#section-4" derivedContent= | ||||
<t>For each supported RTCP feedback mechanism that is | "RFC6904"/>.</li> | |||
<li pn="section-5.3.1-21.9">For each supported RTCP feedback mechani | ||||
sm that is | ||||
present in the offer, an "a=rtcp-fb" line, as specified in | present in the offer, an "a=rtcp-fb" line, as specified in | |||
<xref target="RFC4585"></xref>, Section 4.2. The list of | <xref target="RFC4585" sectionFormat="comma" section="4.2" format="d | |||
RTCP feedback mechanisms that SHOULD/MUST be supported is | efault" derivedLink="https://rfc-editor.org/rfc/rfc4585#section-4.2" derivedCont | |||
ent="RFC4585"/>. The list of | ||||
RTCP feedback mechanisms that <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp | ||||
14> be supported is | ||||
specified in | specified in | |||
<xref target="I-D.ietf-rtcweb-rtp-usage"></xref>, Section | <xref target="RFC8834" sectionFormat="comma" section="5.1" format="d | |||
5.1.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8834#section-5.1" derivedCont | |||
ent="RFC8834"/>.</li> | ||||
<t>If the RtpTransceiver has a sendrecv or sendonly | <li pn="section-5.3.1-21.10"> | |||
<t indent="0" pn="section-5.3.1-21.10.1">If the RtpTransceiver has | ||||
a sendrecv or sendonly | ||||
direction: | direction: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="sec | ||||
<t>For each MediaStream that was associated with the | tion-5.3.1-21.10.2"> | |||
<li pn="section-5.3.1-21.10.2.1">For each MediaStream that was a | ||||
ssociated with the | ||||
transceiver when it was created via addTrack or | transceiver when it was created via addTrack or | |||
addTransceiver, an "a=msid" line, as specified in | addTransceiver, an "a=msid" line, as specified in | |||
<xref target="I-D.ietf-mmusic-msid"></xref>, Section 2, | <xref target="RFC8830" sectionFormat="comma" section="2" format="d | |||
but omitting the "appdata" field.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8830#section-2" derivedConten | |||
</list></t> | t="RFC8830"/>, | |||
</list></t> | but omitting the "appdata" field.</li> | |||
</ul> | ||||
<t>Each m= section which is not bundled into another m= | </li> | |||
section, MUST contain the following attributes (which are of | </ul> | |||
<t indent="0" pn="section-5.3.1-22">Each "m=" section that is not bund | ||||
led into another "m=" | ||||
section <bcp14>MUST</bcp14> contain the following attributes (which ar | ||||
e of | ||||
category IDENTICAL or TRANSPORT):</t> | category IDENTICAL or TRANSPORT):</t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t> | -5.3.1-23"> | |||
<list style="symbols"> | <li pn="section-5.3.1-23.1">"a=ice-ufrag" and "a=ice-pwd" lines, as | |||
specified in | ||||
<t>"a=ice-ufrag" and "a=ice-pwd" lines, as specified in | <xref target="RFC8839" sectionFormat="comma" section="5.4" format= | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp"></xref>, | "default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedCo | |||
Section 4.4.</t> | ntent="RFC8839"/>.</li> | |||
<li pn="section-5.3.1-23.2">For each desired digest algorithm, one o | ||||
<t>For each desired digest algorithm, one or more | r more | |||
"a=fingerprint" lines for each of the endpoint's | "a=fingerprint" lines for each of the endpoint's | |||
certificates, as specified in | certificates, as specified in | |||
<xref target="RFC8122"></xref>, Section 5.</t> | <xref target="RFC8122" sectionFormat="comma" section="5" format="d | |||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8122#section-5" derivedConten | ||||
<t>An "a=setup" line, as specified in | t="RFC8122"/>.</li> | |||
<xref target="RFC4145"></xref>, Section 4, and clarified | <li pn="section-5.3.1-23.3">An "a=setup" line, as specified in | |||
<xref target="RFC4145" sectionFormat="comma" section="4" format="d | ||||
efault" derivedLink="https://rfc-editor.org/rfc/rfc4145#section-4" derivedConten | ||||
t="RFC4145"/> and clarified | ||||
for use in DTLS-SRTP scenarios in | for use in DTLS-SRTP scenarios in | |||
<xref target="RFC5763"></xref>, Section 5. The role value | <xref target="RFC5763" sectionFormat="comma" section="5" format="d | |||
in the answer MUST be "active" or "passive". When the | efault" derivedLink="https://rfc-editor.org/rfc/rfc5763#section-5" derivedConten | |||
t="RFC5763"/>. The role value | ||||
in the answer <bcp14>MUST</bcp14> be "active" or "passive". When t | ||||
he | ||||
offer contains the "actpass" value, as will always be the | offer contains the "actpass" value, as will always be the | |||
case with JSEP endpoints, the answerer SHOULD use the | case with JSEP endpoints, the answerer <bcp14>SHOULD</bcp14> use t | |||
"active" role. Offers from non-JSEP endpoints MAY send | he | |||
other values for "a=setup", in which case the answer MUST | "active" role. Offers from non-JSEP endpoints <bcp14>MAY</bcp14> s | |||
use a value consistent with the value in the offer.</t> | end | |||
other values for "a=setup", in which case the answer <bcp14>MUST</ | ||||
<t>An "a=tls-id" line, as specified in | bcp14> | |||
<xref target="I-D.ietf-mmusic-dtls-sdp" />, Section | use a value consistent with the value in the offer.</li> | |||
5.3.</t> | <li pn="section-5.3.1-23.4">An "a=tls-id" line, as specified in | |||
<xref target="RFC8842" sectionFormat="comma" section="5.3" format= | ||||
<t>If present in the offer, an "a=rtcp-mux" line, as | "default" derivedLink="https://rfc-editor.org/rfc/rfc8842#section-5.3" derivedCo | |||
ntent="RFC8842"/>.</li> | ||||
<li pn="section-5.3.1-23.5">If present in the offer, an "a=rtcp-mux" | ||||
line, as | ||||
specified in | specified in | |||
<xref target="RFC5761"></xref>, Section 5.1.3. Otherwise, | <xref target="RFC5761" sectionFormat="comma" section="5.1.3" forma t="default" derivedLink="https://rfc-editor.org/rfc/rfc5761#section-5.1.3" deriv edContent="RFC5761"/>. Otherwise, | |||
an "a=rtcp" line, as specified in | an "a=rtcp" line, as specified in | |||
<xref target="RFC3605"></xref>, Section 2.1, containing | <xref target="RFC3605" sectionFormat="comma" section="2.1" format= | |||
the dummy value "9 IN IP4 0.0.0.0" (because no candidates | "default" derivedLink="https://rfc-editor.org/rfc/rfc3605#section-2.1" derivedCo | |||
have yet been gathered).</t> | ntent="RFC3605"/>, containing | |||
the default value "9 IN IP4 0.0.0.0" (because no candidates | ||||
<t>If present in the offer, an "a=rtcp-rsize" line, as | have yet been gathered).</li> | |||
<li pn="section-5.3.1-23.6">If present in the offer, an "a=rtcp-rsiz | ||||
e" line, as | ||||
specified in | specified in | |||
<xref target="RFC5506"></xref>, Section 5.</t> | <xref target="RFC5506" sectionFormat="comma" section="5" format="d | |||
</list> | efault" derivedLink="https://rfc-editor.org/rfc/rfc5506#section-5" derivedConten | |||
</t> | t="RFC5506"/>.</li> | |||
</ul> | ||||
<t>If a data channel m= section has been offered, a m= | <t indent="0" pn="section-5.3.1-24">If a data channel "m=" section has | |||
section MUST also be generated for data. The <media> | been offered, an "m=" | |||
field MUST be set to "application" and the <proto> and | section <bcp14>MUST</bcp14> also be generated for data. The <media& | |||
<fmt> fields MUST be set to exactly match the fields in | gt; | |||
field <bcp14>MUST</bcp14> be set to "application", and the <proto&g | ||||
t; and | ||||
<fmt> fields <bcp14>MUST</bcp14> be set to exactly match the fie | ||||
lds in | ||||
the offer.</t> | the offer.</t> | |||
<t indent="0" pn="section-5.3.1-25">Within the data "m=" section, an " | ||||
<t>Within the data m= section, an "a=mid" line MUST be | a=mid" line <bcp14>MUST</bcp14> be | |||
generated and included as described above, along with an | generated and included as described above, along with an | |||
"a=sctp-port" line referencing the SCTP port number, as | "a=sctp-port" line referencing the SCTP port number, as | |||
defined in | defined in | |||
<xref target="I-D.ietf-mmusic-sctp-sdp"></xref>, Section 5.1, | <xref target="RFC8841" sectionFormat="comma" section="5.1" format="def ault" derivedLink="https://rfc-editor.org/rfc/rfc8841#section-5.1" derivedConten t="RFC8841"/>; | |||
and, if appropriate, an "a=max-message-size" line, as defined | and, if appropriate, an "a=max-message-size" line, as defined | |||
in | in | |||
<xref target="I-D.ietf-mmusic-sctp-sdp"></xref>, Section | <xref target="RFC8841" sectionFormat="comma" section="6.1" format="def | |||
6.1.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc8841#section-6.1" derivedConten | |||
t="RFC8841"/>.</t> | ||||
<t>As discussed above, the following attributes of category | <t indent="0" pn="section-5.3.1-26">As discussed above, the following | |||
IDENTICAL or TRANSPORT are included only if the data m= | attributes of category | |||
section is not bundled into another m= section: | IDENTICAL or TRANSPORT are included only if the data "m=" | |||
<list style="symbols"> | section is not bundled into another "m=" section: | |||
</t> | ||||
<t>"a=ice-ufrag"</t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section | |||
-5.3.1-27"> | ||||
<t>"a=ice-pwd"</t> | <li pn="section-5.3.1-27.1">"a=ice-ufrag"</li> | |||
<li pn="section-5.3.1-27.2">"a=ice-pwd"</li> | ||||
<t>"a=fingerprint"</t> | <li pn="section-5.3.1-27.3">"a=fingerprint"</li> | |||
<li pn="section-5.3.1-27.4">"a=setup"</li> | ||||
<t>"a=setup"</t> | <li pn="section-5.3.1-27.5">"a=tls-id"</li> | |||
</ul> | ||||
<t>"a=tls-id"</t> | <t indent="0" pn="section-5.3.1-28">Note that if media "m=" sections a | |||
</list></t> | re bundled into a data "m=" | |||
<t>Note that if media m= sections are bundled into a data m= | ||||
section, then certain TRANSPORT and IDENTICAL attributes may | section, then certain TRANSPORT and IDENTICAL attributes may | |||
also appear in the data m= section even if they would | also appear in the data "m=" section even if they would | |||
otherwise only be appropriate for a media m= section (e.g., | otherwise only be appropriate for a media "m=" section (e.g., | |||
"a=rtcp-mux").</t> | "a=rtcp-mux").</t> | |||
<t indent="0" pn="section-5.3.1-29">If "a=group" attributes with seman | ||||
<t>If "a=group" attributes with semantics of "BUNDLE" are | tics of "BUNDLE" are | |||
offered, corresponding session-level "a=group" attributes | offered, corresponding session-level "a=group" attributes | |||
MUST be added as specified in | <bcp14>MUST</bcp14> be added as specified in | |||
<xref target="RFC5888"></xref>. These attributes MUST have | <xref target="RFC5888" format="default" sectionFormat="of" derivedCont | |||
semantics "BUNDLE", and MUST include the all mid identifiers | ent="RFC5888"/>. These attributes <bcp14>MUST</bcp14> have | |||
semantics "BUNDLE" and <bcp14>MUST</bcp14> include all mid identifiers | ||||
from the offered bundle groups that have not been rejected. | from the offered bundle groups that have not been rejected. | |||
Note that regardless of the presence of "a=bundle-only" in | Note that regardless of the presence of "a=bundle-only" in | |||
the offer, no m= sections in the answer should have an | the offer, all "m=" sections in the answer <bcp14>MUST NOT</bcp14> hav e an | |||
"a=bundle-only" line.</t> | "a=bundle-only" line.</t> | |||
<t indent="0" pn="section-5.3.1-30">Attributes that are common between | ||||
<t>Attributes that are common between all m= sections MAY be | all "m=" sections <bcp14>MAY</bcp14> be | |||
moved to session-level, if explicitly defined to be valid at | moved to the session level if explicitly defined to be valid at | |||
session-level.</t> | the session level.</t> | |||
<t indent="0" pn="section-5.3.1-31">The attributes prohibited in the c | ||||
<t>The attributes prohibited in the creation of offers are | reation of offers are | |||
also prohibited in the creation of answers.</t> | also prohibited in the creation of answers.</t> | |||
</section> | </section> | |||
<section title="Subsequent Answers" | <section anchor="sec.subsequent-answers" numbered="true" toc="include" r | |||
anchor="sec.subsequent-answers"> | emoveInRFC="false" pn="section-5.3.2"> | |||
<name slugifiedName="name-subsequent-answers">Subsequent Answers</name | ||||
<t>When createAnswer is called a second (or later) time, or | > | |||
<t indent="0" pn="section-5.3.2-1">When createAnswer is called a secon | ||||
d (or later) time or | ||||
is called after a local description has already been | is called after a local description has already been | |||
installed, the processing is somewhat different than for an | installed, the processing is somewhat different than for an | |||
initial answer.</t> | initial answer.</t> | |||
<t indent="0" pn="section-5.3.2-2">If the previous answer was not appl | ||||
<t>If the previous answer was not applied using | ied using | |||
setLocalDescription, meaning the PeerConnection is still in | setLocalDescription, meaning the PeerConnection is still in | |||
the "have-remote-offer" state, the steps for generating an | the "have-remote-offer" state, the steps for generating an | |||
initial answer should be followed, subject to the following | initial answer <bcp14>MUST</bcp14> be followed, subject to the followi ng | |||
restriction: | restriction: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>The fields of the "o=" line MUST stay the same except | -5.3.2-3"> | |||
for the <session-version> field, which MUST increment | <li pn="section-5.3.2-3.1">The fields of the "o=" line <bcp14>MUST</ | |||
bcp14> stay the same except | ||||
for the <session-version> field, which <bcp14>MUST</bcp14> inc | ||||
rement | ||||
if the session description changes in any way from the | if the session description changes in any way from the | |||
previously generated answer.</t> | previously generated answer.</li> | |||
</list></t> | </ul> | |||
<t indent="0" pn="section-5.3.2-4">If any session description was prev | ||||
<t>If any session description was previously supplied to | iously supplied to | |||
setLocalDescription, an answer is generated by following the | setLocalDescription, an answer is generated by following the | |||
steps in the "have-remote-offer" state above, along with | steps in the "have-remote-offer" state above, along with | |||
these exceptions: | these exceptions: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>The "s=" and "t=" lines MUST stay the same.</t> | -5.3.2-5"> | |||
<li pn="section-5.3.2-5.1">The "s=" and "t=" lines <bcp14>MUST</bcp1 | ||||
<t>Each "m=" and c=" line MUST be filled in with the port | 4> stay the same.</li> | |||
and address of the default candidate for the m= section, as | <li pn="section-5.3.2-5.2">Each "m=" and "c=" line <bcp14>MUST</bcp1 | |||
4> be filled in with the port | ||||
and address of the default candidate for the "m=" section, as | ||||
described in | described in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp"></xref>, | <xref target="RFC8839" sectionFormat="comma" section="4.2.1.2" forma | |||
Section 3.2.1.2. Note that in certain cases, the m= line protocol | t="default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-4.2.1.2" der | |||
may not match that of the default candidate, because the m= line | ivedContent="RFC8839"/>. Note that in certain cases, the "m=" line protocol | |||
protocol value MUST match what was supplied in the offer, as | may not match that of the default candidate, because the "m=" line | |||
described above.</t> | protocol value <bcp14>MUST</bcp14> match what was supplied in the of | |||
fer, as | ||||
<t>Each "a=ice-ufrag" and "a=ice-pwd" line MUST stay the | described above.</li> | |||
same, unless the m= section is restarting, in which case | <li pn="section-5.3.2-5.3">Each "a=ice-ufrag" and "a=ice-pwd" line < | |||
new ICE credentials must be created as specified in | bcp14>MUST</bcp14> stay the | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp"></xref>, | same, unless the "m=" section is restarting, in which case | |||
Section 3.4.1.1.1. If the m= | new ICE credentials <bcp14>MUST</bcp14> be created as specified in | |||
section is bundled into another m= section, it still MUST | <xref target="RFC8839" sectionFormat="comma" section="4.4.1.1.1" for | |||
NOT contain any ICE credentials.</t> | mat="default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-4.4.1.1.1" | |||
derivedContent="RFC8839"/>. If the "m=" | ||||
<t>Each "a=tls-id" line MUST stay the same unless the | section is bundled into another "m=" section, it still <bcp14>MUST N | |||
OT</bcp14> contain any ICE credentials.</li> | ||||
<li pn="section-5.3.2-5.4">Each "a=tls-id" line <bcp14>MUST</bcp14> | ||||
stay the same, unless the | ||||
offerer's "a=tls-id" line changed, in which case a new | offerer's "a=tls-id" line changed, in which case a new | |||
"a=tls-id" value MUST be created, as described in | tls-id value <bcp14>MUST</bcp14> be created, as described in | |||
<xref target="I-D.ietf-mmusic-dtls-sdp" />, Section | <xref target="RFC8842" sectionFormat="comma" section="5.2" format="d | |||
5.2.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8842#section-5.2" derivedCont | |||
ent="RFC8842"/>.</li> | ||||
<t>Each "a=setup" line MUST use an "active" or "passive" | <li pn="section-5.3.2-5.5">Each "a=setup" line <bcp14>MUST</bcp14> u | |||
se an "active" or "passive" | ||||
role value consistent with the existing DTLS association, | role value consistent with the existing DTLS association, | |||
if the association is being continued by the offerer.</t> | if the association is being continued by the offerer.</li> | |||
<li pn="section-5.3.2-5.6">RTCP multiplexing <bcp14>MUST</bcp14> be | ||||
<t>RTCP multiplexing must be used, and an "a=rtcp-mux" line | used, and an "a=rtcp-mux" line | |||
inserted if and only if the m= section previously used RTCP | inserted if and only if the "m=" section previously used RTCP | |||
multiplexing.</t> | multiplexing.</li> | |||
<li pn="section-5.3.2-5.7">If the "m=" section is not bundled into a | ||||
<t>If the m= section is not bundled into another m= section | nother "m=" section | |||
and RTCP multiplexing is not active, an "a=rtcp" attribute | and RTCP multiplexing is not active, an "a=rtcp" attribute | |||
line MUST be filled in with the port and address of the | line <bcp14>MUST</bcp14> be filled in with the port and address of t he | |||
default RTCP candidate. If no RTCP candidates have yet been | default RTCP candidate. If no RTCP candidates have yet been | |||
gathered, dummy values MUST be used, as described in the | gathered, default values <bcp14>MUST</bcp14> be used, as described i | |||
initial answer section above.</t> | n | |||
<xref target="sec.initial-answers" format="default" sectionFormat="o | ||||
<t>If the m= section is not bundled into another m= | f" derivedContent="Section 5.3.1"/> above.</li> | |||
<li pn="section-5.3.2-5.8">If the "m=" section is not bundled into a | ||||
nother "m=" | ||||
section, for each candidate that has been gathered during | section, for each candidate that has been gathered during | |||
the most recent gathering phase (see | the most recent gathering phase (see | |||
<xref target="sec.ice-gather-overview"></xref>), an | <xref target="sec.ice-gather-overview" format="default" sectionForma | |||
"a=candidate" line MUST be added, as defined in | t="of" derivedContent="Section 3.5.1"/>), an | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp"></xref>, | "a=candidate" line <bcp14>MUST</bcp14> be added, as defined in | |||
Section 4.1. | <xref target="RFC8839" sectionFormat="comma" section="5.1" format="d | |||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.1" derivedCont | ||||
ent="RFC8839"/>. | ||||
If candidate gathering for the section has completed, an | If candidate gathering for the section has completed, an | |||
"a=end-of-candidates" attribute MUST be added, as described | "a=end-of-candidates" attribute <bcp14>MUST</bcp14> be added, as des cribed | |||
in | in | |||
<xref target="I-D.ietf-ice-trickle"></xref>, Section 9.3. | <xref target="RFC8840" sectionFormat="comma" section="8.2" format="d | |||
If the m= section is bundled into another m= section, both | efault" derivedLink="https://rfc-editor.org/rfc/rfc8840#section-8.2" derivedCont | |||
"a=candidate" and "a=end-of-candidates" MUST be | ent="RFC8840"/>. | |||
omitted.</t> | If the "m=" section is bundled into another "m=" section, both | |||
"a=candidate" and "a=end-of-candidates" <bcp14>MUST</bcp14> be | ||||
<t>For RtpTransceivers that are not stopped, the "a=msid" | omitted. | |||
line(s) MUST stay the same, regardless of changes to the | </li> | |||
<li pn="section-5.3.2-5.9">For RtpTransceivers that are not stopped, | ||||
the "a=msid" | ||||
line(s) <bcp14>MUST</bcp14> stay the same, regardless of changes to | ||||
the | ||||
transceiver's direction or track. If no "a=msid" line is | transceiver's direction or track. If no "a=msid" line is | |||
present in the current description, "a=msid" line(s) MUST | present in the current description, "a=msid" line(s) <bcp14>MUST</bc p14> | |||
be generated according to the same rules as for an initial | be generated according to the same rules as for an initial | |||
answer.</t> | answer.</li> | |||
</list></t> | </ul> | |||
</section> | </section> | |||
<section title="Options Handling" | <section anchor="sec.options-handling2" numbered="true" toc="include" re | |||
anchor="sec.options-handling2"> | moveInRFC="false" pn="section-5.3.3"> | |||
<name slugifiedName="name-options-handling-2">Options Handling</name> | ||||
<t>The createAnswer method takes as a parameter an | <t indent="0" pn="section-5.3.3-1">The createAnswer method takes as a | |||
parameter an | ||||
RTCAnswerOptions object. The set of parameters for | RTCAnswerOptions object. The set of parameters for | |||
RTCAnswerOptions is different than those supported in | RTCAnswerOptions is different than those supported in | |||
RTCOfferOptions; the IceRestart option is unnecessary, as ICE | RTCOfferOptions; the IceRestart option is unnecessary, as ICE | |||
credentials will automatically be changed for all m= sections | credentials will automatically be changed for all "m=" sections | |||
where the offerer chose to perform ICE restart.</t> | where the offerer chose to perform ICE restart.</t> | |||
<t indent="0" pn="section-5.3.3-2">The following options are supported | ||||
<t>The following options are supported in | in | |||
RTCAnswerOptions.</t> | RTCAnswerOptions.</t> | |||
<section title="VoiceActivityDetection" | <section anchor="sec.voiceactivitydetection2" numbered="true" toc="inc | |||
anchor="sec.voiceactivitydetection2"> | lude" removeInRFC="false" pn="section-5.3.3.1"> | |||
<name slugifiedName="name-voiceactivitydetection-2">VoiceActivityDet | ||||
<t>Silence suppression in the answer is handled as | ection</name> | |||
<t indent="0" pn="section-5.3.3.1-1">Silence suppression in the answ | ||||
er is handled as | ||||
described in | described in | |||
<xref target="sec.voiceactivitydetection1"></xref>, with | <xref target="sec.voiceactivitydetection1" format="default" sectionF ormat="of" derivedContent="Section 5.2.3.2"/>, with | |||
one exception: if support for silence suppression was not | one exception: if support for silence suppression was not | |||
indicated in the offer, the VoiceActivityDetection | indicated in the offer, the VoiceActivityDetection | |||
parameter has no effect, and the answer should be generated | parameter has no effect, and the answer <bcp14>MUST</bcp14> be gener | |||
as if VoiceActivityDetection was set to false. This is done | ated | |||
as if VoiceActivityDetection was set to "false". This is done | ||||
on a per-codec basis (e.g., if the offerer somehow offered | on a per-codec basis (e.g., if the offerer somehow offered | |||
support for CN but set "usedtx=0" for Opus, setting | support for CN but set "usedtx=0" for Opus, setting | |||
VoiceActivityDetection to true would result in an answer | VoiceActivityDetection to "true" would result in an answer | |||
with CN codecs and "usedtx=0"). The impact of this rule is | with CN codecs and "usedtx=0"). The impact of this rule is | |||
that an answerer will not try to use silence suppression | that an answerer will not try to use silence suppression | |||
with any endpoint that does not offer it, making silence | with any endpoint that does not offer it, making silence | |||
suppression support bilateral even with non-JSEP | suppression support bilateral even with non-JSEP | |||
endpoints.</t> | endpoints.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Modifying an Offer or Answer" | <section anchor="sec.modifying-sdp" numbered="true" toc="include" removeIn | |||
anchor="sec.modifying-sdp"> | RFC="false" pn="section-5.4"> | |||
<name slugifiedName="name-modifying-an-offer-or-answe">Modifying an Offe | ||||
<t>The SDP returned from createOffer or createAnswer MUST NOT | r or Answer</name> | |||
<t indent="0" pn="section-5.4-1">The SDP returned from createOffer or cr | ||||
eateAnswer <bcp14>MUST NOT</bcp14> | ||||
be changed before passing it to setLocalDescription. If precise | be changed before passing it to setLocalDescription. If precise | |||
control over the SDP is needed, the aforementioned | control over the SDP is needed, the aforementioned | |||
createOffer/createAnswer options or RtpTransceiver APIs MUST be | createOffer/createAnswer options or RtpTransceiver APIs <bcp14>MUST</bcp 14> be | |||
used.</t> | used.</t> | |||
<t indent="0" pn="section-5.4-2">After calling setLocalDescription with | ||||
<t>After calling setLocalDescription with an offer or answer, | an offer or answer, | |||
the application MAY modify the SDP to reduce its capabilities | the application <bcp14>MAY</bcp14> modify the SDP to reduce its capabili | |||
ties | ||||
before sending it to the far side, as long as it follows the | before sending it to the far side, as long as it follows the | |||
rules above that define a valid JSEP offer or answer. Likewise, | rules above that define a valid JSEP offer or answer. Likewise, | |||
an application that has received an offer or answer from a peer | an application that has received an offer or answer from a peer | |||
MAY modify the received SDP, subject to the same constraints, | <bcp14>MAY</bcp14> modify the received SDP, subject to the same constrai nts, | |||
before calling setRemoteDescription.</t> | before calling setRemoteDescription.</t> | |||
<t indent="0" pn="section-5.4-3">As always, the application is solely re | ||||
<t>As always, the application is solely responsible for what it | sponsible for what it | |||
sends to the other party, and all incoming SDP will be | sends to the other party, and all incoming SDP will be | |||
processed by the JSEP implementation to the extent of its | processed by the JSEP implementation to the extent of its | |||
capabilities. It is an error to assume that all SDP is | capabilities. It is an error to assume that all SDP is | |||
well-formed; however, one should be able to assume that any | well formed; however, one should be able to assume that any | |||
implementation of this specification will be able to process, | implementation of this specification will be able to process, | |||
as a remote offer or answer, unmodified SDP coming from any | as a remote offer or answer, unmodified SDP coming from any | |||
other implementation of this specification.</t> | other implementation of this specification.</t> | |||
</section> | </section> | |||
<section title="Processing a Local Description" | <section anchor="sec.processing-a-local-desc" numbered="true" toc="include | |||
anchor="sec.processing-a-local-desc"> | " removeInRFC="false" pn="section-5.5"> | |||
<name slugifiedName="name-processing-a-local-descript">Processing a Loca | ||||
<t>When a SessionDescription is supplied to | l Description</name> | |||
setLocalDescription, the following steps MUST be performed: | <t indent="0" pn="section-5.5-1">When a SessionDescription is supplied t | |||
<list style="symbols"> | o | |||
setLocalDescription, the following steps <bcp14>MUST</bcp14> be performe | ||||
<t>If the description is of type "rollback", follow the | d: | |||
</t> | ||||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5 | ||||
.5-2"> | ||||
<li pn="section-5.5-2.1">If the description is of type "rollback", fol | ||||
low the | ||||
processing defined in | processing defined in | |||
<xref target="sec.processing-a-rollback" /> and skip the | <xref target="sec.processing-a-rollback" format="default" sectionForma | |||
processing described in the rest of this section.</t> | t="of" derivedContent="Section 5.7"/> and skip the | |||
processing described in the rest of this section.</li> | ||||
<t>Otherwise, the type of the SessionDescription is checked | <li pn="section-5.5-2.2"> | |||
<t indent="0" pn="section-5.5-2.2.1">Otherwise, the type of the Sess | ||||
ionDescription is checked | ||||
against the current state of the PeerConnection: | against the current state of the PeerConnection: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="secti | ||||
<t>If the type is "offer", the PeerConnection state MUST be | on-5.5-2.2.2"> | |||
either "stable" or "have-local-offer".</t> | <li pn="section-5.5-2.2.2.1">If the type is "offer", the PeerConne | |||
ction state <bcp14>MUST</bcp14> be | ||||
<t>If the type is "pranswer" or "answer", the | either "stable" or "have-local-offer".</li> | |||
PeerConnection state MUST be either "have-remote-offer" or | <li pn="section-5.5-2.2.2.2">If the type is "pranswer" or "answer" | |||
"have-local-pranswer".</t> | , the | |||
</list></t> | PeerConnection state <bcp14>MUST</bcp14> be either "have-remote-offe | |||
r" or | ||||
<t>If the type is not correct for the current state, | "have-local-pranswer".</li> | |||
processing MUST stop and an error MUST be returned.</t> | </ul> | |||
</li> | ||||
<t>The SessionDescription is then checked to ensure that its | <li pn="section-5.5-2.3">If the type is not correct for the current st | |||
ate, | ||||
processing <bcp14>MUST</bcp14> stop and an error <bcp14>MUST</bcp14> b | ||||
e returned.</li> | ||||
<li pn="section-5.5-2.4">The SessionDescription is then checked to ens | ||||
ure that its | ||||
contents are identical to those generated in the last call to | contents are identical to those generated in the last call to | |||
createOffer/createAnswer, and thus have not been altered, as | createOffer/createAnswer, and thus have not been altered, as | |||
discussed in | discussed in | |||
<xref target="sec.modifying-sdp" />; otherwise, processing | <xref target="sec.modifying-sdp" format="default" sectionFormat="of" d | |||
MUST stop and an error MUST be returned.</t> | erivedContent="Section 5.4"/>; otherwise, processing | |||
<bcp14>MUST</bcp14> stop and an error <bcp14>MUST</bcp14> be returned. | ||||
<t>Next, the SessionDescription is parsed into a data | </li> | |||
<li pn="section-5.5-2.5">Next, the SessionDescription is parsed into a | ||||
data | ||||
structure, as described in | structure, as described in | |||
<xref target="sec.parsing-a-desc" /> below.</t> | <xref target="sec.parsing-a-desc" format="default" sectionFormat="of" | |||
derivedContent="Section 5.8"/> below.</li> | ||||
<t>Finally, the parsed SessionDescription is applied as | <li pn="section-5.5-2.6">Finally, the parsed SessionDescription is app | |||
lied as | ||||
described in | described in | |||
<xref target="sec.applying-a-local-desc" /> below.</t> | <xref target="sec.applying-a-local-desc" format="default" sectionForma | |||
</list></t> | t="of" derivedContent="Section 5.9"/> below.</li> | |||
</ul> | ||||
</section> | </section> | |||
<section title="Processing a Remote Description" | <section anchor="sec.processing-a-remote-desc" numbered="true" toc="includ | |||
anchor="sec.processing-a-remote-desc"> | e" removeInRFC="false" pn="section-5.6"> | |||
<name slugifiedName="name-processing-a-remote-descrip">Processing a Remo | ||||
<t>When a SessionDescription is supplied to | te Description</name> | |||
setRemoteDescription, the following steps MUST be performed: | <t indent="0" pn="section-5.6-1">When a SessionDescription is supplied t | |||
<list style="symbols"> | o | |||
setRemoteDescription, the following steps <bcp14>MUST</bcp14> be perform | ||||
<t>If the description is of type "rollback", follow the | ed: | |||
</t> | ||||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5 | ||||
.6-2"> | ||||
<li pn="section-5.6-2.1">If the description is of type "rollback", fol | ||||
low the | ||||
processing defined in | processing defined in | |||
<xref target="sec.processing-a-rollback" /> and skip the | <xref target="sec.processing-a-rollback" format="default" sectionForma | |||
processing described in the rest of this section.</t> | t="of" derivedContent="Section 5.7"/> and skip the | |||
processing described in the rest of this section.</li> | ||||
<t>Otherwise, the type of the SessionDescription is checked | <li pn="section-5.6-2.2"> | |||
<t indent="0" pn="section-5.6-2.2.1">Otherwise, the type of the Sess | ||||
ionDescription is checked | ||||
against the current state of the PeerConnection: | against the current state of the PeerConnection: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="secti | ||||
<t>If the type is "offer", the PeerConnection state MUST be | on-5.6-2.2.2"> | |||
either "stable" or "have-remote-offer".</t> | <li pn="section-5.6-2.2.2.1">If the type is "offer", the PeerConne | |||
ction state <bcp14>MUST</bcp14> be | ||||
<t>If the type is "pranswer" or "answer", the | either "stable" or "have-remote-offer".</li> | |||
PeerConnection state MUST be either "have-local-offer" or | <li pn="section-5.6-2.2.2.2">If the type is "pranswer" or "answer" | |||
"have-remote-pranswer".</t> | , the | |||
</list></t> | PeerConnection state <bcp14>MUST</bcp14> be either "have-local-offer | |||
" or | ||||
<t>If the type is not correct for the current state, | "have-remote-pranswer".</li> | |||
processing MUST stop and an error MUST be returned.</t> | </ul> | |||
</li> | ||||
<t>Next, the SessionDescription is parsed into a data | <li pn="section-5.6-2.3">If the type is not correct for the current st | |||
ate, | ||||
processing <bcp14>MUST</bcp14> stop and an error <bcp14>MUST</bcp14> b | ||||
e returned.</li> | ||||
<li pn="section-5.6-2.4">Next, the SessionDescription is parsed into a | ||||
data | ||||
structure, as described in | structure, as described in | |||
<xref target="sec.parsing-a-desc" /> below. If parsing fails | <xref target="sec.parsing-a-desc" format="default" sectionFormat="of" | |||
for any reason, processing MUST stop and an error MUST be | derivedContent="Section 5.8"/> below. If parsing fails | |||
returned.</t> | for any reason, processing <bcp14>MUST</bcp14> stop and an error <bcp1 | |||
4>MUST</bcp14> be | ||||
<t>Finally, the parsed SessionDescription is applied as | returned.</li> | |||
<li pn="section-5.6-2.5">Finally, the parsed SessionDescription is app | ||||
lied as | ||||
described in | described in | |||
<xref target="sec.applying-a-remote-desc" /> below.</t> | <xref target="sec.applying-a-remote-desc" format="default" sectionForm | |||
</list></t> | at="of" derivedContent="Section 5.10"/> below.</li> | |||
</ul> | ||||
</section> | </section> | |||
<section title="Processing a Rollback" | <section anchor="sec.processing-a-rollback" numbered="true" toc="include" | |||
anchor="sec.processing-a-rollback"> | removeInRFC="false" pn="section-5.7"> | |||
<name slugifiedName="name-processing-a-rollback">Processing a Rollback</ | ||||
<t>A rollback may be performed if the PeerConnection is in any | name> | |||
<t indent="0" pn="section-5.7-1">A rollback may be performed if the Peer | ||||
Connection is in any | ||||
state except for "stable". This means that both offers and | state except for "stable". This means that both offers and | |||
provisional answers can be rolled back. Rollback can only be | provisional answers can be rolled back. Rollback can only be | |||
used to cancel proposed changes; there is no support for | used to cancel proposed changes; there is no support for | |||
rolling back from a stable state to a previous stable state. If | rolling back from a "stable" state to a previous "stable" state. If | |||
a rollback is attempted in the "stable" state, processing MUST | a rollback is attempted in the "stable" state, processing <bcp14>MUST</b | |||
stop and an error MUST be returned. Note that this implies that | cp14> | |||
once the answerer has performed setLocalDescription with his | stop and an error <bcp14>MUST</bcp14> be returned. Note that this implie | |||
s that | ||||
once the answerer has performed setLocalDescription with its | ||||
answer, this cannot be rolled back.</t> | answer, this cannot be rolled back.</t> | |||
<t indent="0" pn="section-5.7-2">The effect of rollback <bcp14>MUST</bcp | ||||
<t>The effect of rollback MUST be the same regardless of | 14> be the same regardless of | |||
whether setLocalDescription or setRemoteDescription is | whether setLocalDescription or setRemoteDescription is | |||
called.</t> | called.</t> | |||
<t indent="0" pn="section-5.7-3">In order to process rollback, a JSEP im | ||||
<t>In order to process rollback, a JSEP implementation abandons | plementation abandons | |||
the current offer/answer transaction, sets the signaling state | the current offer/answer transaction, sets the signaling state | |||
to "stable", and sets the pending local and/or remote | to "stable", and sets the pending local and/or remote | |||
description (see | description (see Sections | |||
<xref target="sec.pendinglocaldescription" /> and | <xref target="sec.pendinglocaldescription" format="counter" sectionForma | |||
<xref target="sec.pendingremotedescription" />) to null. Any | t="of" derivedContent="4.1.14"/> and | |||
<xref target="sec.pendingremotedescription" format="counter" sectionForm | ||||
at="of" derivedContent="4.1.16"/>) to "null". Any | ||||
resources or candidates that were allocated by the abandoned | resources or candidates that were allocated by the abandoned | |||
local description are discarded; any media that is received is | local description are discarded; any media that is received is | |||
processed according to the previous local and remote | processed according to the previous local and remote | |||
descriptions.</t> | descriptions.</t> | |||
<t indent="0" pn="section-5.7-4">A rollback disassociates any RtpTransce | ||||
<t>A rollback disassociates any RtpTransceivers that were | ivers that were | |||
associated with m= sections by the application of the | associated with "m=" sections by the application of the | |||
rolled-back session description (see | rolled-back session description (see Sections | |||
<xref target="sec.applying-a-remote-desc" /> and | <xref target="sec.applying-a-remote-desc" format="counter" sectionFormat | |||
<xref target="sec.applying-a-local-desc" />). This means that | ="of" derivedContent="5.10"/> and | |||
<xref target="sec.applying-a-local-desc" format="counter" sectionFormat= | ||||
"of" derivedContent="5.9"/>). | ||||
This means that | ||||
some RtpTransceivers that were previously associated will no | some RtpTransceivers that were previously associated will no | |||
longer be associated with any m= section; in such cases, the | longer be associated with any "m=" section; in such cases, the | |||
value of the RtpTransceiver's mid property MUST be set to null, | value of the RtpTransceiver's mid property <bcp14>MUST</bcp14> be set to | |||
and the mapping between the transceiver and its m= section | "null", | |||
index MUST be discarded. RtpTransceivers that were created by | and the mapping between the transceiver and its "m=" section | |||
applying a remote offer that was subsequently rolled back MUST | index <bcp14>MUST</bcp14> be discarded. RtpTransceivers that were create | |||
be stopped and removed from the PeerConnection. However, a | d by | |||
RtpTransceiver MUST NOT be removed if a track was attached to | applying a remote offer that was subsequently rolled back <bcp14>MUST</b | |||
cp14> | ||||
be stopped and removed from the PeerConnection. However, an | ||||
RtpTransceiver <bcp14>MUST NOT</bcp14> be removed if a track was attache | ||||
d to | ||||
the RtpTransceiver via the addTrack method. This is so that an | the RtpTransceiver via the addTrack method. This is so that an | |||
application may call addTrack, then call setRemoteDescription | application may call addTrack, then call setRemoteDescription | |||
with an offer, then roll back that offer, then call createOffer | with an offer, then roll back that offer, then call createOffer | |||
and have a m= section for the added track appear in the | and have an "m=" section for the added track appear in the | |||
generated offer.</t> | generated offer.</t> | |||
</section> | </section> | |||
<section title="Parsing a Session Description" | <section anchor="sec.parsing-a-desc" numbered="true" toc="include" removeI | |||
anchor="sec.parsing-a-desc"> | nRFC="false" pn="section-5.8"> | |||
<name slugifiedName="name-parsing-a-session-descripti">Parsing a Session | ||||
<t>The SDP contained in the session description object consists | Description</name> | |||
<t indent="0" pn="section-5.8-1">The SDP contained in the session descri | ||||
ption object consists | ||||
of a sequence of text lines, each containing a key-value | of a sequence of text lines, each containing a key-value | |||
expression, as described in | expression, as described in | |||
<xref target="RFC4566" />, Section 5. The SDP is read, | <xref target="RFC4566" sectionFormat="comma" section="5" format="default | |||
line-by-line, and converted to a data structure that contains | " derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5" derivedContent="RFC | |||
4566"/>. The SDP is read, | ||||
line by line, and converted to a data structure that contains | ||||
the deserialized information. However, SDP allows many types of | the deserialized information. However, SDP allows many types of | |||
lines, not all of which are relevant to JSEP applications. For | lines, not all of which are relevant to JSEP applications. For | |||
each line, the implementation will first ensure it is | each line, the implementation will first ensure that it is | |||
syntactically correct according to its defining ABNF, check | syntactically correct according to its defining ABNF, check | |||
that it conforms to | that it conforms to the semantics used in | |||
<xref target="RFC4566" /> and | <xref target="RFC4566" format="default" sectionFormat="of" derivedConten | |||
<xref target="RFC3264" /> semantics, and then either parse and | t="RFC4566"/> and | |||
<xref target="RFC3264" format="default" sectionFormat="of" derivedConten | ||||
t="RFC3264"/>, and then either parse and | ||||
store or discard the provided value, as described below.</t> | store or discard the provided value, as described below.</t> | |||
<t indent="0" pn="section-5.8-2">If any line is not well formed or canno | ||||
<t>If any line is not well-formed, or cannot be parsed as | t be parsed as | |||
described, the parser MUST stop with an error and reject the | described, the parser <bcp14>MUST</bcp14> stop with an error and reject | |||
the | ||||
session description, even if the value is to be discarded. This | session description, even if the value is to be discarded. This | |||
ensures that implementations do not accidentally misinterpret | ensures that implementations do not accidentally misinterpret | |||
ambiguous SDP.</t> | ambiguous SDP.</t> | |||
<section title="Session-Level Parsing" | <section anchor="sec.session-level-parse" numbered="true" toc="include" | |||
anchor="sec.session-level-parse"> | removeInRFC="false" pn="section-5.8.1"> | |||
<name slugifiedName="name-session-level-parsing">Session-Level Parsing | ||||
<t>First, the session-level lines are checked and parsed. | </name> | |||
These lines MUST occur in a specific order, and with a | <t indent="0" pn="section-5.8.1-1">First, the session-level lines are | |||
checked and parsed. | ||||
These lines <bcp14>MUST</bcp14> occur in a specific order, and with a | ||||
specific syntax, as defined in | specific syntax, as defined in | |||
<xref target="RFC4566" />, Section 5. Note that while the | <xref target="RFC4566" sectionFormat="comma" section="5" format="defau | |||
specific line types (e.g. "v=", "c=") MUST occur in the | lt" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5" derivedContent="R | |||
FC4566"/>. Note that while the | ||||
specific line types (e.g., "v=", "c=") <bcp14>MUST</bcp14> occur in th | ||||
e | ||||
defined order, lines of the same type (typically "a=") can | defined order, lines of the same type (typically "a=") can | |||
occur in any order.</t> | occur in any order.</t> | |||
<t indent="0" pn="section-5.8.1-2">The following non-attribute lines a | ||||
<t>The following non-attribute lines are not meaningful in | re not meaningful in | |||
the JSEP context and MAY be discarded once they have been | the JSEP context and <bcp14>MAY</bcp14> be discarded once they have be | |||
en | ||||
checked. | checked. | |||
<list> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>The "c=" line MUST be checked for syntax but its value | -5.8.1-3"> | |||
<li pn="section-5.8.1-3.1">The "c=" line <bcp14>MUST</bcp14> be chec | ||||
ked for syntax, but its value | ||||
is only used for ICE mismatch detection, as defined in | is only used for ICE mismatch detection, as defined in | |||
<xref target="RFC8445" />, Section 5.4. Note that JSEP | <xref target="RFC8445" sectionFormat="comma" section="5.4" format="d efault" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-5.4" derivedCont ent="RFC8445"/>. Note that JSEP | |||
implementations should never encounter this condition | implementations should never encounter this condition | |||
because ICE is required for WebRTC.</t> | because ICE is required for WebRTC.</li> | |||
<li pn="section-5.8.1-3.2">The "i=", "u=", "e=", "p=", "t=", "r=", " | ||||
<t>The "i=", "u=", "e=", "p=", "t=", "r=", "z=", and "k=" | z=", and "k=" | |||
lines are not used by this specification; they MUST be | lines <bcp14>MUST</bcp14> be | |||
checked for syntax but their values are not used.</t> | checked for syntax, but their values are not otherwise used. </li> | |||
</list></t> | </ul> | |||
<t indent="0" pn="section-5.8.1-4">The remaining non-attribute lines a | ||||
<t>The remaining non-attribute lines are processed as | re processed as | |||
follows: | follows: | |||
<list> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>The "v=" line MUST have a version of 0, as specified in | -5.8.1-5"> | |||
<xref target="RFC4566" />, Section 5.1.</t> | <li pn="section-5.8.1-5.1">The "v=" line <bcp14>MUST</bcp14> have a | |||
version of 0, as specified in | ||||
<t>The "o=" line MUST be parsed as specified in | <xref target="RFC4566" sectionFormat="comma" section="5.1" format="d | |||
<xref target="RFC4566" />, Section 5.2.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.1" derivedCont | |||
ent="RFC4566"/>.</li> | ||||
<t>The "b=" line, if present, MUST be parsed as specified | <li pn="section-5.8.1-5.2">The "o=" line <bcp14>MUST</bcp14> be pars | |||
ed as specified in | ||||
<xref target="RFC4566" sectionFormat="comma" section="5.2" format="d | ||||
efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.2" derivedCont | ||||
ent="RFC4566"/>.</li> | ||||
<li pn="section-5.8.1-5.3">The "b=" line, if present, <bcp14>MUST</b | ||||
cp14> be parsed as specified | ||||
in | in | |||
<xref target="RFC4566" />, Section 5.8, and the bwtype and | <xref target="RFC4566" sectionFormat="comma" section="5.8" format="d | |||
bandwidth values stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.8" derivedCont | |||
</list></t> | ent="RFC4566"/>, and the bwtype and | |||
bandwidth values stored.</li> | ||||
<t>Finally, the attribute lines are processed. Specific | </ul> | |||
processing MUST be applied for the following session-level | <t indent="0" pn="section-5.8.1-6">Finally, the attribute lines are pr | |||
ocessed. Specific | ||||
processing <bcp14>MUST</bcp14> be applied for the following session-le | ||||
vel | ||||
attribute ("a=") lines: | attribute ("a=") lines: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>Any "a=group" lines are parsed as specified in | -5.8.1-7"> | |||
<xref target="RFC5888" />, Section 5, and the group's | <li pn="section-5.8.1-7.1">Any "a=group" lines are parsed as specifi | |||
semantics and mids are stored.</t> | ed in | |||
<xref target="RFC5888" sectionFormat="comma" section="5" format="def | ||||
<t>If present, a single "a=ice-lite" line is parsed as | ault" derivedLink="https://rfc-editor.org/rfc/rfc5888#section-5" derivedContent= | |||
specified in | "RFC5888"/>, and the group's | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | semantics and mids are stored.</li> | |||
Section 4.3, and a value | <li pn="section-5.8.1-7.2">If present, a single "a=ice-lite" line is | |||
indicating the presence of ice-lite is stored.</t> | parsed as | |||
<t>If present, a single "a=ice-ufrag" line is parsed as | ||||
specified in | specified in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | <xref target="RFC8839" sectionFormat="comma" section="5.3" format="d | |||
Section 4.4, and the ufrag value is stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.3" derivedCont | |||
ent="RFC8839"/>, and a value | ||||
<t>If present, a single "a=ice-pwd" line is parsed as | indicating the presence of ice-lite is stored.</li> | |||
<li pn="section-5.8.1-7.3">If present, a single "a=ice-ufrag" line i | ||||
s parsed as | ||||
specified in | specified in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | <xref target="RFC8839" sectionFormat="comma" section="5.4" format="d | |||
Section 4.4, and the password value is stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedCont | |||
ent="RFC8839"/>, and the ufrag value is stored.</li> | ||||
<t>If present, a single "a=ice-options" line is parsed as | <li pn="section-5.8.1-7.4">If present, a single "a=ice-pwd" line is | |||
parsed as | ||||
specified in | specified in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | <xref target="RFC8839" sectionFormat="comma" section="5.4" format="d | |||
Section 4.6, and the set of specified options is stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedCont | |||
ent="RFC8839"/>, and the password value is stored.</li> | ||||
<t>Any "a=fingerprint" lines are parsed as specified in | <li pn="section-5.8.1-7.5">If present, a single "a=ice-options" line | |||
<xref target="RFC8122" />, Section 5, and the set of | is parsed as | |||
fingerprint and algorithm values is stored.</t> | ||||
<t>If present, a single "a=setup" line is parsed as | ||||
specified in | specified in | |||
<xref target="RFC4145" />, Section 4, and the setup value | <xref target="RFC8839" sectionFormat="comma" section="5.6" format="d | |||
is stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.6" derivedCont | |||
ent="RFC8839"/>, and the set of specified options is stored.</li> | ||||
<t>If present, a single "a=tls-id" line is parsed as | <li pn="section-5.8.1-7.6">Any "a=fingerprint" lines are parsed as s | |||
pecified in | ||||
<xref target="RFC8122" sectionFormat="comma" section="5" format="def | ||||
ault" derivedLink="https://rfc-editor.org/rfc/rfc8122#section-5" derivedContent= | ||||
"RFC8122"/>, and the set of | ||||
fingerprint and algorithm values is stored.</li> | ||||
<li pn="section-5.8.1-7.7">If present, a single "a=setup" line is pa | ||||
rsed as | ||||
specified in | specified in | |||
<xref target="I-D.ietf-mmusic-dtls-sdp" /> Section 5, and | <xref target="RFC4145" sectionFormat="comma" section="4" format="def | |||
the tls-id value is stored.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc4145#section-4" derivedContent= | |||
"RFC4145"/>, and the setup value | ||||
<t>Any "a=identity" lines are parsed and the identity | is stored.</li> | |||
values stored for subsequent verification, as specified | <li pn="section-5.8.1-7.8">If present, a single "a=tls-id" line is p | |||
<xref target="I-D.ietf-rtcweb-security-arch" />, Section | arsed as | |||
5.</t> | specified in <xref target="RFC8842" sectionFormat="comma" section="5 | |||
" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8842#section-5" de | ||||
<t>Any "a=extmap" lines are parsed as specified in | rivedContent="RFC8842"/>, and | |||
<xref target="RFC5285" />, Section 5, and their values are | the attribute value is stored.</li> | |||
stored.</t> | <li pn="section-5.8.1-7.9">Any "a=identity" lines are parsed and the | |||
</list></t> | identity | |||
values stored for subsequent verification, as specified in | ||||
<t>Other attributes that are not relevant to JSEP may also be | <xref target="RFC8827" sectionFormat="comma" section="5" format="def | |||
present, and implementations SHOULD process any that they | ault" derivedLink="https://rfc-editor.org/rfc/rfc8827#section-5" derivedContent= | |||
"RFC8827"/>.</li> | ||||
<li pn="section-5.8.1-7.10">Any "a=extmap" lines are parsed as speci | ||||
fied in | ||||
<xref target="RFC5285" sectionFormat="comma" section="5" format="def | ||||
ault" derivedLink="https://rfc-editor.org/rfc/rfc5285#section-5" derivedContent= | ||||
"RFC5285"/>, and their values are | ||||
stored.</li> | ||||
</ul> | ||||
<t indent="0" pn="section-5.8.1-8">Other attributes that are not relev | ||||
ant to JSEP may also be | ||||
present, and implementations <bcp14>SHOULD</bcp14> process any that th | ||||
ey | ||||
recognize. As required by | recognize. As required by | |||
<xref target="RFC4566"></xref>, Section 5.13, unknown | <xref target="RFC4566" sectionFormat="comma" section="5.13" format="de | |||
attribute lines MUST be ignored.</t> | fault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.13" derivedCont | |||
ent="RFC4566"/>, unknown | ||||
<t>Once all the session-level lines have been parsed, | attribute lines <bcp14>MUST</bcp14> be ignored.</t> | |||
processing continues with the lines in m= sections.</t> | <t indent="0" pn="section-5.8.1-9">Once all the session-level lines ha | |||
ve been parsed, | ||||
processing continues with the lines in "m=" sections.</t> | ||||
</section> | </section> | |||
<section title="Media Section Parsing" | <section anchor="sec.media-level-parse" numbered="true" toc="include" re | |||
anchor="sec.media-level-parse"> | moveInRFC="false" pn="section-5.8.2"> | |||
<name slugifiedName="name-media-section-parsing">Media Section Parsing | ||||
<t>Like the session-level lines, the media section lines MUST | </name> | |||
<t indent="0" pn="section-5.8.2-1">Like the session-level lines, the m | ||||
edia section lines <bcp14>MUST</bcp14> | ||||
occur in the specific order and with the specific syntax | occur in the specific order and with the specific syntax | |||
defined in | defined in | |||
<xref target="RFC4566" />, Section 5.</t> | <xref target="RFC4566" sectionFormat="comma" section="5" format="defau | |||
lt" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5" derivedContent="R | ||||
<t>The "m=" line itself MUST be parsed as described in | FC4566"/>.</t> | |||
<xref target="RFC4566" />, Section 5.14, and the media, port, | <t indent="0" pn="section-5.8.2-2">The "m=" line itself <bcp14>MUST</b | |||
proto, and fmt values stored.</t> | cp14> be parsed as described in | |||
<xref target="RFC4566" sectionFormat="comma" section="5.14" format="de | ||||
<t>Following the "m=" line, specific processing MUST be | fault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.14" derivedCont | |||
ent="RFC4566"/>, and the <media>, <port>, | ||||
<proto>, and <fmt> values stored.</t> | ||||
<t indent="0" pn="section-5.8.2-3">Following the "m=" line, specific p | ||||
rocessing <bcp14>MUST</bcp14> be | ||||
applied for the following non-attribute lines: | applied for the following non-attribute lines: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>As with the "c=" line at the session level, the "c=" | -5.8.2-4"> | |||
line MUST be parsed according to | <li pn="section-5.8.2-4.1">As with the "c=" line at the session leve | |||
<xref target="RFC4566" />, Section 5.7, but its value is | l, the "c=" | |||
not used.</t> | line <bcp14>MUST</bcp14> be parsed according to | |||
<xref target="RFC4566" sectionFormat="comma" section="5.7" format="d | ||||
<t>The "b=" line, if present, MUST be parsed as specified | efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.7" derivedCont | |||
ent="RFC4566"/>, but its value is | ||||
not used.</li> | ||||
<li pn="section-5.8.2-4.2">The "b=" line, if present, <bcp14>MUST</b | ||||
cp14> be parsed as specified | ||||
in | in | |||
<xref target="RFC4566" />, Section 5.8, and the bwtype and | <xref target="RFC4566" sectionFormat="comma" section="5.8" format="d | |||
bandwidth values stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.8" derivedCont | |||
</list></t> | ent="RFC4566"/>, and the bwtype and | |||
bandwidth values stored.</li> | ||||
<t>Specific processing MUST also be applied for the following | </ul> | |||
<t indent="0" pn="section-5.8.2-5">Specific processing <bcp14>MUST</bc | ||||
p14> also be applied for the following | ||||
attribute lines: | attribute lines: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>If present, a single "a=ice-ufrag" line is parsed as | -5.8.2-6"> | |||
<li pn="section-5.8.2-6.1">If present, a single "a=ice-ufrag" line i | ||||
s parsed as | ||||
specified in | specified in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | <xref target="RFC8839" sectionFormat="comma" section="5.4" format="d | |||
Section 4.4, and the ufrag value is stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedCont | |||
ent="RFC8839"/>, and the ufrag value is stored.</li> | ||||
<t>If present, a single "a=ice-pwd" line is parsed as | <li pn="section-5.8.2-6.2">If present, a single "a=ice-pwd" line is | |||
parsed as | ||||
specified in | specified in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | <xref target="RFC8839" sectionFormat="comma" section="5.4" format="d | |||
Section 4.4, and the password value is stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedCont | |||
ent="RFC8839"/>, and the password value is stored.</li> | ||||
<t>If present, a single "a=ice-options" line is parsed as | <li pn="section-5.8.2-6.3">If present, a single "a=ice-options" line | |||
is parsed as | ||||
specified in | specified in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, Section 4.6, | <xref target="RFC8839" sectionFormat="comma" section="5.6" format="d | |||
and the set of specified options is stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.6" derivedCont | |||
ent="RFC8839"/>, | ||||
<t>Any "a=candidate" attributes MUST be parsed as specified | and the set of specified options is stored.</li> | |||
<li pn="section-5.8.2-6.4">Any "a=candidate" attributes <bcp14>MUST< | ||||
/bcp14> be parsed as specified | ||||
in | in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | <xref target="RFC8839" sectionFormat="comma" section="5.1" format="d | |||
Section 4.1, and their values stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.1" derivedCont | |||
ent="RFC8839"/>, and their values stored.</li> | ||||
<t>Any "a=remote-candidates" attributes MUST be parsed as | <li pn="section-5.8.2-6.5">Any "a=remote-candidates" attributes <bcp | |||
14>MUST</bcp14> be parsed as | ||||
specified in | specified in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | <xref target="RFC8839" sectionFormat="comma" section="5.2" format="d | |||
Section 4.2, but their values are ignored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.2" derivedCont | |||
ent="RFC8839"/>, but their values are ignored.</li> | ||||
<t>If present, a single "a=end-of-candidates" attribute | <li pn="section-5.8.2-6.6">If present, a single "a=end-of-candidates | |||
MUST be parsed as specified in | " attribute | |||
<xref target="I-D.ietf-ice-trickle" />, Section 8.2, and | <bcp14>MUST</bcp14> be parsed as specified in | |||
its presence or absence flagged and stored.</t> | <xref target="RFC8840" sectionFormat="comma" section="8.1" format="d | |||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8840#section-8.1" derivedCont | ||||
<t>Any "a=fingerprint" lines are parsed as specified in | ent="RFC8840"/>, and | |||
<xref target="RFC8122" />, Section 5, and the set of | its presence or absence flagged and stored.</li> | |||
fingerprint and algorithm values is stored.</t> | <li pn="section-5.8.2-6.7">Any "a=fingerprint" lines are parsed as s | |||
</list></t> | pecified in | |||
<xref target="RFC8122" sectionFormat="comma" section="5" format="def | ||||
<t>If the "m=" proto value indicates use of RTP, as described | ault" derivedLink="https://rfc-editor.org/rfc/rfc8122#section-5" derivedContent= | |||
"RFC8122"/>, and the set of | ||||
fingerprint and algorithm values is stored.</li> | ||||
</ul> | ||||
<t indent="0" pn="section-5.8.2-7">If the "m=" <proto> value ind | ||||
icates use of RTP, as described | ||||
in | in | |||
<xref target="sec.profile-names" /> above, the following | <xref target="sec.profile-names" format="default" sectionFormat="of" d | |||
attribute lines MUST be processed: | erivedContent="Section 5.1.2"/> above, the following | |||
<list style="symbols"> | attribute lines <bcp14>MUST</bcp14> be processed: | |||
</t> | ||||
<t>The "m=" fmt value MUST be parsed as specified in | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section | |||
<xref target="RFC4566" />, Section 5.14, and the individual | -5.8.2-8"> | |||
values stored.</t> | <li pn="section-5.8.2-8.1">The "m=" <fmt> value <bcp14>MUST</b | |||
cp14> be parsed as specified in | ||||
<t>Any "a=rtpmap" or "a=fmtp" lines MUST be parsed as | <xref target="RFC4566" sectionFormat="comma" section="5.14" format=" | |||
default" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.14" derivedCo | ||||
ntent="RFC4566"/>, and the individual | ||||
values stored.</li> | ||||
<li pn="section-5.8.2-8.2">Any "a=rtpmap" or "a=fmtp" lines <bcp14>M | ||||
UST</bcp14> be parsed as | ||||
specified in | specified in | |||
<xref target="RFC4566" />, Section 6, and their values | <xref target="RFC4566" sectionFormat="comma" section="6" format="def | |||
stored.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent= | |||
"RFC4566"/>, and their values | ||||
<t>If present, a single "a=ptime" line MUST be parsed as | stored.</li> | |||
<li pn="section-5.8.2-8.3">If present, a single "a=ptime" line <bcp1 | ||||
4>MUST</bcp14> be parsed as | ||||
described in | described in | |||
<xref target="RFC4566" />, Section 6, and its value | <xref target="RFC4566" sectionFormat="comma" section="6" format="def | |||
stored.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent= | |||
"RFC4566"/>, and its value | ||||
<t>If present, a single "a=maxptime" line MUST be parsed as | stored.</li> | |||
<li pn="section-5.8.2-8.4">If present, a single "a=maxptime" line <b | ||||
cp14>MUST</bcp14> be parsed as | ||||
described in | described in | |||
<xref target="RFC4566" />, Section 6, and its value | <xref target="RFC4566" sectionFormat="comma" section="6" format="def | |||
stored.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent= | |||
"RFC4566"/>, and its value | ||||
<t>If present, a single direction attribute line (e.g. | stored.</li> | |||
"a=sendrecv") MUST be parsed as described in | <li pn="section-5.8.2-8.5">If present, a single direction attribute | |||
<xref target="RFC4566" />, Section 6, and its value | line (e.g., | |||
stored.</t> | "a=sendrecv") <bcp14>MUST</bcp14> be parsed as described in | |||
<xref target="RFC4566" sectionFormat="comma" section="6" format="def | ||||
<t>Any "a=ssrc" attributes MUST be parsed as specified in | ault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent= | |||
<xref target="RFC5576" />, Section 4.1, and their values | "RFC4566"/>, and its value | |||
stored.</t> | stored.</li> | |||
<li pn="section-5.8.2-8.6">Any "a=ssrc" attributes <bcp14>MUST</bcp1 | ||||
<t>Any "a=extmap" attributes MUST be parsed as specified in | 4> be parsed as specified in | |||
<xref target="RFC5576" sectionFormat="comma" section="4.1" format="d | ||||
<xref target="RFC5285" />, Section 5, and their values | efault" derivedLink="https://rfc-editor.org/rfc/rfc5576#section-4.1" derivedCont | |||
stored.</t> | ent="RFC5576"/>, and their values | |||
stored.</li> | ||||
<li pn="section-5.8.2-8.7">Any "a=extmap" attributes <bcp14>MUST</bc | ||||
p14> be parsed as specified in | ||||
<t>Any "a=rtcp-fb" attributes MUST be parsed as specified | <xref target="RFC5285" sectionFormat="comma" section="5" format="def | |||
ault" derivedLink="https://rfc-editor.org/rfc/rfc5285#section-5" derivedContent= | ||||
"RFC5285"/>, and their values | ||||
stored.</li> | ||||
<li pn="section-5.8.2-8.8">Any "a=rtcp-fb" attributes <bcp14>MUST</b | ||||
cp14> be parsed as specified | ||||
in | in | |||
<xref target="RFC4585" />, Section 4.2., and their values | <xref target="RFC4585" sectionFormat="comma" section="4.2" format="d | |||
stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc4585#section-4.2" derivedCont | |||
ent="RFC4585"/>, and their values | ||||
<t>If present, a single "a=rtcp-mux" attribute MUST be | stored.</li> | |||
<li pn="section-5.8.2-8.9">If present, a single "a=rtcp-mux" attribu | ||||
te <bcp14>MUST</bcp14> be | ||||
parsed as specified in | parsed as specified in | |||
<xref target="RFC5761"></xref>, Section 5.1.3, and its | <xref target="RFC5761" sectionFormat="comma" section="5.1.3" format= | |||
presence or absence flagged and stored.</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc5761#section-5.1.3" derived | |||
Content="RFC5761"/>, and its | ||||
<t>If present, a single "a=rtcp-mux-only" attribute MUST be | presence or absence flagged and stored.</li> | |||
<li pn="section-5.8.2-8.10">If present, a single "a=rtcp-mux-only" a | ||||
ttribute <bcp14>MUST</bcp14> be | ||||
parsed as specified in | parsed as specified in | |||
<xref target="I-D.ietf-mmusic-mux-exclusive" />, Section 3, | <xref target="RFC8858" sectionFormat="comma" section="3" format="def | |||
and its presence or absence flagged and stored.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc8858#section-3" derivedContent= | |||
"RFC8858"/>, | ||||
<t>If present, a single "a=rtcp-rsize" attribute MUST be | and its presence or absence flagged and stored.</li> | |||
<li pn="section-5.8.2-8.11">If present, a single "a=rtcp-rsize" attr | ||||
ibute <bcp14>MUST</bcp14> be | ||||
parsed as specified in | parsed as specified in | |||
<xref target="RFC5506" />, Section 5, and its presence or | <xref target="RFC5506" sectionFormat="comma" section="5" format="def | |||
absence flagged and stored.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc5506#section-5" derivedContent= | |||
"RFC5506"/>, and its presence or | ||||
<t>If present, a single "a=rtcp" attribute MUST be parsed | absence flagged and stored.</li> | |||
<li pn="section-5.8.2-8.12">If present, a single "a=rtcp" attribute | ||||
<bcp14>MUST</bcp14> be parsed | ||||
as specified in | as specified in | |||
<xref target="RFC3605" />, Section 2.1, but its value is | <xref target="RFC3605" sectionFormat="comma" section="2.1" format="d efault" derivedLink="https://rfc-editor.org/rfc/rfc3605#section-2.1" derivedCont ent="RFC3605"/>, but its value is | |||
ignored, as this information is superfluous when using | ignored, as this information is superfluous when using | |||
ICE.</t> | ICE.</li> | |||
<li pn="section-5.8.2-8.13">If present, "a=msid" attributes <bcp14>M | ||||
<t>If present, "a=msid" attributes MUST be parsed as | UST</bcp14> be parsed as | |||
specified in | specified in | |||
<xref target="I-D.ietf-mmusic-msid" />, Section 3.2, and | <xref target="RFC8830" sectionFormat="comma" section="3.2" format="d efault" derivedLink="https://rfc-editor.org/rfc/rfc8830#section-3.2" derivedCont ent="RFC8830"/>, and | |||
their values stored, ignoring any "appdata" field. If no "a=msid" | their values stored, ignoring any "appdata" field. If no "a=msid" | |||
attributes are present, a random msid-id value is generated for a | attributes are present, a random msid-id value is generated for a | |||
"default" MediaStream for the session, if not already present, and | "default" MediaStream for the session, if not already present, and | |||
this value is stored.</t> | this value is stored.</li> | |||
<li pn="section-5.8.2-8.14">Any "a=imageattr" attributes <bcp14>MUST | ||||
<t>Any "a=imageattr" attributes MUST be parsed as specified | </bcp14> be parsed as specified | |||
in | in | |||
<xref target="RFC6236" />, Section 3, and their values | <xref target="RFC6236" sectionFormat="comma" section="3" format="def | |||
stored.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc6236#section-3" derivedContent= | |||
"RFC6236"/>, and their values | ||||
<t>Any "a=rid" lines MUST be parsed as specified in | stored.</li> | |||
<xref target="I-D.ietf-mmusic-rid"></xref>, Section 10, and | <li pn="section-5.8.2-8.15">Any "a=rid" lines <bcp14>MUST</bcp14> be | |||
their values stored.</t> | parsed as specified in | |||
<xref target="RFC8851" sectionFormat="comma" section="10" format="de | ||||
<t>If present, a single "a=simulcast" line MUST be parsed | fault" derivedLink="https://rfc-editor.org/rfc/rfc8851#section-10" derivedConten | |||
t="RFC8851"/>, and | ||||
their values stored.</li> | ||||
<li pn="section-5.8.2-8.16">If present, a single "a=simulcast" line | ||||
<bcp14>MUST</bcp14> be parsed | ||||
as specified in | as specified in | |||
<xref target="I-D.ietf-mmusic-sdp-simulcast"></xref>, and | <xref target="RFC8853" format="default" sectionFormat="of" derivedCo | |||
its values stored.</t> | ntent="RFC8853"/>, and | |||
</list></t> | its values stored.</li> | |||
</ul> | ||||
<t>Otherwise, if the "m=" proto value indicates use of SCTP, | <t indent="0" pn="section-5.8.2-9">Otherwise, if the "m=" <proto> | |||
the following attribute lines MUST be processed: | ; value indicates use of SCTP, | |||
<list style="symbols"> | the following attribute lines <bcp14>MUST</bcp14> be processed: | |||
</t> | ||||
<t>The "m=" fmt value MUST be parsed as specified in | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section | |||
<xref target="I-D.ietf-mmusic-sctp-sdp" />, Section 4.3, | -5.8.2-10"> | |||
and the application protocol value stored.</t> | <li pn="section-5.8.2-10.1">The "m=" <fmt> value <bcp14>MUST< | |||
/bcp14> be parsed as specified in | ||||
<t>An "a=sctp-port" attribute MUST be present, and it MUST | <xref target="RFC8841" sectionFormat="comma" section="4.3" format="d | |||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8841#section-4.3" derivedCont | ||||
ent="RFC8841"/>, | ||||
and the application protocol value stored.</li> | ||||
<li pn="section-5.8.2-10.2">An "a=sctp-port" attribute <bcp14>MUST</ | ||||
bcp14> be present, and it <bcp14>MUST</bcp14> | ||||
be parsed as specified in | be parsed as specified in | |||
<xref target="I-D.ietf-mmusic-sctp-sdp" />, Section 5.2, | <xref target="RFC8841" sectionFormat="comma" section="5.2" format="d | |||
and the value stored.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc8841#section-5.2" derivedCont | |||
ent="RFC8841"/>, | ||||
<t>If present, a single "a=max-message-size" attribute MUST | and the value stored.</li> | |||
<li pn="section-5.8.2-10.3">If present, a single "a=max-message-size | ||||
" attribute <bcp14>MUST</bcp14> | ||||
be parsed as specified in | be parsed as specified in | |||
<xref target="I-D.ietf-mmusic-sctp-sdp" />, Section 6, and | <xref target="RFC8841" sectionFormat="comma" section="6" format="def | |||
the value stored. Otherwise, use the specified default.</t> | ault" derivedLink="https://rfc-editor.org/rfc/rfc8841#section-6" derivedContent= | |||
</list></t> | "RFC8841"/>, and | |||
the value stored. Otherwise, use the specified default.</li> | ||||
<t>Other attributes that are not relevant to JSEP may also be | </ul> | |||
present, and implementations SHOULD process any that they | <t indent="0" pn="section-5.8.2-11">Other attributes that are not rele | |||
vant to JSEP may also be | ||||
present, and implementations <bcp14>SHOULD</bcp14> process any that th | ||||
ey | ||||
recognize. As required by | recognize. As required by | |||
<xref target="RFC4566"></xref>, Section 5.13, unknown | <xref target="RFC4566" sectionFormat="comma" section="5.13" format="de | |||
attribute lines MUST be ignored.</t> | fault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.13" derivedCont | |||
ent="RFC4566"/>, unknown | ||||
attribute lines <bcp14>MUST</bcp14> be ignored.</t> | ||||
</section> | </section> | |||
<section title="Semantics Verification"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-5 | |||
.8.3"> | ||||
<t>Assuming parsing completes successfully, the parsed | <name slugifiedName="name-semantics-verification">Semantics Verificati | |||
on</name> | ||||
<t indent="0" pn="section-5.8.3-1">Assuming that parsing completes suc | ||||
cessfully, the parsed | ||||
description is then evaluated to ensure internal consistency | description is then evaluated to ensure internal consistency | |||
as well as proper support for mandatory features. | as well as proper support for mandatory features. | |||
Specifically, the following checks are performed: | Specifically, the following checks are performed: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section | ||||
<t>For each m= section, valid values for each of the | -5.8.3-2"> | |||
<li pn="section-5.8.3-2.1"> | ||||
<t indent="0" pn="section-5.8.3-2.1.1">For each "m=" section, vali | ||||
d values for each of the | ||||
mandatory-to-use features enumerated in | mandatory-to-use features enumerated in | |||
<xref target="sec.usage-requirements" /> MUST be present. | <xref target="sec.usage-requirements" format="default" sectionFormat | |||
These values MAY either be present at the media level, or | ="of" derivedContent="Section 5.1.1"/> <bcp14>MUST</bcp14> be present. | |||
These values <bcp14>MAY</bcp14> be either present at the media level | ||||
or | ||||
inherited from the session level. | inherited from the session level. | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="sec | ||||
<t>ICE ufrag and password values, which MUST comply with | tion-5.8.3-2.1.2"> | |||
<li pn="section-5.8.3-2.1.2.1">ICE ufrag and password values, wh | ||||
ich <bcp14>MUST</bcp14> comply with | ||||
the size limits specified in | the size limits specified in | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, Section 4.4.</t> | <xref target="RFC8839" sectionFormat="comma" section="5.4" format= | |||
"default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedCo | ||||
<t>tls-id value, which MUST be set according to | ntent="RFC8839"/>.</li> | |||
<xref target="I-D.ietf-mmusic-dtls-sdp" />, Section 5. If | <li pn="section-5.8.3-2.1.2.2">A tls-id value, which <bcp14>MUST | |||
this is a re-offer or a response to a re-offer and the | </bcp14> be set according to | |||
tls-id value is different from that presently in use, the | <xref target="RFC8842" sectionFormat="comma" section="5" format="d | |||
DTLS connection is not being continued and the remote | efault" derivedLink="https://rfc-editor.org/rfc/rfc8842#section-5" derivedConten | |||
description MUST be part of an ICE restart, together with | t="RFC8842"/>. If | |||
new ufrag and password values.</t> | this is a re-offer or a response to a re-offer and the | |||
tls-id value is different from that presently in use, the | ||||
<t>DTLS setup value, which MUST be set according to the | DTLS connection is not being continued and the remote | |||
rules specified in | description <bcp14>MUST</bcp14> be part of an ICE restart, togethe | |||
<xref target="RFC5763" />, Section 5 and MUST be | r with | |||
consistent with the selected role of the current DTLS | new ufrag and password values.</li> | |||
connection, if one exists and is being continued.</t> | <li pn="section-5.8.3-2.1.2.3">A DTLS setup value, which <bcp14> | |||
MUST</bcp14> be set according to the | ||||
<t>DTLS fingerprint values, where at least one | rules specified in | |||
fingerprint MUST be present.</t> | <xref target="RFC5763" sectionFormat="comma" section="5" format="d | |||
</list></t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc5763#section-5" derivedConten | |||
t="RFC5763"/> and <bcp14>MUST</bcp14> be | ||||
<t>All RID values referenced in an "a=simulcast" line MUST | consistent with the selected role of the current DTLS | |||
exist as "a=rid" lines.</t> | connection, if one exists and is being continued.</li> | |||
<li pn="section-5.8.3-2.1.2.4">DTLS fingerprint values, where at | ||||
<t>Each m= section is also checked to ensure prohibited | least one | |||
features are not used.</t> | fingerprint <bcp14>MUST</bcp14> be present.</li> | |||
</ul> | ||||
<t>If the RTP/RTCP multiplexing policy is "require", each | </li> | |||
m= section MUST contain an "a=rtcp-mux" attribute. If an m= | <li pn="section-5.8.3-2.2">All rid-ids referenced in an "a=simulcast | |||
section contains an "a=rtcp-mux-only" attribute, that | " line <bcp14>MUST</bcp14> | |||
section MUST also contain an "a=rtcp-mux" attribute.</t> | exist as "a=rid" lines.</li> | |||
<li pn="section-5.8.3-2.3">Each "m=" section is also checked to ensu | ||||
<t>If an m= section was present in the previous answer, the | re that prohibited | |||
state of RTP/RTCP multiplexing MUST match what was | features are not used.</li> | |||
previously negotiated.</t> | <li pn="section-5.8.3-2.4">If the RTP/RTCP multiplexing policy is "r | |||
</list></t> | equire", each | |||
"m=" section <bcp14>MUST</bcp14> contain an "a=rtcp-mux" attribute. | ||||
<t>If this session description is of type "pranswer" or | If an "m=" | |||
"answer", the following additional checks are applied: | section contains an "a=rtcp-mux-only" attribute, that | |||
<list style="symbols"> | section <bcp14>MUST</bcp14> also contain an "a=rtcp-mux" attribute.< | |||
/li> | ||||
<t>The session description must follow the rules defined in | <li pn="section-5.8.3-2.5">If an "m=" section was present in the pre | |||
vious answer, the | ||||
<xref target="RFC3264" />, Section 6, including the | state of RTP/RTCP multiplexing <bcp14>MUST</bcp14> match what was | |||
requirement that the number of m= sections MUST exactly | previously negotiated.</li> | |||
match the number of m= sections in the associated | </ul> | |||
offer.</t> | <t indent="0" pn="section-5.8.3-3">If this session description is of t | |||
ype "pranswer" or | ||||
<t>For each m= section, the media type and protocol values | "answer", the following additional checks are applied: | |||
MUST exactly match the media type and protocol values in | </t> | |||
the corresponding m= section in the associated offer.</t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section | |||
</list></t> | -5.8.3-4"> | |||
<li pn="section-5.8.3-4.1">The session description <bcp14>MUST</bcp1 | ||||
<t>If any of the preceding checks failed, processing MUST | 4> follow the rules defined in | |||
stop and an error MUST be returned.</t> | <xref target="RFC3264" sectionFormat="comma" section="6" format="def | |||
ault" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-6" derivedContent= | ||||
"RFC3264"/>, including the | ||||
requirement that the number of "m=" sections <bcp14>MUST</bcp14> exa | ||||
ctly | ||||
match the number of "m=" sections in the associated | ||||
offer.</li> | ||||
<li pn="section-5.8.3-4.2">For each "m=" section, the media type and | ||||
protocol values | ||||
<bcp14>MUST</bcp14> exactly match the media type and protocol values | ||||
in | ||||
the corresponding "m=" section in the associated offer.</li> | ||||
</ul> | ||||
<t indent="0" pn="section-5.8.3-5">If any of the preceding checks fail | ||||
ed, processing <bcp14>MUST</bcp14> | ||||
stop and an error <bcp14>MUST</bcp14> be returned.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section title="Applying a Local Description" | <section anchor="sec.applying-a-local-desc" numbered="true" toc="include" | |||
anchor="sec.applying-a-local-desc"> | removeInRFC="false" pn="section-5.9"> | |||
<name slugifiedName="name-applying-a-local-descriptio">Applying a Local | ||||
<t>The following steps are performed at the media engine level | Description</name> | |||
to apply a local description. If an error is returned, the | <t indent="0" pn="section-5.9-1">The following steps are performed at th | |||
session MUST be restored to the state it was in before | e media engine level | |||
performing these steps.</t> | to apply a local description. If an error is returned, the | |||
session <bcp14>MUST</bcp14> be restored to the state it was in before | ||||
<t>First, m= sections are processed. For each m= section, the | performing these steps.</t> | |||
following steps MUST be performed; if any parameters are out of | <t indent="0" pn="section-5.9-2">First, "m=" sections are processed. For | |||
bounds, or cannot be applied, processing MUST stop and an error | each "m=" section, the | |||
MUST be returned. | following steps <bcp14>MUST</bcp14> be performed; if any parameters are | |||
<list style="symbols"> | out of | |||
bounds or cannot be applied, processing <bcp14>MUST</bcp14> stop and an | ||||
<t>If this m= section is new, begin gathering candidates for | error | |||
it, as defined in | <bcp14>MUST</bcp14> be returned. | |||
<xref target="RFC8445" />, Section 5.1.1, unless it is | </t> | |||
definitively being bundled (either this is an offer and the | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5 | |||
m= section is marked bundle-only, or it is an answer and the | .9-3"> | |||
m= section is bundled into into another m= section.)</t> | <li pn="section-5.9-3.1">If this "m=" section is new, begin gathering | |||
candidates for | ||||
<t>Or, if the ICE ufrag and password values have changed, | it, as defined in | |||
trigger the ICE agent to start an ICE restart as described in | <xref target="RFC8445" sectionFormat="comma" section="5.1.1" format="d | |||
<xref target="RFC8445" />, Section 9, and begin | efault" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-5.1.1" derivedCo | |||
gathering new candidates for the m= section. If this | ntent="RFC8445"/>, unless it is | |||
description is an answer, also start checks on that media | definitively being bundled (either (1) this is an offer and the | |||
section.</t> | "m=" section is marked bundle-only or (2) it is an answer and the | |||
"m=" section is bundled into another "m=" section).</li> | ||||
<t>If the m= section proto value indicates use of RTP: | <li pn="section-5.9-3.2">Or, if the ICE ufrag and password values have | |||
<list style="symbols"> | changed, | |||
trigger the ICE agent to start an ICE restart as described in | ||||
<t>If there is no RtpTransceiver associated with this m= | <xref target="RFC8445" sectionFormat="comma" section="9" format="defau | |||
section, find one and associate it with this m= section | lt" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-9" derivedContent="R | |||
according to the following steps. Note that this situation | FC8445"/>, and begin | |||
will only occur when applying an offer. | gathering new candidates for the "m=" section. If this | |||
<list style="symbols"> | description is an answer, also start checks on that media | |||
section.</li> | ||||
<t>Find the RtpTransceiver that corresponds to this m= | <li pn="section-5.9-3.3"> | |||
section, using the mapping between transceivers and m= | <t indent="0" pn="section-5.9-3.3.1">If the "m=" section <proto&g | |||
section indices established when creating the offer.</t> | t; value indicates use of RTP: | |||
</t> | ||||
<t>Set the value of this RtpTransceiver's mid property to | <ul spacing="normal" bare="false" empty="false" indent="3" pn="secti | |||
the MID of the m= section.</t> | on-5.9-3.3.2"> | |||
</list></t> | <li pn="section-5.9-3.3.2.1"> | |||
<t indent="0" pn="section-5.9-3.3.2.1.1">If there is no RtpTrans | ||||
<t>If RTCP mux is indicated, prepare to demux RTP and RTCP | ceiver associated with this "m=" | |||
from the RTP ICE component, as specified in | section, find one and associate it with this "m=" section | |||
<xref target="RFC5761" />, Section 5.1.3.</t> | according to the following steps. Note that this situation | |||
will only occur when applying an offer. | ||||
<t>For each specified RTP header extension, establish a | </t> | |||
mapping between the extension ID and URI, as described in | <ul spacing="normal" bare="false" empty="false" indent="3" pn="s | |||
<xref target="RFC5285" />, Section 6.</t> | ection-5.9-3.3.2.1.2"> | |||
<li pn="section-5.9-3.3.2.1.2.1">Find the RtpTransceiver that | ||||
<t>If the MID header extension is supported, prepare to | corresponds to this "m=" | |||
demux RTP streams intended for this m= section based on the | section, using the mapping between transceivers and "m=" | |||
MID header extension, as described in | section indices established when creating the offer.</li> | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />, | <li pn="section-5.9-3.3.2.1.2.2">Set the value of this RtpTran | |||
Section 15.</t> | sceiver's mid property to | |||
the MID of the "m=" section.</li> | ||||
<t>For each specified media format, establish a mapping | </ul> | |||
between the payload type and the actual media format, as | </li> | |||
described in | <li pn="section-5.9-3.3.2.2">If RTCP mux is indicated, prepare to | |||
<xref target="RFC3264" />, Section 6.1. In addition, | demux RTP and RTCP | |||
prepare to demux RTP streams intended for this m= section | from the RTP ICE component, as specified in | |||
based on the media formats supported by this m= section, as | <xref target="RFC5761" sectionFormat="comma" section="5.1.3" format= | |||
described in | "default" derivedLink="https://rfc-editor.org/rfc/rfc5761#section-5.1.3" derived | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />, | Content="RFC5761"/>.</li> | |||
Section 10.2.</t> | <li pn="section-5.9-3.3.2.3">For each specified RTP header extensi | |||
on, establish a | ||||
<t>For each specified "rtx" media format, establish a | mapping between the extension ID and URI, as described in | |||
mapping between the RTX payload type and its associated | <xref target="RFC5285" sectionFormat="comma" section="6" format="def | |||
primary payload type, as described in | ault" derivedLink="https://rfc-editor.org/rfc/rfc5285#section-6" derivedContent= | |||
<xref target="RFC4588" />, Sections 8.6 and 8.7.</t> | "RFC5285"/>.</li> | |||
<li pn="section-5.9-3.3.2.4">If the MID header extension is suppor | ||||
<t>If the directional attribute is of type "sendrecv" or | ted, prepare to | |||
"recvonly", enable receipt and decoding of media.</t> | demux RTP streams intended for this "m=" section based on the | |||
</list></t> | MID header extension, as described in | |||
</list></t> | <xref target="RFC8843" sectionFormat="comma" section="15" format="de | |||
fault" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-15" derivedConten | ||||
t="RFC8843"/>.</li> | ||||
<li pn="section-5.9-3.3.2.5">For each specified media format, esta | ||||
blish a mapping | ||||
between the payload type and the actual media format, as | ||||
described in | ||||
<xref target="RFC3264" sectionFormat="comma" section="6.1" format="d | ||||
efault" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-6.1" derivedCont | ||||
ent="RFC3264"/>. In addition, | ||||
prepare to demux RTP streams intended for this "m=" section | ||||
based on the media formats supported by this "m=" section, as | ||||
described in | ||||
<xref target="RFC8843" sectionFormat="comma" section="9.2" format="d | ||||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-9.2" derivedCont | ||||
ent="RFC8843"/>. | ||||
</li> | ||||
<li pn="section-5.9-3.3.2.6">For each specified "rtx" media format | ||||
, establish a | ||||
mapping between the RTX payload type and its associated | ||||
primary payload type, as described in | ||||
Sections <xref target="RFC4588" section="8.6" sectionFormat="bare" f | ||||
ormat="default" derivedLink="https://rfc-editor.org/rfc/rfc4588#section-8.6" der | ||||
ivedContent="RFC4588"/> and <xref target="RFC4588" section="8.7" sectionFormat=" | ||||
bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc4588#section-8 | ||||
.7" derivedContent="RFC4588"/> of <xref target="RFC4588" format="default" sectio | ||||
nFormat="of" derivedContent="RFC4588"/>. | ||||
<t>Finally, if this description is of type "pranswer" or | </li> | |||
"answer", follow the processing defined in | <li pn="section-5.9-3.3.2.7">If the direction attribute is of type | |||
<xref target="sec.applying-an-answer" /> below.</t> | "sendrecv" or | |||
"recvonly", enable receipt and decoding of media.</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
<t indent="0" pn="section-5.9-4">Finally, if this description is of type | ||||
"pranswer" or | ||||
"answer", follow the processing defined in | ||||
<xref target="sec.applying-an-answer" format="default" sectionFormat="of | ||||
" derivedContent="Section 5.11"/> below.</t> | ||||
</section> | </section> | |||
<section title="Applying a Remote Description" | <section anchor="sec.applying-a-remote-desc" numbered="true" toc="include" | |||
anchor="sec.applying-a-remote-desc"> | removeInRFC="false" pn="section-5.10"> | |||
<name slugifiedName="name-applying-a-remote-descripti">Applying a Remote | ||||
<t>The following steps are performed to apply a remote | Description</name> | |||
description. If an error is returned, the session MUST be | <t indent="0" pn="section-5.10-1">The following steps are performed to a | |||
restored to the state it was in before performing these | pply a remote | |||
steps.</t> | description. If an error is returned, the session <bcp14>MUST</bcp14> be | |||
restored to the state it was in before performing these | ||||
<t>If the answer contains any "a=ice-options" attributes where | steps.</t> | |||
"trickle" is listed as an attribute, update the PeerConnection | <t indent="0" pn="section-5.10-2">If the answer contains any "a=ice-opti | |||
canTrickle property to be true. Otherwise, set this property to | ons" attributes where | |||
false.</t> | "trickle" is listed as an attribute, update the PeerConnection | |||
canTrickleIceCandidates property to be "true". Otherwise, set this prope | ||||
<t>The following steps MUST be performed for attributes at the | rty to | |||
session level; if any parameters are out of bounds, or cannot | "false".</t> | |||
be applied, processing MUST stop and an error MUST be returned. | <t indent="0" pn="section-5.10-3">The following steps <bcp14>MUST</bcp14 | |||
> be performed for attributes at the | ||||
<list style="symbols"> | session level; if any parameters are out of bounds or cannot | |||
be applied, processing <bcp14>MUST</bcp14> stop and an error <bcp14>MUST | ||||
<t>For any specified "CT" bandwidth value, set this as the | </bcp14> be returned. | |||
limit for the maximum total bitrate for all m= sections, as | ||||
specified in | ||||
<xref target="RFC4566"></xref>, Section 5.8. Within this | ||||
overall limit, the implementation can dynamically decide how | ||||
to best allocate the available bandwidth between m= sections, | ||||
respecting any specific limits that have been specified for | ||||
individual m= sections.</t> | ||||
<t>For any specified "RR" or "RS" bandwidth values, handle as | ||||
specified in | ||||
<xref target="RFC3556"></xref>, Section 2.</t> | ||||
<t>Any "AS" bandwidth value MUST be ignored, as the meaning | ||||
of this construct at the session level is not well | ||||
defined.</t> | ||||
</list></t> | ||||
<t>For each m= section, the following steps MUST be performed; | ||||
if any parameters are out of bounds, or cannot be applied, | ||||
processing MUST stop and an error MUST be returned. | ||||
<list style="symbols"> | ||||
<t>If the ICE ufrag or password changed from the previous | ||||
remote description: | ||||
<list style="symbols"> | ||||
<t>If the description is of type "offer", the | ||||
implementation MUST note that an ICE restart is needed, as | ||||
described in | ||||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, | ||||
Section 3.4.1.1.1</t> | ||||
<t>If the description is of type "answer" or "pranswer", | ||||
then check to see if the current local description is an | ||||
ICE restart, and if not, generate an error. If the | ||||
PeerConnection state is "have-remote-pranswer", and the ICE | ||||
ufrag or password changed from the previous provisional | ||||
answer, then signal the ICE agent to discard any previous | ||||
ICE check list state for the m= section. Finally, signal | ||||
the ICE agent to begin checks.</t> | ||||
</list></t> | ||||
<t>If the current local description indicates an ICE restart, | ||||
and either the ICE ufrag or password has not changed from the | ||||
previous remote description, as prescribed by | ||||
<xref target="RFC8445" />, Section 9, generate an | ||||
error.</t> | ||||
<t>Configure the ICE components associated with this media | ||||
section to use the supplied ICE remote ufrag and password for | ||||
their connectivity checks.</t> | ||||
<t>Pair any supplied ICE candidates with any gathered local | ||||
candidates, as described in | ||||
<xref target="RFC8445" />, Section 6.1.2, and start | ||||
connectivity checks with the appropriate credentials.</t> | ||||
<t>If an "a=end-of-candidates" attribute is present, process | ||||
the end-of-candidates indication as described in | ||||
<xref target="I-D.ietf-ice-trickle" />, Section 11.</t> | ||||
<t>If the m= section proto value indicates use of RTP: | ||||
<list style="symbols"> | ||||
<t>If the m= section is being recycled (see | ||||
<xref target="sec.subsequent-offers"></xref>), dissociate | ||||
the currently associated RtpTransceiver by setting its mid | ||||
property to null, and discard the mapping between the | ||||
transceiver and its m= section index.</t> | ||||
<t>If the m= section is not associated with any | ||||
RtpTransceiver (possibly because it was dissociated in the | ||||
previous step), either find an RtpTransceiver or create one | ||||
according to the following steps: | ||||
<list style="symbols"> | ||||
<t>If the m= section is sendrecv or recvonly, and there | ||||
are RtpTransceivers of the same type that were added to | ||||
the PeerConnection by addTrack and are not associated | ||||
with any m= section and are not stopped, find the first | ||||
(according to the canonical order described in | ||||
<xref target="sec.initial-offers" />) such | ||||
RtpTransceiver.</t> | ||||
<t>If no RtpTransceiver was found in the previous step, | ||||
create one with a recvonly direction.</t> | ||||
<t>Associate the found or created RtpTransceiver with the | ||||
m= section by setting the value of the RtpTransceiver's | ||||
mid property to the MID of the m= section, and establish | ||||
a mapping between the transceiver and the index of the m= | ||||
section. If the m= section does not include a MID (i.e., | ||||
the remote endpoint does not support the MID extension), | ||||
generate a value for the RtpTransceiver mid property, | ||||
following the guidance for "a=mid" mentioned in | ||||
<xref target="sec.initial-offers" />.</t> | ||||
</list></t> | ||||
<t>For each specified media format that is also supported | ||||
by the local implementation, establish a mapping between | ||||
the specified payload type and the media format, as | ||||
described in | ||||
<xref target="RFC3264" />, Section 6.1. Specifically, this | ||||
means that the implementation records the payload type to | ||||
be used in outgoing RTP packets when sending each specified | ||||
media format, as well as the relative preference for each | ||||
format that is indicated in their ordering. If any | ||||
indicated media format is not supported by the local | ||||
implementation, it MUST be ignored.</t> | ||||
<t>For each specified "rtx" media format, establish a | ||||
mapping between the RTX payload type and its associated | ||||
primary payload type, as described in | ||||
<xref target="RFC4588" />, Section 4. If any referenced | ||||
primary payload types are not present, this MUST result in | ||||
an error. Note that RTX payload types may refer to primary | ||||
payload types which are not supported by the local media | ||||
implementation, in which case, the RTX payload type MUST | ||||
also be ignored.</t> | ||||
<t>For each specified fmtp parameter that is supported by | ||||
the local implementation, enable them on the associated | ||||
media formats.</t> | ||||
<t>For each specified SSRC that is signaled in the m= | ||||
section, prepare to demux RTP streams intended for this m= | ||||
section using that SSRC, as described in | ||||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />, | ||||
Section 10.2.</t> | ||||
<t>For each specified RTP header extension that is also | ||||
supported by the local implementation, establish a mapping | ||||
between the extension ID and URI, as described in | ||||
<xref target="RFC5285" />, Section 5. Specifically, this | ||||
means that the implementation records the extension ID to | ||||
be used in outgoing RTP packets when sending each specified | ||||
header extension. If any indicated RTP header extension is | ||||
not supported by the local implementation, it MUST be | ||||
ignored.</t> | ||||
<t>For each specified RTCP feedback mechanism that is | ||||
supported by the local implementation, enable them on the | ||||
associated media formats.</t> | ||||
<t>For any specified "TIAS" bandwidth value, set this value | ||||
as a constraint on the maximum RTP bitrate to be used when | ||||
sending media, as specified in | ||||
<xref target="RFC3890"></xref>. If a "TIAS" value is not | ||||
present, but an "AS" value is specified, generate a "TIAS" | ||||
value using this formula: | ||||
<list style="format"> | ||||
<t>TIAS = AS * 1000 * 0.95 - (50 * 40 * 8)</t> | ||||
</list>The 50 is based on 50 packets per second, the 40 is | ||||
based on an estimate of total header size, the 1000 changes | ||||
the unit from kbps to bps (as required by TIAS), and the | ||||
0.95 is to allocate 5% to RTCP. "TIAS" is used in | ||||
preference to "AS" because it provides more accurate | ||||
control of bandwidth.</t> | ||||
<t>For any "RR" or "RS" bandwidth values, handle as | ||||
specified in | ||||
<xref target="RFC3556"></xref>, Section 2.</t> | ||||
<t>Any specified "CT" bandwidth value MUST be ignored, as | ||||
the meaning of this construct at the media level is not | ||||
well defined.</t> | ||||
<t>If the m= section is of type audio: | ||||
<list style="symbols"> | ||||
<t>For each specified "CN" media format, configure | ||||
silence suppression for all supported media formats with | ||||
the same clockrate, as described in | ||||
<xref target="RFC3389" />, Section 5, except for formats | ||||
that have their own internal silence suppression | ||||
mechanisms. Silence suppression for such formats (e.g., | ||||
Opus) is controlled via fmtp parameters, as discussed in | ||||
<xref target="sec.voiceactivitydetection1" />.</t> | ||||
<t>For each specified "telephone-event" media format, | ||||
enable DTMF transmission for all supported media formats | ||||
with the same clockrate, as described in | ||||
<xref target="RFC4733" />, Section 2.5.1.2. If there are | ||||
any supported media formats that do not have a | ||||
corresponding telephone-event format, disable DTMF | ||||
transmission for those formats.</t> | ||||
<t>For any specified "ptime" value, configure the | ||||
available media formats to use the specified packet size | ||||
when sending. If the specified size is not supported for | ||||
a media format, use the next closest value instead.</t> | ||||
</list></t> | ||||
</list></t> | ||||
</list></t> | ||||
<t>Finally, if this description is of type "pranswer" or | </t> | |||
"answer", follow the processing defined in | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5 | |||
<xref target="sec.applying-an-answer" /> below.</t> | .10-4"> | |||
<li pn="section-5.10-4.1">For any specified "CT" bandwidth value, set | ||||
this value as the | ||||
limit for the maximum total bitrate for all "m=" sections, as | ||||
specified in | ||||
<xref target="RFC4566" sectionFormat="comma" section="5.8" format="def | ||||
ault" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-5.8" derivedConten | ||||
t="RFC4566"/>. Within this | ||||
overall limit, the implementation can dynamically decide how | ||||
to best allocate the available bandwidth between "m=" sections, | ||||
respecting any specific limits that have been specified for | ||||
individual "m=" sections.</li> | ||||
<li pn="section-5.10-4.2">For any specified "RR" or "RS" bandwidth val | ||||
ues, handle as | ||||
specified in | ||||
<xref target="RFC3556" sectionFormat="comma" section="2" format="defau | ||||
lt" derivedLink="https://rfc-editor.org/rfc/rfc3556#section-2" derivedContent="R | ||||
FC3556"/>.</li> | ||||
<li pn="section-5.10-4.3">Any "AS" bandwidth value (<xref target="RFC4 | ||||
566" sectionFormat="comma" section="5.8" format="default" derivedLink="https://r | ||||
fc-editor.org/rfc/rfc4566#section-5.8" derivedContent="RFC4566"/>) | ||||
<bcp14>MUST</bcp14> be ignored, as the meaning | ||||
of this construct at the session level is not well | ||||
defined. </li> | ||||
</ul> | ||||
<t indent="0" pn="section-5.10-5">For each "m=" section, the following s | ||||
teps <bcp14>MUST</bcp14> be performed; | ||||
if any parameters are out of bounds or cannot be applied, | ||||
processing <bcp14>MUST</bcp14> stop and an error <bcp14>MUST</bcp14> be | ||||
returned. | ||||
</t> | ||||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5 | ||||
.10-6"> | ||||
<li pn="section-5.10-6.1"> | ||||
<t indent="0" pn="section-5.10-6.1.1">If the ICE ufrag or password c | ||||
hanged from the previous | ||||
remote description: | ||||
</t> | ||||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="secti | ||||
on-5.10-6.1.2"> | ||||
<li pn="section-5.10-6.1.2.1">If the description is of type "offer | ||||
", the | ||||
implementation <bcp14>MUST</bcp14> note that an ICE restart is neede | ||||
d, as | ||||
described in | ||||
<xref target="RFC8839" sectionFormat="comma" section="4.4.1.1.1" for | ||||
mat="default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-4.4.1.1.1" | ||||
derivedContent="RFC8839"/>.</li> | ||||
<li pn="section-5.10-6.1.2.2">If the description is of type "answe | ||||
r" or "pranswer", | ||||
then check to see if the current local description is an | ||||
ICE restart, and if not, generate an error. If the | ||||
PeerConnection state is "have-remote-pranswer" and the ICE | ||||
ufrag or password changed from the previous provisional | ||||
answer, then signal the ICE agent to discard any previous | ||||
ICE checklist state for the "m=" section. Finally, signal | ||||
the ICE agent to begin checks. | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-5.10-6.2">If the current local description indicates a | ||||
n ICE restart | ||||
but neither the ICE ufrag nor the password has changed from the | ||||
previous remote description (as prescribed by | ||||
<xref target="RFC8445" sectionFormat="comma" section="9" format="defau | ||||
lt" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-9" derivedContent="R | ||||
FC8445"/>), generate an | ||||
error.</li> | ||||
<li pn="section-5.10-6.3">Configure the ICE components associated with | ||||
this media | ||||
section to use the supplied ICE remote ufrag and password for | ||||
their connectivity checks.</li> | ||||
<li pn="section-5.10-6.4">Pair any supplied ICE candidates with any ga | ||||
thered local | ||||
candidates, as described in | ||||
<xref target="RFC8445" sectionFormat="comma" section="6.1.2" format="d | ||||
efault" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-6.1.2" derivedCo | ||||
ntent="RFC8445"/>, and start | ||||
connectivity checks with the appropriate credentials.</li> | ||||
<li pn="section-5.10-6.5">If an "a=end-of-candidates" attribute is pre | ||||
sent, process | ||||
the end-of-candidates indication as described in | ||||
<xref target="RFC8838" sectionFormat="comma" section="14" format="defa | ||||
ult" derivedLink="https://rfc-editor.org/rfc/rfc8838#section-14" derivedContent= | ||||
"RFC8838"/>.</li> | ||||
<li pn="section-5.10-6.6"> | ||||
<t indent="0" pn="section-5.10-6.6.1">If the "m=" section <proto& | ||||
gt; value indicates use of RTP: | ||||
</t> | ||||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="secti | ||||
on-5.10-6.6.2"> | ||||
<li pn="section-5.10-6.6.2.1">If the "m=" section is being recycle | ||||
d (see | ||||
<xref target="sec.subsequent-offers" format="default" sectionFormat | ||||
="of" derivedContent="Section 5.2.2"/>), disassociate | ||||
the currently associated RtpTransceiver by setting its mid | ||||
property to "null", and discard the mapping between the | ||||
transceiver and its "m=" section index.</li> | ||||
<li pn="section-5.10-6.6.2.2"> | ||||
<t indent="0" pn="section-5.10-6.6.2.2.1">If the "m=" section is | ||||
not associated with any | ||||
RtpTransceiver (possibly because it was disassociated in the | ||||
previous step), either find an RtpTransceiver or create one | ||||
according to the following steps: | ||||
</t> | ||||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="s | ||||
ection-5.10-6.6.2.2.2"> | ||||
<li pn="section-5.10-6.6.2.2.2.1">If the "m=" section is sendr | ||||
ecv or recvonly, and there | ||||
are RtpTransceivers of the same type that were added to | ||||
the PeerConnection by addTrack and are not associated | ||||
with any "m=" section and are not stopped, find the first | ||||
(according to the canonical order described in | ||||
<xref target="sec.initial-offers" format="default" sectionFormat= | ||||
"of" derivedContent="Section 5.2.1"/>) such | ||||
RtpTransceiver.</li> | ||||
<li pn="section-5.10-6.6.2.2.2.2">If no RtpTransceiver was fou | ||||
nd in the previous step, | ||||
create one with a recvonly direction.</li> | ||||
<li pn="section-5.10-6.6.2.2.2.3">Associate the found or creat | ||||
ed RtpTransceiver with the | ||||
"m=" section by setting the value of the RtpTransceiver's | ||||
mid property to the MID of the "m=" section, and establish | ||||
a mapping between the transceiver and the index of the "m=" | ||||
section. If the "m=" section does not include a MID (i.e., | ||||
the remote endpoint does not support the MID extension), | ||||
generate a value for the RtpTransceiver mid property, | ||||
following the guidance for "a=mid" mentioned in | ||||
<xref target="sec.initial-offers" format="default" sectionFormat= | ||||
"of" derivedContent="Section 5.2.1"/>.</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-5.10-6.6.2.3">For each specified media format that | ||||
is also supported | ||||
by the local implementation, establish a mapping between | ||||
the specified payload type and the media format, as | ||||
described in | ||||
<xref target="RFC3264" sectionFormat="comma" section="6.1" format=" | ||||
default" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-6.1" derivedCon | ||||
tent="RFC3264"/>. Specifically, this | ||||
means that the implementation records the payload type to | ||||
be used in outgoing RTP packets when sending each specified | ||||
media format, as well as the relative preference for each | ||||
format that is indicated in their ordering. If any | ||||
indicated media format is not supported by the local | ||||
implementation, it <bcp14>MUST</bcp14> be ignored.</li> | ||||
<li pn="section-5.10-6.6.2.4">For each specified "rtx" media forma | ||||
t, establish a | ||||
mapping between the RTX payload type and its associated | ||||
primary payload type, as described in | ||||
<xref target="RFC4588" sectionFormat="comma" section="4" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc4588#section-4" derivedContent | ||||
="RFC4588"/>. If any referenced | ||||
primary payload types are not present, this <bcp14>MUST</bcp14> res | ||||
ult in | ||||
an error. Note that RTX payload types may refer to primary | ||||
payload types that are not supported by the local media | ||||
implementation, in which case the RTX payload type <bcp14>MUST</bcp | ||||
14> | ||||
also be ignored.</li> | ||||
<li pn="section-5.10-6.6.2.5">For each specified fmtp parameter th | ||||
at is supported by | ||||
the local implementation, enable them on the associated | ||||
media formats.</li> | ||||
<li pn="section-5.10-6.6.2.6">For each specified Synchronization S | ||||
ource (SSRC) that is signaled in the "m=" | ||||
section, prepare to demux RTP streams intended for this "m=" | ||||
section using that SSRC, as described in | ||||
<xref target="RFC8843" sectionFormat="comma" section="9.2" format=" | ||||
default" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-9.2" derivedCon | ||||
tent="RFC8843"/>.</li> | ||||
<li pn="section-5.10-6.6.2.7">For each specified RTP header extens | ||||
ion that is also | ||||
supported by the local implementation, establish a mapping | ||||
between the extension ID and URI, as described in | ||||
<xref target="RFC5285" sectionFormat="comma" section="5" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc5285#section-5" derivedContent | ||||
="RFC5285"/>. Specifically, this | ||||
means that the implementation records the extension ID to | ||||
be used in outgoing RTP packets when sending each specified | ||||
header extension. If any indicated RTP header extension is | ||||
not supported by the local implementation, it <bcp14>MUST</bcp14> b | ||||
e | ||||
ignored.</li> | ||||
<li pn="section-5.10-6.6.2.8">For each specified RTCP feedback mec | ||||
hanism that is | ||||
supported by the local implementation, enable them on the | ||||
associated media formats.</li> | ||||
<li pn="section-5.10-6.6.2.9"> | ||||
<t indent="0" pn="section-5.10-6.6.2.9.1">For any specified "TIA | ||||
S" ("Transport | ||||
Independent Application Specific Maximum") bandwidth value, set this value | ||||
as a constraint on the maximum RTP bitrate to be used when | ||||
sending media, as specified in | ||||
<xref target="RFC3890" format="default" sectionFormat="of" derivedC | ||||
ontent="RFC3890"/>. If a "TIAS" value is not | ||||
present but an "AS" value is specified, generate a "TIAS" | ||||
value using this formula: | ||||
</t> | ||||
<artwork align="left" pn="section-5.10-6.6.2.9.2"> | ||||
TIAS = AS * 1000 * 0.95 - (50 * 40 * 8) | ||||
</artwork> | ||||
<t indent="0" pn="section-5.10-6.6.2.9.3"> | ||||
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 header overhead is then subtracted out, in which | ||||
the 50 is based on 50 packets per second, the 40 is based on | ||||
typical header size (in bytes), and the 8 converts bytes to bits. | ||||
Note that "TIAS" is preferred over | ||||
"AS" because it provides more accurate | ||||
control of bandwidth.</t> | ||||
</li> | ||||
<li pn="section-5.10-6.6.2.10">For any "RR" or "RS" bandwidth valu | ||||
es, handle as | ||||
specified in | ||||
<xref target="RFC3556" sectionFormat="comma" section="2" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc3556#section-2" derivedContent | ||||
="RFC3556"/>.</li> | ||||
<li pn="section-5.10-6.6.2.11">Any specified "CT" bandwidth value | ||||
<bcp14>MUST</bcp14> be ignored, as | ||||
the meaning of this construct at the media level is not | ||||
well defined.</li> | ||||
<li pn="section-5.10-6.6.2.12"> | ||||
<t indent="0" pn="section-5.10-6.6.2.12.1">If the "m=" section i | ||||
s of type "audio": | ||||
</t> | ||||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="s | ||||
ection-5.10-6.6.2.12.2"> | ||||
<li pn="section-5.10-6.6.2.12.2.1">For each specified "CN" med | ||||
ia format, configure | ||||
silence suppression for all supported media formats with | ||||
the same clock rate, as described in | ||||
<xref target="RFC3389" sectionFormat="comma" section="5" format=" | ||||
default" derivedLink="https://rfc-editor.org/rfc/rfc3389#section-5" derivedConte | ||||
nt="RFC3389"/>, except for formats | ||||
that have their own internal silence suppression | ||||
mechanisms. Silence suppression for such formats (e.g., | ||||
Opus) is controlled via fmtp parameters, as discussed in | ||||
<xref target="sec.voiceactivitydetection1" format="default" secti | ||||
onFormat="of" derivedContent="Section 5.2.3.2"/>.</li> | ||||
<li pn="section-5.10-6.6.2.12.2.2">For each specified "telepho | ||||
ne-event" media format, | ||||
enable dual-tone multifrequency (DTMF) transmission for all suppo | ||||
rted media formats | ||||
with the same clock rate, as described in | ||||
<xref target="RFC4733" sectionFormat="comma" section="2.5.1.2" fo | ||||
rmat="default" derivedLink="https://rfc-editor.org/rfc/rfc4733#section-2.5.1.2" | ||||
derivedContent="RFC4733"/>. If there are | ||||
any supported media formats that do not have a | ||||
corresponding telephone-event format, disable DTMF | ||||
transmission for those formats.</li> | ||||
<li pn="section-5.10-6.6.2.12.2.3">For any specified "ptime" v | ||||
alue, configure the | ||||
available media formats to use the specified packet size | ||||
when sending. If the specified size is not supported for | ||||
a media format, use the next closest value instead.</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
<t indent="0" pn="section-5.10-7">Finally, if this description is of typ | ||||
e "pranswer" or | ||||
"answer", follow the processing defined in | ||||
<xref target="sec.applying-an-answer" format="default" sectionFormat="o | ||||
f" derivedContent="Section 5.11"/> below.</t> | ||||
</section> | </section> | |||
<section title="Applying an Answer" | <section anchor="sec.applying-an-answer" numbered="true" toc="include" rem | |||
anchor="sec.applying-an-answer"> | oveInRFC="false" pn="section-5.11"> | |||
<name slugifiedName="name-applying-an-answer">Applying an Answer</name> | ||||
<t>In addition to the steps mentioned above for processing a | <t indent="0" pn="section-5.11-1">In addition to the steps mentioned abo | |||
local or remote description, the following steps are performed | ve for processing a | |||
when processing a description of type "pranswer" or | local or remote description, the following steps are performed | |||
"answer".</t> | when processing a description of type "pranswer" or | |||
"answer".</t> | ||||
<t>For each m= section, the following steps MUST be performed: | <t indent="0" pn="section-5.11-2">For each "m=" section, the following s | |||
<list style="symbols"> | teps <bcp14>MUST</bcp14> be performed: | |||
</t> | ||||
<t>If the m= section has been rejected (i.e. port is set to | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5 | |||
zero in the answer), stop any reception or transmission of | .11-3"> | |||
media for this section, and, unless a non-rejected m= section | <li pn="section-5.11-3.1">If the "m=" section has been rejected (i.e., | |||
is bundled with this m= section, discard any associated ICE | the <port> value is set to | |||
components, as described in | zero in the answer), stop any reception or transmission of | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" />, Section 3.4.3.1.</t> | media for this section, and, unless a non-rejected "m=" section | |||
is bundled with this "m=" section, discard any associated ICE | ||||
<t>If the remote DTLS fingerprint has been changed or the | components, as described in | |||
tls-id has changed, tear down the DTLS connection. This | <xref target="RFC8839" sectionFormat="comma" section="4.4.3.1" format | |||
includes the case when the PeerConnection state is | ="default" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-4.4.3.1" deri | |||
"have-remote-pranswer". If a DTLS connection needs to be torn | vedContent="RFC8839"/>.</li> | |||
down but the answer does not indicate an ICE restart or, in | <li pn="section-5.11-3.2">If the remote DTLS fingerprint has been chan | |||
the case of "have-remote-pranswer", new ICE credentials, an | ged or the | |||
error MUST be generated. If an ICE restart is performed | value of the "a=tls-id" attribute has changed, tear down the DTLS co | |||
without a change in tls-id or fingerprint, then the same DTLS | nnection. This | |||
connection is continued over the new ICE channel. Note that | includes the case when the PeerConnection state is | |||
although JSEP requires that answerers change the tls-id value | "have-remote-pranswer". If a DTLS connection needs to be torn | |||
if and only if the offerer does, non-JSEP answerers are | down but the answer does not indicate an ICE restart or, in | |||
permitted to change the tls-id as long as the offer contained | the case of "have-remote-pranswer", new ICE credentials, an | |||
an ICE restart. Thus, JSEP implementations which process DTLS | error <bcp14>MUST</bcp14> be generated. If an ICE restart is perform | |||
data prior to receiving an answer MUST be prepared to receive | ed | |||
either a ClientHello or data from the previous DTLS | without a change in the tls-id value or fingerprint, then the same D | |||
connection.</t> | TLS | |||
connection is continued over the new ICE channel. Note that | ||||
<t>If no valid DTLS connection exists, prepare to start a | although JSEP requires that answerers change the tls-id value | |||
DTLS connection, using the specified roles and fingerprints, | if and only if the offerer does, non-JSEP answerers are | |||
on any underlying ICE components, once they are active.</t> | permitted to change the tls-id value as long as the offer contained | |||
an ICE restart. Thus, JSEP implementations that process DTLS | ||||
<t>If the m= section proto value indicates use of RTP: | data prior to receiving an answer <bcp14>MUST</bcp14> be prepared to | |||
<list style="symbols"> | receive | |||
either a ClientHello or data from the previous DTLS | ||||
<t>If the m= section references RTCP feedback mechanisms | connection.</li> | |||
that were not present in the corresponding m= section in | <li pn="section-5.11-3.3">If no valid DTLS connection exists, prepare | |||
the offer, this indicates a negotiation problem and MUST | to start a | |||
result in an error. However, new media formats and new RTP | DTLS connection, using the specified roles and fingerprints, | |||
header extension values are permitted in the answer, as | on any underlying ICE components, once they are active.</li> | |||
described in | <li pn="section-5.11-3.4"> | |||
<xref target="RFC3264" />, Section 7, and | <t indent="0" pn="section-5.11-3.4.1">If the "m=" section <proto& | |||
<xref target="RFC5285" />, Section 6.</t> | gt; value indicates use of RTP: | |||
</t> | ||||
<t>If the m= section has RTCP mux enabled, discard the RTCP | <ul spacing="normal" bare="false" empty="false" indent="3" pn="secti | |||
ICE component, if one exists, and begin or continue muxing | on-5.11-3.4.2"> | |||
RTCP over the RTP ICE component, as specified in | <li pn="section-5.11-3.4.2.1">If the "m=" section references RTCP | |||
<xref target="RFC5761" />, Section 5.1.3. Otherwise, | feedback mechanisms | |||
prepare to transmit RTCP over the RTCP ICE component; if no | that were not present in the corresponding "m=" section in | |||
RTCP ICE component exists, because RTCP mux was previously | the offer, this indicates a negotiation problem and <bcp14>MUST</b | |||
enabled, this MUST result in an error.</t> | cp14> | |||
result in an error. However, new media formats and new RTP | ||||
<t>If the m= section has reduced-size RTCP enabled, | header extension values are permitted in the answer, as | |||
configure the RTCP transmission for this m= section to use | described in | |||
reduced-size RTCP, as specified in | <xref target="RFC3264" sectionFormat="comma" section="7" format="d | |||
<xref target="RFC5506" />.</t> | efault" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-7" derivedConten | |||
t="RFC3264"/> and | ||||
<t>If the directional attribute in the answer indicates | <xref target="RFC5285" sectionFormat="comma" section="6" format="d | |||
that the JSEP implementation should be sending media | efault" derivedLink="https://rfc-editor.org/rfc/rfc5285#section-6" derivedConten | |||
("sendonly" for local answers, "recvonly" for remote | t="RFC5285"/>.</li> | |||
answers, or "sendrecv" for either type of answer), choose | <li pn="section-5.11-3.4.2.2">If the "m=" section has RTCP mux ena | |||
the media format to send as the most preferred media format | bled, discard the RTCP | |||
from the remote description that is also locally supported, | ICE component, if one exists, and begin or continue muxing | |||
as discussed in | RTCP over the RTP ICE component, as specified in | |||
<xref target="RFC3264" />, Sections 6.1 and 7, and start | <xref target="RFC5761" sectionFormat="comma" section="5.1.3" forma | |||
transmitting RTP media using that format once the | t="default" derivedLink="https://rfc-editor.org/rfc/rfc5761#section-5.1.3" deriv | |||
underlying transport layers have been established. If an | edContent="RFC5761"/>. Otherwise, | |||
SSRC has not already been chosen for this outgoing RTP | prepare to transmit RTCP over the RTCP ICE component; if no | |||
stream, choose a random one. If media is already being | RTCP ICE component exists because RTCP mux was previously | |||
transmitted, the same SSRC SHOULD be used unless the | enabled, this <bcp14>MUST</bcp14> result in an error.</li> | |||
clockrate of the new codec is different, in which case a | <li pn="section-5.11-3.4.2.3">If the "m=" section has Reduced-Size | |||
new SSRC MUST be chosen, as specified in | RTCP enabled, | |||
<xref target="RFC7160" />, Section 3.1.</t> | configure the RTCP transmission for this "m=" section to use | |||
Reduced-Size RTCP, as specified in | ||||
<t>The payload type mapping from the remote description is | <xref target="RFC5506" format="default" sectionFormat="of" derived | |||
used to determine payload types for the outgoing RTP | Content="RFC5506"/>.</li> | |||
streams, including the payload type for the send media | <li pn="section-5.11-3.4.2.4">If the direction attribute in the an | |||
format chosen above. Any RTP header extensions that were | swer indicates | |||
negotiated should be included in the outgoing RTP streams, | that the JSEP implementation should be sending media | |||
using the extension mapping from the remote description; if | ("sendonly" for local answers, "recvonly" for remote | |||
the RID header extension has been negotiated, and RID | answers, or "sendrecv" for either type of answer), choose | |||
values are specified, include the RID header extension in | the media format to send as the most preferred media format | |||
the outgoing RTP streams, as indicated in | from the remote description that is also locally supported, | |||
<xref target="I-D.ietf-mmusic-rid"></xref>, Section 4.</t> | as discussed in Sections <xref target="RFC3264" section="6.1" sect | |||
ionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc326 | ||||
<t>If the m= section is of type audio, and silence | 4#section-6.1" derivedContent="RFC3264"/> and <xref target="RFC3264" section="7" | |||
suppression was configured for the send media format as a | sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/r | |||
result of processing the remote description, and is also | fc3264#section-7" derivedContent="RFC3264"/> of <xref target="RFC3264" format="d | |||
enabled for that format in the local description, use | efault" sectionFormat="of" derivedContent="RFC3264"/>, and start | |||
silence suppression for outgoing media, in accordance with | transmitting RTP media using that format once the | |||
the guidance in | underlying transport layers have been established. If an | |||
<xref target="sec.voiceactivitydetection1" />. If these | SSRC has not already been chosen for this outgoing RTP | |||
conditions are not met, silence suppression MUST NOT be | stream, choose a unique random one. If media is already being | |||
used for outgoing media.</t> | transmitted, the same SSRC <bcp14>SHOULD</bcp14> be used unless th | |||
e | ||||
<t>If simulcast has been negotiated, send the number of | clock rate of the new codec is different, in which case a | |||
Source RTP Streams as specified in | new SSRC <bcp14>MUST</bcp14> be chosen, as specified in | |||
<xref target="I-D.ietf-mmusic-sdp-simulcast"></xref>, | <xref target="RFC7160" sectionFormat="comma" section="4.1" format= | |||
Section 6.2.2.</t> | "default" derivedLink="https://rfc-editor.org/rfc/rfc7160#section-4.1" derivedCo | |||
ntent="RFC7160"/>.</li> | ||||
<t>If the send media format chosen above has a | <li pn="section-5.11-3.4.2.5">The payload type mapping from the re | |||
corresponding "rtx" media format, or a FEC mechanism has | mote description is | |||
been negotiated, establish a Redundancy RTP Stream with a | used to determine payload types for the outgoing RTP | |||
random SSRC for each Source RTP Stream, and start or | streams, including the payload type for the send media | |||
continue transmitting RTX/FEC packets as needed.</t> | format chosen above. Any RTP header extensions that were | |||
negotiated should be included in the outgoing RTP streams, | ||||
<t>If the send media format chosen above has a | using the extension mapping from the remote description. If the MI | |||
corresponding "red" media format of the same clockrate, | D | |||
allow redundant encoding using the specified format for | header extension has been negotiated, include it in the outgoing RTP | |||
resiliency purposes, as discussed in | streams, as indicated in | |||
<xref target="I-D.ietf-rtcweb-fec" />, Section 3.2. Note | <xref target="RFC8843" sectionFormat="comma" section="15" format="defau | |||
that unlike RTX or FEC media formats, the "red" format is | lt" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-15" derivedContent=" | |||
transmitted on the Source RTP Stream, not the Redundancy | RFC8843"/>. | |||
RTP Stream.</t> | If the RtpStreamId or RepairedRtpStreamId header extensions have b | |||
een | ||||
<t>Enable the RTCP feedback mechanisms referenced in the | negotiated and rid-ids have been established, include these header | |||
media section for all Source RTP Streams using the | extensions in the outgoing RTP streams, as indicated in | |||
specified media formats. Specifically, begin or continue | <xref target="RFC8851" sectionFormat="comma" section="4" format="d | |||
sending the requested feedback types and reacting to | efault" derivedLink="https://rfc-editor.org/rfc/rfc8851#section-4" derivedConten | |||
received feedback, as specified in | t="RFC8851"/>.</li> | |||
<xref target="RFC4585" />, Section 4.2. When sending RTCP | <li pn="section-5.11-3.4.2.6">If the "m=" section is of type "audi | |||
feedback, follow the rules and recommendations from | o", and silence | |||
<xref target="RFC8108"></xref> Section 5.4.1, to select | suppression was (1) configured for the send media format as a | |||
which SSRC to use.</t> | result of processing the remote description and (2) also | |||
enabled for that format in the local description, use | ||||
<t>If the directional attribute in the answer indicates | silence suppression for outgoing media, in accordance with | |||
that the JSEP implementation should not be sending media | the guidance in | |||
("recvonly" for local answers, "sendonly" for remote | <xref target="sec.voiceactivitydetection1" format="default" sectio | |||
answers, or "inactive" for either type of answer) stop | nFormat="of" derivedContent="Section 5.2.3.2"/>. | |||
transmitting all RTP media, but continue sending RTCP, as | If these | |||
described in | conditions are not met, silence suppression <bcp14>MUST NOT</bcp14 | |||
<xref target="RFC3264" />, Section 5.1.</t> | > be | |||
</list></t> | used for outgoing media.</li> | |||
<li pn="section-5.11-3.4.2.7">If simulcast has been negotiated, se | ||||
<t>If the m= section proto value indicates use of SCTP: | nd the appropriate number of | |||
<list style="symbols"> | Source RTP Streams as specified in | |||
<xref target="RFC8853" sectionFormat="comma" section="5.3.3" forma | ||||
<t>If an SCTP association exists, and the remote SCTP port | t="default" derivedLink="https://rfc-editor.org/rfc/rfc8853#section-5.3.3" deriv | |||
has changed, discard the existing SCTP association. This | edContent="RFC8853"/>.</li> | |||
includes the case when the PeerConnection state is | <li pn="section-5.11-3.4.2.8">If the send media format chosen abov | |||
"have-remote-pranswer".</t> | e has a | |||
corresponding "rtx" media format or a FEC mechanism has | ||||
<t>If no valid SCTP association exists, prepare to initiate | been negotiated, establish a redundancy RTP stream with a | |||
a SCTP association over the associated ICE component and | unique random SSRC for each Source RTP Stream, and start or | |||
DTLS connection, using the local SCTP port value from the | continue transmitting RTX/FEC packets as needed.</li> | |||
local description, and the remote SCTP port value from the | <li pn="section-5.11-3.4.2.9">If the send media format chosen abov | |||
remote description, as described in | e has a | |||
<xref target="I-D.ietf-mmusic-sctp-sdp" />, Section | corresponding "red" media format of the same clock rate, | |||
10.2.</t> | allow redundant encoding using the specified format for | |||
</list></t> | resiliency purposes, as discussed in | |||
</list></t> | <xref target="RFC8854" sectionFormat="comma" section="3.2" format= | |||
"default" derivedLink="https://rfc-editor.org/rfc/rfc8854#section-3.2" derivedCo | ||||
<t>If the answer contains valid bundle groups, discard any ICE | ntent="RFC8854"/>. Note | |||
components for the m= sections that will be bundled onto the | that unlike RTX or FEC media formats, the "red" format is | |||
primary ICE components in each bundle, and begin muxing these | transmitted on the Source RTP Stream, not the redundancy | |||
m= sections accordingly, as described in | RTP stream.</li> | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />, | <li pn="section-5.11-3.4.2.10">Enable the RTCP feedback mechanisms | |||
Section 8.2.</t> | referenced in the | |||
media section for all Source RTP Streams using the | ||||
<t>If the description is of type "answer", and there are still | specified media formats. Specifically, begin or continue | |||
remaining candidates in the ICE candidate pool, discard | sending the requested feedback types and reacting to | |||
them.</t> | received feedback, as specified in | |||
<xref target="RFC4585" sectionFormat="comma" section="4.2" format= | ||||
"default" derivedLink="https://rfc-editor.org/rfc/rfc4585#section-4.2" derivedCo | ||||
ntent="RFC4585"/>. When sending RTCP | ||||
feedback, follow the rules and recommendations from | ||||
<xref target="RFC8108" sectionFormat="comma" section="5.4.1" format="default" | ||||
derivedLink="https://rfc-editor.org/rfc/rfc8108#section-5.4.1" derivedContent=" | ||||
RFC8108"/> to select | ||||
which SSRC to use.</li> | ||||
<li pn="section-5.11-3.4.2.11">If the direction attribute in the a | ||||
nswer indicates | ||||
that the JSEP implementation should not be sending media | ||||
("recvonly" for local answers, "sendonly" for remote | ||||
answers, or "inactive" for either type of answer), stop | ||||
transmitting all RTP media, but continue sending RTCP, as | ||||
described in | ||||
<xref target="RFC3264" sectionFormat="comma" section="5.1" format= | ||||
"default" derivedLink="https://rfc-editor.org/rfc/rfc3264#section-5.1" derivedCo | ||||
ntent="RFC3264"/>.</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-5.11-3.5"> | ||||
<t indent="0" pn="section-5.11-3.5.1">If the "m=" section <proto& | ||||
gt; value indicates use of SCTP: | ||||
</t> | ||||
<ul spacing="normal" bare="false" empty="false" indent="3" pn="secti | ||||
on-5.11-3.5.2"> | ||||
<li pn="section-5.11-3.5.2.1">If an SCTP association exists and th | ||||
e remote SCTP port | ||||
has changed, discard the existing SCTP association. This | ||||
includes the case when the PeerConnection state is | ||||
"have-remote-pranswer".</li> | ||||
<li pn="section-5.11-3.5.2.2">If no valid SCTP association exists, | ||||
prepare to initiate | ||||
an SCTP association over the associated ICE component and | ||||
DTLS connection, using the local SCTP port value from the | ||||
local description and the remote SCTP port value from the | ||||
remote description, as described in | ||||
<xref target="RFC8841" sectionFormat="comma" section="10.2" format | ||||
="default" derivedLink="https://rfc-editor.org/rfc/rfc8841#section-10.2" derived | ||||
Content="RFC8841"/>.</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
<t indent="0" pn="section-5.11-4">If the answer contains valid bundle gr | ||||
oups, discard any ICE | ||||
components for the "m=" sections that will be bundled onto the | ||||
primary ICE components in each bundle, and begin muxing these | ||||
"m=" sections accordingly, as described in | ||||
<xref target="RFC8843" sectionFormat="comma" section="7.4" format="def | ||||
ault" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-7.4" derivedConten | ||||
t="RFC8843"/>.</t> | ||||
<t indent="0" pn="section-5.11-5">If the description is of type "answer" | ||||
and there are still | ||||
remaining candidates in the ICE candidate pool, discard | ||||
them.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section title="Processing RTP/RTCP" anchor="sec.rtp.demux"> | <section anchor="sec.rtp.demux" numbered="true" toc="include" removeInRFC="f | |||
alse" pn="section-6"> | ||||
<t>When bundling, associating incoming RTP/RTCP with the proper | <name slugifiedName="name-processing-rtp-rtcp">Processing RTP/RTCP</name> | |||
m= section is defined in | <t indent="0" pn="section-6-1">When bundling, associating incoming RTP/RTC | |||
<xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" />, Section | P with the proper | |||
10.2. When not bundling, the proper m= section is clear from the | "m=" section is defined in | |||
ICE component over which the RTP/RTCP is received.</t> | <xref target="RFC8843" sectionFormat="comma" section="9.2" format="defau | |||
lt" derivedLink="https://rfc-editor.org/rfc/rfc8843#section-9.2" derivedContent= | ||||
<t>Once the proper m= section(s) are known, RTP/RTCP is delivered | "RFC8843"/>. When not bundling, the proper "m=" section is clear from the | |||
to the RtpTransceiver(s) associated with the m= section(s) and | ICE component over which the RTP/RTCP is received.</t> | |||
further processing of the RTP/RTCP is done at the RtpTransceiver | <t indent="0" pn="section-6-2">Once the proper "m=" section or sections ar | |||
level. This includes using RID | e known, RTP/RTCP is delivered | |||
<xref target="I-D.ietf-mmusic-rid" /> to distinguish between | to the RtpTransceiver(s) associated with the "m=" section(s) and | |||
multiple Encoded Streams, as well as determine which Source RTP | further processing of the RTP/RTCP is done at the RtpTransceiver | |||
stream should be repaired by a given Redundancy RTP stream.</t> | level. This includes using the RID mechanism | |||
<xref target="RFC8851" format="default" sectionFormat="of" derivedConten | ||||
t="RFC8851"/> and its associated RtpStreamId and | ||||
RepairedRtpStreamId identifiers to distinguish between | ||||
multiple encoded streams and determine which Source RTP | ||||
stream should be repaired by a given redundancy RTP stream.</t> | ||||
</section> | </section> | |||
<section title="Examples" anchor="sec.examples"> | <section anchor="sec.examples" numbered="true" toc="include" removeInRFC="fa | |||
lse" pn="section-7"> | ||||
<t>Note that this example section shows several SDP fragments. To | <name slugifiedName="name-examples">Examples</name> | |||
format in 72 columns, some of the lines in SDP have been split | <t indent="0" pn="section-7-1">Note that this example section shows severa | |||
into multiple lines, where leading whitespace indicates that a | l SDP fragments. To | |||
line is a continuation of the previous line. In addition, some | accommodate RFC line-length restrictions, some of the SDP lines have bee | |||
blank lines have been added to improve readability but are not | n split | |||
valid in SDP.</t> | into multiple lines, where leading whitespace indicates that a | |||
line is a continuation of the previous line. In addition, some | ||||
<t>More examples of SDP for WebRTC call flows, including examples | blank lines have been added to improve readability but are not | |||
with IPv6 addresses, can be found in | valid in SDP.</t> | |||
<xref target="I-D.ietf-rtcweb-sdp"></xref>.</t> | <t indent="0" pn="section-7-2">More examples of SDP for WebRTC call flows, | |||
<section title="Simple Example" anchor="sec.simple-examples"> | including examples | |||
with IPv6 addresses, can be found in | ||||
<t>This section shows a very simple example that sets up a | <xref target="I-D.ietf-rtcweb-sdp" format="default" sectionFormat="of" d | |||
minimal audio / video call between two JSEP endpoints without | erivedContent="SDP4WebRTC"/>.</t> | |||
using trickle ICE. The example in the following section | <section anchor="sec.simple-examples" numbered="true" toc="include" remove | |||
provides a more detailed example of what could happen in a JSEP | InRFC="false" pn="section-7.1"> | |||
session.</t> | <name slugifiedName="name-simple-example">Simple Example</name> | |||
<t indent="0" pn="section-7.1-1">This section shows a very simple exampl | ||||
<t>The code flow below shows Alice's endpoint initiating the | e that sets up a | |||
session to Bob's endpoint. The messages from the JavaScript | minimal audio/video call between two JSEP endpoints without | |||
application in Alice's browser to the JavaScript in Bob's | using Trickle ICE. The example in the following section | |||
browser, abbreviated as AliceJS and BobJS respectively, are | provides a more detailed example of what could happen in a JSEP | |||
assumed to flow over some signaling protocol via a web server. | session.</t> | |||
The JavaScript on both Alice's side and Bob's side waits for | <t indent="0" pn="section-7.1-2">The code flow below shows Alice's endpo | |||
all candidates before sending the offer or answer, so the | int initiating the | |||
offers and answers are complete; trickle ICE is not used. The | session to Bob's endpoint. The messages from the JavaScript | |||
user agents (JSEP implementations) in Alice and Bob's browsers, | application in Alice's browser to the JavaScript in Bob's | |||
abbreviated as AliceUA and BobUA respectively, are using the | browser, abbreviated as "AliceJS" and "BobJS", respectively, are | |||
default bundle policy of "balanced", and the default RTCP mux | assumed to flow over some signaling protocol via a web server. | |||
policy of "require".</t> | The JavaScript on both Alice's side and Bob's side waits for | |||
all candidates before sending the offer or answer, so the | ||||
<t> | offers and answers are complete; Trickle ICE is not used. The | |||
<figure> | user agents (JSEP implementations) in Alice's and Bob's browsers, | |||
<artwork> | abbreviated as "AliceUA" and "BobUA", respectively, are both using the | |||
<![CDATA[ | default bundle policy of "balanced" and the default RTCP mux | |||
policy of "require".</t> | ||||
<artwork name="" type="ascii-art" align="left" alt="" pn="section-7.1-3" | ||||
> | ||||
// set up local media state | // set up local media state | |||
AliceJS->AliceUA: create new PeerConnection | AliceJS->AliceUA: create new PeerConnection | |||
AliceJS->AliceUA: addTrack with two tracks: audio and video | AliceJS->AliceUA: addTrack with two tracks: audio and video | |||
AliceJS->AliceUA: createOffer to get offer | AliceJS->AliceUA: createOffer to get offer | |||
AliceJS->AliceUA: setLocalDescription with offer | AliceJS->AliceUA: setLocalDescription with offer | |||
AliceUA->AliceJS: multiple onicecandidate events with candidates | AliceUA->AliceJS: multiple onicecandidate events with candidates | |||
// wait for ICE gathering to complete | // wait for ICE gathering to complete | |||
AliceUA->AliceJS: onicecandidate event with null candidate | AliceUA->AliceJS: onicecandidate event with null candidate | |||
AliceJS->AliceUA: get |offer-A1| from pendingLocalDescription | AliceJS->AliceUA: get |offer-A1| from pendingLocalDescription | |||
// |offer-A1| is sent over signaling protocol to Bob | // |offer-A1| is sent over signaling protocol to Bob | |||
AliceJS->WebServer: signaling with |offer-A1| | AliceJS->WebServer: signaling with |offer-A1| | |||
WebServer->BobJS: signaling with |offer-A1| | WebServer->BobJS: signaling with |offer-A1| | |||
// |offer-A1| arrives at Bob | // |offer-A1| arrives at Bob | |||
BobJS->BobUA: create a PeerConnection | BobJS->BobUA: create a PeerConnection | |||
BobJS->BobUA: setRemoteDescription with |offer-A1| | BobJS->BobUA: setRemoteDescription with |offer-A1| | |||
BobUA->BobJS: ontrack events for audio and video tracks | BobUA->BobJS: ontrack events for audio and video tracks | |||
// Bob accepts call | // Bob accepts call | |||
BobJS->BobUA: addTrack with local tracks | BobJS->BobUA: addTrack with local tracks | |||
BobJS->BobUA: createAnswer | BobJS->BobUA: createAnswer | |||
BobJS->BobUA: setLocalDescription with answer | BobJS->BobUA: setLocalDescription with answer | |||
BobUA->BobJS: multiple onicecandidate events with candidates | BobUA->BobJS: multiple onicecandidate events with candidates | |||
// wait for ICE gathering to complete | // wait for ICE gathering to complete | |||
BobUA->BobJS: onicecandidate event with null candidate | BobUA->BobJS: onicecandidate event with null candidate | |||
BobJS->BobUA: get |answer-A1| from currentLocalDescription | BobJS->BobUA: get |answer-A1| from currentLocalDescription | |||
// |answer-A1| is sent over signaling protocol to Alice | // |answer-A1| is sent over signaling protocol | |||
BobJS->WebServer: signaling with |answer-A1| | // to Alice | |||
WebServer->AliceJS: signaling with |answer-A1| | BobJS->WebServer: signaling with |answer-A1| | |||
WebServer->AliceJS: signaling with |answer-A1| | ||||
// |answer-A1| arrives at Alice | // |answer-A1| arrives at Alice | |||
AliceJS->AliceUA: setRemoteDescription with |answer-A1| | AliceJS->AliceUA: setRemoteDescription with |answer-A1| | |||
AliceUA->AliceJS: ontrack events for audio and video tracks | AliceUA->AliceJS: ontrack events for audio and video tracks | |||
// media flows | // media flows | |||
BobUA->AliceUA: media sent from Bob to Alice | BobUA->AliceUA: media sent from Bob to Alice | |||
AliceUA->BobUA: media sent from Alice to Bob | AliceUA->BobUA: media sent from Alice to Bob </artwork> | |||
]]> | <t indent="0" pn="section-7.1-4">The SDP for |offer-A1| looks like:</t> | |||
</artwork> | <sourcecode name="offer-A1" type="sdp" markers="false" pn="section-7.1-5 | |||
</figure> | "> | |||
</t> | ||||
<t>The SDP for |offer-A1| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="offer-A1"> | ||||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=- 4962303333179871722 1 IN IP4 0.0.0.0 | o=- 4962303333179871722 1 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 10100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 10100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 203.0.113.100 | c=IN IP4 203.0.113.100 | |||
skipping to change at line 4260 ¶ | skipping to change at line 4180 ¶ | |||
m=video 10102 UDP/TLS/RTP/SAVPF 100 101 102 103 | m=video 10102 UDP/TLS/RTP/SAVPF 100 101 102 103 | |||
c=IN IP4 203.0.113.100 | c=IN IP4 203.0.113.100 | |||
a=mid:v1 | a=mid:v1 | |||
a=sendrecv | a=sendrecv | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
a=msid:47017fee-b6c1-4162-929c-a25110252400 | a=msid:47017fee-b6c1-4162-929c-a25110252400 | |||
a=ice-ufrag:BGKk | a=ice-ufrag:BGKk | |||
a=ice-pwd:mqyWsAjvtKwTGnvhPztQ9mIf | a=ice-pwd:mqyWsAjvtKwTGnvhPztQ9mIf | |||
a=fingerprint:sha-256 | a=fingerprint:sha-256 | |||
19:E2:1C:3B:4B:9F:81:E6:B8:5C:F4:A5:A8:D8:73:04: | 19:E2:1C:3B:4B:9F:81:E6:B8:5C:F4:A5:A8:D8:73:04: | |||
BB:05:2F:70:9F:04:A9:0E:05:E9:26:33:E8:70:88:A2 | BB:05:2F:70:9F:04:A9:0E:05:E9:26:33:E8:70:88:A2 | |||
a=setup:actpass | a=setup:actpass | |||
a=tls-id:91bbf309c0990a6bec11e38ba2933cee | a=tls-id:91bbf309c0990a6bec11e38ba2933cee | |||
a=rtcp:10103 IN IP4 203.0.113.100 | a=rtcp:10103 IN IP4 203.0.113.100 | |||
a=rtcp-mux | a=rtcp-mux | |||
a=rtcp-rsize | a=rtcp-rsize | |||
a=candidate:1 1 udp 2113929471 203.0.113.100 10102 typ host | a=candidate:1 1 udp 2113929471 203.0.113.100 10102 typ host | |||
a=candidate:1 2 udp 2113929470 203.0.113.100 10103 typ host | a=candidate:1 2 udp 2113929470 203.0.113.100 10103 typ host | |||
a=end-of-candidates | a=end-of-candidates</sourcecode> | |||
]]> | <t indent="0" pn="section-7.1-6">The SDP for |answer-A1| looks like:</t> | |||
</artwork> | <sourcecode name="answer-A1" type="sdp" markers="false" pn="section-7.1- | |||
</figure> | 7"> | |||
</t> | ||||
<t>The SDP for |answer-A1| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="answer-A1"> | ||||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=- 6729291447651054566 1 IN IP4 0.0.0.0 | o=- 6729291447651054566 1 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 10200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 10200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 203.0.113.200 | c=IN IP4 203.0.113.200 | |||
skipping to change at line 4336 ¶ | skipping to change at line 4247 ¶ | |||
m=video 10200 UDP/TLS/RTP/SAVPF 100 101 102 103 | m=video 10200 UDP/TLS/RTP/SAVPF 100 101 102 103 | |||
c=IN IP4 203.0.113.200 | c=IN IP4 203.0.113.200 | |||
a=mid:v1 | a=mid:v1 | |||
a=sendrecv | a=sendrecv | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
a=msid:61317484-2ed4-49d7-9eb7-1414322a7aae | a=msid:61317484-2ed4-49d7-9eb7-1414322a7aae</sourcecode> | |||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | ||||
</section> | </section> | |||
<section title="Detailed Example" anchor="sec.detailed-example"> | <section anchor="sec.detailed-example" numbered="true" toc="include" remov | |||
eInRFC="false" pn="section-7.2"> | ||||
<t>This section shows a more involved example of a session | <name slugifiedName="name-detailed-example">Detailed Example</name> | |||
between two JSEP endpoints. Trickle ICE is used in full trickle | <t indent="0" pn="section-7.2-1">This section shows a more involved exam | |||
mode, with a bundle policy of "max-bundle", an RTCP mux policy | ple of a session | |||
of "require", and a single TURN server. Initially, both Alice | between two JSEP endpoints. Trickle ICE is used in full trickle | |||
and Bob establish an audio channel and a data channel. Later, | mode, with a bundle policy of "max-bundle", an RTCP mux policy | |||
Bob adds two video flows, one for his video feed, and one for | of "require", and a single TURN server. Initially, both Alice | |||
screensharing, both supporting FEC, and with the video feed | and Bob establish an audio channel and a data channel. Later, | |||
configured for simulcast. Alice accepts these video flows, but | Bob adds two video flows -- one for his video feed and one for | |||
does not add video flows of her own, so they are handled as | screen sharing, both supporting FEC -- with the video feed | |||
recvonly. Alice also specifies a maximum video decoder | configured for simulcast. Alice accepts these video flows but | |||
resolution.</t> | does not add video flows of her own, so they are handled as | |||
recvonly. Alice also specifies a maximum video decoder | ||||
<t> | resolution.</t> | |||
<figure> | <artwork name="" type="ascii-art" align="left" alt="" pn="section-7.2-2" | |||
<artwork> | > | |||
<![CDATA[ | ||||
// set up local media state | // set up local media state | |||
AliceJS->AliceUA: create new PeerConnection | AliceJS->AliceUA: create new PeerConnection | |||
AliceJS->AliceUA: addTrack with an audio track | AliceJS->AliceUA: addTrack with an audio track | |||
AliceJS->AliceUA: createDataChannel to get data channel | AliceJS->AliceUA: createDataChannel to get data channel | |||
AliceJS->AliceUA: createOffer to get |offer-B1| | AliceJS->AliceUA: createOffer to get |offer-B1| | |||
AliceJS->AliceUA: setLocalDescription with |offer-B1| | AliceJS->AliceUA: setLocalDescription with |offer-B1| | |||
// |offer-B1| is sent over signaling protocol to Bob | // |offer-B1| is sent over signaling protocol to Bob | |||
AliceJS->WebServer: signaling with |offer-B1| | AliceJS->WebServer: signaling with |offer-B1| | |||
WebServer->BobJS: signaling with |offer-B1| | WebServer->BobJS: signaling with |offer-B1| | |||
// |offer-B1| arrives at Bob | // |offer-B1| arrives at Bob | |||
BobJS->BobUA: create a PeerConnection | BobJS->BobUA: create a PeerConnection | |||
BobJS->BobUA: setRemoteDescription with |offer-B1| | BobJS->BobUA: setRemoteDescription with |offer-B1| | |||
BobUA->BobJS: ontrack with audio track from Alice | BobUA->BobJS: ontrack event with audio track from Alice | |||
// candidates are sent to Bob | // candidates are sent to Bob | |||
AliceUA->AliceJS: onicecandidate (host) |offer-B1-candidate-1| | AliceUA->AliceJS: onicecandidate (host) |offer-B1-candidate-1| | |||
AliceJS->WebServer: signaling with |offer-B1-candidate-1| | AliceJS->WebServer: signaling with |offer-B1-candidate-1| | |||
AliceUA->AliceJS: onicecandidate (srflx) |offer-B1-candidate-2| | AliceUA->AliceJS: onicecandidate (srflx) |offer-B1-candidate-2| | |||
AliceJS->WebServer: signaling with |offer-B1-candidate-2| | AliceJS->WebServer: signaling with |offer-B1-candidate-2| | |||
AliceUA->AliceJS: onicecandidate (relay) |offer-B1-candidate-3| | AliceUA->AliceJS: onicecandidate (relay) |offer-B1-candidate-3| | |||
AliceJS->WebServer: signaling with |offer-B1-candidate-3| | AliceJS->WebServer: signaling with |offer-B1-candidate-3| | |||
WebServer->BobJS: signaling with |offer-B1-candidate-1| | WebServer->BobJS: signaling with |offer-B1-candidate-1| | |||
BobJS->BobUA: addIceCandidate with |offer-B1-candidate-1| | BobJS->BobUA: addIceCandidate with |offer-B1-candidate-1| | |||
WebServer->BobJS: signaling with |offer-B1-candidate-2| | WebServer->BobJS: signaling with |offer-B1-candidate-2| | |||
BobJS->BobUA: addIceCandidate with |offer-B1-candidate-2| | BobJS->BobUA: addIceCandidate with |offer-B1-candidate-2| | |||
WebServer->BobJS: signaling with |offer-B1-candidate-3| | WebServer->BobJS: signaling with |offer-B1-candidate-3| | |||
BobJS->BobUA: addIceCandidate with |offer-B1-candidate-3| | BobJS->BobUA: addIceCandidate with |offer-B1-candidate-3| | |||
// Bob accepts call | // Bob accepts call | |||
BobJS->BobUA: addTrack with local audio | BobJS->BobUA: addTrack with local audio | |||
BobJS->BobUA: createDataChannel to get data channel | BobJS->BobUA: createDataChannel to get data channel | |||
BobJS->BobUA: createAnswer to get |answer-B1| | BobJS->BobUA: createAnswer to get |answer-B1| | |||
BobJS->BobUA: setLocalDescription with |answer-B1| | BobJS->BobUA: setLocalDescription with |answer-B1| | |||
// |answer-B1| is sent to Alice | // |answer-B1| is sent to Alice | |||
BobJS->WebServer: signaling with |answer-B1| | BobJS->WebServer: signaling with |answer-B1| | |||
WebServer->AliceJS: signaling with |answer-B1| | WebServer->AliceJS: signaling with |answer-B1| | |||
AliceJS->AliceUA: setRemoteDescription with |answer-B1| | AliceJS->AliceUA: setRemoteDescription with |answer-B1| | |||
AliceUA->AliceJS: ontrack event with audio track from Bob | AliceUA->AliceJS: ontrack event with audio track from Bob | |||
// candidates are sent to Alice | // candidates are sent to Alice | |||
BobUA->BobJS: onicecandidate (host) |answer-B1-candidate-1| | BobUA->BobJS: onicecandidate (host) |answer-B1-candidate-1| | |||
BobJS->WebServer: signaling with |answer-B1-candidate-1| | BobJS->WebServer: signaling with |answer-B1-candidate-1| | |||
BobUA->BobJS: onicecandidate (srflx) |answer-B1-candidate-2| | BobUA->BobJS: onicecandidate (srflx) |answer-B1-candidate-2| | |||
BobJS->WebServer: signaling with |answer-B1-candidate-2| | BobJS->WebServer: signaling with |answer-B1-candidate-2| | |||
BobUA->BobJS: onicecandidate (relay) |answer-B1-candidate-3| | BobUA->BobJS: onicecandidate (relay) |answer-B1-candidate-3| | |||
BobJS->WebServer: signaling with |answer-B1-candidate-3| | BobJS->WebServer: signaling with |answer-B1-candidate-3| | |||
WebServer->AliceJS: signaling with |answer-B1-candidate-1| | WebServer->AliceJS: signaling with |answer-B1-candidate-1| | |||
AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-1| | AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-1| | |||
WebServer->AliceJS: signaling with |answer-B1-candidate-2| | WebServer->AliceJS: signaling with |answer-B1-candidate-2| | |||
AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-2| | AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-2| | |||
WebServer->AliceJS: signaling with |answer-B1-candidate-3| | WebServer->AliceJS: signaling with |answer-B1-candidate-3| | |||
AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-3| | AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-3| | |||
// data channel opens | // data channel opens | |||
BobUA->BobJS: ondatachannel event | BobUA->BobJS: ondatachannel event | |||
AliceUA->AliceJS: ondatachannel event | AliceUA->AliceJS: ondatachannel event | |||
BobUA->BobJS: onopen | BobUA->BobJS: onopen | |||
AliceUA->AliceJS: onopen | AliceUA->AliceJS: onopen | |||
// media is flowing between endpoints | // media is flowing between endpoints | |||
BobUA->AliceUA: audio+data sent from Bob to Alice | BobUA->AliceUA: audio+data sent from Bob to Alice | |||
AliceUA->BobUA: audio+data sent from Alice to Bob | AliceUA->BobUA: audio+data sent from Alice to Bob | |||
// some time later Bob adds two video streams | // some time later, Bob adds two video streams | |||
// note, no candidates exchanged, because of bundle | // note: no candidates exchanged, because of bundle | |||
BobJS->BobUA: addTrack with first video stream | BobJS->BobUA: addTrack with first video stream | |||
BobJS->BobUA: addTrack with second video stream | BobJS->BobUA: addTrack with second video stream | |||
BobJS->BobUA: createOffer to get |offer-B2| | BobJS->BobUA: createOffer to get |offer-B2| | |||
BobJS->BobUA: setLocalDescription with |offer-B2| | BobJS->BobUA: setLocalDescription with |offer-B2| | |||
// |offer-B2| is sent to Alice | // |offer-B2| is sent to Alice | |||
BobJS->WebServer: signaling with |offer-B2| | BobJS->WebServer: signaling with |offer-B2| | |||
WebServer->AliceJS: signaling with |offer-B2| | WebServer->AliceJS: signaling with |offer-B2| | |||
AliceJS->AliceUA: setRemoteDescription with |offer-B2| | AliceJS->AliceUA: setRemoteDescription with |offer-B2| | |||
AliceUA->AliceJS: ontrack event with first video track | AliceUA->AliceJS: ontrack event with first video track | |||
AliceUA->AliceJS: ontrack event with second video track | AliceUA->AliceJS: ontrack event with second video track | |||
AliceJS->AliceUA: createAnswer to get |answer-B2| | AliceJS->AliceUA: createAnswer to get |answer-B2| | |||
AliceJS->AliceUA: setLocalDescription with |answer-B2| | AliceJS->AliceUA: setLocalDescription with |answer-B2| | |||
// |answer-B2| is sent over signaling protocol to Bob | // |answer-B2| is sent over signaling protocol | |||
AliceJS->WebServer: signaling with |answer-B2| | // to Bob | |||
WebServer->BobJS: signaling with |answer-B2| | AliceJS->WebServer: signaling with |answer-B2| | |||
BobJS->BobUA: setRemoteDescription with |answer-B2| | WebServer->BobJS: signaling with |answer-B2| | |||
BobJS->BobUA: setRemoteDescription with |answer-B2| | ||||
// media is flowing between endpoints | // media is flowing between endpoints | |||
BobUA->AliceUA: audio+video+data sent from Bob to Alice | BobUA->AliceUA: audio+video+data sent from Bob to Alice | |||
AliceUA->BobUA: audio+video+data sent from Alice to Bob | AliceUA->BobUA: audio+video+data sent from Alice to Bob </artwork> | |||
]]> | <t indent="0" pn="section-7.2-3">The SDP for |offer-B1| looks like:</t> | |||
</artwork> | <sourcecode name="offer-B1" type="sdp" markers="false" pn="section-7.2-4 | |||
</figure> | "> | |||
</t> | ||||
<t>The SDP for |offer-B1| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="offer-B1"> | ||||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=- 4962303333179871723 1 IN IP4 0.0.0.0 | o=- 4962303333179871723 1 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 d1 | a=group:BUNDLE a1 d1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:a1 | a=mid:a1 | |||
skipping to change at line 4508 ¶ | skipping to change at line 4403 ¶ | |||
a=tls-id:17f0f4ba8a5f1213faca591b58ba52a7 | a=tls-id:17f0f4ba8a5f1213faca591b58ba52a7 | |||
a=rtcp-mux | a=rtcp-mux | |||
a=rtcp-mux-only | a=rtcp-mux-only | |||
a=rtcp-rsize | a=rtcp-rsize | |||
m=application 0 UDP/DTLS/SCTP webrtc-datachannel | m=application 0 UDP/DTLS/SCTP webrtc-datachannel | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:d1 | a=mid:d1 | |||
a=sctp-port:5000 | a=sctp-port:5000 | |||
a=max-message-size:65536 | a=max-message-size:65536 | |||
a=bundle-only | a=bundle-only</sourcecode> | |||
]]> | <t indent="0" pn="section-7.2-5">|offer-B1-candidate-1| looks like:</t> | |||
</artwork> | <sourcecode name="offer-B1-candidate-1" type="sdp" markers="false" pn="s | |||
</figure> | ection-7.2-6"> | |||
</t> | ||||
<t>|offer-B1-candidate-1| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="offer-B1-candidate-1"> | ||||
<![CDATA[ | ||||
ufrag ATEn | ufrag ATEn | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 2113929471 203.0.113.100 10100 typ host | attr candidate:1 1 udp 2113929471 203.0.113.100 10100 typ host</sourcecode> | |||
]]> | <t indent="0" pn="section-7.2-7">|offer-B1-candidate-2| looks like:</t> | |||
</artwork> | <sourcecode name="offer-B1-candidate-2" type="sdp" markers="false" pn="s | |||
</figure> | ection-7.2-8"> | |||
</t> | ||||
<t>|offer-B1-candidate-2| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="offer-B1-candidate-2"> | ||||
<![CDATA[ | ||||
ufrag ATEn | ufrag ATEn | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 1845494015 198.51.100.100 11100 typ srflx | attr candidate:1 1 udp 1845494015 198.51.100.100 11100 typ srflx | |||
raddr 203.0.113.100 rport 10100 | raddr 203.0.113.100 rport 10100</sourcecode> | |||
]]> | <t indent="0" pn="section-7.2-9">|offer-B1-candidate-3| looks like:</t> | |||
</artwork> | <sourcecode name="offer-B1-candidate-3" type="sdp" markers="false" pn="s | |||
</figure> | ection-7.2-10"> | |||
</t> | ||||
<t>|offer-B1-candidate-3| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="offer-B1-candidate-3"> | ||||
<![CDATA[ | ||||
ufrag ATEn | ufrag ATEn | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 255 192.0.2.100 12100 typ relay | attr candidate:1 1 udp 255 192.0.2.100 12100 typ relay | |||
raddr 198.51.100.100 rport 11100 | raddr 198.51.100.100 rport 11100</sourcecode> | |||
]]> | <t indent="0" pn="section-7.2-11">The SDP for |answer-B1| looks like:</t | |||
</artwork> | > | |||
</figure> | <sourcecode name="answer-B1" type="sdp" markers="false" pn="section-7.2- | |||
</t> | 12"> | |||
<t>The SDP for |answer-B1| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="answer-B1"> | ||||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=- 7729291447651054566 1 IN IP4 0.0.0.0 | o=- 7729291447651054566 1 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 d1 | a=group:BUNDLE a1 d1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:a1 | a=mid:a1 | |||
skipping to change at line 4604 ¶ | skipping to change at line 4463 ¶ | |||
a=setup:active | a=setup:active | |||
a=tls-id:7a25ab85b195acaf3121f5a8ab4f0f71 | a=tls-id:7a25ab85b195acaf3121f5a8ab4f0f71 | |||
a=rtcp-mux | a=rtcp-mux | |||
a=rtcp-mux-only | a=rtcp-mux-only | |||
a=rtcp-rsize | a=rtcp-rsize | |||
m=application 9 UDP/DTLS/SCTP webrtc-datachannel | m=application 9 UDP/DTLS/SCTP webrtc-datachannel | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:d1 | a=mid:d1 | |||
a=sctp-port:5000 | a=sctp-port:5000 | |||
a=max-message-size:65536 | a=max-message-size:65536</sourcecode> | |||
]]> | <t indent="0" pn="section-7.2-13">|answer-B1-candidate-1| looks like:</t | |||
</artwork> | > | |||
</figure> | <sourcecode name="answer-B1-candidate-1" type="sdp" markers="false" pn=" | |||
</t> | section-7.2-14"> | |||
<t>|answer-B1-candidate-1| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="answer-B1-candidate-1"> | ||||
<![CDATA[ | ||||
ufrag 7sFv | ufrag 7sFv | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 2113929471 203.0.113.200 10200 typ host | attr candidate:1 1 udp 2113929471 203.0.113.200 10200 typ host</sourcecode> | |||
]]> | <t indent="0" pn="section-7.2-15">|answer-B1-candidate-2| looks like:</t | |||
</artwork> | > | |||
</figure> | <sourcecode name="answer-B1-candidate-2" type="sdp" markers="false" pn=" | |||
</t> | section-7.2-16"> | |||
<t>|answer-B1-candidate-2| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="answer-B1-candidate-2"> | ||||
<![CDATA[ | ||||
ufrag 7sFv | ufrag 7sFv | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 1845494015 198.51.100.200 11200 typ srflx | attr candidate:1 1 udp 1845494015 198.51.100.200 11200 typ srflx | |||
raddr 203.0.113.200 rport 10200 | raddr 203.0.113.200 rport 10200</sourcecode> | |||
]]> | <t indent="0" pn="section-7.2-17">|answer-B1-candidate-3| looks like:</t | |||
</artwork> | > | |||
</figure> | <sourcecode name="answer-B1-candidate-3" type="sdp" markers="false" pn=" | |||
</t> | section-7.2-18"> | |||
<t>|answer-B1-candidate-3| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="answer-B1-candidate-3"> | ||||
<![CDATA[ | ||||
ufrag 7sFv | ufrag 7sFv | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 255 192.0.2.200 12200 typ relay | attr candidate:1 1 udp 255 192.0.2.200 12200 typ relay | |||
raddr 198.51.100.200 rport 11200 | raddr 198.51.100.200 rport 11200</sourcecode> | |||
]]> | <t indent="0" pn="section-7.2-19">The SDP for |offer-B2| is shown below. | |||
</artwork> | In addition to the | |||
</figure> | new "m=" sections for video, both of which are offering FEC and | |||
</t> | one of which is offering simulcast, note the increment of the | |||
version number in the "o=" line; changes to the "c=" line, | ||||
<t>The SDP for |offer-B2| is shown below. In addition to the | indicating the local candidate that was selected; and the | |||
new m= sections for video, both of which are offering FEC, and | inclusion of gathered candidates as a=candidate lines.</t> | |||
one of which is offering simulcast, note the increment of the | <sourcecode name="offer-B2" type="sdp" markers="false" pn="section-7.2-2 | |||
version number in the o= line, changes to the c= line, | 0"> | |||
indicating the local candidate that was selected, and the | ||||
inclusion of gathered candidates as a=candidate lines.</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="offer-B2"> | ||||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=- 7729291447651054566 2 IN IP4 0.0.0.0 | o=- 7729291447651054566 2 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 d1 v1 v2 | a=group:BUNDLE a1 d1 v1 v2 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 12200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 12200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 192.0.2.200 | c=IN IP4 192.0.2.200 | |||
skipping to change at line 4723 ¶ | skipping to change at line 4546 ¶ | |||
m=video 12200 UDP/TLS/RTP/SAVPF 100 101 102 103 104 | m=video 12200 UDP/TLS/RTP/SAVPF 100 101 102 103 104 | |||
c=IN IP4 192.0.2.200 | c=IN IP4 192.0.2.200 | |||
a=mid:v1 | a=mid:v1 | |||
a=sendrecv | a=sendrecv | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=rtpmap:104 flexfec/90000 | a=rtpmap:104 flexfec/90000 | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
a=msid:71317484-2ed4-49d7-9eb7-1414322a7aae | a=msid:71317484-2ed4-49d7-9eb7-1414322a7aae | |||
a=rid:1 send | a=rid:1 send | |||
a=rid:2 send | a=rid:2 send | |||
skipping to change at line 4746 ¶ | skipping to change at line 4569 ¶ | |||
m=video 12200 UDP/TLS/RTP/SAVPF 100 101 102 103 104 | m=video 12200 UDP/TLS/RTP/SAVPF 100 101 102 103 104 | |||
c=IN IP4 192.0.2.200 | c=IN IP4 192.0.2.200 | |||
a=mid:v2 | a=mid:v2 | |||
a=sendrecv | a=sendrecv | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=rtpmap:104 flexfec/90000 | a=rtpmap:104 flexfec/90000 | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
a=msid:81317484-2ed4-49d7-9eb7-1414322a7aae | a=msid:81317484-2ed4-49d7-9eb7-1414322a7aae</sourcecode> | |||
]]> | <t indent="0" pn="section-7.2-21">The SDP for |answer-B2| is shown below | |||
</artwork> | . In addition to the | |||
</figure> | acceptance of the video "m=" sections, the use of a=recvonly to | |||
</t> | indicate one-way video, and the use of a=imageattr to limit the | |||
received resolution, note the use of setup:passive to maintain | ||||
<t>The SDP for |answer-B2| is shown below. In addition to the | the existing DTLS roles.</t> | |||
acceptance of the video m= sections, the use of a=recvonly to | <sourcecode name="answer-B2" type="sdp" markers="false" pn="section-7.2- | |||
indicate one-way video, and the use of a=imageattr to limit the | 22"> | |||
received resolution, note the use of setup:passive to maintain | ||||
the existing DTLS roles.</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="answer-B2"> | ||||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=- 4962303333179871723 2 IN IP4 0.0.0.0 | o=- 4962303333179871723 2 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 d1 v1 v2 | a=group:BUNDLE a1 d1 v1 v2 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 12100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 12100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 192.0.2.100 | c=IN IP4 192.0.2.100 | |||
skipping to change at line 4825 ¶ | skipping to change at line 4639 ¶ | |||
m=video 12100 UDP/TLS/RTP/SAVPF 100 101 102 103 | m=video 12100 UDP/TLS/RTP/SAVPF 100 101 102 103 | |||
c=IN IP4 192.0.2.100 | c=IN IP4 192.0.2.100 | |||
a=mid:v1 | a=mid:v1 | |||
a=recvonly | a=recvonly | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=imageattr:100 recv [x=[48:1920],y=[48:1080],q=1.0] | a=imageattr:100 recv [x=[48:1920],y=[48:1080],q=1.0] | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
m=video 12100 UDP/TLS/RTP/SAVPF 100 101 102 103 | m=video 12100 UDP/TLS/RTP/SAVPF 100 101 102 103 | |||
c=IN IP4 192.0.2.100 | c=IN IP4 192.0.2.100 | |||
a=mid:v2 | a=mid:v2 | |||
a=recvonly | a=recvonly | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=imageattr:100 recv [x=[48:1920],y=[48:1080],q=1.0] | a=imageattr:100 recv [x=[48:1920],y=[48:1080],q=1.0] | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli</sourcecode> | |||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | ||||
</section> | </section> | |||
<section title="Early Transport Warmup Example" | <section anchor="sec.warmup-example" numbered="true" toc="include" removeI | |||
anchor="sec.warmup-example"> | nRFC="false" pn="section-7.3"> | |||
<name slugifiedName="name-early-transport-warmup-exam">Early Transport W | ||||
<t>This example demonstrates the early warmup technique | armup Example</name> | |||
described in | <t indent="0" pn="section-7.3-1">This example demonstrates the early-war | |||
<xref target="sec.use-of-provisional-answer" />. Here, Alice's | mup technique | |||
endpoint sends an offer to Bob's endpoint to start an | described in | |||
audio/video call. Bob immediately responds with an answer that | <xref target="sec.use-of-provisional-answer" format="default" sectionF | |||
accepts the audio/video m= sections, but marks them as sendonly | ormat="of" derivedContent="Section 4.1.10.1"/>. Here, Alice's | |||
(from his perspective), meaning that Alice will not yet send | endpoint sends an offer to Bob's endpoint to start an | |||
media. This allows the JSEP implementation to start negotiating | audio/video call. Bob immediately responds with an answer that | |||
ICE and DTLS immediately. Bob's endpoint then prompts him to | accepts the audio/video "m=" sections but marks them as sendonly | |||
answer the call, and when he does, his endpoint sends a second | (from his perspective), meaning that Alice will not yet send | |||
offer which enables the audio and video m= sections, and | media. This allows the JSEP implementation to start negotiating | |||
thereby bidirectional media transmission. The advantage of such | ICE and DTLS immediately. Bob's endpoint then prompts him to | |||
a flow is that as soon as the first answer is received, the | answer the call, and when he does, his endpoint sends a second | |||
implementation can proceed with ICE and DTLS negotiation and | offer, which enables the audio and video "m=" sections, and | |||
establish the session transport. If the transport setup | thereby bidirectional media transmission. The advantage of such | |||
completes before the second offer is sent, then media can be | a flow is that as soon as the first answer is received, the | |||
transmitted immediately by the callee immediately upon | implementation can proceed with ICE and DTLS negotiation and | |||
answering the call, minimizing perceived post-dial-delay. The | establish the session transport. If the transport setup | |||
second offer/answer exchange can also change the preferred | completes before the second offer is sent, then media can be | |||
codecs or other session parameters.</t> | transmitted by the callee immediately upon | |||
answering the call, minimizing perceived post-dial delay. The | ||||
<t>This example also makes use of the "relay" ICE candidate | second offer/answer exchange can also change the preferred | |||
policy described in | codecs or other session parameters.</t> | |||
<xref target="sec.ice-candidate-policy" /> to minimize the ICE | <t indent="0" pn="section-7.3-2">This example also makes use of the "rel | |||
gathering and checking needed.</t> | ay" ICE candidate | |||
policy described in | ||||
<t> | <xref target="sec.ice-candidate-policy" format="default" sectionFormat | |||
<figure> | ="of" derivedContent="Section 3.5.3"/> to minimize the ICE | |||
<artwork> | gathering and checking needed.</t> | |||
<![CDATA[ | <artwork name="" type="ascii-art" align="left" alt="" pn="section-7.3-3" | |||
> | ||||
// set up local media state | // set up local media state | |||
AliceJS->AliceUA: create new PeerConnection with "relay" ICE policy | AliceJS->AliceUA: create new PeerConnection with "relay" ICE policy | |||
AliceJS->AliceUA: addTrack with two tracks: audio and video | AliceJS->AliceUA: addTrack with two tracks: audio and video | |||
AliceJS->AliceUA: createOffer to get |offer-C1| | AliceJS->AliceUA: createOffer to get |offer-C1| | |||
AliceJS->AliceUA: setLocalDescription with |offer-C1| | AliceJS->AliceUA: setLocalDescription with |offer-C1| | |||
// |offer-C1| is sent over signaling protocol to Bob | // |offer-C1| is sent over signaling protocol to Bob | |||
AliceJS->WebServer: signaling with |offer-C1| | AliceJS->WebServer: signaling with |offer-C1| | |||
WebServer->BobJS: signaling with |offer-C1| | WebServer->BobJS: signaling with |offer-C1| | |||
// |offer-C1| arrives at Bob | // |offer-C1| arrives at Bob | |||
BobJS->BobUA: create new PeerConnection with "relay" ICE policy | BobJS->BobUA: create new PeerConnection with "relay" ICE policy | |||
BobJS->BobUA: setRemoteDescription with |offer-C1| | BobJS->BobUA: setRemoteDescription with |offer-C1| | |||
BobUA->BobJS: ontrack events for audio and video | BobUA->BobJS: ontrack events for audio and video | |||
// a relay candidate is sent to Bob | // a relay candidate is sent to Bob | |||
AliceUA->AliceJS: onicecandidate (relay) |offer-C1-candidate-1| | AliceUA->AliceJS: onicecandidate (relay) |offer-C1-candidate-1| | |||
AliceJS->WebServer: signaling with |offer-C1-candidate-1| | AliceJS->WebServer: signaling with |offer-C1-candidate-1| | |||
WebServer->BobJS: signaling with |offer-C1-candidate-1| | WebServer->BobJS: signaling with |offer-C1-candidate-1| | |||
BobJS->BobUA: addIceCandidate with |offer-C1-candidate-1| | BobJS->BobUA: addIceCandidate with |offer-C1-candidate-1| | |||
// Bob prepares an early answer to warmup the transport | // Bob prepares an early answer to warm up the | |||
BobJS->BobUA: addTransceiver with null audio and video tracks | // transport | |||
BobJS->BobUA: transceiver.setDirection(sendonly) for both | BobJS->BobUA: addTransceiver with null audio and video tracks | |||
BobJS->BobUA: createAnswer | BobJS->BobUA: transceiver.setDirection(sendonly) for both | |||
BobJS->BobUA: setLocalDescription with answer | BobJS->BobUA: createAnswer | |||
BobJS->BobUA: setLocalDescription with answer | ||||
// |answer-C1| is sent over signaling protocol to Alice | // |answer-C1| is sent over signaling protocol | |||
BobJS->WebServer: signaling with |answer-C1| | // to Alice | |||
WebServer->AliceJS: signaling with |answer-C1| | BobJS->WebServer: signaling with |answer-C1| | |||
WebServer->AliceJS: signaling with |answer-C1| | ||||
// |answer-C1| (sendonly) arrives at Alice | // |answer-C1| (sendonly) arrives at Alice | |||
AliceJS->AliceUA: setRemoteDescription with |answer-C1| | AliceJS->AliceUA: setRemoteDescription with |answer-C1| | |||
AliceUA->AliceJS: ontrack events for audio and video | AliceUA->AliceJS: ontrack events for audio and video | |||
// a relay candidate is sent to Alice | // a relay candidate is sent to Alice | |||
BobUA->BobJS: onicecandidate (relay) |answer-B1-candidate-1| | BobUA->BobJS: onicecandidate (relay) |answer-B1-candidate-1| | |||
BobJS->WebServer: signaling with |answer-B1-candidate-1| | BobJS->WebServer: signaling with |answer-B1-candidate-1| | |||
WebServer->AliceJS: signaling with |answer-B1-candidate-1| | WebServer->AliceJS: signaling with |answer-B1-candidate-1| | |||
AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-1| | AliceJS->AliceUA: addIceCandidate with |answer-B1-candidate-1| | |||
// ICE and DTLS establish while call is ringing | // ICE and DTLS establish while call is ringing | |||
// Bob accepts call, starts media, and sends new offer | // Bob accepts call, starts media, and sends | |||
BobJS->BobUA: transceiver.setTrack with audio and video tracks | // new offer | |||
BobUA->AliceUA: media sent from Bob to Alice | BobJS->BobUA: transceiver.setTrack with audio and video tracks | |||
BobJS->BobUA: transceiver.setDirection(sendrecv) for both | BobUA->AliceUA: media sent from Bob to Alice | |||
BobJS->BobUA: transceiver.setDirection(sendrecv) for both | ||||
transceivers | transceivers | |||
BobJS->BobUA: createOffer | BobJS->BobUA: createOffer | |||
BobJS->BobUA: setLocalDescription with offer | BobJS->BobUA: setLocalDescription with offer | |||
// |offer-C2| is sent over signaling protocol to Alice | // |offer-C2| is sent over signaling protocol | |||
BobJS->WebServer: signaling with |offer-C2| | // to Alice | |||
WebServer->AliceJS: signaling with |offer-C2| | BobJS->WebServer: signaling with |offer-C2| | |||
WebServer->AliceJS: signaling with |offer-C2| | ||||
// |offer-C2| (sendrecv) arrives at Alice | // |offer-C2| (sendrecv) arrives at Alice | |||
AliceJS->AliceUA: setRemoteDescription with |offer-C2| | AliceJS->AliceUA: setRemoteDescription with |offer-C2| | |||
AliceJS->AliceUA: createAnswer | AliceJS->AliceUA: createAnswer | |||
AliceJS->AliceUA: setLocalDescription with |answer-C2| | AliceJS->AliceUA: setLocalDescription with |answer-C2| | |||
AliceUA->BobUA: media sent from Alice to Bob | AliceUA->BobUA: media sent from Alice to Bob | |||
// |answer-C2| is sent over signaling protocol to Bob | ||||
AliceJS->WebServer: signaling with |answer-C2| | ||||
WebServer->BobJS: signaling with |answer-C2| | ||||
BobJS->BobUA: setRemoteDescription with |answer-C2| | ||||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | ||||
<t>The SDP for |offer-C1| looks like:</t> | ||||
<t> | // |answer-C2| is sent over signaling protocol | |||
<figure> | // to Bob | |||
<artwork alt="offer-C1"> | AliceJS->WebServer: signaling with |answer-C2| | |||
<![CDATA[ | WebServer->BobJS: signaling with |answer-C2| | |||
BobJS->BobUA: setRemoteDescription with |answer-C2| </artwork> | ||||
<t indent="0" pn="section-7.3-4">The SDP for |offer-C1| looks like:</t> | ||||
<sourcecode name="offer-C1" type="sdp" markers="false" pn="section-7.3-5 | ||||
"> | ||||
v=0 | v=0 | |||
o=- 1070771854436052752 1 IN IP4 0.0.0.0 | o=- 1070771854436052752 1 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
skipping to change at line 5010 ¶ | skipping to change at line 4810 ¶ | |||
m=video 0 UDP/TLS/RTP/SAVPF 100 101 102 103 | m=video 0 UDP/TLS/RTP/SAVPF 100 101 102 103 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:v1 | a=mid:v1 | |||
a=sendrecv | a=sendrecv | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
a=msid:bbce3ba6-abfc-ac63-d00a-e15b286f8fce | a=msid:bbce3ba6-abfc-ac63-d00a-e15b286f8fce | |||
a=bundle-only | a=bundle-only</sourcecode> | |||
]]> | <t indent="0" pn="section-7.3-6">|offer-C1-candidate-1| looks like:</t> | |||
</artwork> | <sourcecode name="offer-C1-candidate-1" type="sdp" markers="false" pn="s | |||
</figure> | ection-7.3-7"> | |||
</t> | ||||
<t>|offer-C1-candidate-1| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="offer-C1-candidate-1"> | ||||
<![CDATA[ | ||||
ufrag 4ZcD | ufrag 4ZcD | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 255 192.0.2.100 12100 typ relay | attr candidate:1 1 udp 255 192.0.2.100 12100 typ relay | |||
raddr 0.0.0.0 rport 0 | raddr 0.0.0.0 rport 0</sourcecode> | |||
]]> | <t indent="0" pn="section-7.3-8">The SDP for |answer-C1| looks like:</t> | |||
</artwork> | <sourcecode name="answer-C1" type="sdp" markers="false" pn="section-7.3- | |||
</figure> | 9"> | |||
</t> | ||||
<t>The SDP for |answer-C1| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="answer-C1"> | ||||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=- 6386516489780559513 1 IN IP4 0.0.0.0 | o=- 6386516489780559513 1 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 9 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
skipping to change at line 5089 ¶ | skipping to change at line 4871 ¶ | |||
m=video 9 UDP/TLS/RTP/SAVPF 100 101 102 103 | m=video 9 UDP/TLS/RTP/SAVPF 100 101 102 103 | |||
c=IN IP4 0.0.0.0 | c=IN IP4 0.0.0.0 | |||
a=mid:v1 | a=mid:v1 | |||
a=sendonly | a=sendonly | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
a=msid:751f239e-4ae0-c549-aa3d-890de772998b | a=msid:751f239e-4ae0-c549-aa3d-890de772998b</sourcecode> | |||
]]> | <t indent="0" pn="section-7.3-10">|answer-C1-candidate-1| looks like:</t | |||
</artwork> | > | |||
</figure> | <sourcecode name="answer-C1-candidate-1" type="sdp" markers="false" pn=" | |||
</t> | section-7.3-11"> | |||
<t>|answer-C1-candidate-1| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="answer-C1-candidate-1"> | ||||
<![CDATA[ | ||||
ufrag TpaA | ufrag TpaA | |||
index 0 | index 0 | |||
mid a1 | mid a1 | |||
attr candidate:1 1 udp 255 192.0.2.200 12200 typ relay | attr candidate:1 1 udp 255 192.0.2.200 12200 typ relay | |||
raddr 0.0.0.0 rport 0 | raddr 0.0.0.0 rport 0</sourcecode> | |||
]]> | <t indent="0" pn="section-7.3-12">The SDP for |offer-C2| looks like:</t> | |||
</artwork> | <sourcecode name="offer-C2" type="sdp" markers="false" pn="section-7.3-1 | |||
</figure> | 3"> | |||
</t> | ||||
<t>The SDP for |offer-C2| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="offer-C2"> | ||||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=- 6386516489780559513 2 IN IP4 0.0.0.0 | o=- 6386516489780559513 2 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 12200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 12200 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 192.0.2.200 | c=IN IP4 192.0.2.200 | |||
skipping to change at line 5170 ¶ | skipping to change at line 4934 ¶ | |||
m=video 12200 UDP/TLS/RTP/SAVPF 100 101 102 103 | m=video 12200 UDP/TLS/RTP/SAVPF 100 101 102 103 | |||
c=IN IP4 192.0.2.200 | c=IN IP4 192.0.2.200 | |||
a=mid:v1 | a=mid:v1 | |||
a=sendrecv | a=sendrecv | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
a=msid:751f239e-4ae0-c549-aa3d-890de772998b | a=msid:751f239e-4ae0-c549-aa3d-890de772998b</sourcecode> | |||
]]> | <t indent="0" pn="section-7.3-14">The SDP for |answer-C2| looks like:</t | |||
</artwork> | > | |||
</figure> | <sourcecode name="answer-C2" type="sdp" markers="false" pn="section-7.3- | |||
</t> | 15"> | |||
<t>The SDP for |answer-C2| looks like:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork alt="answer-C2"> | ||||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=- 1070771854436052752 2 IN IP4 0.0.0.0 | o=- 1070771854436052752 2 IN IP4 0.0.0.0 | |||
s=- | s=- | |||
t=0 0 | t=0 0 | |||
a=ice-options:trickle ice2 | a=ice-options:trickle ice2 | |||
a=group:BUNDLE a1 v1 | a=group:BUNDLE a1 v1 | |||
a=group:LS a1 v1 | a=group:LS a1 v1 | |||
m=audio 12100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | m=audio 12100 UDP/TLS/RTP/SAVPF 96 0 8 97 98 | |||
c=IN IP4 192.0.2.100 | c=IN IP4 192.0.2.100 | |||
skipping to change at line 5235 ¶ | skipping to change at line 4990 ¶ | |||
m=video 12100 UDP/TLS/RTP/SAVPF 100 101 102 103 | m=video 12100 UDP/TLS/RTP/SAVPF 100 101 102 103 | |||
c=IN IP4 192.0.2.100 | c=IN IP4 192.0.2.100 | |||
a=mid:v1 | a=mid:v1 | |||
a=sendrecv | a=sendrecv | |||
a=rtpmap:100 VP8/90000 | a=rtpmap:100 VP8/90000 | |||
a=rtpmap:101 H264/90000 | a=rtpmap:101 H264/90000 | |||
a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | a=fmtp:101 packetization-mode=1;profile-level-id=42e01f | |||
a=rtpmap:102 rtx/90000 | a=rtpmap:102 rtx/90000 | |||
a=fmtp:102 apt=100 | a=fmtp:102 apt=100 | |||
=rtpmap:103 rtx/90000 | a=rtpmap:103 rtx/90000 | |||
a=fmtp:103 apt=101 | a=fmtp:103 apt=101 | |||
a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | a=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid | |||
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id | |||
a=rtcp-fb:100 ccm fir | a=rtcp-fb:100 ccm fir | |||
a=rtcp-fb:100 nack | a=rtcp-fb:100 nack | |||
a=rtcp-fb:100 nack pli | a=rtcp-fb:100 nack pli | |||
a=msid:bbce3ba6-abfc-ac63-d00a-e15b286f8fce | a=msid:bbce3ba6-abfc-ac63-d00a-e15b286f8fce</sourcecode> | |||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section title="Security Considerations" | <section anchor="sec.security-considerations" numbered="true" toc="include" | |||
anchor="sec.security-considerations"> | removeInRFC="false" pn="section-8"> | |||
<name slugifiedName="name-security-considerations">Security Considerations | ||||
<t>The IETF has published separate documents | </name> | |||
<xref target="I-D.ietf-rtcweb-security-arch" /> | <t indent="0" pn="section-8-1">The IETF has published separate documents | |||
<xref target="I-D.ietf-rtcweb-security" /> describing the security | <xref target="RFC8827" format="default" sectionFormat="of" derivedConten | |||
architecture for WebRTC as a whole. The remainder of this section | t="RFC8827"/> | |||
describes security considerations for this document.</t> | <xref target="RFC8826" format="default" sectionFormat="of" derivedConten | |||
t="RFC8826"/> describing the security | ||||
<t>While formally the JSEP interface is an API, it is better to | architecture for WebRTC as a whole. The remainder of this section | |||
think of it as an Internet protocol, with the application | describes security considerations for this document.</t> | |||
JavaScript being untrustworthy from the perspective of the JSEP | <t indent="0" pn="section-8-2">While formally the JSEP interface is an API | |||
implementation. Thus, the threat model of | , it is better to | |||
<xref target="RFC3552" /> applies. In particular, JavaScript can | think of it as an Internet protocol, with the application | |||
call the API in any order and with any inputs, including | JavaScript being untrustworthy from the perspective of the JSEP | |||
malicious ones. This is particularly relevant when we consider | implementation. Thus, the threat model of | |||
the SDP which is passed to setLocalDescription(). While correct | <xref target="RFC3552" format="default" sectionFormat="of" derivedConten | |||
API usage requires that the application pass in SDP which was | t="RFC3552"/> applies. In particular, JavaScript can | |||
derived from createOffer() or createAnswer(), there is no | call the API in any order and with any inputs, including | |||
guarantee that applications do so. The JSEP implementation MUST | malicious ones. This is particularly relevant when we consider | |||
be prepared for the JavaScript to pass in bogus data instead.</t> | the SDP that is passed to setLocalDescription. While correct | |||
API usage requires that the application pass in SDP that was | ||||
<t>Conversely, the application programmer needs to be aware that | derived from createOffer or createAnswer, there is no | |||
the JavaScript does not have complete control of endpoint | guarantee that applications do so. The JSEP implementation <bcp14>MUST</ | |||
behavior. One case that bears particular mention is that editing | bcp14> | |||
ICE candidates out of the SDP or suppressing trickled candidates | be prepared for the JavaScript to pass in bogus data instead.</t> | |||
does not have the expected behavior: implementations will still | <t indent="0" pn="section-8-3">Conversely, the application programmer need | |||
perform checks from those candidates even if they are not sent to | s to be aware that | |||
the other side. Thus, for instance, it is not possible to prevent | the JavaScript does not have complete control of endpoint | |||
the remote peer from learning your public IP address by removing | behavior. One case that bears particular mention is that editing | |||
server reflexive candidates. Applications which wish to conceal | ICE candidates out of the SDP or suppressing trickled candidates | |||
their public IP address should instead configure the ICE agent to | does not have the expected behavior: implementations will still | |||
use only relay candidates.</t> | perform checks from those candidates even if they are not sent to | |||
</section> | the other side. Thus, for instance, it is not possible to prevent | |||
<section title="IANA Considerations" | the remote peer from learning your public IP address by removing | |||
anchor="sec.iana-considerations"> | server-reflexive candidates. Applications that wish to conceal | |||
their public IP address <bcp14>MUST</bcp14> instead configure the ICE ag | ||||
<t>This document requires no actions from IANA.</t> | ent to | |||
use only relay candidates.</t> | ||||
</section> | </section> | |||
<section title="Acknowledgements" anchor="sec.acknowledgements"> | <section anchor="sec.iana-considerations" numbered="true" toc="include" remo | |||
veInRFC="false" pn="section-9"> | ||||
<t>Harald Alvestrand, Taylor Brandstetter, Suhas Nandakumar, and | <name slugifiedName="name-iana-considerations">IANA Considerations</name> | |||
Peter Thatcher provided significant text for this draft. Bernard | <t indent="0" pn="section-9-1">This document has no IANA actions.</t> | |||
Aboba, Adam Bergkvist, Dan Burnett, Ben Campbell, Alissa Cooper, | ||||
Richard Ejzak, Stefan Hakansson, Ted Hardie, Christer Holmberg | ||||
Andrew Hutton, Randell Jesup, Matthew Kaufman, Anant Narayanan, | ||||
Adam Roach, Robert Sparks, Neil Stratford, Martin Thomson, Sean | ||||
Turner, and Magnus Westerlund all provided valuable feedback on | ||||
this proposal.</t> | ||||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<references title="Normative References"> | <displayreference target="I-D.ietf-rtcweb-sdp" to="SDP4WebRTC"/> | |||
<?rfc include='reference.I-D.ietf-avtext-rid'?> | <references pn="section-10"> | |||
<?rfc include='reference.I-D.ietf-ice-trickle'?> | <name slugifiedName="name-references">References</name> | |||
<?rfc include='reference.I-D.ietf-mmusic-dtls-sdp'?> | <references pn="section-10.1"> | |||
<?rfc include='reference.I-D.ietf-mmusic-ice-sip-sdp'?> | <name slugifiedName="name-normative-references">Normative References</na | |||
<?rfc include='reference.I-D.ietf-mmusic-msid'?> | me> | |||
<?rfc include='reference.I-D.ietf-mmusic-mux-exclusive'?> | <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2 | |||
<?rfc include='reference.I-D.ietf-mmusic-rid'?> | 119" quoteTitle="true" derivedAnchor="RFC2119"> | |||
<?rfc include='reference.I-D.ietf-mmusic-sctp-sdp'?> | <front> | |||
<?rfc include='reference.I-D.ietf-mmusic-sdp-bundle-negotiation'?> | <title>Key words for use in RFCs to Indicate Requirement Levels</tit | |||
<?rfc include='reference.I-D.ietf-mmusic-sdp-mux-attributes'?> | le> | |||
<?rfc include='reference.I-D.ietf-mmusic-sdp-simulcast'?> | <author initials="S." surname="Bradner" fullname="S. Bradner"> | |||
<?rfc include='reference.I-D.ietf-rtcweb-fec'?> | <organization showOnFrontPage="true"/> | |||
<?rfc include='reference.I-D.ietf-rtcweb-rtp-usage'?> | </author> | |||
<?rfc include='reference.I-D.ietf-rtcweb-security'?> | <date year="1997" month="March"/> | |||
<?rfc include='reference.I-D.ietf-rtcweb-security-arch'?> | <abstract> | |||
<?rfc include='reference.RFC.2119.xml'?> | <t indent="0">In many standards track documents several words are | |||
<?rfc include='reference.RFC.3261.xml'?> | used to signify the requirements in the specification. These words are often ca | |||
<?rfc include='reference.RFC.3264.xml'?> | pitalized. This document defines these words as they should be interpreted in IE | |||
<?rfc include='reference.RFC.3552.xml'?> | TF documents. This document specifies an Internet Best Current Practices for th | |||
<?rfc include='reference.RFC.3605.xml'?> | e Internet Community, and requests discussion and suggestions for improvements.< | |||
<?rfc include='reference.RFC.3890.xml'?> | /t> | |||
<?rfc include='reference.RFC.4145.xml'?> | </abstract> | |||
<?rfc include='reference.RFC.4566.xml'?> | </front> | |||
<?rfc include='reference.RFC.4585.xml'?> | <seriesInfo name="BCP" value="14"/> | |||
<?rfc include='reference.RFC.5124.xml'?> | <seriesInfo name="RFC" value="2119"/> | |||
<?rfc include='reference.RFC.5285.xml'?> | <seriesInfo name="DOI" value="10.17487/RFC2119"/> | |||
<?rfc include='reference.RFC.5761.xml'?> | </reference> | |||
<?rfc include='reference.RFC.5888.xml'?> | <reference anchor="RFC3261" target="https://www.rfc-editor.org/info/rfc3 | |||
<?rfc include='reference.RFC.6236.xml'?> | 261" quoteTitle="true" derivedAnchor="RFC3261"> | |||
<?rfc include='reference.RFC.6347.xml'?> | <front> | |||
<?rfc include='reference.RFC.6716.xml'?> | <title>SIP: Session Initiation Protocol</title> | |||
<?rfc include='reference.RFC.6904.xml'?> | <author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | |||
<?rfc include='reference.RFC.7160.xml'?> | <organization showOnFrontPage="true"/> | |||
<?rfc include='reference.RFC.7587.xml'?> | </author> | |||
<?rfc include='reference.RFC.7742.xml'?> | <author initials="H." surname="Schulzrinne" fullname="H. Schulzrinne | |||
<?rfc include='reference.RFC.7850.xml'?> | "> | |||
<?rfc include='reference.RFC.7874.xml'?> | <organization showOnFrontPage="true"/> | |||
<?rfc include='reference.RFC.8108.xml'?> | </author> | |||
<?rfc include='reference.RFC.8122.xml'?> | <author initials="G." surname="Camarillo" fullname="G. Camarillo"> | |||
<?rfc include='reference.RFC.8445.xml'?> | <organization showOnFrontPage="true"/> | |||
<?rfc include='reference.RFC.3711.xml'?> | </author> | |||
</references> | <author initials="A." surname="Johnston" fullname="A. Johnston"> | |||
<references title="Informative References"> | <organization showOnFrontPage="true"/> | |||
<?rfc include='reference.I-D.ietf-rtcweb-ip-handling'?> | </author> | |||
<?rfc include='reference.I-D.ietf-mmusic-trickle-ice-sip'?> | <author initials="J." surname="Peterson" fullname="J. Peterson"> | |||
<?rfc include='reference.I-D.ietf-rtcweb-sdp'?> | <organization showOnFrontPage="true"/> | |||
<?rfc include='reference.RFC.3389.xml'?> | </author> | |||
<?rfc include='reference.RFC.3960.xml'?> | <author initials="R." surname="Sparks" fullname="R. Sparks"> | |||
<?rfc include='reference.RFC.4568.xml'?> | <organization showOnFrontPage="true"/> | |||
<?rfc include='reference.RFC.4588.xml'?> | </author> | |||
<?rfc include='reference.RFC.4733.xml'?> | <author initials="M." surname="Handley" fullname="M. Handley"> | |||
<?rfc include='reference.RFC.5245.xml'?> | <organization showOnFrontPage="true"/> | |||
<?rfc include='reference.RFC.5506.xml'?> | </author> | |||
<?rfc include='reference.RFC.5576.xml'?> | <author initials="E." surname="Schooler" fullname="E. Schooler"> | |||
<?rfc include='reference.RFC.5763.xml'?> | <organization showOnFrontPage="true"/> | |||
<?rfc include='reference.RFC.5764.xml'?> | </author> | |||
<?rfc include='reference.RFC.6464.xml'?> | <date year="2002" month="June"/> | |||
<?rfc include='reference.RFC.6544.xml'?> | <abstract> | |||
<?rfc include='reference.RFC.3556.xml'?> | <t indent="0">This document describes Session Initiation Protocol | |||
<reference anchor="W3C.webrtc" | (SIP), an application-layer control (signaling) protocol for creating, modifying | |||
target="https://www.w3.org/TR/2017/WD-webrtc-20170515/"> | , and terminating sessions with one or more participants. These sessions includ | |||
<front> | e Internet telephone calls, multimedia distribution, and multimedia conferences. | |||
<title>WebRTC 1.0: Real-time Communication Between | [STANDARDS-TRACK]</t> | |||
Browsers</title> | </abstract> | |||
<author fullname="Adam Bergkvist" initials="A." | </front> | |||
surname="Bergkvist"> | <seriesInfo name="RFC" value="3261"/> | |||
<organization>Ericsson</organization> | <seriesInfo name="DOI" value="10.17487/RFC3261"/> | |||
</author> | </reference> | |||
<author fullname="Daniel C. Burnett" initials="D." | <reference anchor="RFC3264" target="https://www.rfc-editor.org/info/rfc3 | |||
surname="Burnett"> | 264" quoteTitle="true" derivedAnchor="RFC3264"> | |||
<organization></organization> | <front> | |||
</author> | <title>An Offer/Answer Model with Session Description Protocol (SDP) | |||
<author fullname="Cullen Jennings" initials="C." | </title> | |||
surname="Jennings"> | <author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | |||
<organization>Cisco</organization> | <organization showOnFrontPage="true"/> | |||
</author> | </author> | |||
<author fullname="Anant Narayanan" initials="A." | <author initials="H." surname="Schulzrinne" fullname="H. Schulzrinne | |||
surname="Narayanan"> | "> | |||
<organization>Mozilla</organization> | <organization showOnFrontPage="true"/> | |||
</author> | </author> | |||
<author fullname="Bernard Aboba" initials="B." | <date year="2002" month="June"/> | |||
surname="Aboba"> | <abstract> | |||
<organization>Microsoft Corporation</organization> | <t indent="0">This document defines a mechanism by which two entit | |||
</author> | ies can make use of the Session Description Protocol (SDP) to arrive at a common | |||
<author fullname="Taylor Brandstetter" initials="T." | view of a multimedia session between them. In the model, one participant offer | |||
surname="Brandstetter"> | s the other a description of the desired session from their perspective, and the | |||
<organization>Google</organization> | other participant answers with the desired session from their perspective. Thi | |||
</author> | s offer/answer model is most useful in unicast sessions where information from b | |||
<date day="15" month="May" year="2017" /> | oth participants is needed for the complete view of the session. The offer/answ | |||
</front> | er model is used by protocols like the Session Initiation Protocol (SIP). [STAN | |||
<seriesInfo name="World Wide Web Consortium WD" | DARDS-TRACK]</t> | |||
value="WD-webrtc-20170515" /> | </abstract> | |||
<format target="https://www.w3.org/TR/2017/WD-webrtc-20170515/" | </front> | |||
type="HTML" /> | <seriesInfo name="RFC" value="3264"/> | |||
</reference> | <seriesInfo name="DOI" value="10.17487/RFC3264"/> | |||
<reference anchor="TS26.114" | </reference> | |||
target="http://www.3gpp.org/DynaReport/26114.htm"> | <reference anchor="RFC3552" target="https://www.rfc-editor.org/info/rfc3 | |||
<front> | 552" quoteTitle="true" derivedAnchor="RFC3552"> | |||
<title>3rd Generation Partnership Project; Technical | <front> | |||
Specification Group Services and System Aspects; IP | <title>Guidelines for Writing RFC Text on Security Considerations</t | |||
Multimedia Subsystem (IMS); Multimedia Telephony; Media | itle> | |||
handling and interaction (Release 12)</title> | <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | |||
<author> | <organization showOnFrontPage="true"/> | |||
<organization>3GPP TS 26.114 V12.8.0</organization> | </author> | |||
</author> | <author initials="B." surname="Korver" fullname="B. Korver"> | |||
<date year="2014" month="December" /> | <organization showOnFrontPage="true"/> | |||
</front> | </author> | |||
</reference> | <date year="2003" month="July"/> | |||
<abstract> | ||||
<t indent="0">All RFCs are required to have a Security Considerati | ||||
ons section. Historically, such sections have been relatively weak. This docume | ||||
nt provides guidelines to RFC authors on how to write a good Security Considerat | ||||
ions section. This document specifies an Internet Best Current Practices for t | ||||
he Internet Community, and requests discussion and suggestions for improvements. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="72"/> | ||||
<seriesInfo name="RFC" value="3552"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3552"/> | ||||
</reference> | ||||
<reference anchor="RFC3605" target="https://www.rfc-editor.org/info/rfc3 | ||||
605" quoteTitle="true" derivedAnchor="RFC3605"> | ||||
<front> | ||||
<title>Real Time Control Protocol (RTCP) attribute in Session Descri | ||||
ption Protocol (SDP)</title> | ||||
<author initials="C." surname="Huitema" fullname="C. Huitema"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2003" month="October"/> | ||||
<abstract> | ||||
<t indent="0">The Session Description Protocol (SDP) is used to de | ||||
scribe the parameters of media streams used in multimedia sessions. When a sess | ||||
ion requires multiple ports, SDP assumes that these ports have consecutive numbe | ||||
rs. However, when the session crosses a network address translation device that | ||||
also uses port mapping, the ordering of ports can be destroyed by the translati | ||||
on. To handle this, we propose an extension attribute to SDP.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3605"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3605"/> | ||||
</reference> | ||||
<reference anchor="RFC3711" target="https://www.rfc-editor.org/info/rfc3 | ||||
711" quoteTitle="true" derivedAnchor="RFC3711"> | ||||
<front> | ||||
<title>The Secure Real-time Transport Protocol (SRTP)</title> | ||||
<author initials="M." surname="Baugher" fullname="M. Baugher"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="D." surname="McGrew" fullname="D. McGrew"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Naslund" fullname="M. Naslund"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E." surname="Carrara" fullname="E. Carrara"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="K." surname="Norrman" fullname="K. Norrman"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2004" month="March"/> | ||||
<abstract> | ||||
<t indent="0">This document describes the Secure Real-time Transpo | ||||
rt Protocol (SRTP), a profile of the Real-time Transport Protocol (RTP), which c | ||||
an provide confidentiality, message authentication, and replay protection to the | ||||
RTP traffic and to the control traffic for RTP, the Real-time Transport Control | ||||
Protocol (RTCP). [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3711"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3711"/> | ||||
</reference> | ||||
<reference anchor="RFC3890" target="https://www.rfc-editor.org/info/rfc3 | ||||
890" quoteTitle="true" derivedAnchor="RFC3890"> | ||||
<front> | ||||
<title>A Transport Independent Bandwidth Modifier for the Session De | ||||
scription Protocol (SDP)</title> | ||||
<author initials="M." surname="Westerlund" fullname="M. Westerlund"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2004" month="September"/> | ||||
<abstract> | ||||
<t indent="0">This document defines a Session Description Protocol | ||||
(SDP) Transport Independent Application Specific Maximum (TIAS) bandwidth modif | ||||
ier that does not include transport overhead; instead an additional packet rate | ||||
attribute is defined. The transport independent bit-rate value together with th | ||||
e maximum packet rate can then be used to calculate the real bit-rate over the t | ||||
ransport actually used. </t> | ||||
<t indent="0"> The existing SDP bandwidth modifiers and their valu | ||||
es include the bandwidth needed for the transport and IP layers. When using SDP | ||||
with protocols like the Session Announcement Protocol (SAP), the Session Initia | ||||
tion Protocol (SIP), and the Real-Time Streaming Protocol (RTSP), and when the i | ||||
nvolved hosts has different transport overhead, for example due to different IP | ||||
versions, the interpretation of what lower layer bandwidths are included is not | ||||
clear. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3890"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3890"/> | ||||
</reference> | ||||
<reference anchor="RFC4145" target="https://www.rfc-editor.org/info/rfc4 | ||||
145" quoteTitle="true" derivedAnchor="RFC4145"> | ||||
<front> | ||||
<title>TCP-Based Media Transport in the Session Description Protocol | ||||
(SDP)</title> | ||||
<author initials="D." surname="Yon" fullname="D. Yon"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="G." surname="Camarillo" fullname="G. Camarillo"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2005" month="September"/> | ||||
<abstract> | ||||
<t indent="0">This document describes how to express media transpo | ||||
rt over TCP using the Session Description Protocol (SDP). It defines the SDP 'T | ||||
CP' protocol identifier, the SDP 'setup' attribute, which describes the connecti | ||||
on setup procedure, and the SDP 'connection' attribute, which handles connection | ||||
reestablishment. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4145"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4145"/> | ||||
</reference> | ||||
<reference anchor="RFC4566" target="https://www.rfc-editor.org/info/rfc4 | ||||
566" quoteTitle="true" derivedAnchor="RFC4566"> | ||||
<front> | ||||
<title>SDP: Session Description Protocol</title> | ||||
<author initials="M." surname="Handley" fullname="M. Handley"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="V." surname="Jacobson" fullname="V. Jacobson"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Perkins" fullname="C. Perkins"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2006" month="July"/> | ||||
<abstract> | ||||
<t indent="0">This memo defines the Session Description Protocol ( | ||||
SDP). SDP is intended for describing multimedia sessions for the purposes of se | ||||
ssion announcement, session invitation, and other forms of multimedia session in | ||||
itiation. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4566"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4566"/> | ||||
</reference> | ||||
<reference anchor="RFC4585" target="https://www.rfc-editor.org/info/rfc4 | ||||
585" quoteTitle="true" derivedAnchor="RFC4585"> | ||||
<front> | ||||
<title>Extended RTP Profile for Real-time Transport Control Protocol | ||||
(RTCP)-Based Feedback (RTP/AVPF)</title> | ||||
<author initials="J." surname="Ott" fullname="J. Ott"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Wenger" fullname="S. Wenger"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="N." surname="Sato" fullname="N. Sato"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Burmeister" fullname="C. Burmeister"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="J." surname="Rey" fullname="J. Rey"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2006" month="July"/> | ||||
<abstract> | ||||
<t indent="0">Real-time media streams that use RTP are, to some de | ||||
gree, resilient against packet losses. Receivers may use the base mechanisms of | ||||
the Real-time Transport Control Protocol (RTCP) to report packet reception stat | ||||
istics and thus allow a sender to adapt its transmission behavior in the mid-ter | ||||
m. This is the sole means for feedback and feedback-based error repair (besides | ||||
a few codec-specific mechanisms). This document defines an extension to the Au | ||||
dio-visual Profile (AVP) that enables receivers to provide, statistically, more | ||||
immediate feedback to the senders and thus allows for short-term adaptation and | ||||
efficient feedback-based repair mechanisms to be implemented. This early feedba | ||||
ck profile (AVPF) maintains the AVP bandwidth constraints for RTCP and preserves | ||||
scalability to large groups. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4585"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4585"/> | ||||
</reference> | ||||
<reference anchor="RFC5124" target="https://www.rfc-editor.org/info/rfc5 | ||||
124" quoteTitle="true" derivedAnchor="RFC5124"> | ||||
<front> | ||||
<title>Extended Secure RTP Profile for Real-time Transport Control P | ||||
rotocol (RTCP)-Based Feedback (RTP/SAVPF)</title> | ||||
<author initials="J." surname="Ott" fullname="J. Ott"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E." surname="Carrara" fullname="E. Carrara"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2008" month="February"/> | ||||
<abstract> | ||||
<t indent="0">An RTP profile (SAVP) for secure real-time communica | ||||
tions and another profile (AVPF) to provide timely feedback from the receivers t | ||||
o a sender are defined in RFC 3711 and RFC 4585, respectively. This memo specif | ||||
ies the combination of both profiles to enable secure RTP communications with fe | ||||
edback. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5124"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5124"/> | ||||
</reference> | ||||
<reference anchor="RFC5285" target="https://www.rfc-editor.org/info/rfc5 | ||||
285" quoteTitle="true" derivedAnchor="RFC5285"> | ||||
<front> | ||||
<title>A General Mechanism for RTP Header Extensions</title> | ||||
<author initials="D." surname="Singer" fullname="D. Singer"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="H." surname="Desineni" fullname="H. Desineni"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2008" month="July"/> | ||||
<abstract> | ||||
<t indent="0">This document provides a general mechanism to use th | ||||
e header extension feature of RTP (the Real-Time Transport Protocol). It provid | ||||
es the option to use a small number of small extensions in each RTP packet, wher | ||||
e the universe of possible extensions is large and registration is de-centralize | ||||
d. The actual extensions in use in a session are signaled in the setup informat | ||||
ion for that session. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5285"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5285"/> | ||||
</reference> | ||||
<reference anchor="RFC5761" target="https://www.rfc-editor.org/info/rfc5 | ||||
761" quoteTitle="true" derivedAnchor="RFC5761"> | ||||
<front> | ||||
<title>Multiplexing RTP Data and Control Packets on a Single Port</t | ||||
itle> | ||||
<author initials="C." surname="Perkins" fullname="C. Perkins"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Westerlund" fullname="M. Westerlund"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2010" month="April"/> | ||||
<abstract> | ||||
<t indent="0">This memo discusses issues that arise when multiplex | ||||
ing RTP data packets and RTP Control Protocol (RTCP) packets on a single UDP por | ||||
t. It updates RFC 3550 and RFC 3551 to describe when such multiplexing is and is | ||||
not appropriate, and it explains how the Session Description Protocol (SDP) can | ||||
be used to signal multiplexed sessions. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5761"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5761"/> | ||||
</reference> | ||||
<reference anchor="RFC5888" target="https://www.rfc-editor.org/info/rfc5 | ||||
888" quoteTitle="true" derivedAnchor="RFC5888"> | ||||
<front> | ||||
<title>The Session Description Protocol (SDP) Grouping Framework</ti | ||||
tle> | ||||
<author initials="G." surname="Camarillo" fullname="G. Camarillo"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="H." surname="Schulzrinne" fullname="H. Schulzrinne | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2010" month="June"/> | ||||
<abstract> | ||||
<t indent="0">In this specification, we define a framework to grou | ||||
p "m" lines in the Session Description Protocol (SDP) for different purposes. T | ||||
his framework uses the "group" and "mid" SDP attributes, both of which are defin | ||||
ed in this specification. Additionally, we specify how to use the framework for | ||||
two different purposes: for lip synchronization and for receiving a media flow | ||||
consisting of several media streams on different transport addresses. This docu | ||||
ment obsoletes RFC 3388. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5888"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5888"/> | ||||
</reference> | ||||
<reference anchor="RFC6236" target="https://www.rfc-editor.org/info/rfc6 | ||||
236" quoteTitle="true" derivedAnchor="RFC6236"> | ||||
<front> | ||||
<title>Negotiation of Generic Image Attributes in the Session Descri | ||||
ption Protocol (SDP)</title> | ||||
<author initials="I." surname="Johansson" fullname="I. Johansson"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="K." surname="Jung" fullname="K. Jung"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2011" month="May"/> | ||||
<abstract> | ||||
<t indent="0">This document proposes a new generic session setup a | ||||
ttribute to make it possible to negotiate different image attributes such as ima | ||||
ge size. A possible use case is to make it possible for a \%low-end \%hand- hel | ||||
d terminal to display video without the need to rescale the image, something tha | ||||
t may consume large amounts of memory and processing power. The document also h | ||||
elps to maintain an optimal bitrate for video as only the image size that is des | ||||
ired by the receiver is transmitted. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6236"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6236"/> | ||||
</reference> | ||||
<reference anchor="RFC6347" target="https://www.rfc-editor.org/info/rfc6 | ||||
347" quoteTitle="true" derivedAnchor="RFC6347"> | ||||
<front> | ||||
<title>Datagram Transport Layer Security Version 1.2</title> | ||||
<author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="N." surname="Modadugu" fullname="N. Modadugu"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2012" month="January"/> | ||||
<abstract> | ||||
<t indent="0">This document specifies version 1.2 of the Datagram | ||||
Transport Layer Security (DTLS) protocol. The DTLS protocol provides communicat | ||||
ions privacy for datagram protocols. The protocol allows client/server applicat | ||||
ions to communicate in a way that is designed to prevent eavesdropping, tamperin | ||||
g, or message forgery. The DTLS protocol is based on the Transport Layer Securi | ||||
ty (TLS) protocol and provides equivalent security guarantees. Datagram semanti | ||||
cs of the underlying transport are preserved by the DTLS protocol. This documen | ||||
t updates DTLS 1.0 to work with TLS version 1.2. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6347"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6347"/> | ||||
</reference> | ||||
<reference anchor="RFC6716" target="https://www.rfc-editor.org/info/rfc6 | ||||
716" quoteTitle="true" derivedAnchor="RFC6716"> | ||||
<front> | ||||
<title>Definition of the Opus Audio Codec</title> | ||||
<author initials="JM." surname="Valin" fullname="JM. Valin"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="K." surname="Vos" fullname="K. Vos"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="T." surname="Terriberry" fullname="T. Terriberry"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2012" month="September"/> | ||||
<abstract> | ||||
<t indent="0">This document defines the Opus interactive speech an | ||||
d audio codec. Opus is designed to handle a wide range of interactive audio appl | ||||
ications, including Voice over IP, videoconferencing, in-game chat, and even liv | ||||
e, distributed music performances. It scales from low bitrate narrowband speech | ||||
at 6 kbit/s to very high quality stereo music at 510 kbit/s. Opus uses both Li | ||||
near Prediction (LP) and the Modified Discrete Cosine Transform (MDCT) to achiev | ||||
e good compression of both speech and music. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6716"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6716"/> | ||||
</reference> | ||||
<reference anchor="RFC6904" target="https://www.rfc-editor.org/info/rfc6 | ||||
904" quoteTitle="true" derivedAnchor="RFC6904"> | ||||
<front> | ||||
<title>Encryption of Header Extensions in the Secure Real-time Trans | ||||
port Protocol (SRTP)</title> | ||||
<author initials="J." surname="Lennox" fullname="J. Lennox"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2013" month="April"/> | ||||
<abstract> | ||||
<t indent="0">The Secure Real-time Transport Protocol (SRTP) provi | ||||
des authentication, but not encryption, of the headers of Real-time Transport Pr | ||||
otocol (RTP) packets. However, RTP header extensions may carry sensitive inform | ||||
ation for which participants in multimedia sessions want confidentiality. This | ||||
document provides a mechanism, extending the mechanisms of SRTP, to selectively | ||||
encrypt RTP header extensions in SRTP.</t> | ||||
<t indent="0">This document updates RFC 3711, the Secure Real-time | ||||
Transport Protocol specification, to require that all future SRTP encryption tr | ||||
ansforms specify how RTP header extensions are to be encrypted.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6904"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6904"/> | ||||
</reference> | ||||
<reference anchor="RFC7160" target="https://www.rfc-editor.org/info/rfc7 | ||||
160" quoteTitle="true" derivedAnchor="RFC7160"> | ||||
<front> | ||||
<title>Support for Multiple Clock Rates in an RTP Session</title> | ||||
<author initials="M." surname="Petit-Huguenin" fullname="M. Petit-Hu | ||||
guenin"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="G." surname="Zorn" fullname="G. Zorn" role="editor | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2014" month="April"/> | ||||
<abstract> | ||||
<t indent="0">This document clarifies the RTP specification regard | ||||
ing the use of different clock rates in an RTP session. It also provides guidan | ||||
ce on how legacy RTP implementations that use multiple clock rates can interoper | ||||
ate with RTP implementations that use the algorithm described in this document. | ||||
It updates RFC 3550.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7160"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7160"/> | ||||
</reference> | ||||
<reference anchor="RFC7587" target="https://www.rfc-editor.org/info/rfc7 | ||||
587" quoteTitle="true" derivedAnchor="RFC7587"> | ||||
<front> | ||||
<title>RTP Payload Format for the Opus Speech and Audio Codec</title | ||||
> | ||||
<author initials="J." surname="Spittka" fullname="J. Spittka"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="K." surname="Vos" fullname="K. Vos"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="JM." surname="Valin" fullname="JM. Valin"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2015" month="June"/> | ||||
<abstract> | ||||
<t indent="0">This document defines the Real-time Transport Protoc | ||||
ol (RTP) payload format for packetization of Opus-encoded speech and audio data | ||||
necessary to integrate the codec in the most compatible way. It also provides a | ||||
n applicability statement for the use of Opus over RTP. Further, it describes me | ||||
dia type registrations for the RTP payload format.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7587"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7587"/> | ||||
</reference> | ||||
<reference anchor="RFC7742" target="https://www.rfc-editor.org/info/rfc7 | ||||
742" quoteTitle="true" derivedAnchor="RFC7742"> | ||||
<front> | ||||
<title>WebRTC Video Processing and Codec Requirements</title> | ||||
<author initials="A.B." surname="Roach" fullname="A.B. Roach"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2016" month="March"/> | ||||
<abstract> | ||||
<t indent="0">This specification provides the requirements and con | ||||
siderations for WebRTC applications to send and receive video across a network. | ||||
It specifies the video processing that is required as well as video codecs and | ||||
their parameters.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7742"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7742"/> | ||||
</reference> | ||||
<reference anchor="RFC7850" target="https://www.rfc-editor.org/info/rfc7 | ||||
850" quoteTitle="true" derivedAnchor="RFC7850"> | ||||
<front> | ||||
<title>Registering Values of the SDP 'proto' Field for Transporting | ||||
RTP Media over TCP under Various RTP Profiles</title> | ||||
<author initials="S." surname="Nandakumar" fullname="S. Nandakumar"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2016" month="April"/> | ||||
<abstract> | ||||
<t indent="0">The Real-time Transport Protocol (RTP) specification | ||||
establishes a registry of profile names for use by higher-level control protoco | ||||
ls, such as the Session Description Protocol (SDP), to refer to the transport me | ||||
thods. This specification describes the following new SDP transport protocol id | ||||
entifiers for transporting RTP Media over TCP: 'TCP/RTP/AVPF', 'TCP/RTP/SAVP', ' | ||||
TCP/RTP/SAVPF', 'TCP/DTLS/RTP/SAVP', 'TCP/DTLS/RTP/SAVPF', 'TCP/TLS/RTP/AVP', an | ||||
d 'TCP/TLS/RTP/AVPF'.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7850"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7850"/> | ||||
</reference> | ||||
<reference anchor="RFC7874" target="https://www.rfc-editor.org/info/rfc7 | ||||
874" quoteTitle="true" derivedAnchor="RFC7874"> | ||||
<front> | ||||
<title>WebRTC Audio Codec and Processing Requirements</title> | ||||
<author initials="JM." surname="Valin" fullname="JM. Valin"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Bran" fullname="C. Bran"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2016" month="May"/> | ||||
<abstract> | ||||
<t indent="0">This document outlines the audio codec and processin | ||||
g requirements for WebRTC endpoints.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7874"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7874"/> | ||||
</reference> | ||||
<reference anchor="RFC8108" target="https://www.rfc-editor.org/info/rfc8 | ||||
108" quoteTitle="true" derivedAnchor="RFC8108"> | ||||
<front> | ||||
<title>Sending Multiple RTP Streams in a Single RTP Session</title> | ||||
<author initials="J." surname="Lennox" fullname="J. Lennox"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Westerlund" fullname="M. Westerlund"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="Q." surname="Wu" fullname="Q. Wu"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Perkins" fullname="C. Perkins"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2017" month="March"/> | ||||
<abstract> | ||||
<t indent="0">This memo expands and clarifies the behavior of Real | ||||
-time Transport Protocol (RTP) endpoints that use multiple synchronization sourc | ||||
es (SSRCs). This occurs, for example, when an endpoint sends multiple RTP strea | ||||
ms in a single RTP session. This memo updates RFC 3550 with regard to handling | ||||
multiple SSRCs per endpoint in RTP sessions, with a particular focus on RTP Cont | ||||
rol Protocol (RTCP) behavior. It also updates RFC 4585 to change and clarify th | ||||
e calculation of the timeout of SSRCs and the inclusion of feedback messages.</t | ||||
> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8108"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8108"/> | ||||
</reference> | ||||
<reference anchor="RFC8122" target="https://www.rfc-editor.org/info/rfc8 | ||||
122" quoteTitle="true" derivedAnchor="RFC8122"> | ||||
<front> | ||||
<title>Connection-Oriented Media Transport over the Transport Layer | ||||
Security (TLS) Protocol in the Session Description Protocol (SDP)</title> | ||||
<author initials="J." surname="Lennox" fullname="J. Lennox"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Holmberg" fullname="C. Holmberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2017" month="March"/> | ||||
<abstract> | ||||
<t indent="0">This document specifies how to establish secure conn | ||||
ection-oriented media transport sessions over the Transport Layer Security (TLS) | ||||
protocol using the Session Description Protocol (SDP). It defines the SDP prot | ||||
ocol identifier, 'TCP/TLS'. It also defines the syntax and semantics for an SDP | ||||
'fingerprint' attribute that identifies the certificate that will be presented | ||||
for the TLS session. This mechanism allows media transport over TLS connections | ||||
to be established securely, so long as the integrity of session descriptions is | ||||
assured.</t> | ||||
<t indent="0">This document obsoletes RFC 4572 by clarifying the u | ||||
sage of multiple fingerprints.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8122"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8122"/> | ||||
</reference> | ||||
<reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8 | ||||
174" quoteTitle="true" derivedAnchor="RFC8174"> | ||||
<front> | ||||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | ||||
tle> | ||||
<author initials="B." surname="Leiba" fullname="B. Leiba"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2017" month="May"/> | ||||
<abstract> | ||||
<t indent="0">RFC 2119 specifies common key words that may be used | ||||
in protocol specifications. This document aims to reduce the ambiguity by cla | ||||
rifying that only UPPERCASE usage of the key words have the defined special mea | ||||
nings.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="8174"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
</reference> | ||||
<reference anchor="RFC8445" target="https://www.rfc-editor.org/info/rfc8 | ||||
445" quoteTitle="true" derivedAnchor="RFC8445"> | ||||
<front> | ||||
<title>Interactive Connectivity Establishment (ICE): A Protocol for | ||||
Network Address Translator (NAT) Traversal</title> | ||||
<author initials="A." surname="Keranen" fullname="A. Keranen"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Holmberg" fullname="C. Holmberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2018" month="July"/> | ||||
<abstract> | ||||
<t indent="0">This document describes a protocol for Network Addre | ||||
ss Translator (NAT) traversal for UDP-based communication. This protocol is cal | ||||
led Interactive Connectivity Establishment (ICE). ICE makes use of the Session | ||||
Traversal Utilities for NAT (STUN) protocol and its extension, Traversal Using R | ||||
elay NAT (TURN).</t> | ||||
<t indent="0">This document obsoletes RFC 5245.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8445"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8445"/> | ||||
</reference> | ||||
<reference anchor="RFC8826" target="https://www.rfc-editor.org/info/rfc8 | ||||
826" quoteTitle="true" derivedAnchor="RFC8826"> | ||||
<front> | ||||
<title>Security Considerations for WebRTC</title> | ||||
<author initials="E." surname="Rescorla" fullname="Eric Rescorla"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8826"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8826"/> | ||||
</reference> | ||||
<reference anchor="RFC8827" target="https://www.rfc-editor.org/info/rfc8 | ||||
827" quoteTitle="true" derivedAnchor="RFC8827"> | ||||
<front> | ||||
<title>WebRTC Security Architecture</title> | ||||
<author initials="E." surname="Rescorla" fullname="Eric Rescorla"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8827"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8827"/> | ||||
</reference> | ||||
<reference anchor="RFC8830" target="https://www.rfc-editor.org/info/rfc8 | ||||
830" quoteTitle="true" derivedAnchor="RFC8830"> | ||||
<front> | ||||
<title>WebRTC MediaStream Identification in the Session Description | ||||
Protocol</title> | ||||
<author initials="H" surname="Alvestrand" fullname="Harald Alvestran | ||||
d"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8830"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8830"/> | ||||
</reference> | ||||
<reference anchor="RFC8834" target="https://www.rfc-editor.org/info/rfc8 | ||||
834" quoteTitle="true" derivedAnchor="RFC8834"> | ||||
<front> | ||||
<title>Media Transport and Use of RTP in WebRTC</title> | ||||
<author initials="C." surname="Perkins" fullname="Colin Perkins"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Westerlund" fullname="Magnus Westerlu | ||||
nd"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="J." surname="Ott" fullname="Jörg Ott"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8834"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8834"/> | ||||
</reference> | ||||
<reference anchor="RFC8838" target="https://www.rfc-editor.org/info/rfc8 | ||||
838" quoteTitle="true" derivedAnchor="RFC8838"> | ||||
<front> | ||||
<title>Trickle ICE: Incremental Provisioning of Candidates for the I | ||||
nteractive Connectivity Establishment (ICE) Protocol</title> | ||||
<author initials="E" surname="Ivov" fullname="Emil Ivov"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="J" surname="Uberti" fullname="Justin Uberti"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="P" surname="Saint-Andre" fullname="Peter Saint-And | ||||
re"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8838"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8838"/> | ||||
</reference> | ||||
<reference anchor="RFC8839" target="https://www.rfc-editor.org/info/rfc8 | ||||
839" quoteTitle="true" derivedAnchor="RFC8839"> | ||||
<front> | ||||
<title>Session Description Protocol (SDP) Offer/Answer Procedures fo | ||||
r Interactive Connectivity Establishment (ICE)</title> | ||||
<author initials="M" surname="Petit-Huguenin" fullname="Marc Petit-H | ||||
uguenin"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C" surname="Holmberg" fullname="Christer Holmberg" | ||||
> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="A" surname="Keränen" fullname="Ari Keränen"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R" surname="Shpount" fullname="Roman Shpount"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8839"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8839"/> | ||||
</reference> | ||||
<reference anchor="RFC8840" target="https://www.rfc-editor.org/info/rfc8 | ||||
840" quoteTitle="true" derivedAnchor="RFC8840"> | ||||
<front> | ||||
<title>A Session Initiation Protocol (SIP) Usage for Incremental Pro | ||||
visioning of Candidates for the Interactive Connectivity Establishment (Trickle | ||||
ICE)</title> | ||||
<author initials="E" surname="Ivov" fullname="Emil Ivov"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="T" surname="Stach" fullname="Thomas Stach"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E" surname="Marocco" fullname="Enrico Marocco"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C" surname="Holmberg" fullname="Christer Holmberg" | ||||
> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8840"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8840"/> | ||||
</reference> | ||||
<reference anchor="RFC8841" target="https://www.rfc-editor.org/info/rfc8 | ||||
841" quoteTitle="true" derivedAnchor="RFC8841"> | ||||
<front> | ||||
<title>Session Description Protocol (SDP) Offer/Answer Procedures fo | ||||
r Stream Control Transmission Protocol (SCTP) over Datagram Transport Layer Secu | ||||
rity (DTLS) Transport</title> | ||||
<author initials="C." surname="Holmberg" fullname="Christer Holmberg | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R." surname="Shpount" fullname="Roman Shpount"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Loreto" fullname="Salvatore Loreto"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="G." surname="Camarillo" fullname="Gonzalo Camarill | ||||
o"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8841"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8841"/> | ||||
</reference> | ||||
<reference anchor="RFC8842" target="https://www.rfc-editor.org/info/rfc8 | ||||
842" quoteTitle="true" derivedAnchor="RFC8842"> | ||||
<front> | ||||
<title>Session Description Protocol (SDP) Offer/Answer Consideration | ||||
s for Datagram Transport Layer Security (DTLS) and Transport Layer Security (TLS | ||||
)</title> | ||||
<author initials="C." surname="Holmberg" fullname="Christer Holmberg | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R." surname="Shpount" fullname="Roman Shpount"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8842"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8842"/> | ||||
</reference> | ||||
<reference anchor="RFC8843" target="https://www.rfc-editor.org/info/rfc8 | ||||
843" quoteTitle="true" derivedAnchor="RFC8843"> | ||||
<front> | ||||
<title>Negotiating Media Multiplexing Using the Session Description | ||||
Protocol (SDP)</title> | ||||
<author initials="C" surname="Holmberg" fullname="Christer Holmberg" | ||||
> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="H" surname="Alvestrand" fullname="Harald Alvestran | ||||
d"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C" surname="Jennings" fullname="Cullen Jennings"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8843"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8843"/> | ||||
</reference> | ||||
<reference anchor="RFC8851" target="https://www.rfc-editor.org/info/rfc8 | ||||
851" quoteTitle="true" derivedAnchor="RFC8851"> | ||||
<front> | ||||
<title>RTP Payload Format Restrictions</title> | ||||
<author initials="A.B." surname="Roach" fullname="Adam Roach" role=" | ||||
editor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8851"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8851"/> | ||||
</reference> | ||||
<reference anchor="RFC8852" target="https://www.rfc-editor.org/info/rfc8 | ||||
852" quoteTitle="true" derivedAnchor="RFC8852"> | ||||
<front> | ||||
<title>RTP Stream Identifier Source Description (SDES)</title> | ||||
<author initials="A.B." surname="Roach" fullname="Adam Roach"/> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar | ||||
"/> | ||||
<author initials="P" surname="Thatcher" fullname="Peter Thatcher"/> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8852"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8852"/> | ||||
</reference> | ||||
<reference anchor="RFC8853" target="https://www.rfc-editor.org/info/rfc8 | ||||
853" quoteTitle="true" derivedAnchor="RFC8853"> | ||||
<front> | ||||
<title>Using Simulcast in Session Description Protocol (SDP) and RTP | ||||
Sessions</title> | ||||
<author initials="B" surname="Burman" fullname="Bo Burman"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M" surname="Westerlund" fullname="Magnus Westerlun | ||||
d"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M" surname="Zanaty" fullname="Mo Zanaty"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8853"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8853"/> | ||||
</reference> | ||||
<reference anchor="RFC8854" target="https://www.rfc-editor.org/info/rfc8 | ||||
854" quoteTitle="true" derivedAnchor="RFC8854"> | ||||
<front> | ||||
<title>WebRTC Forward Error Correction Requirements</title> | ||||
<author initials="J." surname="Uberti" fullname="Justin Uberti"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8854"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8854"/> | ||||
</reference> | ||||
<reference anchor="RFC8858" target="https://www.rfc-editor.org/info/rfc8 | ||||
858" quoteTitle="true" derivedAnchor="RFC8858"> | ||||
<front> | ||||
<title>Indicating Exclusive Support of RTP and RTP Control Protocol | ||||
(RTCP) Multiplexing Using the Session Description Protocol (SDP)</title> | ||||
<author initials="C." surname="Holmberg" fullname="Christer Holmberg | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8858"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8858"/> | ||||
</reference> | ||||
<reference anchor="RFC8859" target="https://www.rfc-editor.org/info/rfc8 | ||||
859" quoteTitle="true" derivedAnchor="RFC8859"> | ||||
<front> | ||||
<title>A Framework for Session Description Protocol (SDP) Attributes | ||||
When Multiplexing</title> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8859"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8859"/> | ||||
</reference> | ||||
</references> | ||||
<references pn="section-10.2"> | ||||
<name slugifiedName="name-informative-references">Informative References | ||||
</name> | ||||
<reference anchor="RFC3389" target="https://www.rfc-editor.org/info/rfc3 | ||||
389" quoteTitle="true" derivedAnchor="RFC3389"> | ||||
<front> | ||||
<title>Real-time Transport Protocol (RTP) Payload for Comfort Noise | ||||
(CN)</title> | ||||
<author initials="R." surname="Zopf" fullname="R. Zopf"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2002" month="September"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3389"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3389"/> | ||||
</reference> | ||||
<reference anchor="RFC3556" target="https://www.rfc-editor.org/info/rfc3 | ||||
556" quoteTitle="true" derivedAnchor="RFC3556"> | ||||
<front> | ||||
<title>Session Description Protocol (SDP) Bandwidth Modifiers for RT | ||||
P Control Protocol (RTCP) Bandwidth</title> | ||||
<author initials="S." surname="Casner" fullname="S. Casner"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2003" month="July"/> | ||||
<abstract> | ||||
<t indent="0">This document defines an extension to the Session De | ||||
scription Protocol (SDP) to specify two additional modifiers for the bandwidth a | ||||
ttribute. These modifiers may be used to specify the bandwidth allowed for RTP C | ||||
ontrol Protocol (RTCP) packets in a Real-time Transport Protocol (RTP) session. | ||||
[STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3556"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3556"/> | ||||
</reference> | ||||
<reference anchor="RFC3960" target="https://www.rfc-editor.org/info/rfc3 | ||||
960" quoteTitle="true" derivedAnchor="RFC3960"> | ||||
<front> | ||||
<title>Early Media and Ringing Tone Generation in the Session Initia | ||||
tion Protocol (SIP)</title> | ||||
<author initials="G." surname="Camarillo" fullname="G. Camarillo"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="H." surname="Schulzrinne" fullname="H. Schulzrinne | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2004" month="December"/> | ||||
<abstract> | ||||
<t indent="0">This document describes how to manage early media in | ||||
the Session Initiation Protocol (SIP) using two models: the gateway model and t | ||||
he application server model. It also describes the inputs one needs to consider | ||||
in defining local policies for ringing tone generation. This memo provides inf | ||||
ormation for the Internet community.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3960"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3960"/> | ||||
</reference> | ||||
<reference anchor="RFC4568" target="https://www.rfc-editor.org/info/rfc4 | ||||
568" quoteTitle="true" derivedAnchor="RFC4568"> | ||||
<front> | ||||
<title>Session Description Protocol (SDP) Security Descriptions for | ||||
Media Streams</title> | ||||
<author initials="F." surname="Andreasen" fullname="F. Andreasen"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Baugher" fullname="M. Baugher"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="D." surname="Wing" fullname="D. Wing"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2006" month="July"/> | ||||
<abstract> | ||||
<t indent="0">This document defines a Session Description Protocol | ||||
(SDP) cryptographic attribute for unicast media streams. The attribute describ | ||||
es a cryptographic key and other parameters that serve to configure security for | ||||
a unicast media stream in either a single message or a roundtrip exchange. The | ||||
attribute can be used with a variety of SDP media transports, and this document | ||||
defines how to use it for the Secure Real-time Transport Protocol (SRTP) unicas | ||||
t media streams. The SDP crypto attribute requires the services of a data secur | ||||
ity protocol to secure the SDP message. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4568"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4568"/> | ||||
</reference> | ||||
<reference anchor="RFC4588" target="https://www.rfc-editor.org/info/rfc4 | ||||
588" quoteTitle="true" derivedAnchor="RFC4588"> | ||||
<front> | ||||
<title>RTP Retransmission Payload Format</title> | ||||
<author initials="J." surname="Rey" fullname="J. Rey"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="D." surname="Leon" fullname="D. Leon"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="A." surname="Miyazaki" fullname="A. Miyazaki"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="V." surname="Varsa" fullname="V. Varsa"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R." surname="Hakenberg" fullname="R. Hakenberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2006" month="July"/> | ||||
<abstract> | ||||
<t indent="0">RTP retransmission is an effective packet loss recov | ||||
ery technique for real-time applications with relaxed delay bounds. This docume | ||||
nt describes an RTP payload format for performing retransmissions. Retransmitted | ||||
RTP packets are sent in a separate stream from the original RTP stream. It is | ||||
assumed that feedback from receivers to senders is available. In particular, it | ||||
is assumed that Real-time Transport Control Protocol (RTCP) feedback as defined | ||||
in the extended RTP profile for RTCP-based feedback (denoted RTP/AVPF) is avail | ||||
able in this memo. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4588"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4588"/> | ||||
</reference> | ||||
<reference anchor="RFC4733" target="https://www.rfc-editor.org/info/rfc4 | ||||
733" quoteTitle="true" derivedAnchor="RFC4733"> | ||||
<front> | ||||
<title>RTP Payload for DTMF Digits, Telephony Tones, and Telephony S | ||||
ignals</title> | ||||
<author initials="H." surname="Schulzrinne" fullname="H. Schulzrinne | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="T." surname="Taylor" fullname="T. Taylor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2006" month="December"/> | ||||
<abstract> | ||||
<t indent="0">This memo describes how to carry dual-tone multifreq | ||||
uency (DTMF) signalling, other tone signals, and telephony events in RTP packets | ||||
. It obsoletes RFC 2833.</t> | ||||
<t indent="0">This memo captures and expands upon the basic framew | ||||
ork defined in RFC 2833, but retains only the most basic event codes. It sets u | ||||
p an IANA registry to which other event code assignments may be added. Companion | ||||
documents add event codes to this registry relating to modem, fax, text telepho | ||||
ny, and channel-associated signalling events. The remainder of the event codes d | ||||
efined in RFC 2833 are conditionally reserved in case other documents revive the | ||||
ir use.</t> | ||||
<t indent="0">This document provides a number of clarifications to | ||||
the original document. However, it specifically differs from RFC 2833 by remov | ||||
ing the requirement that all compliant implementations support the DTMF events. | ||||
Instead, compliant implementations taking part in out-of-band negotiations of m | ||||
edia stream content indicate what events they support. This memo adds three new | ||||
procedures to the RFC 2833 framework: subdivision of long events into segments, | ||||
reporting of multiple events in a single packet, and the concept and reporting | ||||
of state events. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4733"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4733"/> | ||||
</reference> | ||||
<reference anchor="RFC5245" target="https://www.rfc-editor.org/info/rfc5 | ||||
245" quoteTitle="true" derivedAnchor="RFC5245"> | ||||
<front> | ||||
<title>Interactive Connectivity Establishment (ICE): A Protocol for | ||||
Network Address Translator (NAT) Traversal for Offer/Answer Protocols</title> | ||||
<author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2010" month="April"/> | ||||
<abstract> | ||||
<t indent="0">This document describes a protocol for Network Addre | ||||
ss Translator (NAT) traversal for UDP-based multimedia sessions established with | ||||
the offer/answer model. This protocol is called Interactive Connectivity Estab | ||||
lishment (ICE). ICE makes use of the Session Traversal Utilities for NAT (STUN) | ||||
protocol and its extension, Traversal Using Relay NAT (TURN). ICE can be used | ||||
by any protocol utilizing the offer/answer model, such as the Session Initiation | ||||
Protocol (SIP). [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5245"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5245"/> | ||||
</reference> | ||||
<reference anchor="RFC5506" target="https://www.rfc-editor.org/info/rfc5 | ||||
506" quoteTitle="true" derivedAnchor="RFC5506"> | ||||
<front> | ||||
<title>Support for Reduced-Size Real-Time Transport Control Protocol | ||||
(RTCP): Opportunities and Consequences</title> | ||||
<author initials="I." surname="Johansson" fullname="I. Johansson"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Westerlund" fullname="M. Westerlund"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2009" month="April"/> | ||||
<abstract> | ||||
<t indent="0">This memo discusses benefits and issues that arise w | ||||
hen allowing Real-time Transport Protocol (RTCP) packets to be transmitted with | ||||
reduced size. The size can be reduced if the rules on how to create compound pa | ||||
ckets outlined in RFC 3550 are removed or changed. Based on that analysis, this | ||||
memo defines certain changes to the rules to allow feedback messages to be sent | ||||
as Reduced-Size RTCP packets under certain conditions when using the RTP/AVPF ( | ||||
Real-time Transport Protocol / Audio-Visual Profile with Feedback) profile (RFC | ||||
4585). This document updates RFC 3550, RFC 3711, and RFC 4585. [STANDARDS-TRACK | ||||
]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5506"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5506"/> | ||||
</reference> | ||||
<reference anchor="RFC5576" target="https://www.rfc-editor.org/info/rfc5 | ||||
576" quoteTitle="true" derivedAnchor="RFC5576"> | ||||
<front> | ||||
<title>Source-Specific Media Attributes in the Session Description P | ||||
rotocol (SDP)</title> | ||||
<author initials="J." surname="Lennox" fullname="J. Lennox"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="J." surname="Ott" fullname="J. Ott"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="T." surname="Schierl" fullname="T. Schierl"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2009" month="June"/> | ||||
<abstract> | ||||
<t indent="0">The Session Description Protocol (SDP) provides mech | ||||
anisms to describe attributes of multimedia sessions and of individual media str | ||||
eams (e.g., Real-time Transport Protocol (RTP) sessions) within a multimedia ses | ||||
sion, but does not provide any mechanism to describe individual media sources wi | ||||
thin a media stream. This document defines a mechanism to describe RTP media so | ||||
urces, which are identified by their synchronization source (SSRC) identifiers, | ||||
in SDP, to associate attributes with these sources, and to express relationships | ||||
among sources. It also defines several source-level attributes that can be use | ||||
d to describe properties of media sources. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5576"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5576"/> | ||||
</reference> | ||||
<reference anchor="RFC5763" target="https://www.rfc-editor.org/info/rfc5 | ||||
763" quoteTitle="true" derivedAnchor="RFC5763"> | ||||
<front> | ||||
<title>Framework for Establishing a Secure Real-time Transport Proto | ||||
col (SRTP) Security Context Using Datagram Transport Layer Security (DTLS)</titl | ||||
e> | ||||
<author initials="J." surname="Fischl" fullname="J. Fischl"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="H." surname="Tschofenig" fullname="H. Tschofenig"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2010" month="May"/> | ||||
<abstract> | ||||
<t indent="0">This document specifies how to use the Session Initi | ||||
ation Protocol (SIP) to establish a Secure Real-time Transport Protocol (SRTP) s | ||||
ecurity context using the Datagram Transport Layer Security (DTLS) protocol. It | ||||
describes a mechanism of transporting a fingerprint attribute in the Session De | ||||
scription Protocol (SDP) that identifies the key that will be presented during t | ||||
he DTLS handshake. The key exchange travels along the media path as opposed to | ||||
the signaling path. The SIP Identity mechanism can be used to protect the integ | ||||
rity of the fingerprint attribute from modification by intermediate proxies. [S | ||||
TANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5763"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5763"/> | ||||
</reference> | ||||
<reference anchor="RFC5764" target="https://www.rfc-editor.org/info/rfc5 | ||||
764" quoteTitle="true" derivedAnchor="RFC5764"> | ||||
<front> | ||||
<title>Datagram Transport Layer Security (DTLS) Extension to Establi | ||||
sh Keys for the Secure Real-time Transport Protocol (SRTP)</title> | ||||
<author initials="D." surname="McGrew" fullname="D. McGrew"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2010" month="May"/> | ||||
<abstract> | ||||
<t indent="0">This document describes a Datagram Transport Layer S | ||||
ecurity (DTLS) extension to establish keys for Secure RTP (SRTP) and Secure RTP | ||||
Control Protocol (SRTCP) flows. DTLS keying happens on the media path, independ | ||||
ent of any out-of-band signalling channel present. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5764"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5764"/> | ||||
</reference> | ||||
<reference anchor="RFC6120" target="https://www.rfc-editor.org/info/rfc6 | ||||
120" quoteTitle="true" derivedAnchor="RFC6120"> | ||||
<front> | ||||
<title>Extensible Messaging and Presence Protocol (XMPP): Core</titl | ||||
e> | ||||
<author initials="P." surname="Saint-Andre" fullname="P. Saint-Andre | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2011" month="March"/> | ||||
<abstract> | ||||
<t indent="0">The Extensible Messaging and Presence Protocol (XMPP | ||||
) is an application profile of the Extensible Markup Language (XML) that enables | ||||
the near-real-time exchange of structured yet extensible data between any two o | ||||
r more network entities. This document defines XMPP's core protocol methods: se | ||||
tup and teardown of XML streams, channel encryption, authentication, error handl | ||||
ing, and communication primitives for messaging, network availability ("presence | ||||
"), and request-response interactions. This document obsoletes RFC 3920. [STAN | ||||
DARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6120"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6120"/> | ||||
</reference> | ||||
<reference anchor="RFC6464" target="https://www.rfc-editor.org/info/rfc6 | ||||
464" quoteTitle="true" derivedAnchor="RFC6464"> | ||||
<front> | ||||
<title>A Real-time Transport Protocol (RTP) Header Extension for Cli | ||||
ent-to-Mixer Audio Level Indication</title> | ||||
<author initials="J." surname="Lennox" fullname="J. Lennox" role="ed | ||||
itor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E." surname="Ivov" fullname="E. Ivov"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E." surname="Marocco" fullname="E. Marocco"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2011" month="December"/> | ||||
<abstract> | ||||
<t indent="0">This document defines a mechanism by which packets o | ||||
f Real-time Transport Protocol (RTP) audio streams can indicate, in an RTP heade | ||||
r extension, the audio level of the audio sample carried in the RTP packet. In | ||||
large conferences, this can reduce the load on an audio mixer or other middlebox | ||||
that wants to forward only a few of the loudest audio streams, without requirin | ||||
g it to decode and measure every stream that is received. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6464"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6464"/> | ||||
</reference> | ||||
<reference anchor="RFC8828" target="https://www.rfc-editor.org/info/rfc8 | ||||
828" quoteTitle="true" derivedAnchor="RFC8828"> | ||||
<front> | ||||
<title>WebRTC IP Address Handling Requirements</title> | ||||
<author initials="J" surname="Uberti" fullname="Justin Uberti"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="G" surname="Shieh" fullname="Guo-wei Shieh"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8828"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8828"/> | ||||
</reference> | ||||
<reference anchor="I-D.ietf-rtcweb-sdp" quoteTitle="true" target="https: | ||||
//tools.ietf.org/html/draft-ietf-rtcweb-sdp-14" derivedAnchor="SDP4WebRTC"> | ||||
<front> | ||||
<title>Annotated Example SDP for WebRTC</title> | ||||
<author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C" surname="Jennings" fullname="Cullen Jennings"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="December" day="17" year="2020"/> | ||||
<abstract> | ||||
<t indent="0">The Web Real Time Communications (WebRTC) family of | ||||
protocols defines mechanism for direct interactive rich communication using audi | ||||
o, video, and data between two peers' web browsers. With in the WebRTC framewor | ||||
k, the Session Description Protocol (SDP) is used for negotiating session capabi | ||||
lities between the peers. Such a negotiation happens based on the SDP offer/ans | ||||
wer exchange mechanism This document provides an informational reference in des | ||||
cribing the role of SDP and the offer/answer exchange mechanism for the most com | ||||
mon WebRTC use cases. This document makes no changes to the SDP offer/answer ex | ||||
change mechanism.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-rtcweb-sdp-14"/> | ||||
<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-i | ||||
etf-rtcweb-sdp-14.txt"/> | ||||
<refcontent>Work in Progress</refcontent> | ||||
</reference> | ||||
<reference anchor="TS26.114" target="https://www.3gpp.org/DynaReport/261 | ||||
14.htm" quoteTitle="true" derivedAnchor="TS26.114"> | ||||
<front> | ||||
<title>3rd Generation Partnership Project; Technical Specification G | ||||
roup Services and System Aspects; IP Multimedia Subsystem (IMS); Multimedia Tele | ||||
phony; Media handling and interaction (Release 16)</title> | ||||
<seriesInfo name="3GPP TS" value="26.114 V16.3.0"/> | ||||
<author> | ||||
<organization showOnFrontPage="true">3GPP</organization> | ||||
</author> | ||||
<date year="2019" month="September"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="W3C.webrtc" target="https://www.w3.org/TR/2020/PR-web | ||||
rtc-20201215/" quoteTitle="true" derivedAnchor="W3C.webrtc"> | ||||
<front> | ||||
<title>WebRTC 1.0: Real-time Communication Between Browsers</title> | ||||
<author fullname="Cullen Jennings" initials="C." surname="Jennings" | ||||
role="editor"> | ||||
<organization showOnFrontPage="true">Cisco</organization> | ||||
</author> | ||||
<author fullname="Henrik Boström" asciiFullname="Henrik Bostrom" ini | ||||
tials="H." surname="Boström" asciiSurname="Bostrom" role="editor"> | ||||
<organization showOnFrontPage="true">Google</organization> | ||||
</author> | ||||
<author fullname="Jan-Ivar Bruaroey" initials="J." surname="Bruaroey | ||||
" role="editor"> | ||||
<organization showOnFrontPage="true">Mozilla</organization> | ||||
</author> | ||||
<date month="Dec" year="2020"/> | ||||
</front> | ||||
<refcontent>World Wide Web Consortium PR PR-webrtc-20201215</refconten | ||||
t> | ||||
</reference> | ||||
</references> | ||||
</references> | </references> | |||
<section title="Appendix A" anchor="sec.appendix-a"> | <section anchor="sec.appendix-a" numbered="true" toc="include" removeInRFC=" | |||
false" pn="section-appendix.a"> | ||||
<t>For the syntax validation performed in | <name slugifiedName="name-sdp-abnf-syntax">SDP ABNF Syntax</name> | |||
<xref target="sec.parsing-a-desc" />, the following list of ABNF | <t indent="0" pn="section-appendix.a-1">For the syntax validation performe | |||
d in | ||||
<xref target="sec.parsing-a-desc" format="default" sectionFormat="of" deri | ||||
vedContent="Section 5.8"/>, the following list of ABNF | ||||
definitions is used:</t> | definitions is used:</t> | |||
<texttable anchor="sdp-abnf" title="SDP ABNF References"> | <table anchor="sdp-abnf" align="center" pn="table-1"> | |||
<ttcol align='left'>Attribute</ttcol> | <name slugifiedName="name-sdp-abnf-references">SDP ABNF References</name | |||
<ttcol align='left'>Reference</ttcol> | > | |||
<c>ptime</c> | <thead> | |||
<c> | <tr> | |||
<xref target="RFC4566" /> Section 9</c> | <th align="left" colspan="1" rowspan="1">Attribute</th> | |||
<c>maxptime</c> | <th align="left" colspan="1" rowspan="1">Reference</th> | |||
<c> | </tr> | |||
<xref target="RFC4566" /> Section 9</c> | </thead> | |||
<c>rtpmap</c> | <tbody> | |||
<c> | <tr> | |||
<xref target="RFC4566" /> Section 9</c> | <td align="left" colspan="1" rowspan="1">ptime</td> | |||
<c>recvonly</c> | <td align="left" colspan="1" rowspan="1"> | |||
<c> | <xref target="RFC4566" sectionFormat="of" section="6" format="defa | |||
<xref target="RFC4566" /> Section 9</c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent=" | |||
<c>sendrecv</c> | RFC4566"/></td> | |||
<c> | </tr> | |||
<xref target="RFC4566" /> Section 9</c> | <tr> | |||
<c>sendonly</c> | <td align="left" colspan="1" rowspan="1">maxptime</td> | |||
<c> | <td align="left" colspan="1" rowspan="1"> | |||
<xref target="RFC4566" /> Section 9</c> | <xref target="RFC4566" sectionFormat="of" section="6" format="defa | |||
<c>inactive</c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent=" | |||
<c> | RFC4566"/></td> | |||
<xref target="RFC4566" /> Section 9</c> | </tr> | |||
<c>framerate</c> | <tr> | |||
<c> | <td align="left" colspan="1" rowspan="1">rtpmap</td> | |||
<xref target="RFC4566" /> Section 9</c> | <td align="left" colspan="1" rowspan="1"> | |||
<c>fmtp</c> | <xref target="RFC4566" sectionFormat="of" section="6" format="defa | |||
<c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-6" derivedContent=" | |||
<xref target="RFC4566" /> Section 9</c> | RFC4566"/></td> | |||
<c>quality</c> | </tr> | |||
<c> | <tr> | |||
<xref target="RFC4566" /> Section 9</c> | <td align="left" colspan="1" rowspan="1">recvonly</td> | |||
<c>rtcp</c> | <td align="left" colspan="1" rowspan="1"> | |||
<c> | <xref target="RFC4566" sectionFormat="of" section="9" format="defa | |||
<xref target="RFC3605" /> Section 2.1</c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-9" derivedContent=" | |||
<c>setup</c> | RFC4566"/></td> | |||
<c> | </tr> | |||
<xref target="RFC4145" /> Sections 3, 4, and 5</c> | <tr> | |||
<c>connection</c> | <td align="left" colspan="1" rowspan="1">sendrecv</td> | |||
<c> | <td align="left" colspan="1" rowspan="1"> | |||
<xref target="RFC4145" /> Sections 3, 4, and 5</c> | <xref target="RFC4566" sectionFormat="of" section="9" format="defa | |||
<c>fingerprint</c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-9" derivedContent=" | |||
<c> | RFC4566"/></td> | |||
<xref target="RFC8122" /> Section 5</c> | </tr> | |||
<c>rtcp-fb</c> | <tr> | |||
<c> | <td align="left" colspan="1" rowspan="1">sendonly</td> | |||
<xref target="RFC4585" /> Section 4.2</c> | <td align="left" colspan="1" rowspan="1"> | |||
<c>extmap</c> | <xref target="RFC4566" sectionFormat="of" section="9" format="defa | |||
<c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-9" derivedContent=" | |||
<xref target="RFC5285" /> Section 7</c> | RFC4566"/></td> | |||
<c>mid</c> | </tr> | |||
<c> | <tr> | |||
<xref target="RFC5888" /> Sections 4 and 5</c> | <td align="left" colspan="1" rowspan="1">inactive</td> | |||
<c>group</c> | <td align="left" colspan="1" rowspan="1"> | |||
<c> | <xref target="RFC4566" sectionFormat="of" section="9" format="defa | |||
<xref target="RFC5888" /> Sections 4 and 5</c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-9" derivedContent=" | |||
<c>imageattr</c> | RFC4566"/></td> | |||
<c> | </tr> | |||
<xref target="RFC6236" /> Section 3.1</c> | <tr> | |||
<c>extmap (encrypt option)</c> | <td align="left" colspan="1" rowspan="1">fmtp</td> | |||
<c> | <td align="left" colspan="1" rowspan="1"> | |||
<xref target="RFC6904" /> Section 4</c> | <xref target="RFC4566" sectionFormat="of" section="9" format="defa | |||
<c>candidate</c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc4566#section-9" derivedContent=" | |||
<c> | RFC4566"/></td> | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" /> Section 4.1</c> | </tr> | |||
<c>remote-candidates</c> | <tr> | |||
<c> | <td align="left" colspan="1" rowspan="1">rtcp</td> | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" /> Section 4.2</c> | <td align="left" colspan="1" rowspan="1"> | |||
<c>ice-lite</c> | <xref target="RFC3605" sectionFormat="of" section="2.1" format="de | |||
<c> | fault" derivedLink="https://rfc-editor.org/rfc/rfc3605#section-2.1" derivedConte | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" /> Section 4.3</c> | nt="RFC3605"/></td> | |||
<c>ice-ufrag</c> | </tr> | |||
<c> | <tr> | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" /> Section 4.4</c> | <td align="left" colspan="1" rowspan="1">setup</td> | |||
<c>ice-pwd</c> | <td align="left" colspan="1" rowspan="1"> | |||
<c> | <xref target="RFC4145" section="4" sectionFormat="of" format="defa | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" /> Section 4.4</c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc4145#section-4" derivedContent=" | |||
<c>ice-options</c> | RFC4145"/></td> | |||
<c> | </tr> | |||
<xref target="I-D.ietf-mmusic-ice-sip-sdp" /> Section 4.6</c> | <tr> | |||
<c>msid</c> | <td align="left" colspan="1" rowspan="1">fingerprint</td> | |||
<c> | <td align="left" colspan="1" rowspan="1"> | |||
<xref target="I-D.ietf-mmusic-msid" /> Section 2</c> | <xref target="RFC8122" sectionFormat="of" section="5" format="defa | |||
<c>rid</c> | ult" derivedLink="https://rfc-editor.org/rfc/rfc8122#section-5" derivedContent=" | |||
<c> | RFC8122"/></td> | |||
<xref target="I-D.ietf-mmusic-rid" /> Section 10</c> | </tr> | |||
<c>simulcast</c> | <tr> | |||
<c> | <td align="left" colspan="1" rowspan="1">rtcp-fb</td> | |||
<xref target="I-D.ietf-mmusic-sdp-simulcast" /> Section 6.1</c> | <td align="left" colspan="1" rowspan="1"> | |||
<c>tls-id</c> | <xref target="RFC4585" sectionFormat="of" section="4.2" format="de | |||
<c> | fault" derivedLink="https://rfc-editor.org/rfc/rfc4585#section-4.2" derivedConte | |||
<xref target="I-D.ietf-mmusic-dtls-sdp" /> Section 4</c> | nt="RFC4585"/></td> | |||
</texttable> | </tr> | |||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">extmap</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC5285" sectionFormat="of" section="7" format="defa | ||||
ult" derivedLink="https://rfc-editor.org/rfc/rfc5285#section-7" derivedContent=" | ||||
RFC5285"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">mid</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC5888" section="4" sectionFormat="of" format="defa | ||||
ult" derivedLink="https://rfc-editor.org/rfc/rfc5888#section-4" derivedContent=" | ||||
RFC5888"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">group</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC5888" section="5" sectionFormat="of" format="defa | ||||
ult" derivedLink="https://rfc-editor.org/rfc/rfc5888#section-5" derivedContent=" | ||||
RFC5888"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">imageattr</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC6236" sectionFormat="of" section="3.1" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc6236#section-3.1" derivedConte | ||||
nt="RFC6236"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">extmap (encrypt option)</td | ||||
> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC6904" sectionFormat="of" section="4" format="defa | ||||
ult" derivedLink="https://rfc-editor.org/rfc/rfc6904#section-4" derivedContent=" | ||||
RFC6904"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">candidate</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8839" sectionFormat="of" section="5.1" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.1" derivedConte | ||||
nt="RFC8839"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">remote-candidates</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8839" sectionFormat="of" section="5.2" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.2" derivedConte | ||||
nt="RFC8839"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">ice-lite</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8839" sectionFormat="of" section="5.3" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.3" derivedConte | ||||
nt="RFC8839"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">ice-ufrag</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8839" sectionFormat="of" section="5.4" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedConte | ||||
nt="RFC8839"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">ice-pwd</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8839" sectionFormat="of" section="5.4" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.4" derivedConte | ||||
nt="RFC8839"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">ice-options</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8839" sectionFormat="of" section="5.6" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc8839#section-5.6" derivedConte | ||||
nt="RFC8839"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">msid</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8830" sectionFormat="of" section="3" format="defa | ||||
ult" derivedLink="https://rfc-editor.org/rfc/rfc8830#section-3" derivedContent=" | ||||
RFC8830"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">rid</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8851" sectionFormat="of" section="10" format="def | ||||
ault" derivedLink="https://rfc-editor.org/rfc/rfc8851#section-10" derivedContent | ||||
="RFC8851"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">simulcast</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8853" sectionFormat="of" section="5.1" format="de | ||||
fault" derivedLink="https://rfc-editor.org/rfc/rfc8853#section-5.1" derivedConte | ||||
nt="RFC8853"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">tls-id</td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
<xref target="RFC8842" sectionFormat="of" section="4" format="defa | ||||
ult" derivedLink="https://rfc-editor.org/rfc/rfc8842#section-4" derivedContent=" | ||||
RFC8842"/></td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | </section> | |||
<section title="Change log" anchor="sec.change-log"> | <section anchor="sec.acknowledgements" numbered="false" toc="include" remove | |||
InRFC="false" pn="section-appendix.b"> | ||||
<t>Note to RFC Editor: Please remove this section before | <name slugifiedName="name-acknowledgements">Acknowledgements</name> | |||
publication.</t> | <t indent="0" pn="section-appendix.b-1"><contact fullname="Harald Alvestra | |||
nd"/>, <contact fullname="Taylor Brandstetter"/>, <contact fullname="Suhas | ||||
<t>Changes in draft-26:</t> | Nandakumar"/>, and | |||
<contact fullname="Peter Thatcher"/> provided significant text for this | ||||
<t> | document. <contact fullname="Bernard Aboba"/>, <contact fullname="Adam | |||
<list style="symbols"> | Bergkvist"/>, <contact fullname="Jan-Ivar Bruaroey"/>, | |||
<t>Update guidance on generation of the m= proto value to be | <contact fullname="Dan Burnett"/>, <contact fullname="Ben Campbell"/ | |||
consistent with ice-sip-sdp.</t> | >, <contact fullname="Alissa Cooper"/>, | |||
</list> | <contact fullname="Richard Ejzak"/>, <contact fullname="Stefan Håkan | |||
</t> | sson"/>, <contact fullname="Ted Hardie"/>, <contact fullname="Christer Holmberg" | |||
/>, | ||||
<t>Changes in draft-25:</t> | <contact fullname="Andrew Hutton"/>, <contact fullname="Randell Jesu | |||
p"/>, <contact fullname="Matthew Kaufman"/>, <contact fullname="Anant Narayanan" | ||||
<t> | />, | |||
<list style="symbols"> | <contact fullname="Adam Roach"/>, <contact fullname="Robert Sparks"/>, | |||
<contact fullname="Neil Stratford"/>, <contact fullname="Martin Thom | ||||
<t>Remove MSID track ID from offers and answers.</t> | son"/>, <contact fullname="Sean Turner"/>, and <contact fullname="Magnus W | |||
esterlund"/> all provided valuable feedback on | ||||
<t>Add note about rejecting all m= sections in a BUNDLE group.</t> | this document.</t> | |||
</section> | ||||
<t>Update ICE references to RFC 8445 and mention ice2.</t> | <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc | |||
</list> | ="include" pn="section-appendix.c"> | |||
</t> | <name slugifiedName="name-authors-addresses">Authors' Addresses</name> | |||
<author fullname="Justin Uberti" initials="J." surname="Uberti"> | ||||
<t>Changes in draft-24:</t> | <organization showOnFrontPage="true">Google</organization> | |||
<address> | ||||
<t> | <postal> | |||
<list style="symbols"> | <street>747 6th Street South</street> | |||
<city>Kirkland</city> | ||||
<t>Clarify that rounding is permitted when trying to maintain | <region>WA</region> | |||
aspect ratio.</t> | <code>98033</code> | |||
<country>United States of America</country> | ||||
<t>Update tls-id handling to match what is specified in | </postal> | |||
dtls-sdp.</t> | <email>justin@uberti.name</email> | |||
</list> | </address> | |||
</t> | </author> | |||
<author fullname="Cullen Jennings" initials="C." surname="Jennings"> | ||||
<t>Changes in draft-23:</t> | <organization showOnFrontPage="true">Cisco</organization> | |||
<address> | ||||
<t> | <postal> | |||
<list style="symbols"> | <street>400 3rd Avenue SW</street> | |||
<city>Calgary</city> | ||||
<t>Clarify rollback handling, and treat it similarly to other | <region>AB</region> | |||
setLocal/setRemote usages.</t> | <code>T2P 4H2</code> | |||
<country>Canada</country> | ||||
<t>Adopt a first-fit policy for handling multiple remote | </postal> | |||
a=imageattr attributes.</t> | <email>fluffy@iii.ca</email> | |||
</address> | ||||
<t>Clarify that a session description with zero m= sections | </author> | |||
is legal.</t> | <author fullname="Eric Rescorla" initials="E." surname="Rescorla" role="ed | |||
</list> | itor"> | |||
</t> | <organization showOnFrontPage="true">Mozilla</organization> | |||
<address> | ||||
<t>Changes in draft-22:</t> | <email>ekr@rtfm.com</email> | |||
</address> | ||||
<t> | </author> | |||
<list style="symbols"> | ||||
<t>Clarify currentDirection versus direction.</t> | ||||
<t>Correct session-id text so that it aligns with RFC | ||||
3264.</t> | ||||
<t>Clarify that generated ICE candidate objects must have all | ||||
four fields.</t> | ||||
<t>Make rollback work from any state besides stable and | ||||
regardless of whether setLocalDescription or | ||||
setRemoteDescription is used.</t> | ||||
<t>Allow modifying SDP before sending or after receiving | ||||
either offers or answers (previously this was forbidden for | ||||
answers).</t> | ||||
<t>Provide rationale for several design choices.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-21:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Change dtls-id to tls-id to match MMUSIC draft.</t> | ||||
<t>Replace regular expression for proto field with a list and | ||||
clarify that the answer must exactly match the offer.</t> | ||||
<t>Remove text about how to error check on setLocal because | ||||
local descriptions cannot be changed.</t> | ||||
<t>Rework silence suppression support to always require that | ||||
both sides agree to silence suppression or none is used.</t> | ||||
<t>Remove instructions to parse "a=ssrc-group".</t> | ||||
<t>Allow the addition of new codecs in answers and in | ||||
subsequent offers.</t> | ||||
<t>Clarify imageattr processing. Replace use of [x=0,y=0] | ||||
with direction indicators.</t> | ||||
<t>Document when early media can occur.</t> | ||||
<t>Fix ICE default port handling when bundle-only is | ||||
used.</t> | ||||
<t>Forbid duplicating IDENTICAL/TRANSPORT attributes when you | ||||
are bundling.</t> | ||||
<t>Clarify the number of components to gather when bundle is | ||||
involved.</t> | ||||
<t>Explicitly state that PTs and SSRCs are to be used for | ||||
demuxing.</t> | ||||
<t>Update guidance on "a=setup" line. This should now match | ||||
the MMUSIC draft.</t> | ||||
<t>Update guidance on certificate/digest matching to conform | ||||
to RFC8122.</t> | ||||
<t>Update examples.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-20:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Remove Appendix-B.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-19:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Examples are now machine-generated for correctness, and | ||||
use IETF-approved example IP addresses.</t> | ||||
<t>Add early transport warmup example, and add missing | ||||
attributes to existing examples.</t> | ||||
<t>Only send "a=rtcp-mux-only" and "a=bundle-only" on new m= | ||||
sections.</t> | ||||
<t>Update references.</t> | ||||
<t>Add coverage of a=identity.</t> | ||||
<t>Explain the lipsync group algorithm more thoroughly.</t> | ||||
<t>Remove unnecessary list of MTI specs.</t> | ||||
<t>Allow codecs which weren't offered to appear in answers | ||||
and which weren't selected to appear in subsequent | ||||
offers.</t> | ||||
<t>Codec preferences now are applied on both initial and | ||||
subsequent offers and answers.</t> | ||||
<t>Clarify a=msid handling for recvonly m= sections.</t> | ||||
<t>Clarify behavior of attributes for bundle-only data | ||||
channels.</t> | ||||
<t>Allow media attributes to appear in data m= sections when | ||||
all the media m= sections are bundle-only.</t> | ||||
<t>Use consistent terminology for JSEP implementations.</t> | ||||
<t>Describe how to handle failed API calls.</t> | ||||
<t>Some cleanup on routing rules.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-18:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Update demux algorithm and move it to an appendix in | ||||
preparation for merging it into BUNDLE.</t> | ||||
<t>Clarify why we can't handle an incoming offer to send | ||||
simulcast.</t> | ||||
<t>Expand IceCandidate object text.</t> | ||||
<t>Further document use of ICE candidate pool.</t> | ||||
<t>Document removeTrack.</t> | ||||
<t>Update requirements to only accept the last generated | ||||
offer/answer as an argument to setLocalDescription.</t> | ||||
<t>Allow round pixels.</t> | ||||
<t>Fix code around default timing when AVPF is not | ||||
specified.</t> | ||||
<t>Clean up terminology around m= line and m=section.</t> | ||||
<t>Provide a more realistic example for minimum decoder | ||||
capabilities.</t> | ||||
<t>Document behavior when rtcp-mux policy is require but | ||||
rtcp-mux attribute not provided.</t> | ||||
<t>Expanded discussion of RtpSender and RtpReceiver.</t> | ||||
<t>Add RtpTransceiver.currentDirection and document | ||||
setDirection.</t> | ||||
<t>Require imageattr x=0, y=0 to indicate that there are no | ||||
valid resolutions.</t> | ||||
<t>Require a privacy-preserving MID/RID construction.</t> | ||||
<t>Require support for RFC 3556 bandwidth modifiers.</t> | ||||
<t>Update maxptime description.</t> | ||||
<t>Note that endpoints may encounter extra codecs in answers | ||||
and subsequent offers from non-JSEP peers.</t> | ||||
<t>Update references.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-17:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Split createOffer and createAnswer sections to clearly | ||||
indicate attributes which always appear and which only appear | ||||
when not bundled into another m= section.</t> | ||||
<t>Add descriptions of RtpTransceiver methods.</t> | ||||
<t>Describe how to process RTCP feedback attributes.</t> | ||||
<t>Clarify transceiver directions and their interaction with | ||||
3264.</t> | ||||
<t>Describe setCodecPreferences.</t> | ||||
<t>Update RTP demux algorithm. Include RTCP.</t> | ||||
<t>Update requirements for when a=rtcp is included, limiting | ||||
to cases where it is needed for backward compatibility.</t> | ||||
<t>Clarify SAR handling.</t> | ||||
<t>Updated addTrack matching algorithm.</t> | ||||
<t>Remove a=ssrc requirements.</t> | ||||
<t>Handle a=setup in reoffers.</t> | ||||
<t>Discuss how RTX/FEC should be handled.</t> | ||||
<t>Discuss how telephone-event should be handled.</t> | ||||
<t>Discuss how CN/DTX should be handled.</t> | ||||
<t>Add missing references to ABNF table.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-16:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Update addIceCandidate to indicate ICE generation and | ||||
allow per-m= section end-of-candidates.</t> | ||||
<t>Update fingerprint handling to use | ||||
draft-ietf-mmusic-4572-update.</t> | ||||
<t>Update text around SDP processing of RTP header extensions | ||||
and payload formats.</t> | ||||
<t>Add sections on simulcast, addTransceiver, and | ||||
createDataChannel.</t> | ||||
<t>Clarify text to ensure that the session ID is a positive | ||||
63 bit integer.</t> | ||||
<t>Clarify SDP processing for direction indication.</t> | ||||
<t>Describe SDP processing for rtcp-mux-only.</t> | ||||
<t>Specify how SDP session version in o= line.</t> | ||||
<t>Require that when doing an re-offer, the capabilities of | ||||
the new session are mostly required to be a subset of the | ||||
previously negotiated session.</t> | ||||
<t>Clarified ICE restart interaction with bundle-only.</t> | ||||
<t>Remove support for changing SDP before calling | ||||
setLocalDescription.</t> | ||||
<t>Specify algorithm for demuxing RTP based on MID, PT, and | ||||
SSRC.</t> | ||||
<t>Clarify rules for rejecting m= lines when bundle policy is | ||||
balanced or max-bundle.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-15:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Clarify text around codecs offered in subsequent | ||||
transactions to refer to what's been negotiated.</t> | ||||
<t>Rewrite LS handling text to indicate edge cases and that | ||||
we're living with them.</t> | ||||
<t>Require that answerer reject m= lines when there are no | ||||
codecs in common.</t> | ||||
<t>Enforce max-bundle on offer processing.</t> | ||||
<t>Fix TIAS formula to handle bits vs. kilobits.</t> | ||||
<t>Describe addTrack algorithm.</t> | ||||
<t>Clean up references.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-14:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Added discussion of RtpTransceivers + RtpSenders + | ||||
RtpReceivers, and how they interact with | ||||
createOffer/createAnswer.</t> | ||||
<t>Removed obsolete OfferToReceiveX options.</t> | ||||
<t>Explained how addIceCandidate can be used for | ||||
end-of-candidates.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-13:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Clarified which SDP lines can be ignored.</t> | ||||
<t>Clarified how to handle various received attributes.</t> | ||||
<t>Revised how attributes should be generated for bundled m= | ||||
lines.</t> | ||||
<t>Remove unused references.</t> | ||||
<t>Remove text advocating use of unilateral PTs.</t> | ||||
<t>Trigger an ICE restart even if the ICE candidate policy is | ||||
being made more strict.</t> | ||||
<t>Remove the 'public' ICE candidate policy.</t> | ||||
<t>Move open issues into GitHub issues.</t> | ||||
<t>Split local/remote description accessors into | ||||
current/pending.</t> | ||||
<t>Clarify a=imageattr handling.</t> | ||||
<t>Add more detail on VoiceActivityDetection handling.</t> | ||||
<t>Reference draft-shieh-rtcweb-ip-handling.</t> | ||||
<t>Make it clear when an ICE restart should occur.</t> | ||||
<t>Resolve changes needed in references.</t> | ||||
<t>Remove MSID semantics.</t> | ||||
<t>ice-options are now at session level.</t> | ||||
<t>Default RTCP mux policy is now 'require'.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-12:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Filled in sections on applying local and remote | ||||
descriptions.</t> | ||||
<t>Discussed downscaling and upscaling to fulfill imageattr | ||||
requirements.</t> | ||||
<t>Updated what SDP can be modified by the application.</t> | ||||
<t>Updated to latest datachannel SDP.</t> | ||||
<t>Allowed multiple fingerprint lines.</t> | ||||
<t>Switched back to IPv4 for dummy candidates.</t> | ||||
<t>Added additional clarity on ICE default candidates.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-11:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Clarified handling of RTP CNAMEs.</t> | ||||
<t>Updated what SDP lines should be processed or ignored.</t> | ||||
<t>Specified how a=imageattr should be used.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-10:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Described video size negotiation with imageattr.</t> | ||||
<t>Clarified rejection of sections that do not have | ||||
mux-only.</t> | ||||
<t>Add handling of LS groups</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-09:</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Don't return null for {local,remote}Description after | ||||
close().</t> | ||||
<t>Changed TCP/TLS to UDP/DTLS in RTP profile names.</t> | ||||
<t>Separate out bundle and mux policy.</t> | ||||
<t>Added specific references to FEC mechanisms.</t> | ||||
<t>Added canTrickle mechanism.</t> | ||||
<t>Added section on subsequent answers and, answer | ||||
options.</t> | ||||
<t>Added text defining set{Local,Remote}Description | ||||
behavior.</t> | ||||
</list> | ||||
</t> | ||||
<t>Changes in draft-08: | ||||
<list style="symbols"> | ||||
<t>Added new example section and removed old examples in | ||||
appendix.</t> | ||||
<t>Fixed <proto> field handling.</t> | ||||
<t>Added text describing a=rtcp attribute.</t> | ||||
<t>Reworked handling of OfferToReceiveAudio and | ||||
OfferToReceiveVideo per discussion at IETF 90.</t> | ||||
<t>Reworked trickle ICE handling and its impact on m= and c= | ||||
lines per discussion at interim.</t> | ||||
<t>Added max-bundle-and-rtcp-mux policy.</t> | ||||
<t>Added description of maxptime handling.</t> | ||||
<t>Updated ICE candidate pool default to 0.</t> | ||||
<t>Resolved open issues around AppID/receiver-ID.</t> | ||||
<t>Reworked and expanded how changes to the ICE configuration | ||||
are handled.</t> | ||||
<t>Some reference updates.</t> | ||||
<t>Editorial clarification.</t> | ||||
</list></t> | ||||
<t>Changes in draft-07: | ||||
<list style="symbols"> | ||||
<t>Expanded discussion of VAD and Opus DTX.</t> | ||||
<t>Added a security considerations section.</t> | ||||
<t>Rewrote the section on modifying SDP to require | ||||
implementations to clearly indicate whether any given | ||||
modification is allowed.</t> | ||||
<t>Clarified impact of IceRestart on CreateOffer in local-offer | ||||
state.</t> | ||||
<t>Guidance on whether attributes should be defined at the | ||||
media level or the session level.</t> | ||||
<t>Renamed "default" bundle policy to "balanced".</t> | ||||
<t>Removed default ICE candidate pool size and clarify how it | ||||
works.</t> | ||||
<t>Defined a canonical order for assignment of MSTs to m= | ||||
lines.</t> | ||||
<t>Removed discussion of rehydration.</t> | ||||
<t>Added Eric Rescorla as a draft editor.</t> | ||||
<t>Cleaned up references.</t> | ||||
<t>Editorial cleanup</t> | ||||
</list></t> | ||||
<t>Changes in draft-06: | ||||
<list style="symbols"> | ||||
<t>Reworked handling of m= line recycling.</t> | ||||
<t>Added handling of BUNDLE and bundle-only.</t> | ||||
<t>Clarified handling of rollback.</t> | ||||
<t>Added text describing the ICE Candidate Pool and its | ||||
behavior.</t> | ||||
<t>Allowed OfferToReceiveX to create multiple recvonly m= | ||||
sections.</t> | ||||
</list></t> | ||||
<t>Changes in draft-05: | ||||
<list style="symbols"> | ||||
<t>Fixed several issues identified in the createOffer/Answer | ||||
sections during document review.</t> | ||||
<t>Updated references.</t> | ||||
</list></t> | ||||
<t>Changes in draft-04: | ||||
<list style="symbols"> | ||||
<t>Filled in sections on createOffer and createAnswer.</t> | ||||
<t>Added SDP examples.</t> | ||||
<t>Fixed references.</t> | ||||
</list></t> | ||||
<t>Changes in draft-03: | ||||
<list style="symbols"> | ||||
<t>Added text describing relationship to W3C specification</t> | ||||
</list></t> | ||||
<t>Changes in draft-02: | ||||
<list style="symbols"> | ||||
<!-- A --> | ||||
<t>Converted from nroff</t> | ||||
<!-- B --> | ||||
<t>Removed comparisons to old approaches abandoned by the | ||||
working group</t> | ||||
<!-- C --> | ||||
<t>Removed stuff that has moved to W3C specification</t> | ||||
<!-- D --> | ||||
<t>Align SDP handling with W3C draft</t> | ||||
<!-- E --> | ||||
<t>Clarified section on forking.</t> | ||||
<!-- F --> | ||||
<!-- G --> | ||||
<!-- H --> | ||||
<!-- I --> | ||||
<!-- J --> | ||||
<!-- K --> | ||||
<!-- L --> | ||||
</list></t> | ||||
<t>Changes in draft-01: | ||||
<list style="symbols"> | ||||
<t>Added diagrams for architecture and state machine.</t> | ||||
<t>Added sections on forking and rehydration.</t> | ||||
<t>Clarified meaning of "pranswer" and "answer".</t> | ||||
<t>Reworked how ICE restarts and media directions are | ||||
controlled.</t> | ||||
<t>Added list of parameters that can be changed in a | ||||
description.</t> | ||||
<t>Updated suggested API and examples to match latest | ||||
thinking.</t> | ||||
<t>Suggested API and examples have been moved to an | ||||
appendix.</t> | ||||
</list></t> | ||||
<t>Changes in draft -00: | ||||
<list style="symbols"> | ||||
<t>Migrated from draft-uberti-rtcweb-jsep-02.</t> | ||||
</list></t> | ||||
</section> | </section> | |||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 699 change blocks. | ||||
4130 lines changed or deleted | 6410 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |