<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[214420] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/214420">214420</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2017-03-27 11:10:45 -0700 (Mon, 27 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add support for RTCRtpReceiver/RTCRtpSender getParameters
https://bugs.webkit.org/show_bug.cgi?id=170057

Patch by Youenn Fablet &lt;youenn@apple.com&gt; on 2017-03-27
Reviewed by Alex Christensen.

Source/ThirdParty/libwebrtc:

* Source/webrtc/api/mediatypes.h:

Source/WebCore:

Test: webrtc/video-getParameters.html

getParameters returns a dictionary of values taken from libwebrtc RtpReceiverInterface/RtpSenderInrterface objects.
Added a direct link between WebCore RTCRtpReceiver and libwebrtc RtpReceiverInterface object.
Making the link between WebCore RTCRtpSender and libwebrtc RtpSenderInrterface object through
PeerConnectionBackend to keep the current architecture shared with OpenWebRTC.
In the future, we should try to make the link more direct.

Added routines to support the conversion from libwebrtc to WebCore.
Ensured that RTCRtpReceiver is cleaning its backend when being stopped.

* CMakeLists.txt:
* DerivedSources.make:
* Modules/mediastream/MediaEndpointPeerConnection.cpp:
(WebCore::MediaEndpointPeerConnection::setRemoteDescriptionTask):
* Modules/mediastream/PeerConnectionBackend.h:
(WebCore::PeerConnectionBackend::getParameters):
* Modules/mediastream/RTCPeerConnection.cpp:
(WebCore::RTCPeerConnection::doClose):
(WebCore::RTCPeerConnection::getParameters):
* Modules/mediastream/RTCPeerConnection.h:
* Modules/mediastream/RTCRtpParameters.h: Added.
* Modules/mediastream/RTCRtpParameters.idl: Added.
* Modules/mediastream/RTCRtpReceiver.cpp:
(WebCore::RTCRtpReceiver::RTCRtpReceiver):
* Modules/mediastream/RTCRtpReceiver.h:
(WebCore::RTCRtpReceiver::Backend::~Backend):
(WebCore::RTCRtpReceiver::Backend::getParameters):
(WebCore::RTCRtpReceiver::create):
(WebCore::RTCRtpReceiver::stop):
(WebCore::RTCRtpReceiver::setBackend):
(WebCore::RTCRtpReceiver::getParameters):
* Modules/mediastream/RTCRtpReceiver.idl:
* Modules/mediastream/RTCRtpSender.cpp:
(WebCore::RTCRtpSender::create):
(WebCore::RTCRtpSender::RTCRtpSender):
(WebCore::RTCRtpSender::replaceTrack):
(WebCore::RTCRtpSender::getParameters):
* Modules/mediastream/RTCRtpSender.h:
(WebCore::RTCRtpSender::Backend::~Backend):
(WebCore::RTCRtpSender::isStopped):
(WebCore::RTCRtpSender::stop):
* Modules/mediastream/RTCRtpSender.idl:
* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
(WebCore::LibWebRTCMediaEndpoint::addTrack):
(WebCore::LibWebRTCMediaEndpoint::addRemoteTrack):
(WebCore::LibWebRTCMediaEndpoint::OnAddTrack):
(WebCore::LibWebRTCMediaEndpoint::stop):
(WebCore::fillEncodingParameters):
(WebCore::fillHeaderExtensionParameters):
(WebCore::fillCodecParameters):
(WebCore::fillRtpParameters):
(WebCore::RTCRtpReceiverBackend::getParameters):
(WebCore::LibWebRTCMediaEndpoint::getRTCRtpSenderParameters):
* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
(WebCore::LibWebRTCPeerConnectionBackend::notifyAddedTrack):
(WebCore::LibWebRTCPeerConnectionBackend::getParameters):
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
* WebCore.xcodeproj/project.pbxproj:
* platform/mediastream/mac/RealtimeOutgoingAudioSource.h:

LayoutTests:

* webrtc/video-getParameters-expected.txt: Added.
* webrtc/video-getParameters.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceThirdPartylibwebrtcChangeLog">trunk/Source/ThirdParty/libwebrtc/ChangeLog</a></li>
<li><a href="#trunkSourceThirdPartylibwebrtcSourcewebrtcapimediatypesh">trunk/Source/ThirdParty/libwebrtc/Source/webrtc/api/mediatypes.h</a></li>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreDerivedSourcesmake">trunk/Source/WebCore/DerivedSources.make</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp">trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamPeerConnectionBackendh">trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCPeerConnectioncpp">trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCPeerConnectionh">trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpReceivercpp">trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpReceiverh">trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpReceiveridl">trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.idl</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpSendercpp">trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpSenderh">trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpSenderidl">trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCStatsReporth">trunk/Source/WebCore/Modules/mediastream/RTCStatsReport.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamlibwebrtcLibWebRTCMediaEndpointcpp">trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamlibwebrtcLibWebRTCMediaEndpointh">trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamlibwebrtcLibWebRTCPeerConnectionBackendcpp">trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamlibwebrtcLibWebRTCPeerConnectionBackendh">trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacRealtimeOutgoingAudioSourceh">trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestswebrtcvideogetParametersexpectedtxt">trunk/LayoutTests/webrtc/video-getParameters-expected.txt</a></li>
<li><a href="#trunkLayoutTestswebrtcvideogetParametershtml">trunk/LayoutTests/webrtc/video-getParameters.html</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpParametersh">trunk/Source/WebCore/Modules/mediastream/RTCRtpParameters.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamRTCRtpParametersidl">trunk/Source/WebCore/Modules/mediastream/RTCRtpParameters.idl</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/LayoutTests/ChangeLog        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2017-03-27  Youenn Fablet  &lt;youenn@apple.com&gt;
+
+        Add support for RTCRtpReceiver/RTCRtpSender getParameters
+        https://bugs.webkit.org/show_bug.cgi?id=170057
+
+        Reviewed by Alex Christensen.
+
+        * webrtc/video-getParameters-expected.txt: Added.
+        * webrtc/video-getParameters.html: Added.
+
</ins><span class="cx"> 2017-03-27  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         font variation properties don't need to accept numbers
</span></span></pre></div>
<a id="trunkLayoutTestswebrtcvideogetParametersexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/webrtc/video-getParameters-expected.txt (0 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/webrtc/video-getParameters-expected.txt                                (rev 0)
+++ trunk/LayoutTests/webrtc/video-getParameters-expected.txt        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+
+PASS Basic video stats 
+
</ins></span></pre></div>
<a id="trunkLayoutTestswebrtcvideogetParametershtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/webrtc/video-getParameters.html (0 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/webrtc/video-getParameters.html                                (rev 0)
+++ trunk/LayoutTests/webrtc/video-getParameters.html        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -0,0 +1,56 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+    &lt;head&gt;
+        &lt;meta charset=&quot;utf-8&quot;&gt;
+        &lt;title&gt;Testing getParameters on a basic video exchange&lt;/title&gt;
+        &lt;script src=&quot;../resources/testharness.js&quot;&gt;&lt;/script&gt;
+        &lt;script src=&quot;../resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+    &lt;/head&gt;
+    &lt;body&gt;
+        &lt;script src =&quot;routines.js&quot;&gt;&lt;/script&gt;
+        &lt;script&gt;
+var firstConnection, secondConnection;
+promise_test((test) =&gt; {
+    if (window.testRunner)
+        testRunner.setUserMediaPermission(true);
+
+    var sender, receiver;
+    var localStream, remoteStream;
+    return navigator.mediaDevices.getUserMedia({ video: true}).then((stream) =&gt; {
+        localStream = stream;
+        return new Promise((resolve, reject) =&gt; {
+            if (window.internals)
+                internals.useMockRTCPeerConnectionFactory(&quot;TwoRealPeerConnections&quot;);
+
+            createConnections((connection) =&gt; {
+                firstConnection = connection;
+                sender = firstConnection.addTrack(stream.getVideoTracks()[0], stream);
+            }, (connection) =&gt; {
+                secondConnection = connection;
+                receiver = secondConnection.addTransceiver(&quot;video&quot;).receiver;
+                secondConnection.ontrack = (trackEvent) =&gt; {
+                    remoteStream = trackEvent.streams[0];
+                    resolve();
+                };
+            });
+            setTimeout(() =&gt; reject(&quot;Test timed out&quot;), 5000);
+        });
+    }).then(() =&gt; {
+        assert_true(!!sender, &quot;sender should not be undefined&quot;);
+        assert_true(!!receiver, &quot;receiver should not be undefined&quot;);
+        var senderParameters = sender.getParameters();
+        var receiverParameters = receiver.getParameters();
+        assert_true(!!senderParameters, &quot;sender parameters should not be undefined or null&quot;);
+        assert_true(!!receiverParameters, &quot;receiver parameters should not be undefined or null&quot;);
+
+        assert_equals(JSON.stringify(senderParameters), JSON.stringify(receiverParameters), &quot;testing sender vs. receiver parameters&quot;);
+
+        senderParameters.encodings[0].fec.ssrc = 1;
+        senderParameters.encodings[0].rtx.ssrc = 1;
+        senderParameters.encodings[0].ssrc = 1;
+        assert_equals(JSON.stringify(senderParameters), '{&quot;codecs&quot;:[],&quot;degradationPreference&quot;:&quot;balanced&quot;,&quot;encodings&quot;:[{&quot;active&quot;:true,&quot;dtx&quot;:&quot;disabled&quot;,&quot;fec&quot;:{&quot;ssrc&quot;:1},&quot;maxBitrate&quot;:0,&quot;maxFramerate&quot;:0,&quot;priority&quot;:&quot;medium&quot;,&quot;rid&quot;:&quot;&quot;,&quot;rtx&quot;:{&quot;ssrc&quot;:1},&quot;scaleResolutionDownBy&quot;:1,&quot;ssrc&quot;:1}],&quot;headerExtensions&quot;:[],&quot;transactionId&quot;:&quot;&quot;}', &quot;Testing sanitized parameters&quot;);
+    });
+}, &quot;Basic video stats&quot;);
+        &lt;/script&gt;
+    &lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceThirdPartylibwebrtcChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/libwebrtc/ChangeLog (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/libwebrtc/ChangeLog        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/ThirdParty/libwebrtc/ChangeLog        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2017-03-27  Youenn Fablet  &lt;youenn@apple.com&gt;
+
+        Add support for RTCRtpReceiver/RTCRtpSender getParameters
+        https://bugs.webkit.org/show_bug.cgi?id=170057
+
+        Reviewed by Alex Christensen.
+
+        * Source/webrtc/api/mediatypes.h:
+
</ins><span class="cx"> 2017-03-22  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix warnings in libwebrtc
</span></span></pre></div>
<a id="trunkSourceThirdPartylibwebrtcSourcewebrtcapimediatypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/api/mediatypes.h (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/api/mediatypes.h        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/api/mediatypes.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -11,6 +11,8 @@
</span><span class="cx"> #ifndef WEBRTC_API_MEDIATYPES_H_
</span><span class="cx"> #define WEBRTC_API_MEDIATYPES_H_
</span><span class="cx"> 
</span><ins>+#include &quot;webrtc/base/export.h&quot;
+
</ins><span class="cx"> #include &lt;string&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace cricket {
</span><span class="lines">@@ -21,7 +23,7 @@
</span><span class="cx">   MEDIA_TYPE_DATA
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-std::string MediaTypeToString(MediaType type);
</del><ins>+WEBRTC_DYLIB_EXPORT std::string MediaTypeToString(MediaType type);
</ins><span class="cx"> // Aborts on invalid string. Only expected to be used on strings that are
</span><span class="cx"> // guaranteed to be valid, such as MediaStreamTrackInterface::kind().
</span><span class="cx"> MediaType MediaTypeFromString(const std::string&amp; type_str);
</span></span></pre></div>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/CMakeLists.txt        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -250,6 +250,7 @@
</span><span class="cx">     Modules/mediastream/RTCPeerConnection.idl
</span><span class="cx">     Modules/mediastream/RTCPeerConnectionIceEvent.idl
</span><span class="cx">     Modules/mediastream/RTCPeerConnectionState.idl
</span><ins>+    Modules/mediastream/RTCRtpParameters.idl
</ins><span class="cx">     Modules/mediastream/RTCRtpReceiver.idl
</span><span class="cx">     Modules/mediastream/RTCRtpSender.idl
</span><span class="cx">     Modules/mediastream/RTCRtpTransceiver.idl
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/ChangeLog        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -1,3 +1,72 @@
</span><ins>+2017-03-27  Youenn Fablet  &lt;youenn@apple.com&gt;
+
+        Add support for RTCRtpReceiver/RTCRtpSender getParameters
+        https://bugs.webkit.org/show_bug.cgi?id=170057
+
+        Reviewed by Alex Christensen.
+
+        Test: webrtc/video-getParameters.html
+
+        getParameters returns a dictionary of values taken from libwebrtc RtpReceiverInterface/RtpSenderInrterface objects.
+        Added a direct link between WebCore RTCRtpReceiver and libwebrtc RtpReceiverInterface object.
+        Making the link between WebCore RTCRtpSender and libwebrtc RtpSenderInrterface object through
+        PeerConnectionBackend to keep the current architecture shared with OpenWebRTC.
+        In the future, we should try to make the link more direct.
+
+        Added routines to support the conversion from libwebrtc to WebCore.
+        Ensured that RTCRtpReceiver is cleaning its backend when being stopped.
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * Modules/mediastream/MediaEndpointPeerConnection.cpp:
+        (WebCore::MediaEndpointPeerConnection::setRemoteDescriptionTask):
+        * Modules/mediastream/PeerConnectionBackend.h:
+        (WebCore::PeerConnectionBackend::getParameters):
+        * Modules/mediastream/RTCPeerConnection.cpp:
+        (WebCore::RTCPeerConnection::doClose):
+        (WebCore::RTCPeerConnection::getParameters):
+        * Modules/mediastream/RTCPeerConnection.h:
+        * Modules/mediastream/RTCRtpParameters.h: Added.
+        * Modules/mediastream/RTCRtpParameters.idl: Added.
+        * Modules/mediastream/RTCRtpReceiver.cpp:
+        (WebCore::RTCRtpReceiver::RTCRtpReceiver):
+        * Modules/mediastream/RTCRtpReceiver.h:
+        (WebCore::RTCRtpReceiver::Backend::~Backend):
+        (WebCore::RTCRtpReceiver::Backend::getParameters):
+        (WebCore::RTCRtpReceiver::create):
+        (WebCore::RTCRtpReceiver::stop):
+        (WebCore::RTCRtpReceiver::setBackend):
+        (WebCore::RTCRtpReceiver::getParameters):
+        * Modules/mediastream/RTCRtpReceiver.idl:
+        * Modules/mediastream/RTCRtpSender.cpp:
+        (WebCore::RTCRtpSender::create):
+        (WebCore::RTCRtpSender::RTCRtpSender):
+        (WebCore::RTCRtpSender::replaceTrack):
+        (WebCore::RTCRtpSender::getParameters):
+        * Modules/mediastream/RTCRtpSender.h:
+        (WebCore::RTCRtpSender::Backend::~Backend):
+        (WebCore::RTCRtpSender::isStopped):
+        (WebCore::RTCRtpSender::stop):
+        * Modules/mediastream/RTCRtpSender.idl:
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+        (WebCore::LibWebRTCMediaEndpoint::addTrack):
+        (WebCore::LibWebRTCMediaEndpoint::addRemoteTrack):
+        (WebCore::LibWebRTCMediaEndpoint::OnAddTrack):
+        (WebCore::LibWebRTCMediaEndpoint::stop):
+        (WebCore::fillEncodingParameters):
+        (WebCore::fillHeaderExtensionParameters):
+        (WebCore::fillCodecParameters):
+        (WebCore::fillRtpParameters):
+        (WebCore::RTCRtpReceiverBackend::getParameters):
+        (WebCore::LibWebRTCMediaEndpoint::getRTCRtpSenderParameters):
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+        (WebCore::LibWebRTCPeerConnectionBackend::notifyAddedTrack):
+        (WebCore::LibWebRTCPeerConnectionBackend::getParameters):
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/mediastream/mac/RealtimeOutgoingAudioSource.h:
+
</ins><span class="cx"> 2017-03-27  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         font variation properties don't need to accept numbers
</span></span></pre></div>
<a id="trunkSourceWebCoreDerivedSourcesmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/DerivedSources.make (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/DerivedSources.make        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/DerivedSources.make        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -194,6 +194,7 @@
</span><span class="cx">     $(WebCore)/Modules/mediastream/RTCOfferOptions.idl \
</span><span class="cx">     $(WebCore)/Modules/mediastream/RTCPeerConnection.idl \
</span><span class="cx">     $(WebCore)/Modules/mediastream/RTCPeerConnectionState.idl \
</span><ins>+    $(WebCore)/Modules/mediastream/RTCRtpParameters.idl \
</ins><span class="cx">     $(WebCore)/Modules/mediastream/RTCRtpReceiver.idl \
</span><span class="cx">     $(WebCore)/Modules/mediastream/RTCRtpSender.idl \
</span><span class="cx">     $(WebCore)/Modules/mediastream/RTCRtpTransceiver.idl \
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -500,7 +500,7 @@
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (!transceiver) {
</span><del>-                auto sender = RTCRtpSender::create(String(mediaDescription.type), Vector&lt;String&gt;(), m_peerConnection.senderClient());
</del><ins>+                auto sender = RTCRtpSender::create(String(mediaDescription.type), Vector&lt;String&gt;(), m_peerConnection.senderBackend());
</ins><span class="cx">                 auto receiver = createReceiver(mediaDescription.mid, mediaDescription.type, mediaDescription.mediaStreamTrackId);
</span><span class="cx"> 
</span><span class="cx">                 auto newTransceiver = RTCRtpTransceiver::create(WTFMove(sender), WTFMove(receiver));
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamPeerConnectionBackendh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #if ENABLE(WEB_RTC)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSDOMPromise.h&quot;
</span><ins>+#include &quot;RTCRtpParameters.h&quot;
</ins><span class="cx"> #include &quot;RTCSignalingState.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -97,6 +98,8 @@
</span><span class="cx">     virtual void replaceTrack(RTCRtpSender&amp;, Ref&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;) = 0;
</span><span class="cx">     virtual void notifyAddedTrack(RTCRtpSender&amp;) { }
</span><span class="cx"> 
</span><ins>+    virtual RTCRtpParameters getParameters(RTCRtpSender&amp;) const { return { }; }
+
</ins><span class="cx">     void markAsNeedingNegotiation();
</span><span class="cx">     bool isNegotiationNeeded() const { return m_negotiationNeeded; };
</span><span class="cx">     void clearNegotiationNeededState() { m_negotiationNeeded = false; };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCPeerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -348,11 +348,14 @@
</span><span class="cx">     m_iceConnectionState = RTCIceConnectionState::Closed;
</span><span class="cx">     m_signalingState = RTCSignalingState::Closed;
</span><span class="cx"> 
</span><del>-    m_backend-&gt;stop();
</del><ins>+    for (RTCRtpReceiver&amp; receiver : m_transceiverSet-&gt;receivers())
+        receiver.stop();
</ins><span class="cx"> 
</span><span class="cx">     for (RTCRtpSender&amp; sender : m_transceiverSet-&gt;senders())
</span><span class="cx">         sender.stop();
</span><span class="cx"> 
</span><ins>+    m_backend-&gt;stop();
+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -522,6 +525,11 @@
</span><span class="cx">     m_backend-&gt;replaceTrack(sender, withTrack.releaseNonNull(), WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RTCRtpParameters RTCPeerConnection::getParameters(RTCRtpSender&amp; sender) const
+{
+    return m_backend-&gt;getParameters(sender);
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(WEB_RTC)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCPeerConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -58,11 +58,12 @@
</span><span class="cx"> 
</span><span class="cx"> struct RTCAnswerOptions;
</span><span class="cx"> struct RTCOfferOptions;
</span><ins>+struct RTCRtpParameters;
</ins><span class="cx"> struct RTCRtpTransceiverInit {
</span><span class="cx">     RTCRtpTransceiverDirection direction;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class RTCPeerConnection final : public RefCounted&lt;RTCPeerConnection&gt;, public RTCRtpSenderClient, public EventTargetWithInlineData, public ActiveDOMObject {
</del><ins>+class RTCPeerConnection final : public RefCounted&lt;RTCPeerConnection&gt;, public RTCRtpSender::Backend, public EventTargetWithInlineData, public ActiveDOMObject {
</ins><span class="cx"> public:
</span><span class="cx">     static Ref&lt;RTCPeerConnection&gt; create(ScriptExecutionContext&amp;);
</span><span class="cx">     virtual ~RTCPeerConnection();
</span><span class="lines">@@ -134,7 +135,7 @@
</span><span class="cx"> 
</span><span class="cx">     void scheduleNegotiationNeededEvent();
</span><span class="cx"> 
</span><del>-    RTCRtpSenderClient&amp; senderClient() { return *this; }
</del><ins>+    RTCRtpSender::Backend&amp; senderBackend() { return *this; }
</ins><span class="cx">     void fireEvent(Event&amp;);
</span><span class="cx"> 
</span><span class="cx">     void disableICECandidateFiltering() { m_backend-&gt;disableICECandidateFiltering(); }
</span><span class="lines">@@ -160,8 +161,10 @@
</span><span class="cx">     const char* activeDOMObjectName() const final;
</span><span class="cx">     bool canSuspendForDocumentSuspension() const final;
</span><span class="cx"> 
</span><del>-    // RTCRtpSenderClient
</del><ins>+    // FIXME: We might want PeerConnectionBackend to be the Backend
+    // RTCRtpSender::Backend
</ins><span class="cx">     void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;) final;
</span><ins>+    RTCRtpParameters getParameters(RTCRtpSender&amp;) const final;
</ins><span class="cx"> 
</span><span class="cx">     void updateConnectionState();
</span><span class="cx">     bool doClose();
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpParametersh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/Modules/mediastream/RTCRtpParameters.h (0 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpParameters.h                                (rev 0)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpParameters.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -0,0 +1,84 @@
</span><ins>+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(WEB_RTC)
+
+#include &lt;wtf/Vector.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace WebCore {
+
+struct RTCRtpParameters {
+
+    struct FecParameters {
+        unsigned long ssrc;
+    };
+
+    struct RtxParameters {
+        unsigned long ssrc;
+    };
+
+    enum class PriorityType { VeryLow, Low, Medium, High };
+    enum class DegradationPreference { MaintainFramerate, MaintainResolution, Balanced };
+    enum class DtxStatus { Disabled, Enabled };
+
+    struct CodecParameters {
+        unsigned short payloadType { 0 };
+        String mimeType;
+        unsigned long clockRate { 0 };
+        unsigned short channels = 1;
+    };
+
+    struct EncodingParameters {
+        unsigned long ssrc { 0 };
+        RtxParameters rtx;
+        FecParameters fec;
+        DtxStatus dtx { DtxStatus::Disabled };
+        bool active { false};
+        PriorityType priority { PriorityType::Medium };
+        unsigned long maxBitrate { 0 };
+        unsigned long maxFramerate { 0 };
+        String rid;
+        double scaleResolutionDownBy { 1 };
+    };
+
+    struct HeaderExtensionParameters {
+        String uri;
+        unsigned short id;
+    };
+
+    String transactionId;
+    Vector&lt;EncodingParameters&gt; encodings;
+    Vector&lt;HeaderExtensionParameters&gt; headerExtensions;
+    Vector&lt;CodecParameters&gt; codecs;
+    DegradationPreference degradationPreference = DegradationPreference::Balanced;
+};
+
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_RTC)
</ins></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpParametersidl"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/Modules/mediastream/RTCRtpParameters.idl (0 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpParameters.idl                                (rev 0)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpParameters.idl        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -0,0 +1,126 @@
</span><ins>+/*
+* Copyright (C) 2017 Apple Inc. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in the
+*    documentation and/or other materials provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+* THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+[
+    Conditional=WEB_RTC,
+    EnabledAtRuntime=PeerConnection,
+    JSGenerateToJSObject,
+] dictionary RTCRtpParameters {
+    DOMString transactionId;
+    sequence&lt;RTCRtpEncodingParameters&gt; encodings;
+    sequence&lt;RTCRtpHeaderExtensionParameters&gt; headerExtensions;
+    // FIXME: Add RTCRtcpParameters rtcp;
+    sequence&lt;RTCRtpCodecParameters&gt; codecs;
+    RTCDegradationPreference degradationPreference = &quot;balanced&quot;;
+};
+
+[
+    Conditional=WEB_RTC,
+    EnabledAtRuntime=PeerConnection,
+    JSGenerateToJSObject,
+] dictionary RTCRtpCodecParameters {
+    unsigned short payloadType;
+    DOMString mimeType;
+    unsigned long clockRate;
+    unsigned short channels = 1;
+    // FIXME: Add DOMString sdpFmtpLine;
+};
+
+[
+    Conditional=WEB_RTC,
+    EnabledAtRuntime=PeerConnection,
+    JSGenerateToJSObject,
+] dictionary RTCRtpEncodingParameters {
+    unsigned long ssrc;
+    RTCRtpRtxParameters rtx;
+    RTCRtpFecParameters fec;
+    RTCDtxStatus dtx;
+    boolean active;
+    RTCPriorityType priority;
+    unsigned long maxBitrate;
+    unsigned long maxFramerate;
+    DOMString rid;
+    double scaleResolutionDownBy = 1;
+};
+
+[
+    Conditional=WEB_RTC,
+    EnabledAtRuntime=PeerConnection,
+    JSGenerateToJSObject,
+] dictionary RTCRtpHeaderExtensionParameters {
+    DOMString uri;
+    unsigned short id;
+    // FIXME: Add boolean encrypted;
+};
+
+//[
+//    Conditional=WEB_RTC,
+//    EnabledAtRuntime=PeerConnection,
+//    JSGenerateToJSObject,
+//] dictionary RTCRtcpParameters {
+//    DOMString cname;
+//    boolean reducedSize;
+//};
+
+[
+    Conditional=WEB_RTC,
+    EnabledAtRuntime=PeerConnection,
+    JSGenerateToJSObject,
+] dictionary RTCRtpFecParameters {
+    unsigned long ssrc;
+};
+
+[
+    Conditional=WEB_RTC,
+    EnabledAtRuntime=PeerConnection,
+    JSGenerateToJSObject,
+] dictionary RTCRtpRtxParameters {
+    unsigned long ssrc;
+};
+
+[
+    Conditional=WEB_RTC,
+] enum RTCDegradationPreference {
+    &quot;maintain-framerate&quot;,
+    &quot;maintain-resolution&quot;,
+    &quot;balanced&quot;
+};
+
+[
+    Conditional=WEB_RTC,
+] enum RTCDtxStatus {
+    &quot;disabled&quot;,
+    &quot;enabled&quot;
+};
+
+[
+    Conditional=WEB_RTC,
+    EnabledAtRuntime=PeerConnection,
+] enum RTCPriorityType {
+    &quot;very-low&quot;,
+    &quot;low&quot;,
+    &quot;medium&quot;,
+    &quot;high&quot;
+};
</ins></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpReceivercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -33,10 +33,13 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_RTC)
</span><span class="cx"> 
</span><ins>+#include &quot;RTCRtpParameters.h&quot;
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-RTCRtpReceiver::RTCRtpReceiver(Ref&lt;MediaStreamTrack&gt;&amp;&amp; track)
</del><ins>+RTCRtpReceiver::RTCRtpReceiver(Ref&lt;MediaStreamTrack&gt;&amp;&amp; track, Backend* backend)
</ins><span class="cx">     : RTCRtpSenderReceiverBase(WTFMove(track))
</span><ins>+    , m_backend(backend)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpReceiverh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -32,24 +32,38 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_RTC)
</span><span class="cx"> 
</span><ins>+#include &quot;RTCRtpParameters.h&quot;
</ins><span class="cx"> #include &quot;RTCRtpSenderReceiverBase.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class RTCRtpReceiver : public RTCRtpSenderReceiverBase {
</span><span class="cx"> public:
</span><del>-    static Ref&lt;RTCRtpReceiver&gt; create(Ref&lt;MediaStreamTrack&gt;&amp;&amp; track)
</del><ins>+    class Backend {
+    public:
+        virtual ~Backend() { }
+        virtual RTCRtpParameters getParameters() { return { }; }
+    };
+
+    static Ref&lt;RTCRtpReceiver&gt; create(Ref&lt;MediaStreamTrack&gt;&amp;&amp; track, Backend* backend = nullptr)
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new RTCRtpReceiver(WTFMove(track)));
</del><ins>+        return adoptRef(*new RTCRtpReceiver(WTFMove(track), backend));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    void stop() { m_backend = nullptr; }
+    // FIXME: We should pass a UniqueRef here.
+    void setBackend(std::unique_ptr&lt;Backend&gt;&amp;&amp; backend) { m_backend = WTFMove(backend); }
+
</ins><span class="cx">     bool isDispatched() const { return m_isDispatched; }
</span><span class="cx">     void setDispatched(bool isDispatched) { m_isDispatched = isDispatched; }
</span><ins>+    RTCRtpParameters getParameters() { return m_backend ? m_backend-&gt;getParameters() : RTCRtpParameters(); }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    explicit RTCRtpReceiver(Ref&lt;MediaStreamTrack&gt;&amp;&amp;);
</del><ins>+    explicit RTCRtpReceiver(Ref&lt;MediaStreamTrack&gt;&amp;&amp;, Backend*);
</ins><span class="cx"> 
</span><span class="cx">     bool m_isDispatched { false };
</span><ins>+    std::unique_ptr&lt;Backend&gt; m_backend;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpReceiveridl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.idl (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.idl        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.idl        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -34,9 +34,9 @@
</span><span class="cx">     EnabledAtRuntime=PeerConnection,
</span><span class="cx"> ] interface RTCRtpReceiver {
</span><span class="cx">     readonly attribute MediaStreamTrack track;
</span><ins>+    RTCRtpParameters getParameters();
</ins><span class="cx">     // FIXME 169662: missing transport
</span><span class="cx">     // FIXME 169662: missing rtcpTransport
</span><span class="cx">     // FIXME 169662: missing getCapabilities
</span><del>-    // FIXME 169662: missing getParameters
</del><span class="cx">     // FIXME 169662: missing getContributingSources
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpSendercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -37,23 +37,23 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-Ref&lt;RTCRtpSender&gt; RTCRtpSender::create(Ref&lt;MediaStreamTrack&gt;&amp;&amp; track, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, RTCRtpSenderClient&amp; client)
</del><ins>+Ref&lt;RTCRtpSender&gt; RTCRtpSender::create(Ref&lt;MediaStreamTrack&gt;&amp;&amp; track, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, Backend&amp; backend)
</ins><span class="cx"> {
</span><del>-    auto sender = adoptRef(*new RTCRtpSender(String(track-&gt;kind()), WTFMove(mediaStreamIds), client));
</del><ins>+    auto sender = adoptRef(*new RTCRtpSender(String(track-&gt;kind()), WTFMove(mediaStreamIds), backend));
</ins><span class="cx">     sender-&gt;setTrack(WTFMove(track));
</span><span class="cx">     return sender;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;RTCRtpSender&gt; RTCRtpSender::create(String&amp;&amp; trackKind, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, RTCRtpSenderClient&amp; client)
</del><ins>+Ref&lt;RTCRtpSender&gt; RTCRtpSender::create(String&amp;&amp; trackKind, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, Backend&amp; backend)
</ins><span class="cx"> {
</span><del>-    return adoptRef(*new RTCRtpSender(WTFMove(trackKind), WTFMove(mediaStreamIds), client));
</del><ins>+    return adoptRef(*new RTCRtpSender(WTFMove(trackKind), WTFMove(mediaStreamIds), backend));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RTCRtpSender::RTCRtpSender(String&amp;&amp; trackKind, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, RTCRtpSenderClient&amp; client)
</del><ins>+RTCRtpSender::RTCRtpSender(String&amp;&amp; trackKind, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, Backend&amp; backend)
</ins><span class="cx">     : RTCRtpSenderReceiverBase()
</span><span class="cx">     , m_trackKind(WTFMove(trackKind))
</span><span class="cx">     , m_mediaStreamIds(WTFMove(mediaStreamIds))
</span><del>-    , m_client(&amp;client)
</del><ins>+    , m_backend(&amp;backend)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -87,9 +87,16 @@
</span><span class="cx">     if (!withTrack &amp;&amp; m_track)
</span><span class="cx">         m_track-&gt;stopProducingData();
</span><span class="cx"> 
</span><del>-    m_client-&gt;replaceTrack(*this, WTFMove(withTrack), WTFMove(promise));
</del><ins>+    m_backend-&gt;replaceTrack(*this, WTFMove(withTrack), WTFMove(promise));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RTCRtpParameters RTCRtpSender::getParameters()
+{
+    if (isStopped())
+        return { };
+    return m_backend-&gt;getParameters(*this);
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(WEB_RTC)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpSenderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -37,18 +37,18 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class RTCRtpSenderClient {
</del><ins>+class RTCRtpSender : public RTCRtpSenderReceiverBase {
</ins><span class="cx"> public:
</span><del>-    virtual void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;) = 0;
</del><ins>+    class Backend {
+    public:
+        virtual void replaceTrack(RTCRtpSender&amp;, RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;) = 0;
+        virtual RTCRtpParameters getParameters(RTCRtpSender&amp;) const = 0;
+        virtual ~Backend() { }
+    };
</ins><span class="cx"> 
</span><del>-    virtual ~RTCRtpSenderClient() { }
-};
</del><ins>+    static Ref&lt;RTCRtpSender&gt; create(Ref&lt;MediaStreamTrack&gt;&amp;&amp;, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, Backend&amp;);
+    static Ref&lt;RTCRtpSender&gt; create(String&amp;&amp; trackKind, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, Backend&amp;);
</ins><span class="cx"> 
</span><del>-class RTCRtpSender : public RTCRtpSenderReceiverBase {
-public:
-    static Ref&lt;RTCRtpSender&gt; create(Ref&lt;MediaStreamTrack&gt;&amp;&amp;, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, RTCRtpSenderClient&amp;);
-    static Ref&lt;RTCRtpSender&gt; create(String&amp;&amp; trackKind, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, RTCRtpSenderClient&amp;);
-
</del><span class="cx">     const String&amp; trackId() const { return m_trackId; }
</span><span class="cx">     const String&amp; trackKind() const { return m_trackKind; }
</span><span class="cx"> 
</span><span class="lines">@@ -55,20 +55,22 @@
</span><span class="cx">     const Vector&lt;String&gt;&amp; mediaStreamIds() const { return m_mediaStreamIds; }
</span><span class="cx">     void setMediaStreamIds(Vector&lt;String&gt;&amp;&amp; mediaStreamIds) { m_mediaStreamIds = WTFMove(mediaStreamIds); }
</span><span class="cx"> 
</span><del>-    bool isStopped() const { return !m_client; }
-    void stop() { m_client = nullptr; }
</del><ins>+    bool isStopped() const { return !m_backend; }
+    void stop() { m_backend = nullptr; }
</ins><span class="cx">     void setTrack(Ref&lt;MediaStreamTrack&gt;&amp;&amp;);
</span><span class="cx">     void setTrackToNull();
</span><span class="cx"> 
</span><span class="cx">     void replaceTrack(RefPtr&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;);
</span><span class="cx"> 
</span><ins>+    RTCRtpParameters getParameters();
+
</ins><span class="cx"> private:
</span><del>-    RTCRtpSender(String&amp;&amp; trackKind, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, RTCRtpSenderClient&amp;);
</del><ins>+    RTCRtpSender(String&amp;&amp; trackKind, Vector&lt;String&gt;&amp;&amp; mediaStreamIds, Backend&amp;);
</ins><span class="cx"> 
</span><span class="cx">     String m_trackId;
</span><span class="cx">     String m_trackKind;
</span><span class="cx">     Vector&lt;String&gt; m_mediaStreamIds;
</span><del>-    RTCRtpSenderClient* m_client;
</del><ins>+    Backend* m_backend;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCRtpSenderidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -38,6 +38,6 @@
</span><span class="cx">     // FIXME 169662: missing rtcpTransport
</span><span class="cx">     // FIXME 169662: missing getCapabilities
</span><span class="cx">     // FIXME 169662: missing setParameters
</span><del>-    // FIXME 169662: missing getParameters
</del><ins>+    RTCRtpParameters getParameters();
</ins><span class="cx">     Promise&lt;void&gt; replaceTrack(MediaStreamTrack? withTrack);
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamRTCStatsReporth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/RTCStatsReport.h (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/RTCStatsReport.h        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/RTCStatsReport.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -124,7 +124,7 @@
</span><span class="cx">         bool ended { false };
</span><span class="cx">         bool detached { false };
</span><span class="cx">         unsigned long frameWidth { 0 };
</span><del>-        unsigned long frameHeight { 0};
</del><ins>+        unsigned long frameHeight { 0 };
</ins><span class="cx">         double framesPerSecond { 0 };
</span><span class="cx">         unsigned long framesSent { 0 };
</span><span class="cx">         unsigned long framesReceived { 0 };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamlibwebrtcLibWebRTCMediaEndpointcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -160,7 +160,7 @@
</span><span class="cx">     m_backend-&gt;SetRemoteDescription(&amp;m_setRemoteSessionDescriptionObserver, sessionDescription.release());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void LibWebRTCMediaEndpoint::addTrack(MediaStreamTrack&amp; track, const Vector&lt;String&gt;&amp; mediaStreamIds)
</del><ins>+void LibWebRTCMediaEndpoint::addTrack(RTCRtpSender&amp; sender, MediaStreamTrack&amp; track, const Vector&lt;String&gt;&amp; mediaStreamIds)
</ins><span class="cx"> {
</span><span class="cx">     if (!LibWebRTCProvider::factory())
</span><span class="cx">         return;
</span><span class="lines">@@ -178,9 +178,8 @@
</span><span class="cx">     case RealtimeMediaSource::Type::Audio: {
</span><span class="cx">         auto trackSource = RealtimeOutgoingAudioSource::create(source);
</span><span class="cx">         auto audioTrack = LibWebRTCProvider::factory()-&gt;CreateAudioTrack(track.id().utf8().data(), trackSource.ptr());
</span><del>-        trackSource-&gt;setTrack(rtc::scoped_refptr&lt;webrtc::AudioTrackInterface&gt;(audioTrack));
</del><span class="cx">         m_peerConnectionBackend.addAudioSource(WTFMove(trackSource));
</span><del>-        m_backend-&gt;AddTrack(audioTrack.get(), WTFMove(mediaStreams));
</del><ins>+        m_senders.add(&amp;sender, m_backend-&gt;AddTrack(audioTrack.get(), WTFMove(mediaStreams)));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     case RealtimeMediaSource::Type::Video: {
</span><span class="lines">@@ -187,7 +186,7 @@
</span><span class="cx">         auto videoSource = RealtimeOutgoingVideoSource::create(source);
</span><span class="cx">         auto videoTrack = LibWebRTCProvider::factory()-&gt;CreateVideoTrack(track.id().utf8().data(), videoSource.ptr());
</span><span class="cx">         m_peerConnectionBackend.addVideoSource(WTFMove(videoSource));
</span><del>-        m_backend-&gt;AddTrack(videoTrack.get(), WTFMove(mediaStreams));
</del><ins>+        m_senders.add(&amp;sender, m_backend-&gt;AddTrack(videoTrack.get(), WTFMove(mediaStreams)));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     case RealtimeMediaSource::Type::None:
</span><span class="lines">@@ -246,6 +245,7 @@
</span><span class="cx"> static inline void fillRTCRTPStreamStats(RTCStatsReport::RTCRTPStreamStats&amp; stats, const webrtc::RTCRTPStreamStats&amp; rtcStats)
</span><span class="cx"> {
</span><span class="cx">     fillRTCStats(stats, rtcStats);
</span><ins>+
</ins><span class="cx">     if (rtcStats.ssrc.is_defined())
</span><span class="cx">         stats.ssrc = *rtcStats.ssrc;
</span><span class="cx">     if (rtcStats.associate_stats_id.is_defined())
</span><span class="lines">@@ -276,6 +276,7 @@
</span><span class="cx"> static inline void fillInboundRTPStreamStats(RTCStatsReport::InboundRTPStreamStats&amp; stats, const webrtc::RTCInboundRTPStreamStats&amp; rtcStats)
</span><span class="cx"> {
</span><span class="cx">     fillRTCRTPStreamStats(stats, rtcStats);
</span><ins>+
</ins><span class="cx">     if (rtcStats.packets_received.is_defined())
</span><span class="cx">         stats.packetsReceived = *rtcStats.packets_received;
</span><span class="cx">     if (rtcStats.bytes_received.is_defined())
</span><span class="lines">@@ -327,6 +328,7 @@
</span><span class="cx"> static inline void fillRTCMediaStreamTrackStats(RTCStatsReport::MediaStreamTrackStats&amp; stats, const webrtc::RTCMediaStreamTrackStats&amp; rtcStats)
</span><span class="cx"> {
</span><span class="cx">     fillRTCStats(stats, rtcStats);
</span><ins>+
</ins><span class="cx">     if (rtcStats.track_identifier.is_defined())
</span><span class="cx">         stats.trackIdentifier = fromStdString(*rtcStats.track_identifier);
</span><span class="cx">     if (rtcStats.remote_source.is_defined())
</span><span class="lines">@@ -364,7 +366,7 @@
</span><span class="cx"> static inline void fillRTCDataChannelStats(RTCStatsReport::DataChannelStats&amp; stats, const webrtc::RTCDataChannelStats&amp; rtcStats)
</span><span class="cx"> {
</span><span class="cx">     fillRTCStats(stats, rtcStats);
</span><del>-    
</del><ins>+
</ins><span class="cx">     if (rtcStats.label.is_defined())
</span><span class="cx">         stats.label = fromStdString(*rtcStats.label);
</span><span class="cx">     if (rtcStats.protocol.is_defined())
</span><span class="lines">@@ -468,14 +470,25 @@
</span><span class="cx">     m_peerConnectionBackend.connection().fireEvent(MediaStreamEvent::create(eventNames().addstreamEvent, false, false, &amp;mediaStream));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void LibWebRTCMediaEndpoint::addRemoteTrack(const webrtc::RtpReceiverInterface&amp; rtcReceiver, const std::vector&lt;rtc::scoped_refptr&lt;webrtc::MediaStreamInterface&gt;&gt;&amp; rtcStreams)
</del><ins>+class RTCRtpReceiverBackend final : public RTCRtpReceiver::Backend {
+public:
+    explicit RTCRtpReceiverBackend(rtc::scoped_refptr&lt;webrtc::RtpReceiverInterface&gt;&amp;&amp; rtcReceiver) : m_rtcReceiver(WTFMove(rtcReceiver)) { }
+private:
+    RTCRtpParameters getParameters() final;
+
+    rtc::scoped_refptr&lt;webrtc::RtpReceiverInterface&gt; m_rtcReceiver;
+};
+
+
+void LibWebRTCMediaEndpoint::addRemoteTrack(rtc::scoped_refptr&lt;webrtc::RtpReceiverInterface&gt;&amp;&amp; rtcReceiver, const std::vector&lt;rtc::scoped_refptr&lt;webrtc::MediaStreamInterface&gt;&gt;&amp; rtcStreams)
</ins><span class="cx"> {
</span><ins>+    ASSERT(rtcReceiver);
</ins><span class="cx">     RefPtr&lt;RTCRtpReceiver&gt; receiver;
</span><span class="cx">     RefPtr&lt;RealtimeMediaSource&gt; remoteSource;
</span><span class="cx"> 
</span><del>-    auto* rtcTrack = rtcReceiver.track().get();
</del><ins>+    auto* rtcTrack = rtcReceiver-&gt;track().get();
</ins><span class="cx"> 
</span><del>-    switch (rtcReceiver.media_type()) {
</del><ins>+    switch (rtcReceiver-&gt;media_type()) {
</ins><span class="cx">     case cricket::MEDIA_TYPE_DATA:
</span><span class="cx">         return;
</span><span class="cx">     case cricket::MEDIA_TYPE_AUDIO: {
</span><span class="lines">@@ -496,6 +509,8 @@
</span><span class="cx">     }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    receiver-&gt;setBackend(std::make_unique&lt;RTCRtpReceiverBackend&gt;(WTFMove(rtcReceiver)));
+    
</ins><span class="cx">     auto* track = receiver-&gt;track();
</span><span class="cx">     ASSERT(track);
</span><span class="cx"> 
</span><span class="lines">@@ -537,11 +552,10 @@
</span><span class="cx"> 
</span><span class="cx"> void LibWebRTCMediaEndpoint::OnAddTrack(rtc::scoped_refptr&lt;webrtc::RtpReceiverInterface&gt; receiver, const std::vector&lt;rtc::scoped_refptr&lt;webrtc::MediaStreamInterface&gt;&gt;&amp; streams)
</span><span class="cx"> {
</span><del>-    callOnMainThread([protectedThis = makeRef(*this), receiver = WTFMove(receiver), streams] {
</del><ins>+    callOnMainThread([protectedThis = makeRef(*this), receiver = WTFMove(receiver), streams]() mutable {
</ins><span class="cx">         if (protectedThis-&gt;isStopped())
</span><span class="cx">             return;
</span><del>-        ASSERT(receiver);
-        protectedThis-&gt;addRemoteTrack(*receiver, streams);
</del><ins>+        protectedThis-&gt;addRemoteTrack(WTFMove(receiver), streams);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -603,6 +617,7 @@
</span><span class="cx">     m_backend-&gt;Close();
</span><span class="cx">     m_backend = nullptr;
</span><span class="cx">     m_streams.clear();
</span><ins>+    m_senders.clear();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void LibWebRTCMediaEndpoint::OnRenegotiationNeeded()
</span><span class="lines">@@ -750,6 +765,115 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static inline RTCRtpParameters::EncodingParameters fillEncodingParameters(const webrtc::RtpEncodingParameters&amp; rtcParameters)
+{
+    RTCRtpParameters::EncodingParameters parameters;
+
+    if (rtcParameters.ssrc)
+        parameters.ssrc = *rtcParameters.ssrc;
+    if (rtcParameters.rtx &amp;&amp; rtcParameters.rtx-&gt;ssrc)
+        parameters.rtx.ssrc = *rtcParameters.rtx-&gt;ssrc;
+    if (rtcParameters.fec &amp;&amp; rtcParameters.fec-&gt;ssrc)
+        parameters.fec.ssrc = *rtcParameters.fec-&gt;ssrc;
+    if (rtcParameters.dtx) {
+        switch (*rtcParameters.dtx) {
+        case webrtc::DtxStatus::DISABLED:
+            parameters.dtx = RTCRtpParameters::DtxStatus::Disabled;
+            break;
+        case webrtc::DtxStatus::ENABLED:
+            parameters.dtx = RTCRtpParameters::DtxStatus::Enabled;
+        }
+    }
+    parameters.active = rtcParameters.active;
+    if (rtcParameters.priority) {
+        switch (*rtcParameters.priority) {
+        case webrtc::PriorityType::VERY_LOW:
+            parameters.priority = RTCRtpParameters::PriorityType::VeryLow;
+            break;
+        case webrtc::PriorityType::LOW:
+            parameters.priority = RTCRtpParameters::PriorityType::Low;
+            break;
+        case webrtc::PriorityType::MEDIUM:
+            parameters.priority = RTCRtpParameters::PriorityType::Medium;
+            break;
+        case webrtc::PriorityType::HIGH:
+            parameters.priority = RTCRtpParameters::PriorityType::High;
+            break;
+        }
+    }
+    if (rtcParameters.max_bitrate_bps)
+        parameters.maxBitrate = *rtcParameters.max_bitrate_bps;
+    if (rtcParameters.max_framerate)
+        parameters.maxFramerate = *rtcParameters.max_framerate;
+    parameters.rid = fromStdString(rtcParameters.rid);
+    parameters.scaleResolutionDownBy = rtcParameters.scale_resolution_down_by;
+
+    return parameters;
+}
+
+static inline RTCRtpParameters::HeaderExtensionParameters fillHeaderExtensionParameters(const webrtc::RtpHeaderExtensionParameters&amp; rtcParameters)
+{
+    RTCRtpParameters::HeaderExtensionParameters parameters;
+
+    parameters.uri = fromStdString(rtcParameters.uri);
+    parameters.id = rtcParameters.id;
+
+    return parameters;
+}
+
+static inline RTCRtpParameters::CodecParameters fillCodecParameters(const webrtc::RtpCodecParameters&amp; rtcParameters)
+{
+    RTCRtpParameters::CodecParameters parameters;
+
+    parameters.payloadType = rtcParameters.payload_type;
+    parameters.mimeType = fromStdString(rtcParameters.mime_type());
+    if (rtcParameters.clock_rate)
+        parameters.clockRate = *rtcParameters.clock_rate;
+    if (rtcParameters.num_channels)
+        parameters.channels = *rtcParameters.num_channels;
+
+    return parameters;
+}
+
+static RTCRtpParameters fillRtpParameters(const webrtc::RtpParameters rtcParameters)
+{
+    RTCRtpParameters parameters;
+
+    parameters.transactionId = fromStdString(rtcParameters.transaction_id);
+    for (auto&amp; rtcEncoding : rtcParameters.encodings)
+        parameters.encodings.append(fillEncodingParameters(rtcEncoding));
+    for (auto&amp; extension : rtcParameters.header_extensions)
+        parameters.headerExtensions.append(fillHeaderExtensionParameters(extension));
+    for (auto&amp; codec : rtcParameters.codecs)
+        parameters.codecs.append(fillCodecParameters(codec));
+
+    switch (rtcParameters.degradation_preference) {
+    case webrtc::DegradationPreference::MAINTAIN_FRAMERATE:
+        parameters.degradationPreference = RTCRtpParameters::DegradationPreference::MaintainFramerate;
+        break;
+    case webrtc::DegradationPreference::MAINTAIN_RESOLUTION:
+        parameters.degradationPreference = RTCRtpParameters::DegradationPreference::MaintainResolution;
+        break;
+    case webrtc::DegradationPreference::BALANCED:
+        parameters.degradationPreference = RTCRtpParameters::DegradationPreference::Balanced;
+        break;
+    };
+    return parameters;
+}
+
+RTCRtpParameters RTCRtpReceiverBackend::getParameters()
+{
+    return fillRtpParameters(m_rtcReceiver-&gt;GetParameters());
+}
+
+RTCRtpParameters LibWebRTCMediaEndpoint::getRTCRtpSenderParameters(RTCRtpSender&amp; sender)
+{
+    auto rtcSender = m_senders.get(&amp;sender);
+    if (!rtcSender)
+        return { };
+    return fillRtpParameters(rtcSender-&gt;GetParameters());
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // USE(LIBWEBRTC)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamlibwebrtcLibWebRTCMediaEndpointh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;LibWebRTCProvider.h&quot;
</span><span class="cx"> #include &quot;PeerConnectionBackend.h&quot;
</span><ins>+#include &quot;RTCRtpReceiver.h&quot;
</ins><span class="cx"> #include &quot;RealtimeOutgoingAudioSource.h&quot;
</span><span class="cx"> #include &quot;RealtimeOutgoingVideoSource.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -79,7 +80,8 @@
</span><span class="cx">     RefPtr&lt;RTCSessionDescription&gt; pendingLocalDescription() const;
</span><span class="cx">     RefPtr&lt;RTCSessionDescription&gt; pendingRemoteDescription() const;
</span><span class="cx"> 
</span><del>-    void addTrack(MediaStreamTrack&amp;, const Vector&lt;String&gt;&amp;);
</del><ins>+    void addTrack(RTCRtpSender&amp;, MediaStreamTrack&amp;, const Vector&lt;String&gt;&amp;);
+    RTCRtpParameters getRTCRtpSenderParameters(RTCRtpSender&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     LibWebRTCMediaEndpoint(LibWebRTCPeerConnectionBackend&amp;, LibWebRTCProvider&amp;);
</span><span class="lines">@@ -103,7 +105,7 @@
</span><span class="cx">     void setRemoteSessionDescriptionSucceeded();
</span><span class="cx">     void setRemoteSessionDescriptionFailed(const std::string&amp;);
</span><span class="cx">     void addRemoteStream(webrtc::MediaStreamInterface&amp;);
</span><del>-    void addRemoteTrack(const webrtc::RtpReceiverInterface&amp;, const std::vector&lt;rtc::scoped_refptr&lt;webrtc::MediaStreamInterface&gt;&gt;&amp;);
</del><ins>+    void addRemoteTrack(rtc::scoped_refptr&lt;webrtc::RtpReceiverInterface&gt;&amp;&amp;, const std::vector&lt;rtc::scoped_refptr&lt;webrtc::MediaStreamInterface&gt;&gt;&amp;);
</ins><span class="cx">     void removeRemoteStream(webrtc::MediaStreamInterface&amp;);
</span><span class="cx">     void addDataChannel(rtc::scoped_refptr&lt;webrtc::DataChannelInterface&gt;&amp;&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -175,6 +177,7 @@
</span><span class="cx">     SetLocalSessionDescriptionObserver m_setLocalSessionDescriptionObserver;
</span><span class="cx">     SetRemoteSessionDescriptionObserver m_setRemoteSessionDescriptionObserver;
</span><span class="cx">     HashMap&lt;webrtc::MediaStreamInterface*, MediaStream*&gt; m_streams;
</span><ins>+    HashMap&lt;RTCRtpSender*, rtc::scoped_refptr&lt;webrtc::RtpSenderInterface&gt;&gt; m_senders;
</ins><span class="cx"> 
</span><span class="cx">     bool m_isInitiator { false };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamlibwebrtcLibWebRTCPeerConnectionBackendcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -307,7 +307,7 @@
</span><span class="cx"> void LibWebRTCPeerConnectionBackend::notifyAddedTrack(RTCRtpSender&amp; sender)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(sender.track());
</span><del>-    m_endpoint-&gt;addTrack(*sender.track(), sender.mediaStreamIds());
</del><ins>+    m_endpoint-&gt;addTrack(sender, *sender.track(), sender.mediaStreamIds());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void LibWebRTCPeerConnectionBackend::removeRemoteStream(MediaStream* mediaStream)
</span><span class="lines">@@ -364,6 +364,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RTCRtpParameters LibWebRTCPeerConnectionBackend::getParameters(RTCRtpSender&amp; sender) const
+{
+    return m_endpoint-&gt;getRTCRtpSenderParameters(sender);
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // USE(LIBWEBRTC)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamlibwebrtcLibWebRTCPeerConnectionBackendh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -70,6 +70,7 @@
</span><span class="cx">     RefPtr&lt;RTCSessionDescription&gt; pendingRemoteDescription() const final;
</span><span class="cx"> 
</span><span class="cx">     void replaceTrack(RTCRtpSender&amp;, Ref&lt;MediaStreamTrack&gt;&amp;&amp;, DOMPromise&lt;void&gt;&amp;&amp;) final;
</span><ins>+    RTCRtpParameters getParameters(RTCRtpSender&amp;) const final;
</ins><span class="cx"> 
</span><span class="cx">     void emulatePlatformEvent(const String&amp;) final { }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -2710,6 +2710,8 @@
</span><span class="cx">                 5E2C43711BCF0D750001E2BD /* JSRTCRtpTransceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E2C436D1BCF0D690001E2BD /* JSRTCRtpTransceiver.cpp */; };
</span><span class="cx">                 5E2C43721BCF0D750001E2BC /* JSRTCRtpReceiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E2C436E1BCF0D690001E2BC /* JSRTCRtpReceiver.h */; };
</span><span class="cx">                 5E2C43721BCF0D750001E2BD /* JSRTCRtpTransceiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E2C436E1BCF0D690001E2BD /* JSRTCRtpTransceiver.h */; };
</span><ins>+                5E2C43731BCF0D750001E2BE /* JSRTCRtpParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E2C436F1BCF0D690001E2BE /* JSRTCRtpParameters.cpp */; };
+                5E2C43741BCF0D750001E2BE /* JSRTCRtpParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E2C43701BCF0D690001E2BE /* JSRTCRtpParameters.h */; };
</ins><span class="cx">                 5E2C43731BCF0D750001E2BC /* JSRTCRtpSender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E2C436F1BCF0D690001E2BC /* JSRTCRtpSender.cpp */; };
</span><span class="cx">                 5E2C43741BCF0D750001E2BC /* JSRTCRtpSender.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E2C43701BCF0D690001E2BC /* JSRTCRtpSender.h */; };
</span><span class="cx">                 5E2C437B1BCF9A570001E2BC /* RTCPeerConnectionBuiltins.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E2C43761BCF9A0B0001E2BC /* RTCPeerConnectionBuiltins.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -9332,6 +9334,8 @@
</span><span class="cx">                 41A3D58D101C152D00316D07 /* DedicatedWorkerThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DedicatedWorkerThread.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 41A48A9C1E83129100D2AC2D /* RTCPeerConnectionState.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RTCPeerConnectionState.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 41A48A9D1E8312EB00D2AC2D /* RTCPeerConnectionState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCPeerConnectionState.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                41A48AA71E84AEEC00D2AC2D /* RTCRtpParameters.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RTCRtpParameters.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
+                41A48AA81E84AF1D00D2AC2D /* RTCRtpParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCRtpParameters.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 41ABE6791D0580D5006D862D /* CrossOriginPreflightChecker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CrossOriginPreflightChecker.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 41ABE67A1D0580D5006D862D /* CrossOriginPreflightChecker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrossOriginPreflightChecker.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 41AD75391CEF6BCE00A31486 /* FetchOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchOptions.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -10422,6 +10426,8 @@
</span><span class="cx">                 5E2C436E1BCF0D690001E2BD /* JSRTCRtpTransceiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSRTCRtpTransceiver.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5E2C436F1BCF0D690001E2BC /* JSRTCRtpSender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSRTCRtpSender.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5E2C43701BCF0D690001E2BC /* JSRTCRtpSender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSRTCRtpSender.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                5E2C436F1BCF0D690001E2BE /* JSRTCRtpParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSRTCRtpParameters.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5E2C43701BCF0D690001E2BE /* JSRTCRtpParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSRTCRtpParameters.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 5E2C43751BCF9A0B0001E2BC /* RTCPeerConnectionBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCPeerConnectionBuiltins.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5E2C43761BCF9A0B0001E2BC /* RTCPeerConnectionBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCPeerConnectionBuiltins.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5E2C43781BCF9A0B0001E2BC /* RTCPeerConnectionInternalsBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCPeerConnectionInternalsBuiltins.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -15958,6 +15964,8 @@
</span><span class="cx">                                 07221B7917CEC32700848E51 /* RTCPeerConnection.idl */,
</span><span class="cx">                                 5E2C43541BCEE30D0001E2BC /* RTCPeerConnection.js */,
</span><span class="cx">                                 5E2C43551BCEE30D0001E2BC /* RTCPeerConnectionInternals.js */,
</span><ins>+                                41A48AA71E84AEEC00D2AC2D /* RTCRtpParameters.idl */,
+                                41A48AA81E84AF1D00D2AC2D /* RTCRtpParameters.h */,
</ins><span class="cx">                                 5E2C43561BCEE30D0001E2BC /* RTCRtpReceiver.cpp */,
</span><span class="cx">                                 5E2C43571BCEE30D0001E2BC /* RTCRtpReceiver.h */,
</span><span class="cx">                                 5E2C43581BCEE30D0001E2BC /* RTCRtpReceiver.idl */,
</span><span class="lines">@@ -16196,6 +16204,8 @@
</span><span class="cx">                                 07969DA017D14151007FF842 /* JSRTCPeerConnection.h */,
</span><span class="cx">                                 5E2C436D1BCF0D690001E2BC /* JSRTCRtpReceiver.cpp */,
</span><span class="cx">                                 5E2C436E1BCF0D690001E2BC /* JSRTCRtpReceiver.h */,
</span><ins>+                                5E2C436F1BCF0D690001E2BE /* JSRTCRtpParameters.cpp */,
+                                5E2C43701BCF0D690001E2BE /* JSRTCRtpParameters.h */,
</ins><span class="cx">                                 5E2C436F1BCF0D690001E2BC /* JSRTCRtpSender.cpp */,
</span><span class="cx">                                 5E2C43701BCF0D690001E2BC /* JSRTCRtpSender.h */,
</span><span class="cx">                                 5E2C436D1BCF0D690001E2BD /* JSRTCRtpTransceiver.cpp */,
</span><span class="lines">@@ -27856,6 +27866,7 @@
</span><span class="cx">                                 07969DBA17D14151007FF842 /* JSRTCPeerConnection.h in Headers */,
</span><span class="cx">                                 5E2C43721BCF0D750001E2BC /* JSRTCRtpReceiver.h in Headers */,
</span><span class="cx">                                 5E2C43741BCF0D750001E2BC /* JSRTCRtpSender.h in Headers */,
</span><ins>+                                5E2C43741BCF0D750001E2BE /* JSRTCRtpParameters.h in Headers */,
</ins><span class="cx">                                 5E2C43721BCF0D750001E2BD /* JSRTCRtpTransceiver.h in Headers */,
</span><span class="cx">                                 07969DBC17D14151007FF842 /* JSRTCSessionDescription.h in Headers */,
</span><span class="cx">                                 07969DC217D14151007FF842 /* JSRTCStatsReport.h in Headers */,
</span><span class="lines">@@ -31822,6 +31833,7 @@
</span><span class="cx">                                 07969DB917D14151007FF842 /* JSRTCPeerConnection.cpp in Sources */,
</span><span class="cx">                                 5E2C43711BCF0D750001E2BC /* JSRTCRtpReceiver.cpp in Sources */,
</span><span class="cx">                                 5E2C43731BCF0D750001E2BC /* JSRTCRtpSender.cpp in Sources */,
</span><ins>+                                5E2C43731BCF0D750001E2BE /* JSRTCRtpParameters.cpp in Sources */,
</ins><span class="cx">                                 5E2C43711BCF0D750001E2BD /* JSRTCRtpTransceiver.cpp in Sources */,
</span><span class="cx">                                 07969DBB17D14151007FF842 /* JSRTCSessionDescription.cpp in Sources */,
</span><span class="cx">                                 07969DC117D14151007FF842 /* JSRTCStatsReport.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacRealtimeOutgoingAudioSourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.h (214419 => 214420)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.h        2017-03-27 17:50:33 UTC (rev 214419)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSource.h        2017-03-27 18:10:45 UTC (rev 214420)
</span><span class="lines">@@ -48,7 +48,6 @@
</span><span class="cx">     static Ref&lt;RealtimeOutgoingAudioSource&gt; create(Ref&lt;RealtimeMediaSource&gt;&amp;&amp; audioSource) { return adoptRef(*new RealtimeOutgoingAudioSource(WTFMove(audioSource))); }
</span><span class="cx">     ~RealtimeOutgoingAudioSource() { stop(); }
</span><span class="cx"> 
</span><del>-    void setTrack(rtc::scoped_refptr&lt;webrtc::AudioTrackInterface&gt;&amp;&amp; track) { m_track = WTFMove(track); }
</del><span class="cx">     void stop();
</span><span class="cx"> 
</span><span class="cx">     bool setSource(Ref&lt;RealtimeMediaSource&gt;&amp;&amp;);
</span><span class="lines">@@ -76,7 +75,6 @@
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;webrtc::AudioTrackSinkInterface*&gt; m_sinks;
</span><span class="cx">     Ref&lt;RealtimeMediaSource&gt; m_audioSource;
</span><del>-    rtc::scoped_refptr&lt;webrtc::AudioTrackInterface&gt; m_track;
</del><span class="cx">     Ref&lt;AudioSampleDataSource&gt; m_sampleConverter;
</span><span class="cx">     CAAudioStreamDescription m_inputStreamDescription;
</span><span class="cx">     CAAudioStreamDescription m_outputStreamDescription;
</span></span></pre>
</div>
</div>

</body>
</html>