Diff
Modified: trunk/Source/WebCore/ChangeLog (235718 => 235719)
--- trunk/Source/WebCore/ChangeLog 2018-09-06 03:46:17 UTC (rev 235718)
+++ trunk/Source/WebCore/ChangeLog 2018-09-06 04:01:18 UTC (rev 235719)
@@ -1,3 +1,38 @@
+2018-09-05 Youenn Fablet <[email protected]>
+
+ Introduce a backend for RTCRtpTransceiver
+ https://bugs.webkit.org/show_bug.cgi?id=189322
+
+ Reviewed by Eric Carlson.
+
+ Introduce RTCRtpTransceiverBackend to implement the transceiver functionality using libwebrtc.
+ Remove provisional mids as it will be done by the webrtc backend.
+
+ No observable change of behavior yet since there is no transceiver backend yet.
+
+ * Modules/mediastream/PeerConnectionBackend.h:
+ * Modules/mediastream/RTCRtpTransceiver.cpp:
+ (WebCore::RTCRtpTransceiver::RTCRtpTransceiver):
+ (WebCore::RTCRtpTransceiver::mid const):
+ (WebCore::RTCRtpTransceiver::direction const):
+ (WebCore::RTCRtpTransceiver::setDirection):
+ (WebCore::RTCRtpTransceiver::stop):
+ (WebCore::RTCRtpTransceiver::getNextMid): Deleted.
+ (WebCore::RTCRtpTransceiver::directionString const): Deleted.
+ * Modules/mediastream/RTCRtpTransceiver.h:
+ (WebCore::RTCRtpTransceiver::create):
+ (WebCore::RTCRtpTransceiver::provisionalMid const): Deleted.
+ (WebCore::RTCRtpTransceiver::setMid): Deleted.
+ * Modules/mediastream/RTCRtpTransceiverBackend.h: Added.
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+ (WebCore::LibWebRTCPeerConnectionBackend::createReceiver):
+ (WebCore::LibWebRTCPeerConnectionBackend::videoReceiver):
+ (WebCore::LibWebRTCPeerConnectionBackend::audioReceiver):
+ (WebCore::LibWebRTCPeerConnectionBackend::addTrack):
+ (WebCore::LibWebRTCPeerConnectionBackend::completeAddTransceiver):
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+ * WebCore.xcodeproj/project.pbxproj:
+
2018-09-05 Zalan Bujtas <[email protected]>
[LFC] Pass in const LayoutContext& to geometry methods when possible
Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (235718 => 235719)
--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h 2018-09-06 03:46:17 UTC (rev 235718)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h 2018-09-06 04:01:18 UTC (rev 235719)
@@ -100,7 +100,6 @@
virtual void getStats(MediaStreamTrack*, Ref<DeferredPromise>&&) = 0;
- virtual Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0;
virtual ExceptionOr<Ref<RTCRtpSender>> addTrack(RTCRtpSender*, MediaStreamTrack&, const Vector<String>&);
virtual void removeTrack(RTCRtpSender&) { }
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp (235718 => 235719)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp 2018-09-06 03:46:17 UTC (rev 235718)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp 2018-09-06 04:01:18 UTC (rev 235719)
@@ -38,47 +38,20 @@
namespace WebCore {
-#define STRING_FUNCTION(name) \
- static const String& name##String() \
- { \
- static NeverDestroyed<const String> name(MAKE_STATIC_STRING_IMPL(#name)); \
- return name; \
- }
-
-STRING_FUNCTION(sendrecv)
-STRING_FUNCTION(sendonly)
-STRING_FUNCTION(recvonly)
-STRING_FUNCTION(inactive)
-
-String RTCRtpTransceiver::getNextMid()
-{
- static unsigned mid = 0;
- return String::number(++mid);
-}
-
-RTCRtpTransceiver::RTCRtpTransceiver(Ref<RTCRtpSender>&& sender, Ref<RTCRtpReceiver>&& receiver)
+RTCRtpTransceiver::RTCRtpTransceiver(Ref<RTCRtpSender>&& sender, Ref<RTCRtpReceiver>&& receiver, std::unique_ptr<RTCRtpTransceiverBackend>&& backend)
: m_direction(RTCRtpTransceiverDirection::Sendrecv)
, m_sender(WTFMove(sender))
, m_receiver(WTFMove(receiver))
, m_iceTransport(RTCIceTransport::create())
+ , m_backend(WTFMove(backend))
{
}
-const String& RTCRtpTransceiver::directionString() const
+const String& RTCRtpTransceiver::mid() const
{
- switch (m_direction) {
- case RTCRtpTransceiverDirection::Sendrecv:
- return sendrecvString();
- case RTCRtpTransceiverDirection::Sendonly:
- return sendonlyString();
- case RTCRtpTransceiverDirection::Recvonly:
- return recvonlyString();
- case RTCRtpTransceiverDirection::Inactive:
- return inactiveString();
- }
-
- ASSERT_NOT_REACHED();
- return inactiveString();
+ if (!m_backend)
+ return m_mid;
+ return m_backend->mid();
}
bool RTCRtpTransceiver::hasSendingDirection() const
@@ -86,6 +59,21 @@
return m_direction == RTCRtpTransceiverDirection::Sendrecv || m_direction == RTCRtpTransceiverDirection::Sendonly;
}
+RTCRtpTransceiverDirection RTCRtpTransceiver::direction() const
+{
+ if (!m_backend)
+ return m_direction;
+ return m_backend->direction();
+}
+
+void RTCRtpTransceiver::setDirection(RTCRtpTransceiverDirection direction)
+{
+ m_direction = direction;
+ if (m_backend)
+ m_backend->setDirection(direction);
+}
+
+
void RTCRtpTransceiver::enableSendingDirection()
{
if (m_direction == RTCRtpTransceiverDirection::Recvonly)
@@ -104,9 +92,13 @@
void RTCRtpTransceiver::stop()
{
+ if (m_stopped)
+ return;
m_stopped = true;
m_receiver->stop();
m_sender->stop();
+ if (m_backend)
+ m_backend->stop();
}
void RtpTransceiverSet::append(Ref<RTCRtpTransceiver>&& transceiver)
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h (235718 => 235719)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h 2018-09-06 03:46:17 UTC (rev 235718)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h 2018-09-06 04:01:18 UTC (rev 235719)
@@ -36,6 +36,7 @@
#include "RTCIceTransport.h"
#include "RTCRtpReceiver.h"
#include "RTCRtpSender.h"
+#include "RTCRtpTransceiverBackend.h"
#include "RTCRtpTransceiverDirection.h"
#include "ScriptWrappable.h"
#include <wtf/RefCounted.h>
@@ -46,7 +47,7 @@
class RTCRtpTransceiver : public RefCounted<RTCRtpTransceiver>, public ScriptWrappable {
public:
- static Ref<RTCRtpTransceiver> create(Ref<RTCRtpSender>&& sender, Ref<RTCRtpReceiver>&& receiver) { return adoptRef(*new RTCRtpTransceiver(WTFMove(sender), WTFMove(receiver))); }
+ static Ref<RTCRtpTransceiver> create(Ref<RTCRtpSender>&& sender, Ref<RTCRtpReceiver>&& receiver, std::unique_ptr<RTCRtpTransceiverBackend>&& backend) { return adoptRef(*new RTCRtpTransceiver(WTFMove(sender), WTFMove(receiver), WTFMove(backend))); }
virtual ~RTCRtpTransceiver() = default;
bool hasSendingDirection() const;
@@ -53,17 +54,10 @@
void enableSendingDirection();
void disableSendingDirection();
- const String& directionString() const;
- RTCRtpTransceiverDirection direction() const { return m_direction; }
- // FIXME: setDirection should trigger negotiation needed.
- void setDirection(RTCRtpTransceiverDirection direction) { m_direction = direction; }
+ RTCRtpTransceiverDirection direction() const;
+ void setDirection(RTCRtpTransceiverDirection);
+ const String& mid() const;
- const String& provisionalMid() const { return m_provisionalMid; }
- void setProvisionalMid(const String& provisionalMid) { m_provisionalMid = provisionalMid; }
-
- const String& mid() const { return m_mid; }
- void setMid(const String& mid) { m_mid = mid; }
-
RTCRtpSender& sender() { return m_sender.get(); }
RTCRtpReceiver& receiver() { return m_receiver.get(); }
@@ -75,14 +69,10 @@
// transport each.
RTCIceTransport& iceTransport() { return m_iceTransport.get(); }
- static String getNextMid();
-
private:
- RTCRtpTransceiver(Ref<RTCRtpSender>&&, Ref<RTCRtpReceiver>&&);
+ RTCRtpTransceiver(Ref<RTCRtpSender>&&, Ref<RTCRtpReceiver>&&, std::unique_ptr<RTCRtpTransceiverBackend>&&);
- String m_provisionalMid;
String m_mid;
-
RTCRtpTransceiverDirection m_direction;
Ref<RTCRtpSender> m_sender;
@@ -91,6 +81,7 @@
bool m_stopped { false };
Ref<RTCIceTransport> m_iceTransport;
+ std::unique_ptr<RTCRtpTransceiverBackend> m_backend;
};
class RtpTransceiverSet {
Added: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiverBackend.h (0 => 235719)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiverBackend.h (rev 0)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiverBackend.h 2018-09-06 04:01:18 UTC (rev 235719)
@@ -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 "RTCRtpTransceiverDirection.h"
+
+namespace WebCore {
+
+class RTCRtpTransceiverBackend {
+public:
+ virtual ~RTCRtpTransceiverBackend() = default;
+
+ virtual RTCRtpTransceiverDirection direction() const = 0;
+ virtual void setDirection(RTCRtpTransceiverDirection) = 0;
+
+ virtual const String& mid() = 0;
+ virtual void stop() = 0;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_RTC)
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (235718 => 235719)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2018-09-06 03:46:17 UTC (rev 235718)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2018-09-06 04:01:18 UTC (rev 235719)
@@ -235,7 +235,7 @@
return RealtimeIncomingVideoSource::create(nullptr, WTFMove(trackId));
}
-Ref<RTCRtpReceiver> LibWebRTCPeerConnectionBackend::createReceiver(const String&, const String& trackKind, const String& trackId)
+Ref<RTCRtpReceiver> LibWebRTCPeerConnectionBackend::createReceiver(const String& trackKind, const String& trackId)
{
auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), createEmptySource(trackKind, String(trackId)));
m_pendingReceivers.append(receiver.copyRef());
@@ -258,7 +258,7 @@
auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), source.copyRef());
auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr);
- auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("video", { }, WTFMove(senderBackend)), receiver.copyRef());
+ auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("video", { }, WTFMove(senderBackend)), receiver.copyRef(), nullptr);
transceiver->disableSendingDirection();
m_peerConnection.addTransceiver(WTFMove(transceiver));
@@ -281,7 +281,7 @@
auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), source.copyRef());
auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr);
- auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("audio", { }, WTFMove(senderBackend)), receiver.copyRef());
+ auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("audio", { }, WTFMove(senderBackend)), receiver.copyRef(), nullptr);
transceiver->disableSendingDirection();
m_peerConnection.addTransceiver(WTFMove(transceiver));
@@ -340,19 +340,14 @@
ExceptionOr<Ref<RTCRtpSender>> LibWebRTCPeerConnectionBackend::addTrack(RTCRtpSender* sender, MediaStreamTrack& track, const Vector<String>& 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));
+ auto receiver = createReceiver(trackKind, trackId);
+ auto transceiver = RTCRtpTransceiver::create(WTFMove(newSender), WTFMove(receiver), nullptr);
- // 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));
}
@@ -383,10 +378,8 @@
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));
+ auto transceiver = RTCRtpTransceiver::create(WTFMove(sender), createReceiver(trackKind, trackId), nullptr);
- transceiver->setProvisionalMid(transceiverMid);
transceiver->setDirection(init.direction);
m_peerConnection.addInternalTransceiver(transceiver.copyRef());
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h (235718 => 235719)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2018-09-06 03:46:17 UTC (rev 235718)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2018-09-06 04:01:18 UTC (rev 235719)
@@ -69,7 +69,6 @@
std::unique_ptr<RTCDataChannelHandler> createDataChannelHandler(const String&, const RTCDataChannelInit&) final;
bool setConfiguration(MediaEndpointConfiguration&&) final;
void getStats(MediaStreamTrack*, Ref<DeferredPromise>&&) final;
- Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) final;
RefPtr<RTCSessionDescription> localDescription() const final;
RefPtr<RTCSessionDescription> currentLocalDescription() const final;
@@ -113,6 +112,7 @@
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;
bool m_isLocalDescriptionSet { false };
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (235718 => 235719)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2018-09-06 03:46:17 UTC (rev 235718)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2018-09-06 04:01:18 UTC (rev 235719)
@@ -7283,6 +7283,7 @@
4184F5151EAF059800F18BF0 /* OrientationNotifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OrientationNotifier.h; sourceTree = "<group>"; };
4186BD3B213EDE380001826F /* LibWebRTCRtpReceiverBackend.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LibWebRTCRtpReceiverBackend.h; path = libwebrtc/LibWebRTCRtpReceiverBackend.h; sourceTree = "<group>"; };
4186BD3D213EDE390001826F /* LibWebRTCRtpSenderBackend.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LibWebRTCRtpSenderBackend.h; path = libwebrtc/LibWebRTCRtpSenderBackend.h; sourceTree = "<group>"; };
+ 4186BD46214072B60001826F /* RTCRtpTransceiverBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCRtpTransceiverBackend.h; sourceTree = "<group>"; };
41885B9111B6FDA6003383BB /* FormSubmission.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormSubmission.h; sourceTree = "<group>"; };
41885B9211B6FDA6003383BB /* FormSubmission.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormSubmission.cpp; sourceTree = "<group>"; };
418A06CE133C04D500CD379C /* EventDispatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventDispatcher.h; sourceTree = "<group>"; };
@@ -15169,6 +15170,7 @@
5E5E2B101CFC3E4B000C0D85 /* RTCRtpTransceiver.cpp */,
5E5E2B111CFC3E4B000C0D85 /* RTCRtpTransceiver.h */,
5E5E2B121CFC3E4B000C0D85 /* RTCRtpTransceiver.idl */,
+ 4186BD46214072B60001826F /* RTCRtpTransceiverBackend.h */,
316DCB171E78C330001B5F87 /* RTCRtpTransceiverDirection.idl */,
07221B7A17CEC32700848E51 /* RTCSessionDescription.cpp */,
07221B7B17CEC32700848E51 /* RTCSessionDescription.h */,