WebKit Bugzilla
Attachment 348541 Details for
Bug 189171
: Introduce LibWebRTC backends for sender and receiver
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
WIP
bug-189171-20180830135336.patch (text/plain), 72.54 KB, created by
youenn fablet
on 2018-08-30 13:53:37 PDT
(
hide
)
Description:
WIP
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2018-08-30 13:53:37 PDT
Size:
72.54 KB
patch
obsolete
>Subversion Revision: 235451 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 13f8bf119382611160068dcc87580373ee413fbf..7f5e0f43c7b980f6ae67b7be241fdcbca35f8448 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,63 @@ >+2018-08-30 Youenn Fablet <youenn@apple.com> >+ >+ Introduce LibWebRTC backends for sender and receiver >+ https://bugs.webkit.org/show_bug.cgi?id=189171 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Rename RTCRtpSender::Backend to RTCRtpSenderBackend, ditto for RTCRtpReceiver::Backend. >+ Make RTCRtpSender/RTCRtpReceiver own their backend. >+ Update code so that libwebrtc code specific code is now creating senders and receivers. >+ This will allow to correctly set the libwebrtc sender/receiver to WebKit DOM sender/receiver. >+ >+ Covered by existing tests. >+ >+ * Modules/mediastream/PeerConnectionBackend.cpp: >+ (WebCore::PeerConnectionBackend::addTrack): >+ (WebCore::PeerConnectionBackend::addTransceiver): >+ * Modules/mediastream/PeerConnectionBackend.h: >+ * Modules/mediastream/RTCPeerConnection.cpp: >+ (WebCore::RTCPeerConnection::addTrack): >+ (WebCore::RTCPeerConnection::addTransceiver): >+ (WebCore::RTCPeerConnection::enqueueReplaceTrackTask): >+ * Modules/mediastream/RTCPeerConnection.h: >+ * Modules/mediastream/RTCRtpReceiver.cpp: >+ (WebCore::RTCRtpReceiver::RTCRtpReceiver): >+ * Modules/mediastream/RTCRtpReceiver.h: >+ (WebCore::RTCRtpReceiver::create): >+ (WebCore::RTCRtpReceiver::setBackend): >+ * Modules/mediastream/RTCRtpReceiverBackend.h: Added. >+ (WebCore::RTCRtpReceiverBackend::getParameters): >+ * Modules/mediastream/RTCRtpSender.cpp: >+ (WebCore::RTCRtpSender::create): >+ (WebCore::RTCRtpSender::RTCRtpSender): >+ * Modules/mediastream/RTCRtpSender.h: >+ * Modules/mediastream/RTCRtpSenderBackend.h: Added. >+ * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp: >+ (WebCore::LibWebRTCMediaEndpoint::addRemoteTrack): >+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp: >+ (WebCore::LibWebRTCPeerConnectionBackend::videoReceiver): >+ (WebCore::LibWebRTCPeerConnectionBackend::audioReceiver): >+ (WebCore::LibWebRTCPeerConnectionBackend::addTrack): >+ (WebCore::LibWebRTCPeerConnectionBackend::addTransceiver): >+ (WebCore::LibWebRTCPeerConnectionBackend::completeAddTransceiver): >+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h: >+ * Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp: Added. >+ (WebCore::LibWebRTCRtpReceiverBackend::getParameters): >+ * Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h: Added. >+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp: Added. >+ (WebCore::LibWebRTCRtpSenderBackend::replaceTrack): >+ (WebCore::LibWebRTCRtpSenderBackend::getParameters const): >+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h: Added. >+ * Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp: Added. >+ (WebCore::fillEncodingParameters): >+ (WebCore::fillHeaderExtensionParameters): >+ (WebCore::fillCodecParameters): >+ (WebCore::fillRtpParameters): >+ * Modules/mediastream/libwebrtc/LibWebRTCUtils.h: Added. >+ (WebCore::fromStdString): >+ * WebCore.xcodeproj/project.pbxproj: >+ > 2018-08-29 Youenn Fablet <youenn@apple.com> > > Add a runtime flag for WebRTC unified plan >diff --git a/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp b/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp >index 28734b203f2ccc53fd16f4a9678e8657abfbbdf3..333113f20e3c657b433b159a67e1af4284f1c707 100644 >--- a/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp >+++ b/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp >@@ -530,6 +530,21 @@ void PeerConnectionBackend::markAsNeedingNegotiation() > m_peerConnection.scheduleNegotiationNeededEvent(); > } > >+ExceptionOr<Ref<RTCRtpSender>> PeerConnectionBackend::addTrack(RTCRtpSender*, MediaStreamTrack&, const Vector<String>&) >+{ >+ return Exception { NotSupportedError, "Not implemented"_s }; >+} >+ >+ExceptionOr<Ref<RTCRtpTransceiver>> PeerConnectionBackend::addTransceiver(const String&, const RTCRtpTransceiverInit&) >+{ >+ return Exception { NotSupportedError, "Not implemented"_s }; >+} >+ >+ExceptionOr<Ref<RTCRtpTransceiver>> PeerConnectionBackend::addTransceiver(Ref<MediaStreamTrack>&&, const RTCRtpTransceiverInit&) >+{ >+ return Exception { NotSupportedError, "Not implemented"_s }; >+} >+ > #if !RELEASE_LOG_DISABLED > WTFLogChannel& PeerConnectionBackend::logChannel() const > { >diff --git a/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h b/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h >index f8a976b7a58f5c510b79d0979f8aa57a8dd0e43e..95e0f9932cae0e5af4f7b294e38dd4195064fc82 100644 >--- a/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h >+++ b/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h >@@ -50,6 +50,7 @@ class RTCIceCandidate; > class RTCPeerConnection; > class RTCRtpReceiver; > class RTCRtpSender; >+class RTCRtpTransceiver; > class RTCSessionDescription; > class RTCStatsReport; > >@@ -57,6 +58,7 @@ struct MediaEndpointConfiguration; > struct RTCAnswerOptions; > struct RTCDataChannelInit; > struct RTCOfferOptions; >+struct RTCRtpTransceiverInit; > > namespace PeerConnection { > using SessionDescriptionPromise = DOMPromiseDeferred<IDLDictionary<RTCSessionDescription::Init>>; >@@ -99,11 +101,11 @@ public: > virtual void getStats(MediaStreamTrack*, Ref<DeferredPromise>&&) = 0; > > virtual Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0; >- virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0; >- virtual bool notifyAddedTrack(RTCRtpSender&) { return false; } >+ virtual ExceptionOr<Ref<RTCRtpSender>> addTrack(RTCRtpSender*, MediaStreamTrack&, const Vector<String>&); > virtual void notifyRemovedTrack(RTCRtpSender&) { } > >- virtual RTCRtpParameters getParameters(RTCRtpSender&) const { return { }; } >+ virtual ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(const String&, const RTCRtpTransceiverInit&); >+ virtual ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(Ref<MediaStreamTrack>&&, const RTCRtpTransceiverInit&); > > void markAsNeedingNegotiation(); > bool isNegotiationNeeded() const { return m_negotiationNeeded; }; >diff --git a/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp b/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp >index a04f81e1fb12727cffbd508918b23c760a22baef..31e69e216b49e44443d22b2b4c41ca18aeceebe8 100644 >--- a/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp >+++ b/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp >@@ -128,7 +128,7 @@ ExceptionOr<Ref<RTCRtpSender>> RTCPeerConnection::addTrack(Ref<MediaStreamTrack> > for (auto& transceiver : m_transceiverSet->list()) { > auto& existingSender = transceiver->sender(); > if (existingSender.trackKind() == track->kind() && existingSender.trackId().isNull() && !transceiver->hasSendingDirection()) { >- existingSender.setTrack(WTFMove(track)); >+ existingSender.setTrack(track.copyRef()); > existingSender.setMediaStreamIds(WTFMove(mediaStreamIds)); > transceiver->enableSendingDirection(); > sender = &existingSender; >@@ -137,27 +137,7 @@ ExceptionOr<Ref<RTCRtpSender>> RTCPeerConnection::addTrack(Ref<MediaStreamTrack> > } > } > >- if (!sender) { >- String transceiverMid = RTCRtpTransceiver::getNextMid(); >- const String& trackKind = track->kind(); >- String trackId = createCanonicalUUIDString(); >- >- auto newSender = RTCRtpSender::create(WTFMove(track), WTFMove(mediaStreamIds), *this); >- auto receiver = m_backend->createReceiver(transceiverMid, trackKind, trackId); >- auto transceiver = RTCRtpTransceiver::create(WTFMove(newSender), WTFMove(receiver)); >- >- // This transceiver is not yet associated with an m-line (null mid), but we need a >- // provisional mid if the transceiver is used to create an offer. >- transceiver->setProvisionalMid(transceiverMid); >- >- sender = &transceiver->sender(); >- m_transceiverSet->append(WTFMove(transceiver)); >- } >- >- if (!m_backend->notifyAddedTrack(*sender)) >- return Exception { InvalidAccessError, "Unable to add track"_s }; >- >- return Ref<RTCRtpSender> { *sender }; >+ return m_backend->addTrack(sender, track.get(), mediaStreamIds); > } > > ExceptionOr<void> RTCPeerConnection::removeTrack(RTCRtpSender& sender) >@@ -192,31 +172,11 @@ ExceptionOr<Ref<RTCRtpTransceiver>> RTCPeerConnection::addTransceiver(AddTransce > if (kind != "audio" && kind != "video") > return Exception { TypeError }; > >- auto sender = RTCRtpSender::create(String(kind), Vector<String>(), *this); >- return completeAddTransceiver(WTFMove(sender), init, createCanonicalUUIDString(), kind); >+ return m_backend->addTransceiver(kind, init); > } > >- Ref<MediaStreamTrack> track = WTF::get<RefPtr<MediaStreamTrack>>(withTrack).releaseNonNull(); >- const String& trackId = track->id(); >- const String& trackKind = track->kind(); >- >- auto sender = RTCRtpSender::create(WTFMove(track), Vector<String>(), *this); >- if (!m_backend->notifyAddedTrack(sender)) >- return Exception { InvalidAccessError, "Unable to add track"_s }; >- >- return completeAddTransceiver(WTFMove(sender), init, trackId, trackKind); >-} >- >-Ref<RTCRtpTransceiver> RTCPeerConnection::completeAddTransceiver(Ref<RTCRtpSender>&& sender, const RTCRtpTransceiverInit& init, const String& trackId, const String& trackKind) >-{ >- String transceiverMid = RTCRtpTransceiver::getNextMid(); >- auto transceiver = RTCRtpTransceiver::create(WTFMove(sender), m_backend->createReceiver(transceiverMid, trackKind, trackId)); >- >- transceiver->setProvisionalMid(transceiverMid); >- transceiver->setDirection(init.direction); >- >- m_transceiverSet->append(transceiver.copyRef()); >- return transceiver; >+ auto track = WTF::get<RefPtr<MediaStreamTrack>>(withTrack).releaseNonNull(); >+ return m_backend->addTransceiver(WTFMove(track), init); > } > > void RTCPeerConnection::queuedCreateOffer(RTCOfferOptions&& options, SessionDescriptionPromise&& promise) >@@ -586,28 +546,11 @@ void RTCPeerConnection::enqueueReplaceTrackTask(RTCRtpSender& sender, RefPtr<Med > bool hasTrack = protectedSender->track(); > protectedSender->setTrack(withTrack.releaseNonNull()); > if (!hasTrack) >- protectedThis->m_backend->notifyAddedTrack(protectedSender.get()); >+ protectedThis->m_backend->addTrack(protectedSender.ptr(), *protectedSender->track(), { }); > promise.resolve(); > }); > } > >-void RTCPeerConnection::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& withTrack, DOMPromiseDeferred<void>&& promise) >-{ >- INFO_LOG(LOGIDENTIFIER); >- >- if (!sender.track() && withTrack) { >- enqueueReplaceTrackTask(sender, withTrack.releaseNonNull(), WTFMove(promise)); >- return; >- } >- >- m_backend->replaceTrack(sender, WTFMove(withTrack), WTFMove(promise)); >-} >- >-RTCRtpParameters RTCPeerConnection::getParameters(RTCRtpSender& sender) const >-{ >- return m_backend->getParameters(sender); >-} >- > void RTCPeerConnection::dispatchEvent(Event& event) > { > DEBUG_LOG(LOGIDENTIFIER, "dispatching '", event.type(), "'"); >diff --git a/Source/WebCore/Modules/mediastream/RTCPeerConnection.h b/Source/WebCore/Modules/mediastream/RTCPeerConnection.h >index 427bf223eb8e419c39b2b5ef145dfa6d108d1de7..84eb9bc9a55a5a7174c7e0fb1e7e94e7d315d2d6 100644 >--- a/Source/WebCore/Modules/mediastream/RTCPeerConnection.h >+++ b/Source/WebCore/Modules/mediastream/RTCPeerConnection.h >@@ -66,7 +66,6 @@ struct RTCRtpTransceiverInit { > > class RTCPeerConnection final > : public RefCounted<RTCPeerConnection> >- , public RTCRtpSender::Backend > , public EventTargetWithInlineData > , public ActiveDOMObject > #if !RELEASE_LOG_DISABLED >@@ -109,6 +108,8 @@ public: > bool isClosed() const { return m_connectionState == RTCPeerConnectionState::Closed; } > bool isStopped() const { return m_isStopped; } > >+ void addInternalTransceiver(Ref<RTCRtpTransceiver>&& transceiver) { m_transceiverSet->append(WTFMove(transceiver)); } >+ > // 5.1 RTCPeerConnection extensions > const Vector<std::reference_wrapper<RTCRtpSender>>& getSenders() const { return m_transceiverSet->senders(); } > const Vector<std::reference_wrapper<RTCRtpReceiver>>& getReceivers() const { return m_transceiverSet->receivers(); } >@@ -144,7 +145,6 @@ public: > > void scheduleNegotiationNeededEvent(); > >- RTCRtpSender::Backend& senderBackend() { return *this; } > void fireEvent(Event&); > > void disableICECandidateFiltering() { m_backend->disableICECandidateFiltering(); } >@@ -186,11 +186,6 @@ private: > const char* activeDOMObjectName() const final; > bool canSuspendForDocumentSuspension() const final; > >- // FIXME: We might want PeerConnectionBackend to be the Backend >- // RTCRtpSender::Backend >- void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) final; >- RTCRtpParameters getParameters(RTCRtpSender&) const final; >- > void updateConnectionState(); > bool doClose(); > void doStop(); >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp b/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp >index 3d67319c91bc63c577bb820b0a870e26d75e40a0..8fbe9a29596f6add0595d2175c0607fe1b57d6a7 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp >+++ b/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp >@@ -37,9 +37,9 @@ > > namespace WebCore { > >-RTCRtpReceiver::RTCRtpReceiver(Ref<MediaStreamTrack>&& track, Backend* backend) >+RTCRtpReceiver::RTCRtpReceiver(Ref<MediaStreamTrack>&& track, std::unique_ptr<RTCRtpReceiverBackend>&& backend) > : RTCRtpSenderReceiverBase(WTFMove(track)) >- , m_backend(backend) >+ , m_backend(WTFMove(backend)) > { > } > >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h b/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h >index 14ab069347099d4c8f261c8962290ab717a2b2a9..db6b7498b9e083919abb57af71acb4fb64de5f41 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h >+++ b/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h >@@ -33,6 +33,7 @@ > #if ENABLE(WEB_RTC) > > #include "RTCRtpParameters.h" >+#include "RTCRtpReceiverBackend.h" > #include "RTCRtpSenderReceiverBase.h" > > namespace WebCore { >@@ -40,31 +41,20 @@ namespace WebCore { > > class RTCRtpReceiver : public RTCRtpSenderReceiverBase { > public: >- class Backend { >- public: >- virtual ~Backend() = default; >- virtual RTCRtpParameters getParameters() { return { }; } >- }; >- >- static Ref<RTCRtpReceiver> create(Ref<MediaStreamTrack>&& track, Backend* backend = nullptr) >+ static Ref<RTCRtpReceiver> create(Ref<MediaStreamTrack>&& track, std::unique_ptr<RTCRtpReceiverBackend>&& backend = nullptr) > { >- return adoptRef(*new RTCRtpReceiver(WTFMove(track), backend)); >+ return adoptRef(*new RTCRtpReceiver(WTFMove(track), WTFMove(backend))); > } > > void stop(); > >- // FIXME: We should pass a UniqueRef here. >- void setBackend(std::unique_ptr<Backend>&& backend) { m_backend = WTFMove(backend); } >- >- bool isDispatched() const { return m_isDispatched; } >- void setDispatched(bool isDispatched) { m_isDispatched = isDispatched; } >+ void setBackend(std::unique_ptr<RTCRtpReceiverBackend>&& backend) { m_backend = WTFMove(backend); } > RTCRtpParameters getParameters() { return m_backend ? m_backend->getParameters() : RTCRtpParameters(); } > > private: >- explicit RTCRtpReceiver(Ref<MediaStreamTrack>&&, Backend*); >+ RTCRtpReceiver(Ref<MediaStreamTrack>&&, std::unique_ptr<RTCRtpReceiverBackend>&&); > >- bool m_isDispatched { false }; >- std::unique_ptr<Backend> m_backend; >+ std::unique_ptr<RTCRtpReceiverBackend> m_backend; > }; > > } // namespace WebCore >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpReceiverBackend.h b/Source/WebCore/Modules/mediastream/RTCRtpReceiverBackend.h >new file mode 100644 >index 0000000000000000000000000000000000000000..f0fef34aef0497cc7ff16394ff2fac00a2f5ce2a >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/RTCRtpReceiverBackend.h >@@ -0,0 +1,47 @@ >+/* >+ * Copyright (C) 2015 Ericsson AB. 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. >+ * 3. Neither the name of Ericsson nor the names of its contributors >+ * may be used to endorse or promote products derived from this >+ * software without specific prior written permission. >+ * >+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT >+ * OWNER OR 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 "RTCRtpParameters.h" >+ >+namespace WebCore { >+ >+class RTCRtpReceiverBackend { >+public: >+ virtual ~RTCRtpReceiverBackend() = default; >+ virtual RTCRtpParameters getParameters() { return { }; } >+}; >+ >+} // namespace WebCore >+ >+#endif // ENABLE(WEB_RTC) >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp b/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp >index 18dc9bd64da3b1ea89c2c06cf3c99a99a02e0711..6a3d1bcd90886e033d5124dc9d4eb4b6dfdfb74c 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp >+++ b/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp >@@ -35,23 +35,23 @@ > > namespace WebCore { > >-Ref<RTCRtpSender> RTCRtpSender::create(Ref<MediaStreamTrack>&& track, Vector<String>&& mediaStreamIds, Backend& backend) >+Ref<RTCRtpSender> RTCRtpSender::create(Ref<MediaStreamTrack>&& track, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&& backend) > { >- auto sender = adoptRef(*new RTCRtpSender(String(track->kind()), WTFMove(mediaStreamIds), backend)); >+ auto sender = adoptRef(*new RTCRtpSender(String(track->kind()), WTFMove(mediaStreamIds), WTFMove(backend))); > sender->setTrack(WTFMove(track)); > return sender; > } > >-Ref<RTCRtpSender> RTCRtpSender::create(String&& trackKind, Vector<String>&& mediaStreamIds, Backend& backend) >+Ref<RTCRtpSender> RTCRtpSender::create(String&& trackKind, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&& backend) > { >- return adoptRef(*new RTCRtpSender(WTFMove(trackKind), WTFMove(mediaStreamIds), backend)); >+ return adoptRef(*new RTCRtpSender(WTFMove(trackKind), WTFMove(mediaStreamIds), WTFMove(backend))); > } > >-RTCRtpSender::RTCRtpSender(String&& trackKind, Vector<String>&& mediaStreamIds, Backend& backend) >+RTCRtpSender::RTCRtpSender(String&& trackKind, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&& backend) > : RTCRtpSenderReceiverBase() > , m_trackKind(WTFMove(trackKind)) > , m_mediaStreamIds(WTFMove(mediaStreamIds)) >- , m_backend(&backend) >+ , m_backend(WTFMove(backend)) > { > } > >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpSender.h b/Source/WebCore/Modules/mediastream/RTCRtpSender.h >index 8958df679132d4f8e6f25d84bd0ec11793676fca..4e1e4b5e3a7fa5f7d17c0df73496f6ead20ef1ef 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpSender.h >+++ b/Source/WebCore/Modules/mediastream/RTCRtpSender.h >@@ -33,21 +33,15 @@ > #if ENABLE(WEB_RTC) > > #include "PeerConnectionBackend.h" >+#include "RTCRtpSenderBackend.h" > #include "RTCRtpSenderReceiverBase.h" > > namespace WebCore { > > class RTCRtpSender : public RTCRtpSenderReceiverBase { > public: >- class Backend { >- public: >- virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0; >- virtual RTCRtpParameters getParameters(RTCRtpSender&) const = 0; >- virtual ~Backend() = default; >- }; >- >- static Ref<RTCRtpSender> create(Ref<MediaStreamTrack>&&, Vector<String>&& mediaStreamIds, Backend&); >- static Ref<RTCRtpSender> create(String&& trackKind, Vector<String>&& mediaStreamIds, Backend&); >+ static Ref<RTCRtpSender> create(Ref<MediaStreamTrack>&&, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&&); >+ static Ref<RTCRtpSender> create(String&& trackKind, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&&); > > const String& trackId() const { return m_trackId; } > const String& trackKind() const { return m_trackKind; } >@@ -65,12 +59,12 @@ public: > RTCRtpParameters getParameters(); > > private: >- RTCRtpSender(String&& trackKind, Vector<String>&& mediaStreamIds, Backend&); >+ RTCRtpSender(String&& trackKind, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&&); > > String m_trackId; > String m_trackKind; > Vector<String> m_mediaStreamIds; >- Backend* m_backend; >+ std::unique_ptr<RTCRtpSenderBackend> m_backend; > }; > > } // namespace WebCore >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h b/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h >new file mode 100644 >index 0000000000000000000000000000000000000000..5d258a4c3e9cf491538264868166172ffc40a4d5 >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h >@@ -0,0 +1,46 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. >+ * >+ * 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 "JSDOMPromiseDeferred.h" >+#include "RTCRtpParameters.h" >+ >+namespace WebCore { >+ >+class MediaStreamTrack; >+class RTCRtpSender; >+ >+class RTCRtpSenderBackend { >+public: >+ virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0; >+ virtual RTCRtpParameters getParameters(RTCRtpSender&) const = 0; >+ virtual ~RTCRtpSenderBackend() = default; >+}; >+ >+} // namespace WebCore >+ >+#endif // ENABLE(WEB_RTC) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp >index bf120d029b980c3528feb04095aba0e924a76ad5..de359179fde2b4a195ede625515cac695e844429 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp >@@ -32,6 +32,9 @@ > #include "LibWebRTCDataChannelHandler.h" > #include "LibWebRTCPeerConnectionBackend.h" > #include "LibWebRTCProvider.h" >+#include "LibWebRTCRtpReceiverBackend.h" >+#include "LibWebRTCRtpSenderBackend.h" >+#include "LibWebRTCUtils.h" > #include "Logging.h" > #include "NotImplemented.h" > #include "Performance.h" >@@ -56,11 +59,6 @@ > > namespace WebCore { > >-static inline String fromStdString(const std::string& value) >-{ >- return String::fromUTF8(value.data(), value.length()); >-} >- > LibWebRTCMediaEndpoint::LibWebRTCMediaEndpoint(LibWebRTCPeerConnectionBackend& peerConnection, LibWebRTCProvider& client) > : m_peerConnectionBackend(peerConnection) > , m_peerConnectionFactory(*client.factory()) >@@ -645,16 +643,6 @@ void LibWebRTCMediaEndpoint::addRemoteStream(webrtc::MediaStreamInterface&) > { > } > >-class RTCRtpReceiverBackend final : public RTCRtpReceiver::Backend { >-public: >- explicit RTCRtpReceiverBackend(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&& rtcReceiver) : m_rtcReceiver(WTFMove(rtcReceiver)) { } >-private: >- RTCRtpParameters getParameters() final; >- >- rtc::scoped_refptr<webrtc::RtpReceiverInterface> m_rtcReceiver; >-}; >- >- > void LibWebRTCMediaEndpoint::addRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&& rtcReceiver, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& rtcStreams) > { > ASSERT(rtcReceiver); >@@ -684,7 +672,7 @@ void LibWebRTCMediaEndpoint::addRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiv > } > } > >- receiver->setBackend(std::make_unique<RTCRtpReceiverBackend>(WTFMove(rtcReceiver))); >+ receiver->setBackend(std::make_unique<LibWebRTCRtpReceiverBackend>(WTFMove(rtcReceiver))); > > auto* track = receiver->track(); > ASSERT(track); >@@ -952,94 +940,6 @@ void LibWebRTCMediaEndpoint::setRemoteSessionDescriptionFailed(const std::string > }); > } > >-static inline RTCRtpParameters::EncodingParameters fillEncodingParameters(const webrtc::RtpEncodingParameters& rtcParameters) >-{ >- RTCRtpParameters::EncodingParameters parameters; >- >- if (rtcParameters.ssrc) >- parameters.ssrc = *rtcParameters.ssrc; >- if (rtcParameters.rtx && rtcParameters.rtx->ssrc) >- parameters.rtx.ssrc = *rtcParameters.rtx->ssrc; >- if (rtcParameters.fec && rtcParameters.fec->ssrc) >- parameters.fec.ssrc = *rtcParameters.fec->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.max_bitrate_bps) >- parameters.maxBitrate = *rtcParameters.max_bitrate_bps; >- if (rtcParameters.max_framerate) >- parameters.maxFramerate = *rtcParameters.max_framerate; >- parameters.rid = fromStdString(rtcParameters.rid); >- if (rtcParameters.scale_resolution_down_by) >- parameters.scaleResolutionDownBy = *rtcParameters.scale_resolution_down_by; >- >- return parameters; >-} >- >-static inline RTCRtpParameters::HeaderExtensionParameters fillHeaderExtensionParameters(const webrtc::RtpHeaderExtensionParameters& rtcParameters) >-{ >- RTCRtpParameters::HeaderExtensionParameters parameters; >- >- parameters.uri = fromStdString(rtcParameters.uri); >- parameters.id = rtcParameters.id; >- >- return parameters; >-} >- >-static inline RTCRtpParameters::CodecParameters fillCodecParameters(const webrtc::RtpCodecParameters& 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& rtcEncoding : rtcParameters.encodings) >- parameters.encodings.append(fillEncodingParameters(rtcEncoding)); >- for (auto& extension : rtcParameters.header_extensions) >- parameters.headerExtensions.append(fillHeaderExtensionParameters(extension)); >- for (auto& codec : rtcParameters.codecs) >- parameters.codecs.append(fillCodecParameters(codec)); >- >- switch (rtcParameters.degradation_preference) { >- // FIXME: Support DegradationPreference::DISABLED. >- case webrtc::DegradationPreference::DISABLED: >- 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->GetParameters()); >-} >- > RTCRtpParameters LibWebRTCMediaEndpoint::getRTCRtpSenderParameters(RTCRtpSender& sender) > { > auto rtcSender = m_senders.get(&sender); >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >index 22ba150c4b464dc29abf622e79b19f6d8fc3217c..e07a853812a6ac1a77871db8b49a9128d56af46c 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >@@ -32,6 +32,8 @@ > #include "JSRTCStatsReport.h" > #include "LibWebRTCDataChannelHandler.h" > #include "LibWebRTCMediaEndpoint.h" >+#include "LibWebRTCRtpReceiverBackend.h" >+#include "LibWebRTCRtpSenderBackend.h" > #include "MediaEndpointConfiguration.h" > #include "Page.h" > #include "RTCIceCandidate.h" >@@ -275,7 +277,8 @@ LibWebRTCPeerConnectionBackend::VideoReceiver LibWebRTCPeerConnectionBackend::vi > auto source = RealtimeIncomingVideoSource::create(nullptr, WTFMove(trackId)); > auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), source.copyRef()); > >- auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("video", { }, m_peerConnection), receiver.copyRef()); >+ auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); >+ auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("video", { }, WTFMove(senderBackend)), receiver.copyRef()); > transceiver->disableSendingDirection(); > m_peerConnection.addTransceiver(WTFMove(transceiver)); > >@@ -297,7 +300,8 @@ LibWebRTCPeerConnectionBackend::AudioReceiver LibWebRTCPeerConnectionBackend::au > auto source = RealtimeIncomingAudioSource::create(nullptr, WTFMove(trackId)); > auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), source.copyRef()); > >- auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("audio", { }, m_peerConnection), receiver.copyRef()); >+ auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); >+ auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("audio", { }, WTFMove(senderBackend)), receiver.copyRef()); > transceiver->disableSendingDirection(); > m_peerConnection.addTransceiver(WTFMove(transceiver)); > >@@ -348,10 +352,59 @@ RefPtr<RTCSessionDescription> LibWebRTCPeerConnectionBackend::remoteDescription( > return m_endpoint->remoteDescription(); > } > >-bool LibWebRTCPeerConnectionBackend::notifyAddedTrack(RTCRtpSender& sender) >+ExceptionOr<Ref<RTCRtpSender>> LibWebRTCPeerConnectionBackend::addTrack(RTCRtpSender* sender, MediaStreamTrack& track, const Vector<String>& mediaStreamIds) > { >- ASSERT(sender.track()); >- return m_endpoint->addTrack(sender, *sender.track(), sender.mediaStreamIds()); >+ if (!sender) { >+ String transceiverMid = RTCRtpTransceiver::getNextMid(); >+ const String& trackKind = track.kind(); >+ String trackId = createCanonicalUUIDString(); >+ >+ auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); >+ auto newSender = RTCRtpSender::create(makeRef(track), Vector<String> { mediaStreamIds }, WTFMove(senderBackend)); >+ auto receiver = createReceiver(transceiverMid, trackKind, trackId); >+ auto transceiver = RTCRtpTransceiver::create(WTFMove(newSender), WTFMove(receiver)); >+ >+ // This transceiver is not yet associated with an m-line (null mid), but we need a >+ // provisional mid if the transceiver is used to create an offer. >+ transceiver->setProvisionalMid(transceiverMid); >+ >+ sender = &transceiver->sender(); >+ m_peerConnection.addInternalTransceiver(WTFMove(transceiver)); >+ } >+ >+ if (!m_endpoint->addTrack(*sender, track, mediaStreamIds)) >+ return Exception { TypeError, "Unable to add track"_s }; >+ >+ return makeRef(*sender); >+} >+ >+ExceptionOr<Ref<RTCRtpTransceiver>> LibWebRTCPeerConnectionBackend::addTransceiver(const String& trackKind, const RTCRtpTransceiverInit& init) >+{ >+ auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); >+ auto newSender = RTCRtpSender::create(String(trackKind), Vector<String>(), WTFMove(senderBackend)); >+ return completeAddTransceiver(WTFMove(newSender), init, createCanonicalUUIDString(), trackKind); >+} >+ >+ExceptionOr<Ref<RTCRtpTransceiver>> LibWebRTCPeerConnectionBackend::addTransceiver(Ref<MediaStreamTrack>&& track, const RTCRtpTransceiverInit& init) >+{ >+ auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); >+ auto sender = RTCRtpSender::create(track.copyRef(), Vector<String>(), WTFMove(senderBackend)); >+ if (!m_endpoint->addTrack(sender.get(), track, Vector<String> { })) >+ return Exception { InvalidAccessError, "Unable to add track"_s }; >+ >+ return completeAddTransceiver(WTFMove(sender), init, track->id(), track->kind()); >+} >+ >+Ref<RTCRtpTransceiver> LibWebRTCPeerConnectionBackend::completeAddTransceiver(Ref<RTCRtpSender>&& sender, const RTCRtpTransceiverInit& init, const String& trackId, const String& trackKind) >+{ >+ String transceiverMid = RTCRtpTransceiver::getNextMid(); >+ auto transceiver = RTCRtpTransceiver::create(WTFMove(sender), createReceiver(transceiverMid, trackKind, trackId)); >+ >+ transceiver->setProvisionalMid(transceiverMid); >+ transceiver->setDirection(init.direction); >+ >+ m_peerConnection.addInternalTransceiver(transceiver.copyRef()); >+ return transceiver; > } > > void LibWebRTCPeerConnectionBackend::notifyRemovedTrack(RTCRtpSender& sender) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h >index fa0f0137095252612f4b0eb6116484d14fa33101..1c5572474da029c561b96c7cfa3a1df17926cc17 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h >@@ -28,6 +28,7 @@ > > #include "PeerConnectionBackend.h" > #include <wtf/HashMap.h> >+#include <wtf/WeakPtr.h> > > namespace webrtc { > class IceCandidateInterface; >@@ -45,7 +46,7 @@ class RealtimeIncomingVideoSource; > class RealtimeOutgoingAudioSource; > class RealtimeOutgoingVideoSource; > >-class LibWebRTCPeerConnectionBackend final : public PeerConnectionBackend { >+class LibWebRTCPeerConnectionBackend final : public PeerConnectionBackend, public CanMakeWeakPtr<LibWebRTCPeerConnectionBackend> { > WTF_MAKE_FAST_ALLOCATED; > public: > LibWebRTCPeerConnectionBackend(RTCPeerConnection&, LibWebRTCProvider&); >@@ -54,6 +55,9 @@ public: > bool hasAudioSources() const { return m_audioSources.size(); } > bool hasVideoSources() const { return m_videoSources.size(); } > >+ void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&); >+ RTCRtpParameters getParameters(RTCRtpSender&) const; >+ > private: > void doCreateOffer(RTCOfferOptions&&) final; > void doCreateAnswer(RTCAnswerOptions&&) final; >@@ -74,13 +78,11 @@ private: > RefPtr<RTCSessionDescription> currentRemoteDescription() const final; > RefPtr<RTCSessionDescription> pendingRemoteDescription() const final; > >- void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) final; >- RTCRtpParameters getParameters(RTCRtpSender&) const final; >- > void emulatePlatformEvent(const String&) final { } > void applyRotationForOutgoingVideoSources() final; > >- friend LibWebRTCMediaEndpoint; >+ friend class LibWebRTCMediaEndpoint; >+ friend class LibWebRTCRtpSenderBackend; > RTCPeerConnection& connection() { return m_peerConnection; } > void addAudioSource(Ref<RealtimeOutgoingAudioSource>&&); > void addVideoSource(Ref<RealtimeOutgoingVideoSource>&&); >@@ -88,9 +90,12 @@ private: > void getStatsSucceeded(const DeferredPromise&, Ref<RTCStatsReport>&&); > void getStatsFailed(const DeferredPromise&, Exception&&); > >- bool notifyAddedTrack(RTCRtpSender&) final; >+ ExceptionOr<Ref<RTCRtpSender>> addTrack(RTCRtpSender*, MediaStreamTrack&, const Vector<String>&) final; > void notifyRemovedTrack(RTCRtpSender&) final; > >+ ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(const String&, const RTCRtpTransceiverInit&) final; >+ ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(Ref<MediaStreamTrack>&&, const RTCRtpTransceiverInit&) final; >+ > struct VideoReceiver { > Ref<RTCRtpReceiver> receiver; > Ref<RealtimeIncomingVideoSource> source; >@@ -105,6 +110,8 @@ private: > private: > bool isLocalDescriptionSet() const final { return m_isLocalDescriptionSet; } > >+ Ref<RTCRtpTransceiver> completeAddTransceiver(Ref<RTCRtpSender>&&, const RTCRtpTransceiverInit&, const String& trackId, const String& trackKind); >+ > Ref<LibWebRTCMediaEndpoint> m_endpoint; > bool m_isLocalDescriptionSet { false }; > bool m_isRemoteDescriptionSet { false }; >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..4df4e7ccafe63133b835b01db2d0f7baeaa09405 >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp >@@ -0,0 +1,41 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. >+ * >+ * 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. >+ */ >+ >+#include "config.h" >+#include "LibWebRTCRtpReceiverBackend.h" >+ >+#include "LibWebRTCUtils.h" >+ >+#if ENABLE(WEB_RTC) && USE(LIBWEBRTC) >+ >+namespace WebCore { >+ >+RTCRtpParameters LibWebRTCRtpReceiverBackend::getParameters() >+{ >+ return fillRtpParameters(m_rtcReceiver->GetParameters()); >+} >+ >+} // namespace WebCore >+ >+#endif // ENABLE(WEB_RTC) && USE(LIBWEBRTC) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h >new file mode 100644 >index 0000000000000000000000000000000000000000..7ace2e42da631ee9712d8ad8ecb69d84b6cea2b1 >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h >@@ -0,0 +1,57 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. >+ * >+ * 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) && USE(LIBWEBRTC) >+ >+#include "LibWebRTCMacros.h" >+#include "RTCRtpReceiverBackend.h" >+ >+#pragma GCC diagnostic push >+#pragma GCC diagnostic ignored "-Wunused-parameter" >+ >+#include <webrtc/api/rtpreceiverinterface.h> >+#include <webrtc/rtc_base/scoped_ref_ptr.h> >+ >+#pragma GCC diagnostic pop >+ >+namespace WebCore { >+ >+class LibWebRTCRtpReceiverBackend final : public RTCRtpReceiverBackend { >+public: >+ explicit LibWebRTCRtpReceiverBackend(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&& rtcReceiver) >+ : m_rtcReceiver(WTFMove(rtcReceiver)) >+ { >+ } >+ >+private: >+ RTCRtpParameters getParameters() final; >+ >+ rtc::scoped_refptr<webrtc::RtpReceiverInterface> m_rtcReceiver; >+}; >+ >+} // namespace WebCore >+ >+#endif // ENABLE(WEB_RTC) && USE(LIBWEBRTC) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..36863a942c8ed33699b081246cd67d6886cfec1f >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp >@@ -0,0 +1,65 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. >+ * >+ * 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. >+ */ >+ >+#include "config.h" >+#include "LibWebRTCRtpSenderBackend.h" >+ >+#if ENABLE(WEB_RTC) && USE(LIBWEBRTC) >+ >+#include "LibWebRTCPeerConnectionBackend.h" >+#include "LibWebRTCUtils.h" >+#include "RTCPeerConnection.h" >+#include "RTCRtpSender.h" >+ >+namespace WebCore { >+ >+void LibWebRTCRtpSenderBackend::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& track, DOMPromiseDeferred<void>&& promise) >+{ >+ if (!m_peerConnectionBackend) { >+ promise.reject(Exception { InvalidStateError, "No WebRTC backend"_s }); >+ return; >+ } >+ >+ if (!sender.track() && track) { >+ m_peerConnectionBackend->connection().enqueueReplaceTrackTask(sender, track.releaseNonNull(), WTFMove(promise)); >+ return; >+ } >+ >+ m_peerConnectionBackend->replaceTrack(sender, WTFMove(track), WTFMove(promise)); >+} >+ >+RTCRtpParameters LibWebRTCRtpSenderBackend::getParameters(RTCRtpSender& sender) const >+{ >+ if (!m_rtcSender) { >+ // FIXME: We should not need to go through the backend and should directly have m_rtcSender here. >+ if (!m_peerConnectionBackend) >+ return { }; >+ return m_peerConnectionBackend->getParameters(sender); >+ } >+ return fillRtpParameters(m_rtcSender->GetParameters()); >+} >+ >+} // namespace WebCore >+ >+#endif // ENABLE(WEB_RTC) && USE(LIBWEBRTC) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h >new file mode 100644 >index 0000000000000000000000000000000000000000..69b9ceaf0c2deac172f024f45d810004430f4e7f >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h >@@ -0,0 +1,64 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. >+ * >+ * 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 "LibWebRTCMacros.h" >+#include "RTCRtpSenderBackend.h" >+#include <wtf/WeakPtr.h> >+ >+#pragma GCC diagnostic push >+#pragma GCC diagnostic ignored "-Wunused-parameter" >+ >+#include <webrtc/api/rtpsenderinterface.h> >+#include <webrtc/rtc_base/scoped_ref_ptr.h> >+ >+#pragma GCC diagnostic pop >+ >+namespace WebCore { >+ >+class LibWebRTCPeerConnectionBackend; >+ >+class LibWebRTCRtpSenderBackend final : public RTCRtpSenderBackend { >+public: >+ explicit LibWebRTCRtpSenderBackend(LibWebRTCPeerConnectionBackend& backend, rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender) >+ : m_peerConnectionBackend(makeWeakPtr(&backend)) >+ , m_rtcSender(WTFMove(rtcSender)) >+ { >+ } >+ >+ void setRTCSender(rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender) { m_rtcSender = WTFMove(rtcSender); } >+ void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) final; >+ RTCRtpParameters getParameters(RTCRtpSender&) const final; >+ >+private: >+ WeakPtr<LibWebRTCPeerConnectionBackend> m_peerConnectionBackend; >+ rtc::scoped_refptr<webrtc::RtpSenderInterface> m_rtcSender; >+}; >+ >+} // namespace WebCore >+ >+#endif // ENABLE(WEB_RTC) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..f3c6cc6d262c014af1b58477919922dfb0f320ff >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp >@@ -0,0 +1,121 @@ >+/* >+ * Copyright (C) 2018 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. >+ */ >+ >+#include "config.h" >+#include "LibWebRTCUtils.h" >+ >+#if USE(LIBWEBRTC) >+ >+#include "LibWebRTCMacros.h" >+#include "RTCRtpParameters.h" >+#include <webrtc/api/rtpparameters.h> >+ >+namespace WebCore { >+ >+static inline RTCRtpParameters::EncodingParameters fillEncodingParameters(const webrtc::RtpEncodingParameters& rtcParameters) >+{ >+ RTCRtpParameters::EncodingParameters parameters; >+ >+ if (rtcParameters.ssrc) >+ parameters.ssrc = *rtcParameters.ssrc; >+ if (rtcParameters.rtx && rtcParameters.rtx->ssrc) >+ parameters.rtx.ssrc = *rtcParameters.rtx->ssrc; >+ if (rtcParameters.fec && rtcParameters.fec->ssrc) >+ parameters.fec.ssrc = *rtcParameters.fec->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.max_bitrate_bps) >+ parameters.maxBitrate = *rtcParameters.max_bitrate_bps; >+ if (rtcParameters.max_framerate) >+ parameters.maxFramerate = *rtcParameters.max_framerate; >+ parameters.rid = fromStdString(rtcParameters.rid); >+ if (rtcParameters.scale_resolution_down_by) >+ parameters.scaleResolutionDownBy = *rtcParameters.scale_resolution_down_by; >+ >+ return parameters; >+} >+ >+static inline RTCRtpParameters::HeaderExtensionParameters fillHeaderExtensionParameters(const webrtc::RtpHeaderExtensionParameters& rtcParameters) >+{ >+ RTCRtpParameters::HeaderExtensionParameters parameters; >+ >+ parameters.uri = fromStdString(rtcParameters.uri); >+ parameters.id = rtcParameters.id; >+ >+ return parameters; >+} >+ >+static inline RTCRtpParameters::CodecParameters fillCodecParameters(const webrtc::RtpCodecParameters& 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; >+} >+ >+RTCRtpParameters fillRtpParameters(const webrtc::RtpParameters& rtcParameters) >+{ >+ RTCRtpParameters parameters; >+ >+ parameters.transactionId = fromStdString(rtcParameters.transaction_id); >+ for (auto& rtcEncoding : rtcParameters.encodings) >+ parameters.encodings.append(fillEncodingParameters(rtcEncoding)); >+ for (auto& extension : rtcParameters.header_extensions) >+ parameters.headerExtensions.append(fillHeaderExtensionParameters(extension)); >+ for (auto& codec : rtcParameters.codecs) >+ parameters.codecs.append(fillCodecParameters(codec)); >+ >+ switch (rtcParameters.degradation_preference) { >+ // FIXME: Support DegradationPreference::DISABLED. >+ case webrtc::DegradationPreference::DISABLED: >+ 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; >+} >+ >+}; // namespace WebCore >+ >+#endif // USE(LIBWEBRTC) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.h >new file mode 100644 >index 0000000000000000000000000000000000000000..1421da01b674df7c4f70e01426663d346c9a1ff7 >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.h >@@ -0,0 +1,46 @@ >+/* >+ * Copyright (C) 2018 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 USE(LIBWEBRTC) >+ >+namespace webrtc { >+struct RtpParameters; >+} >+ >+namespace WebCore { >+ >+struct RTCRtpParameters; >+ >+RTCRtpParameters fillRtpParameters(const webrtc::RtpParameters&); >+ >+inline String fromStdString(const std::string& value) >+{ >+ return String::fromUTF8(value.data(), value.length()); >+} >+ >+} // namespace WebCore >+ >+#endif // USE(LIBWEBRTC) >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index 8aab55c273eee95a4864af5a688abd91824f838b..e71922001aaabb802bb396ab2779f965695855d9 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -1102,9 +1102,13 @@ > 418A06D0133C04D500CD379C /* EventDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 418A06CE133C04D500CD379C /* EventDispatcher.h */; }; > 418F88050FF957AF0080F045 /* JSAbstractWorker.h in Headers */ = {isa = PBXBuildFile; fileRef = 418F88030FF957AE0080F045 /* JSAbstractWorker.h */; }; > 419242492127B93E00634FCF /* RealtimeOutgoingVideoSourceCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 419242472127B7CC00634FCF /* RealtimeOutgoingVideoSourceCocoa.mm */; }; >+ 4195814B21386EA0000DBA62 /* WebAudioBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = 415C1CA4213868B200A23750 /* WebAudioBufferList.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 419ACF921F97E7DA009F1A83 /* ServiceWorkerFetch.h in Headers */ = {isa = PBXBuildFile; fileRef = 419ACF8E1F97E7D5009F1A83 /* ServiceWorkerFetch.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 419BC2DF1685329900D64D6D /* VisitedLinkState.h in Headers */ = {isa = PBXBuildFile; fileRef = 419BC2DD1685329900D64D6D /* VisitedLinkState.h */; }; > 419BE7591BC7F42B00E1C85B /* WebCoreBuiltinNames.h in Headers */ = {isa = PBXBuildFile; fileRef = 419BE7521BC7F3DB00E1C85B /* WebCoreBuiltinNames.h */; }; >+ 419F846921385EB70052DD0B /* LibWebRTCRtpSenderBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41B9A3B42137987C00AB239E /* LibWebRTCRtpSenderBackend.cpp */; }; >+ 419F846B21385EBA0052DD0B /* LibWebRTCRtpReceiverBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41B9A3B62137987D00AB239E /* LibWebRTCRtpReceiverBackend.cpp */; }; >+ 419F846E213861410052DD0B /* LibWebRTCUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 419F846D2138613E0052DD0B /* LibWebRTCUtils.cpp */; }; > 41A1B01C1E54239B007F3769 /* JSDOMGuardedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 41A1B01A1E542396007F3769 /* JSDOMGuardedObject.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 41A3D58F101C152D00316D07 /* DedicatedWorkerThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 41A3D58D101C152D00316D07 /* DedicatedWorkerThread.h */; }; > 41A7D3531F438D16008988DE /* WorkerCacheStorageConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 41A7D3501F438D10008988DE /* WorkerCacheStorageConnection.h */; }; >@@ -4052,8 +4056,8 @@ > CDE595951BF16DF300A1CBE8 /* CDMSessionAVContentKeySession.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDE595931BF166AD00A1CBE8 /* CDMSessionAVContentKeySession.mm */; }; > CDE595971BF26E2100A1CBE8 /* CDMSessionMediaSourceAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE595961BF26E2100A1CBE8 /* CDMSessionMediaSourceAVFObjC.h */; }; > CDE5959D1BF2757100A1CBE8 /* CDMSessionMediaSourceAVFObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDE5959C1BF2757100A1CBE8 /* CDMSessionMediaSourceAVFObjC.mm */; }; >- CDE667A41E4BBF1500E8154A /* WebAudioBufferList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDE667A21E4BBF1500E8154A /* WebAudioBufferList.cpp */; }; >- CDE667A51E4BBF1500E8154A /* WebAudioBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE667A31E4BBF1500E8154A /* WebAudioBufferList.h */; settings = {ATTRIBUTES = (Private, ); }; }; >+ CDE667A41E4BBF1500E8154A /* cocoa/WebAudioBufferList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDE667A21E4BBF1500E8154A /* cocoa/WebAudioBufferList.cpp */; }; >+ CDE667A51E4BBF1500E8154A /* cocoa/WebAudioBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE667A31E4BBF1500E8154A /* cocoa/WebAudioBufferList.h */; settings = {ATTRIBUTES = (Private, ); }; }; > CDE7FC45181904B1002BBB77 /* OrderIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE7FC43181904B1002BBB77 /* OrderIterator.h */; settings = {ATTRIBUTES = (Private, ); }; }; > CDE83DB2183C44060031EAA3 /* VideoPlaybackQuality.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE83DB0183C44060031EAA3 /* VideoPlaybackQuality.h */; }; > CDE8B5EC1A69777300B4B66A /* LegacyCDMPrivateClearKey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDE8B5EA1A69777300B4B66A /* LegacyCDMPrivateClearKey.cpp */; }; >@@ -7061,7 +7065,7 @@ > 339B5B62131DAA3200F48D02 /* CookiesStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CookiesStrategy.h; sourceTree = "<group>"; }; > 3662F984047CEDBE5DDDAFAA /* RenderMathMLMenclose.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderMathMLMenclose.cpp; sourceTree = "<group>"; }; > 37119A7920CCB610002C6DC9 /* WebKitTargetConditionals.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = WebKitTargetConditionals.xcconfig; sourceTree = "<group>"; }; >- 3717D7E517ECC3A6003C276D /* extract-localizable-strings.pl */ = {isa = PBXFileReference; lastKnownFileType = text.script.perl; name = extract-localizable-strings.pl; path = "Scripts/extract-localizable-strings.pl"; sourceTree = "<group>"; }; >+ 3717D7E517ECC3A6003C276D /* extract-localizable-strings.pl */ = {isa = PBXFileReference; lastKnownFileType = text.script.perl; name = "extract-localizable-strings.pl"; path = "Scripts/extract-localizable-strings.pl"; sourceTree = "<group>"; }; > 371A67CA11C6C7DB00047B8B /* HyphenationCF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HyphenationCF.cpp; sourceTree = "<group>"; }; > 371E65CB13661EDC00BEEDB0 /* PageSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PageSerializer.h; sourceTree = "<group>"; }; > 371E65CD13661EED00BEEDB0 /* PageSerializer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PageSerializer.cpp; sourceTree = "<group>"; }; >@@ -7279,6 +7283,8 @@ > 419BC2DC1685329900D64D6D /* VisitedLinkState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VisitedLinkState.cpp; sourceTree = "<group>"; }; > 419BC2DD1685329900D64D6D /* VisitedLinkState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VisitedLinkState.h; sourceTree = "<group>"; }; > 419BE7521BC7F3DB00E1C85B /* WebCoreBuiltinNames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebCoreBuiltinNames.h; sourceTree = "<group>"; }; >+ 419F846C2138613D0052DD0B /* LibWebRTCUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCUtils.h; path = libwebrtc/LibWebRTCUtils.h; sourceTree = "<group>"; }; >+ 419F846D2138613E0052DD0B /* LibWebRTCUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCUtils.cpp; path = libwebrtc/LibWebRTCUtils.cpp; sourceTree = "<group>"; }; > 419FAFAD1ABABCD5005B3572 /* ReadableStreamBYOBReader.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReadableStreamBYOBReader.idl; sourceTree = "<group>"; }; > 419FAFAD1ABABCD5005B828B /* ReadableStreamDefaultReader.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReadableStreamDefaultReader.idl; sourceTree = "<group>"; }; > 41A023ED1A39DB7900F722CF /* ReadableStream.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReadableStream.idl; sourceTree = "<group>"; }; >@@ -7311,6 +7317,12 @@ > 41B2A6251EF1BF60002B9D7A /* WebAudioSourceProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebAudioSourceProvider.h; sourceTree = "<group>"; }; > 41B459DA1F4CADB90000F6FD /* ReadableStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReadableStream.h; sourceTree = "<group>"; }; > 41B459ED1F55EBC70000F6FD /* ReadableStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReadableStream.cpp; sourceTree = "<group>"; }; >+ 41B9A3AE21377CA600AB239E /* RTCRtpSenderBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCRtpSenderBackend.h; sourceTree = "<group>"; }; >+ 41B9A3B021377F7200AB239E /* RTCRtpReceiverBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCRtpReceiverBackend.h; sourceTree = "<group>"; }; >+ 41B9A3B32137987B00AB239E /* LibWebRTCRtpSenderBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCRtpSenderBackend.h; path = libwebrtc/LibWebRTCRtpSenderBackend.h; sourceTree = "<group>"; }; >+ 41B9A3B42137987C00AB239E /* LibWebRTCRtpSenderBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCRtpSenderBackend.cpp; path = libwebrtc/LibWebRTCRtpSenderBackend.cpp; sourceTree = "<group>"; }; >+ 41B9A3B52137987C00AB239E /* LibWebRTCRtpReceiverBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCRtpReceiverBackend.h; path = libwebrtc/LibWebRTCRtpReceiverBackend.h; sourceTree = "<group>"; }; >+ 41B9A3B62137987D00AB239E /* LibWebRTCRtpReceiverBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCRtpReceiverBackend.cpp; path = libwebrtc/LibWebRTCRtpReceiverBackend.cpp; sourceTree = "<group>"; }; > 41C760B00EDE03D300C1655F /* ScriptState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptState.h; sourceTree = "<group>"; }; > 41C7E1051E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CanvasCaptureMediaStreamTrack.cpp; sourceTree = "<group>"; }; > 41C7E1061E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CanvasCaptureMediaStreamTrack.h; sourceTree = "<group>"; }; >@@ -13345,8 +13357,8 @@ > CDE5959C1BF2757100A1CBE8 /* CDMSessionMediaSourceAVFObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CDMSessionMediaSourceAVFObjC.mm; sourceTree = "<group>"; }; > CDE6560E17CA6E7600526BA7 /* mediaControlsApple.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = mediaControlsApple.js; sourceTree = "<group>"; }; > CDE667A11E4BBA4D00E8154A /* PlatformAudioData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformAudioData.h; sourceTree = "<group>"; }; >- CDE667A21E4BBF1500E8154A /* WebAudioBufferList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cocoa/WebAudioBufferList.cpp; sourceTree = "<group>"; }; >- CDE667A31E4BBF1500E8154A /* WebAudioBufferList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa/WebAudioBufferList.h; sourceTree = "<group>"; }; >+ CDE667A21E4BBF1500E8154A /* cocoa/WebAudioBufferList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cocoa/WebAudioBufferList.cpp; sourceTree = "<group>"; }; >+ CDE667A31E4BBF1500E8154A /* cocoa/WebAudioBufferList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa/WebAudioBufferList.h; sourceTree = "<group>"; }; > CDE7FC42181904B1002BBB77 /* OrderIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OrderIterator.cpp; sourceTree = "<group>"; }; > CDE7FC43181904B1002BBB77 /* OrderIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OrderIterator.h; sourceTree = "<group>"; }; > CDE83DAF183C44060031EAA3 /* VideoPlaybackQuality.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VideoPlaybackQuality.cpp; sourceTree = "<group>"; }; >@@ -15094,9 +15106,11 @@ > 5E2C43561BCEE30D0001E2BC /* RTCRtpReceiver.cpp */, > 5E2C43571BCEE30D0001E2BC /* RTCRtpReceiver.h */, > 5E2C43581BCEE30D0001E2BC /* RTCRtpReceiver.idl */, >+ 41B9A3B021377F7200AB239E /* RTCRtpReceiverBackend.h */, > 5E2C43591BCEE30D0001E2BC /* RTCRtpSender.cpp */, > 5E2C435A1BCEE30D0001E2BC /* RTCRtpSender.h */, > 5E2C435B1BCEE30D0001E2BC /* RTCRtpSender.idl */, >+ 41B9A3AE21377CA600AB239E /* RTCRtpSenderBackend.h */, > 5E2C435D1BCEE30D0001E2BC /* RTCRtpSenderReceiverBase.h */, > 5E5E2B101CFC3E4B000C0D85 /* RTCRtpTransceiver.cpp */, > 5E5E2B111CFC3E4B000C0D85 /* RTCRtpTransceiver.h */, >@@ -16808,6 +16822,12 @@ > 417612AC1E3A993B00C3D81D /* LibWebRTCMediaEndpoint.h */, > 417612AD1E3A993B00C3D81D /* LibWebRTCPeerConnectionBackend.cpp */, > 417612AE1E3A993B00C3D81D /* LibWebRTCPeerConnectionBackend.h */, >+ 41B9A3B62137987D00AB239E /* LibWebRTCRtpReceiverBackend.cpp */, >+ 41B9A3B52137987C00AB239E /* LibWebRTCRtpReceiverBackend.h */, >+ 41B9A3B42137987C00AB239E /* LibWebRTCRtpSenderBackend.cpp */, >+ 41B9A3B32137987B00AB239E /* LibWebRTCRtpSenderBackend.h */, >+ 419F846D2138613E0052DD0B /* LibWebRTCUtils.cpp */, >+ 419F846C2138613D0052DD0B /* LibWebRTCUtils.h */, > ); > name = libwebrtc; > sourceTree = "<group>"; >@@ -24532,8 +24552,8 @@ > children = ( > CD669D661D232DFF004D1866 /* MediaSessionManagerCocoa.cpp */, > CD227E362113AEFA00D285AF /* MediaSessionManagerCocoa.h */, >- CDE667A21E4BBF1500E8154A /* WebAudioBufferList.cpp */, >- CDE667A31E4BBF1500E8154A /* WebAudioBufferList.h */, >+ CDE667A21E4BBF1500E8154A /* cocoa/WebAudioBufferList.cpp */, >+ CDE667A31E4BBF1500E8154A /* cocoa/WebAudioBufferList.h */, > ); > name = cocoa; > sourceTree = "<group>"; >@@ -28177,6 +28197,7 @@ > 8AB4BC77126FDB7100DEB727 /* IgnoreDestructiveWriteCountIncrementer.h in Headers */, > 467302021C4EFE7800BCB357 /* IgnoreOpensDuringUnloadCountIncrementer.h in Headers */, > B27535700B053814002CE64F /* Image.h in Headers */, >+ 4195814B21386EA0000DBA62 /* WebAudioBufferList.h in Headers */, > 55A336F91D821E3C0022C4C7 /* ImageBackingStore.h in Headers */, > 31815A311F9A6C8F00FCBF89 /* ImageBitmap.h in Headers */, > 7C7903B31F86F95C00463A70 /* ImageBitmapRenderingContext.h in Headers */, >@@ -30729,7 +30750,7 @@ > 7132445120109DA500AE7FB2 /* WebAnimationUtilities.h in Headers */, > E18536841F4E481400FE091B /* WebArchiveResourceFromNSAttributedString.h in Headers */, > E18C35441F71970C00FF632D /* WebArchiveResourceWebResourceHandler.h in Headers */, >- CDE667A51E4BBF1500E8154A /* WebAudioBufferList.h in Headers */, >+ CDE667A51E4BBF1500E8154A /* cocoa/WebAudioBufferList.h in Headers */, > 41B2A6261EF1BF6D002B9D7A /* WebAudioSourceProvider.h in Headers */, > 07D637401BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h in Headers */, > 1F36EA9C1E21BA1700621E25 /* WebBackgroundTaskController.h in Headers */, >@@ -31372,6 +31393,9 @@ > 5CDD83641E4325A000621E92 /* LibWebRTCDataChannelHandler.cpp in Sources */, > 417612AF1E3A994000C3D81D /* LibWebRTCMediaEndpoint.cpp in Sources */, > 417612B11E3A994000C3D81D /* LibWebRTCPeerConnectionBackend.cpp in Sources */, >+ 419F846B21385EBA0052DD0B /* LibWebRTCRtpReceiverBackend.cpp in Sources */, >+ 419F846921385EB70052DD0B /* LibWebRTCRtpSenderBackend.cpp in Sources */, >+ 419F846E213861410052DD0B /* LibWebRTCUtils.cpp in Sources */, > 9759E93E14EF1CF80026A2DD /* LoadableTextTrack.cpp in Sources */, > 445775EA2047303C008DCE5D /* LocalDefaultSystemAppearance.mm in Sources */, > FABE72FE1059C21100D999DD /* MathMLNames.cpp in Sources */, >@@ -32054,7 +32078,7 @@ > A14832B9187F63D500DA63A6 /* WAKView.mm in Sources */, > DE5F861E1FA281FD006DB63A /* WebAccessibilityObjectWrapperBase.mm in Sources */, > DE5F861D1FA2815B006DB63A /* WebAccessibilityObjectWrapperMac.mm in Sources */, >- CDE667A41E4BBF1500E8154A /* WebAudioBufferList.cpp in Sources */, >+ CDE667A41E4BBF1500E8154A /* cocoa/WebAudioBufferList.cpp in Sources */, > CD7E05221651C28200C1201F /* WebCoreAVFResourceLoader.mm in Sources */, > CD225C0B1C46FBF400140761 /* WebCoreNSURLSession.mm in Sources */, > 93F19B0708245E59001E9ABC /* WebCoreView.m in Sources */,
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 189171
:
348541
|
348558
|
348560
|
348565
|
348569
|
348590
|
348603
|
348821
|
348823