Title: [235757] trunk/Source/WebCore
Revision
235757
Author
you...@apple.com
Date
2018-09-06 14:14:07 -0700 (Thu, 06 Sep 2018)

Log Message

Move replaceTrack logic to RTCRtpSender backend
https://bugs.webkit.org/show_bug.cgi?id=189359

Reviewed by Eric Carlson.

Move replaceTrack handling from LibWebRTCPeerConnectionBackend to LibWebRTCRtpSenderBackend.
This will allow using SetTrack when fully implementing unified plan.
No change of behavior.

* Modules/mediastream/RTCRtpSender.cpp:
(WebCore::RTCRtpSender::replaceTrack):
* Modules/mediastream/RTCRtpSender.h:
* Modules/mediastream/RTCRtpSender.idl:
* Modules/mediastream/RTCRtpSenderBackend.h:
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
(WebCore::LibWebRTCPeerConnectionBackend::replaceTrack): Deleted.
(WebCore::LibWebRTCPeerConnectionBackend::enqueueReplaceTrackTask): Deleted.
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
* Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp:
(WebCore::updateTrackSource):
(WebCore::LibWebRTCRtpSenderBackend::replaceTrack):
* Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (235756 => 235757)


--- trunk/Source/WebCore/ChangeLog	2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/ChangeLog	2018-09-06 21:14:07 UTC (rev 235757)
@@ -1,3 +1,28 @@
+2018-09-06  Youenn Fablet  <you...@apple.com>
+
+        Move replaceTrack logic to RTCRtpSender backend
+        https://bugs.webkit.org/show_bug.cgi?id=189359
+
+        Reviewed by Eric Carlson.
+
+        Move replaceTrack handling from LibWebRTCPeerConnectionBackend to LibWebRTCRtpSenderBackend.
+        This will allow using SetTrack when fully implementing unified plan.
+        No change of behavior.
+
+        * Modules/mediastream/RTCRtpSender.cpp:
+        (WebCore::RTCRtpSender::replaceTrack):
+        * Modules/mediastream/RTCRtpSender.h:
+        * Modules/mediastream/RTCRtpSender.idl:
+        * Modules/mediastream/RTCRtpSenderBackend.h:
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+        (WebCore::LibWebRTCPeerConnectionBackend::replaceTrack): Deleted.
+        (WebCore::LibWebRTCPeerConnectionBackend::enqueueReplaceTrackTask): Deleted.
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+        * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp:
+        (WebCore::updateTrackSource):
+        (WebCore::LibWebRTCRtpSenderBackend::replaceTrack):
+        * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h:
+
 2018-09-06  Andy Estes  <aes...@apple.com>
 
         [Apple Pay] Rename the -apple-pay-button-type value "checkout" to "check-out"

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp (235756 => 235757)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp	2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp	2018-09-06 21:14:07 UTC (rev 235757)
@@ -77,7 +77,7 @@
     m_track = WTFMove(track);
 }
 
-void RTCRtpSender::replaceTrack(RefPtr<MediaStreamTrack>&& withTrack, DOMPromiseDeferred<void>&& promise)
+void RTCRtpSender::replaceTrack(ScriptExecutionContext& context, RefPtr<MediaStreamTrack>&& withTrack, DOMPromiseDeferred<void>&& promise)
 {
     if (isStopped()) {
         promise.reject(InvalidStateError);
@@ -89,7 +89,7 @@
         return;
     }
 
-    m_backend->replaceTrack(*this, WTFMove(withTrack), WTFMove(promise));
+    m_backend->replaceTrack(context, *this, WTFMove(withTrack), WTFMove(promise));
 }
 
 RTCRtpParameters RTCRtpSender::getParameters()

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h (235756 => 235757)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h	2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h	2018-09-06 21:14:07 UTC (rev 235757)
@@ -54,7 +54,7 @@
     void setTrack(Ref<MediaStreamTrack>&&);
     void setTrackToNull();
 
-    void replaceTrack(RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
+    void replaceTrack(ScriptExecutionContext&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
 
     RTCRtpParameters getParameters();
     void setParameters(const RTCRtpParameters&, DOMPromiseDeferred<void>&&);

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl (235756 => 235757)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl	2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl	2018-09-06 21:14:07 UTC (rev 235757)
@@ -40,5 +40,5 @@
     // FIXME 169662: missing setStreams
     RTCRtpParameters getParameters();
     Promise<void> setParameters(RTCRtpParameters parameters);
-    Promise<void> replaceTrack(MediaStreamTrack? withTrack);
+    [CallWith=ScriptExecutionContext] Promise<void> replaceTrack(MediaStreamTrack? withTrack);
 };

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h (235756 => 235757)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h	2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h	2018-09-06 21:14:07 UTC (rev 235757)
@@ -33,10 +33,11 @@
 
 class MediaStreamTrack;
 class RTCRtpSender;
+class ScriptExecutionContext;
 
 class RTCRtpSenderBackend {
 public:
-    virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0;
+    virtual void replaceTrack(ScriptExecutionContext&, RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0;
     virtual RTCRtpParameters getParameters() const = 0;
     virtual void setParameters(const RTCRtpParameters&, DOMPromiseDeferred<void>&&) = 0;
     virtual ~RTCRtpSenderBackend() = default;

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (235756 => 235757)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2018-09-06 21:14:07 UTC (rev 235757)
@@ -383,58 +383,6 @@
     return source.setSource(track->privateTrack());
 }
 
-void LibWebRTCPeerConnectionBackend::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& track, DOMPromiseDeferred<void>&& promise)
-{
-    auto* currentTrack = sender.track();
-
-    ASSERT(!track || !currentTrack || currentTrack->source().type() == track->source().type());
-    if (currentTrack) {
-        switch (currentTrack->source().type()) {
-        case RealtimeMediaSource::Type::None:
-            ASSERT_NOT_REACHED();
-            promise.reject(InvalidModificationError);
-            break;
-        case RealtimeMediaSource::Type::Audio:
-            if (!updateTrackSource(*backendFromRTPSender(sender).audioSource(), track.get())) {
-                promise.reject(InvalidModificationError);
-                return;
-            }
-            break;
-        case RealtimeMediaSource::Type::Video:
-            if (!updateTrackSource(*backendFromRTPSender(sender).videoSource(), track.get())) {
-                promise.reject(InvalidModificationError);
-                return;
-            }
-            break;
-        }
-    }
-    enqueueReplaceTrackTask(sender, WTFMove(track), WTFMove(promise));
-}
-
-void LibWebRTCPeerConnectionBackend::enqueueReplaceTrackTask(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& withTrack, DOMPromiseDeferred<void>&& promise)
-{
-    m_peerConnection.scriptExecutionContext()->postTask([protectedConnection = makeRef(m_peerConnection), protectedSender = makeRef(sender), promise = WTFMove(promise), withTrack = WTFMove(withTrack), this](ScriptExecutionContext&) mutable {
-        if (protectedConnection->isClosed())
-            return;
-
-        if (!withTrack) {
-            protectedSender->setTrackToNull();
-            promise.resolve();
-            return;
-        }
-
-        bool hasTrack = protectedSender->track();
-        protectedSender->setTrack(withTrack.releaseNonNull());
-        if (!hasTrack) {
-            if (!m_endpoint->addTrack(backendFromRTPSender(protectedSender), *protectedSender->track(), { })) {
-                promise.reject(Exception { TypeError, "Unable to add track"_s });
-                return;
-            }
-        }
-        promise.resolve();
-    });
-}
-
 void LibWebRTCPeerConnectionBackend::applyRotationForOutgoingVideoSources()
 {
     for (auto& transceiver : m_peerConnection.getTransceivers()) {

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h (235756 => 235757)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h	2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h	2018-09-06 21:14:07 UTC (rev 235757)
@@ -106,7 +106,6 @@
 
     Ref<RTCRtpTransceiver> completeAddTransceiver(Ref<RTCRtpSender>&&, const RTCRtpTransceiverInit&, const String& trackId, const String& trackKind);
 
-    void enqueueReplaceTrackTask(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
     Ref<RTCRtpReceiver> createReceiver(const String& trackKind, const String& trackId);
 
     Ref<LibWebRTCMediaEndpoint> m_endpoint;

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp (235756 => 235757)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp	2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp	2018-09-06 21:14:07 UTC (rev 235757)
@@ -31,17 +31,73 @@
 #include "LibWebRTCUtils.h"
 #include "RTCPeerConnection.h"
 #include "RTCRtpSender.h"
+#include "ScriptExecutionContext.h"
 
 namespace WebCore {
 
-void LibWebRTCRtpSenderBackend::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& track, DOMPromiseDeferred<void>&& promise)
+template<typename Source>
+static inline bool updateTrackSource(Source& source, MediaStreamTrack* track)
 {
+    if (!track) {
+        source.stop();
+        return true;
+    }
+    return source.setSource(track->privateTrack());
+}
+
+void LibWebRTCRtpSenderBackend::replaceTrack(ScriptExecutionContext& context, RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& track, DOMPromiseDeferred<void>&& promise)
+{
     if (!m_peerConnectionBackend) {
         promise.reject(Exception { InvalidStateError, "No WebRTC backend"_s });
         return;
     }
 
-    m_peerConnectionBackend->replaceTrack(sender, WTFMove(track), WTFMove(promise));
+    auto* currentTrack = sender.track();
+
+    ASSERT(!track || !currentTrack || currentTrack->source().type() == track->source().type());
+    if (currentTrack) {
+    switch (currentTrack->source().type()) {
+    case RealtimeMediaSource::Type::None:
+        ASSERT_NOT_REACHED();
+        promise.reject(InvalidModificationError);
+        break;
+    case RealtimeMediaSource::Type::Audio:
+        if (!updateTrackSource(*audioSource(), track.get())) {
+            promise.reject(InvalidModificationError);
+            return;
+        }
+        break;
+    case RealtimeMediaSource::Type::Video:
+        if (!updateTrackSource(*videoSource(), track.get())) {
+            promise.reject(InvalidModificationError);
+            return;
+        }
+        break;
+    }
+    }
+
+    context.postTask([protectedSender = makeRef(sender), promise = WTFMove(promise), track = WTFMove(track), this](ScriptExecutionContext&) mutable {
+        if (protectedSender->isStopped())
+            return;
+
+        if (!track) {
+            protectedSender->setTrackToNull();
+            promise.resolve();
+            return;
+        }
+
+        bool hasTrack = protectedSender->track();
+        protectedSender->setTrack(track.releaseNonNull());
+        if (!hasTrack) {
+            // FIXME: In case of unified plan, we should use m_rtcSender->SetTrack and no longer need m_peerConnectionBackend.
+            auto result = m_peerConnectionBackend->addTrack(protectedSender.ptr(), *protectedSender->track(), { });
+            if (result.hasException()) {
+                promise.reject(result.releaseException());
+                return;
+            }
+        }
+        promise.resolve();
+    });
 }
 
 RTCRtpParameters LibWebRTCRtpSenderBackend::getParameters() const

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h (235756 => 235757)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h	2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h	2018-09-06 21:14:07 UTC (rev 235757)
@@ -92,7 +92,7 @@
     }
 
 private:
-    void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) final;
+    void replaceTrack(ScriptExecutionContext&, RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) final;
     RTCRtpParameters getParameters() const final;
     void setParameters(const RTCRtpParameters&, DOMPromiseDeferred<void>&&) final;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to