WebKit Bugzilla
Attachment 349915 Details for
Bug 176281
: track.onmute isn't called for a remote MediaStreamTrack when its counter part track is removed from the peer connection
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-176281-20180917113022.patch (text/plain), 9.71 KB, created by
youenn fablet
on 2018-09-17 11:30:22 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2018-09-17 11:30:22 PDT
Size:
9.71 KB
patch
obsolete
>Subversion Revision: 236064 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 7c460113fcc6ec4210989614ed31fb8bc0757b6c..100bc5d51a9afbd19c37b87bf4b5d79b74bbac7d 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,25 @@ >+2018-09-17 Youenn Fablet <youenn@apple.com> >+ >+ track.onmute isn't called for a remote MediaStreamTrack when its counter part track is removed from the peer connection >+ https://bugs.webkit.org/show_bug.cgi?id=176281 >+ <rdar://problem/44525674> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Listen to libwebrtc remove track callbacks. >+ Implement handling as per https://w3c.github.io/webrtc-pc/#process-remote-track-removal. >+ This triggers a mute event on the track. >+ >+ Test: webrtc/remove-track.html >+ >+ * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp: >+ (WebCore::LibWebRTCMediaEndpoint::removeRemoteTrack): >+ (WebCore::LibWebRTCMediaEndpoint::OnRemoveTrack): >+ * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h: >+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp: >+ (WebCore::LibWebRTCPeerConnectionBackend::shouldOfferAllowToReceive const): >+ Drive by fix: Plan B code path does not mandate having an rtc backend for each sender. >+ > 2018-09-17 Youenn Fablet <youenn@apple.com> > > Enable VCP for iOS and reenable it for MacOS >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp >index 8535d2b72bc16e67fe1d0f95252cacf738deb202..b25b564f2be71ae2ea5db0e9d39fbdfdb8e07e28 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp >@@ -445,6 +445,22 @@ void LibWebRTCMediaEndpoint::newTransceiver(rtc::scoped_refptr<webrtc::RtpTransc > fireTrackEvent(makeRef(newTransceiver.receiver()), newTransceiver.receiver().track(), rtcReceiver->streams(), makeRef(newTransceiver)); > } > >+void LibWebRTCMediaEndpoint::removeRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&& receiver) >+{ >+ // FIXME: Support plan B code path. >+ if (!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()) >+ return; >+ >+ auto* transceiver = m_peerConnectionBackend.existingTransceiver([&receiver](auto& transceiverBackend) { >+ auto* rtcTransceiver = transceiverBackend.rtcTransceiver(); >+ return rtcTransceiver && receiver.get() == rtcTransceiver->receiver().get(); >+ }); >+ if (!transceiver) >+ return; >+ >+ transceiver->receiver().track().source().setMuted(true); >+} >+ > template<typename T> > std::optional<LibWebRTCMediaEndpoint::Backends> LibWebRTCMediaEndpoint::createTransceiverBackends(T&& trackOrKind, const RTCRtpTransceiverInit& init, LibWebRTCRtpSenderBackend::Source&& source) > { >@@ -546,6 +562,14 @@ void LibWebRTCMediaEndpoint::OnTrack(rtc::scoped_refptr<webrtc::RtpTransceiverIn > }); > } > >+void LibWebRTCMediaEndpoint::OnRemoveTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver) >+{ >+ callOnMainThread([protectedThis = makeRef(*this), receiver = WTFMove(receiver)]() mutable { >+ if (protectedThis->isStopped()) >+ return; >+ protectedThis->removeRemoteTrack(WTFMove(receiver)); >+ }); >+} > > std::unique_ptr<RTCDataChannelHandler> LibWebRTCMediaEndpoint::createDataChannel(const String& label, const RTCDataChannelInit& options) > { >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h >index 5806a830582d50da7bc61a6441d80e5c65422ef4..177e7aa143f67d9c26975170e785c43640dc39cd 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h >@@ -118,6 +118,7 @@ private: > void OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface>) final; > void OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&) final; > void OnTrack(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>) final; >+ void OnRemoveTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>) final; > > void OnRenegotiationNeeded() final; > void OnIceConnectionChange(webrtc::PeerConnectionInterface::IceConnectionState) final; >@@ -135,6 +136,7 @@ private: > void addRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&&, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&); > void removeRemoteStream(webrtc::MediaStreamInterface&); > void newTransceiver(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>&&); >+ void removeRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&&); > > void fireTrackEvent(Ref<RTCRtpReceiver>&&, Ref<MediaStreamTrack>&&, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&, RefPtr<RTCRtpTransceiver>&&); > >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >index c21d26bb0ca82ce605da48c11498802182b60121..3c4f99a5b32f6fafd8af3542c4eabe2be0134978 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >@@ -486,8 +486,8 @@ bool LibWebRTCPeerConnectionBackend::shouldOfferAllowToReceive(const char* kind) > if (transceiver->direction() != RTCRtpTransceiverDirection::Sendrecv) > continue; > >- auto& backend = static_cast<LibWebRTCRtpSenderBackend&>(*transceiver->sender().backend()); >- if (!backend.rtcSender()) >+ auto* backend = static_cast<LibWebRTCRtpSenderBackend*>(transceiver->sender().backend()); >+ if (backend && !backend->rtcSender()) > return true; > } > return false; >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index b3d9e0e4a77d9051201318ef18a39af0f82253c8..3edb1a8f4f955f313f8565ea570824fc2a7c97a1 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,14 @@ >+2018-09-17 Youenn Fablet <youenn@apple.com> >+ >+ track.onmute isn't called for a remote MediaStreamTrack when its counter part track is removed from the peer connection >+ https://bugs.webkit.org/show_bug.cgi?id=176281 >+ <rdar://problem/44525674> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * webrtc/remove-track-expected.txt: Added. >+ * webrtc/remove-track.html: Added. >+ > 2018-09-17 Youenn Fablet <youenn@apple.com> > > Enable VCP for iOS and reenable it for MacOS >diff --git a/LayoutTests/webrtc/remove-track-expected.txt b/LayoutTests/webrtc/remove-track-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..de6c3c260587732c7619df5db0b7b7ccf014a86a >--- /dev/null >+++ b/LayoutTests/webrtc/remove-track-expected.txt >@@ -0,0 +1,5 @@ >+ >+PASS Setup audio video exchange >+PASS Remove video track >+PASS Remove audio track >+ >diff --git a/LayoutTests/webrtc/remove-track.html b/LayoutTests/webrtc/remove-track.html >new file mode 100644 >index 0000000000000000000000000000000000000000..827f522e42242801692bb94408766dd173ed6fd8 >--- /dev/null >+++ b/LayoutTests/webrtc/remove-track.html >@@ -0,0 +1,72 @@ >+<!doctype html> >+<html> >+ <head> >+ <meta charset="utf-8"> >+ <title>Testing basic video exchange from offerer to receiver</title> >+ <script src="../resources/testharness.js"></script> >+ <script src="../resources/testharnessreport.js"></script> >+ </head> >+ <body> >+ <script src ="routines.js"></script> >+ <script> >+let firstConnection, secondConnection; >+let stream; >+let remoteAudioTrack, remoteVideoTrack; >+promise_test(async (test) => { >+ if (window.testRunner) >+ testRunner.setUserMediaPermission(true); >+ >+ stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true }); >+ await new Promise((resolve, reject) => { >+ createConnections((connection) => { >+ firstConnection = connection; >+ firstConnection.addTrack(stream.getVideoTracks()[0], stream); >+ firstConnection.addTrack(stream.getAudioTracks()[0], stream); >+ }, (connection) => { >+ secondConnection = connection; >+ secondConnection.ontrack = (trackEvent) => { >+ if (!remoteVideoTrack) { >+ remoteVideoTrack = trackEvent.track; >+ return; >+ } >+ remoteAudioTrack = trackEvent.track; >+ resolve(); >+ }; >+ }); >+ setTimeout(() => reject("Test timed out"), 5000); >+ }); >+}, "Setup audio video exchange"); >+ >+async function renegotiate() >+{ >+ let d = await firstConnection.createOffer(); >+ await firstConnection.setLocalDescription(d); >+ await secondConnection.setRemoteDescription(firstConnection.localDescription); >+ d = await secondConnection.createAnswer(); >+ await secondConnection.setLocalDescription(d); >+} >+ >+promise_test((test) => { >+ const promise = new Promise((resolve, reject) => { >+ remoteVideoTrack.onmute = resolve; >+ setTimeout(() => reject("Test timed out"), 5000); >+ }); >+ >+ firstConnection.removeTrack(firstConnection.getSenders()[0]); >+ renegotiate(); >+ return promise; >+}, "Remove video track"); >+ >+promise_test((test) => { >+ const promise = new Promise((resolve, reject) => { >+ remoteAudioTrack.onmute = resolve; >+ setTimeout(() => reject("Test timed out"), 5000); >+ }); >+ >+ firstConnection.removeTrack(firstConnection.getSenders()[1]); >+ renegotiate(); >+ return promise; >+}, "Remove audio track"); >+ </script> >+ </body> >+</html>
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 176281
:
319733
| 349915