WebKit Bugzilla
Attachment 349044 Details for
Bug 189359
: Move replaceTrack logic to RTCRtpSender backend
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-189359-20180906104711.patch (text/plain), 12.49 KB, created by
youenn fablet
on 2018-09-06 10:47:11 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2018-09-06 10:47:11 PDT
Size:
12.49 KB
patch
obsolete
>Subversion Revision: 235737 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 8ebfd969209773286cee0f85efbe970b23e299d8..9d731832b250d4f529967676fce0703d957d870d 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,28 @@ >+2018-09-06 Youenn Fablet <youenn@apple.com> >+ >+ Move replaceTrack logic to RTCRtpSender backend >+ https://bugs.webkit.org/show_bug.cgi?id=189359 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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 Ali Juma <ajuma@chromium.org> > > IntersectionObserver leaks documents >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp b/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp >index 2b5b3c605926f73a7fc26e2a17b00672f23fbd3a..75839e19e52a0550525e0cd0d586a761ceb22f36 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp >+++ b/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp >@@ -77,7 +77,7 @@ void RTCRtpSender::setTrack(Ref<MediaStreamTrack>&& track) > 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 @@ void RTCRtpSender::replaceTrack(RefPtr<MediaStreamTrack>&& withTrack, DOMPromise > return; > } > >- m_backend->replaceTrack(*this, WTFMove(withTrack), WTFMove(promise)); >+ m_backend->replaceTrack(context, *this, WTFMove(withTrack), WTFMove(promise)); > } > > RTCRtpParameters RTCRtpSender::getParameters() >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpSender.h b/Source/WebCore/Modules/mediastream/RTCRtpSender.h >index 45b89014461b10be3b0b2183239eca7a9aa041ee..8c2679102bce82110549f8b6981f29e865f6f2bf 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpSender.h >+++ b/Source/WebCore/Modules/mediastream/RTCRtpSender.h >@@ -54,7 +54,7 @@ public: > 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>&&); >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpSender.idl b/Source/WebCore/Modules/mediastream/RTCRtpSender.idl >index c8dcd97ed2708b180493793036b6d48a3bd285e3..efc42529adb308a65027e98d12cc89e87f99571c 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpSender.idl >+++ b/Source/WebCore/Modules/mediastream/RTCRtpSender.idl >@@ -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); > }; >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h b/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h >index 4ad09ecaf43b04132599ffb1ff82bd16324206df..6812936df5f5e4b607cea4a7a3d2a18ce86a6221 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h >+++ b/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h >@@ -33,10 +33,11 @@ namespace WebCore { > > 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; >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >index c75cb49ea5c1111c8c2c24b9df522ea5f1b92b91..50824599bd207174dee176d9f9831294a3ff01b6 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >@@ -383,58 +383,6 @@ static inline bool updateTrackSource(Source& source, MediaStreamTrack* track) > 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()) { >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h >index c1926b74fcd835476b0e91f48d0457813cd94822..d376f0ec178eef99f804a5c24198b76ddad8dd34 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h >@@ -106,7 +106,6 @@ private: > > 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; >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp >index 9371820034757a6793df3a66a6bf3540d2d8b257..ad96b1fccef776375bc3c68f5f1e6b57108e73f4 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp >@@ -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 >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h >index 66927f96451d51e1640160768f6a7fdb3af2ab0f..9dff4aa9a167776fd6b060f1a31e0eef08b82ff9 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h >@@ -92,7 +92,7 @@ public: > } > > 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; >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 189359
: 349044 |
349065