Diff
Modified: trunk/Source/WebCore/ChangeLog (235648 => 235649)
--- trunk/Source/WebCore/ChangeLog 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/ChangeLog 2018-09-05 00:04:01 UTC (rev 235649)
@@ -1,3 +1,51 @@
+2018-09-04 Youenn Fablet <you...@apple.com>
+
+ Make LibWebRTCRtpSenderBackend own its libwebrtc RTP sender backend
+ https://bugs.webkit.org/show_bug.cgi?id=189270
+
+ Reviewed by Eric Carlson.
+
+ Previously, the libwebrtc senders were owned in LibWebRTCMediaEndpoint.
+ This patch makes them be owned by LibWebRTCRtpSenderBackend.
+ This simplifies the implementation of RTCRtpSender::getParameters.
+ This will help simplify the implementation of RTCRtpSender::replaceTrack.
+
+ removeTrack is also refactored so that LibWebRTCMediaEndpoint directly uses libwebrtc constructs and not WebCore libwebrtc-agnostic ones.
+
+ No change of behavior.
+
+ * Modules/mediastream/PeerConnectionBackend.h:
+ (WebCore::PeerConnectionBackend::removeTrack):
+ (WebCore::PeerConnectionBackend::notifyRemovedTrack): Deleted.
+ * Modules/mediastream/RTCPeerConnection.cpp:
+ (WebCore::RTCPeerConnection::removeTrack):
+ * Modules/mediastream/RTCRtpSender.cpp:
+ (WebCore::RTCRtpSender::getParameters):
+ * Modules/mediastream/RTCRtpSender.h:
+ (WebCore::RTCRtpSender::backend):
+ * Modules/mediastream/RTCRtpSenderBackend.h:
+ * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+ (WebCore::LibWebRTCMediaEndpoint::addTrack):
+ (WebCore::LibWebRTCMediaEndpoint::removeTrack):
+ (WebCore::LibWebRTCMediaEndpoint::doCreateOffer):
+ (WebCore::LibWebRTCMediaEndpoint::stop):
+ (WebCore::LibWebRTCMediaEndpoint::shouldOfferAllowToReceiveAudio const): Deleted.
+ (WebCore::LibWebRTCMediaEndpoint::shouldOfferAllowToReceiveVideo const): Deleted.
+ (WebCore::LibWebRTCMediaEndpoint::getRTCRtpSenderParameters): Deleted.
+ * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+ (WebCore::backendFromRTPSender):
+ (WebCore::LibWebRTCPeerConnectionBackend::addTrack):
+ (WebCore::LibWebRTCPeerConnectionBackend::addTransceiver):
+ (WebCore::LibWebRTCPeerConnectionBackend::removeTrack):
+ (WebCore::LibWebRTCPeerConnectionBackend::shouldOfferAllowToReceive const):
+ (WebCore::LibWebRTCPeerConnectionBackend::notifyRemovedTrack): Deleted.
+ (WebCore::LibWebRTCPeerConnectionBackend::getParameters const): Deleted.
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp:
+ (WebCore::LibWebRTCRtpSenderBackend::getParameters const):
+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h:
+
2018-09-04 Wenson Hsieh <wenson_hs...@apple.com>
Populate "text/uri-list" with multiple URLs when the pasteboard contains multiple URLs
Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h 2018-09-05 00:04:01 UTC (rev 235649)
@@ -102,7 +102,7 @@
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 notifyRemovedTrack(RTCRtpSender&) { }
+ virtual void removeTrack(RTCRtpSender&) { }
virtual ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(const String&, const RTCRtpTransceiverInit&);
virtual ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(Ref<MediaStreamTrack>&&, const RTCRtpTransceiverInit&);
Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp 2018-09-05 00:04:01 UTC (rev 235649)
@@ -157,9 +157,8 @@
if (shouldAbort)
return { };
+ m_backend->removeTrack(sender);
sender.stop();
-
- m_backend->notifyRemovedTrack(sender);
return { };
}
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp 2018-09-05 00:04:01 UTC (rev 235649)
@@ -96,7 +96,7 @@
{
if (isStopped())
return { };
- return m_backend->getParameters(*this);
+ return m_backend->getParameters();
}
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h 2018-09-05 00:04:01 UTC (rev 235649)
@@ -57,6 +57,7 @@
void replaceTrack(RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
RTCRtpParameters getParameters();
+ RTCRtpSenderBackend* backend() { return m_backend.get(); }
private:
RTCRtpSender(String&& trackKind, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&&);
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h 2018-09-05 00:04:01 UTC (rev 235649)
@@ -37,7 +37,7 @@
class RTCRtpSenderBackend {
public:
virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0;
- virtual RTCRtpParameters getParameters(RTCRtpSender&) const = 0;
+ virtual RTCRtpParameters getParameters() const = 0;
virtual ~RTCRtpSenderBackend() = default;
};
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp 2018-09-05 00:04:01 UTC (rev 235649)
@@ -194,9 +194,10 @@
startLoggingStats();
}
-bool LibWebRTCMediaEndpoint::addTrack(RTCRtpSender& sender, MediaStreamTrack& track, const Vector<String>& mediaStreamIds)
+bool LibWebRTCMediaEndpoint::addTrack(LibWebRTCRtpSenderBackend& sender, MediaStreamTrack& track, const Vector<String>& mediaStreamIds)
{
ASSERT(m_backend);
+ ASSERT(!sender.rtcSender());
if (!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()) {
String mediaStreamId = mediaStreamIds.isEmpty() ? createCanonicalUUIDString() : mediaStreamIds[0];
@@ -217,9 +218,10 @@
auto audioTrack = m_peerConnectionFactory.CreateAudioTrack(track.id().utf8().data(), trackSource.ptr());
m_peerConnectionBackend.addAudioSource(WTFMove(trackSource));
auto rtpSender = m_backend->AddTrack(audioTrack.get(), WTFMove(ids));
- if (rtpSender.ok())
- m_senders.add(&sender, rtpSender.MoveValue());
- return rtpSender.ok();
+ if (!rtpSender.ok())
+ return false;
+ sender.setRTCSender(rtpSender.MoveValue());
+ return true;
}
case RealtimeMediaSource::Type::Video: {
auto videoSource = RealtimeOutgoingVideoSource::create(track.privateTrack());
@@ -226,9 +228,10 @@
auto videoTrack = m_peerConnectionFactory.CreateVideoTrack(track.id().utf8().data(), videoSource.ptr());
m_peerConnectionBackend.addVideoSource(WTFMove(videoSource));
auto rtpSender = m_backend->AddTrack(videoTrack.get(), WTFMove(ids));
- if (rtpSender.ok())
- m_senders.add(&sender, rtpSender.MoveValue());
- return rtpSender.ok();
+ if (!rtpSender.ok())
+ return false;
+ sender.setRTCSender(rtpSender.MoveValue());
+ return true;
}
case RealtimeMediaSource::Type::None:
ASSERT_NOT_REACHED();
@@ -236,48 +239,12 @@
return false;
}
-void LibWebRTCMediaEndpoint::removeTrack(RTCRtpSender& sender)
+void LibWebRTCMediaEndpoint::removeTrack(LibWebRTCRtpSenderBackend& sender)
{
ASSERT(m_backend);
-
- auto rtcSender = m_senders.get(&sender);
- if (!rtcSender)
- return;
- m_backend->RemoveTrack(rtcSender.get());
+ m_backend->RemoveTrack(sender.rtcSender());
}
-bool LibWebRTCMediaEndpoint::shouldOfferAllowToReceiveAudio() const
-{
- ASSERT(!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled());
- for (const auto& transceiver : m_peerConnectionBackend.connection().getTransceivers()) {
- if (transceiver->sender().trackKind() != "audio")
- continue;
-
- if (transceiver->direction() == RTCRtpTransceiverDirection::Recvonly)
- return true;
-
- if (transceiver->direction() == RTCRtpTransceiverDirection::Sendrecv && !m_senders.contains(&transceiver->sender()))
- return true;
- }
- return false;
-}
-
-bool LibWebRTCMediaEndpoint::shouldOfferAllowToReceiveVideo() const
-{
- ASSERT(!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled());
- for (const auto& transceiver : m_peerConnectionBackend.connection().getTransceivers()) {
- if (transceiver->sender().trackKind() != "video")
- continue;
-
- if (transceiver->direction() == RTCRtpTransceiverDirection::Recvonly)
- return true;
-
- if (transceiver->direction() == RTCRtpTransceiverDirection::Sendrecv && !m_senders.contains(&transceiver->sender()))
- return true;
- }
- return false;
-}
-
void LibWebRTCMediaEndpoint::doCreateOffer(const RTCOfferOptions& options)
{
ASSERT(m_backend);
@@ -288,9 +255,9 @@
rtcOptions.voice_activity_detection = options.voiceActivityDetection;
if (!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()) {
- if (shouldOfferAllowToReceiveAudio())
+ if (m_peerConnectionBackend.shouldOfferAllowToReceive("audio"_s))
rtcOptions.offer_to_receive_audio = webrtc::PeerConnectionInterface::RTCOfferAnswerOptions::kOfferToReceiveMediaTrue;
- if (shouldOfferAllowToReceiveVideo())
+ if (m_peerConnectionBackend.shouldOfferAllowToReceive("video"_s))
rtcOptions.offer_to_receive_video = webrtc::PeerConnectionInterface::RTCOfferAnswerOptions::kOfferToReceiveMediaTrue;
}
m_backend->CreateOffer(&m_createSessionDescriptionObserver, rtcOptions);
@@ -470,7 +437,6 @@
m_backend->Close();
m_backend = nullptr;
m_streams.clear();
- m_senders.clear();
}
void LibWebRTCMediaEndpoint::OnRenegotiationNeeded()
@@ -614,14 +580,6 @@
});
}
-RTCRtpParameters LibWebRTCMediaEndpoint::getRTCRtpSenderParameters(RTCRtpSender& sender)
-{
- auto rtcSender = m_senders.get(&sender);
- if (!rtcSender)
- return { };
- return fillRtpParameters(rtcSender->GetParameters());
-}
-
void LibWebRTCMediaEndpoint::gatherStatsForLogging()
{
LibWebRTCProvider::callOnWebRTCSignalingThread([protectedThis = makeRef(*this)] {
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h 2018-09-05 00:04:01 UTC (rev 235649)
@@ -61,6 +61,7 @@
class LibWebRTCProvider;
class LibWebRTCPeerConnectionBackend;
+class LibWebRTCRtpSenderBackend;
class MediaStreamTrack;
class RTCSessionDescription;
@@ -97,9 +98,8 @@
RefPtr<RTCSessionDescription> pendingLocalDescription() const;
RefPtr<RTCSessionDescription> pendingRemoteDescription() const;
- bool addTrack(RTCRtpSender&, MediaStreamTrack&, const Vector<String>&);
- void removeTrack(RTCRtpSender&);
- RTCRtpParameters getRTCRtpSenderParameters(RTCRtpSender&);
+ bool addTrack(LibWebRTCRtpSenderBackend&, MediaStreamTrack&, const Vector<String>&);
+ void removeTrack(LibWebRTCRtpSenderBackend&);
private:
LibWebRTCMediaEndpoint(LibWebRTCPeerConnectionBackend&, LibWebRTCProvider&);
@@ -142,9 +142,6 @@
: rtc::RefCountReleaseStatus::kDroppedLastRef;
}
- bool shouldOfferAllowToReceiveAudio() const;
- bool shouldOfferAllowToReceiveVideo() const;
-
#if !RELEASE_LOG_DISABLED
const Logger& logger() const final { return m_logger.get(); }
const void* logIdentifier() const final { return m_logIdentifier; }
@@ -167,7 +164,6 @@
SetRemoteSessionDescriptionObserver<LibWebRTCMediaEndpoint> m_setRemoteSessionDescriptionObserver;
HashMap<webrtc::MediaStreamInterface*, RefPtr<MediaStream>> m_streams;
- HashMap<RTCRtpSender*, rtc::scoped_refptr<webrtc::RtpSenderInterface>> m_senders;
bool m_isInitiator { false };
Timer m_statsLogTimer;
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2018-09-05 00:04:01 UTC (rev 235649)
@@ -43,6 +43,7 @@
#include "RealtimeIncomingVideoSource.h"
#include "RealtimeOutgoingAudioSource.h"
#include "RealtimeOutgoingVideoSource.h"
+#include "RuntimeEnabledFeatures.h"
namespace WebCore {
@@ -331,6 +332,11 @@
return m_endpoint->remoteDescription();
}
+static inline LibWebRTCRtpSenderBackend& backendFromRTPSender(RTCRtpSender& sender)
+{
+ return static_cast<LibWebRTCRtpSenderBackend&>(*sender.backend());
+}
+
ExceptionOr<Ref<RTCRtpSender>> LibWebRTCPeerConnectionBackend::addTrack(RTCRtpSender* sender, MediaStreamTrack& track, const Vector<String>& mediaStreamIds)
{
if (!sender) {
@@ -351,7 +357,7 @@
m_peerConnection.addInternalTransceiver(WTFMove(transceiver));
}
- if (!m_endpoint->addTrack(*sender, track, mediaStreamIds))
+ if (!m_endpoint->addTrack(backendFromRTPSender(*sender), track, mediaStreamIds))
return Exception { TypeError, "Unable to add track"_s };
return makeRef(*sender);
@@ -367,8 +373,9 @@
ExceptionOr<Ref<RTCRtpTransceiver>> LibWebRTCPeerConnectionBackend::addTransceiver(Ref<MediaStreamTrack>&& track, const RTCRtpTransceiverInit& init)
{
auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr);
+ auto& backend = *senderBackend;
auto sender = RTCRtpSender::create(track.copyRef(), Vector<String>(), WTFMove(senderBackend));
- if (!m_endpoint->addTrack(sender.get(), track, Vector<String> { }))
+ if (!m_endpoint->addTrack(backend, track, Vector<String> { }))
return Exception { InvalidAccessError, "Unable to add track"_s };
return completeAddTransceiver(WTFMove(sender), init, track->id(), track->kind());
@@ -386,9 +393,9 @@
return transceiver;
}
-void LibWebRTCPeerConnectionBackend::notifyRemovedTrack(RTCRtpSender& sender)
+void LibWebRTCPeerConnectionBackend::removeTrack(RTCRtpSender& sender)
{
- m_endpoint->removeTrack(sender);
+ m_endpoint->removeTrack(backendFromRTPSender(sender));
}
template<typename Source>
@@ -444,11 +451,6 @@
}
}
-RTCRtpParameters LibWebRTCPeerConnectionBackend::getParameters(RTCRtpSender& sender) const
-{
- return m_endpoint->getRTCRtpSenderParameters(sender);
-}
-
void LibWebRTCPeerConnectionBackend::applyRotationForOutgoingVideoSources()
{
for (auto& source : m_videoSources)
@@ -455,6 +457,26 @@
source->setApplyRotation(true);
}
+bool LibWebRTCPeerConnectionBackend::shouldOfferAllowToReceive(const char* kind) const
+{
+ ASSERT(!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled());
+ for (const auto& transceiver : m_peerConnection.getTransceivers()) {
+ if (transceiver->sender().trackKind() != kind)
+ continue;
+
+ if (transceiver->direction() == RTCRtpTransceiverDirection::Recvonly)
+ return true;
+
+ if (transceiver->direction() != RTCRtpTransceiverDirection::Sendrecv)
+ continue;
+
+ auto& backend = static_cast<LibWebRTCRtpSenderBackend&>(*transceiver->sender().backend());
+ if (!backend.rtcSender())
+ return true;
+ }
+ return false;
+}
+
} // namespace WebCore
#endif // USE(LIBWEBRTC)
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2018-09-05 00:04:01 UTC (rev 235649)
@@ -56,8 +56,9 @@
bool hasVideoSources() const { return m_videoSources.size(); }
void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
- RTCRtpParameters getParameters(RTCRtpSender&) const;
+ bool shouldOfferAllowToReceive(const char*) const;
+
private:
void doCreateOffer(RTCOfferOptions&&) final;
void doCreateAnswer(RTCAnswerOptions&&) final;
@@ -90,7 +91,7 @@
void getStatsSucceeded(const DeferredPromise&, Ref<RTCStatsReport>&&);
ExceptionOr<Ref<RTCRtpSender>> addTrack(RTCRtpSender*, MediaStreamTrack&, const Vector<String>&) final;
- void notifyRemovedTrack(RTCRtpSender&) final;
+ void removeTrack(RTCRtpSender&) final;
ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(const String&, const RTCRtpTransceiverInit&) final;
ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(Ref<MediaStreamTrack>&&, const RTCRtpTransceiverInit&) final;
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp 2018-09-05 00:04:01 UTC (rev 235649)
@@ -49,14 +49,11 @@
m_peerConnectionBackend->replaceTrack(sender, WTFMove(track), WTFMove(promise));
}
-RTCRtpParameters LibWebRTCRtpSenderBackend::getParameters(RTCRtpSender& sender) const
+RTCRtpParameters LibWebRTCRtpSenderBackend::getParameters() 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);
- }
+ if (!m_rtcSender)
+ return { };
+
return fillRtpParameters(m_rtcSender->GetParameters());
}
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h (235648 => 235649)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h 2018-09-04 23:51:12 UTC (rev 235648)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h 2018-09-05 00:04:01 UTC (rev 235649)
@@ -50,10 +50,12 @@
{
}
+ void setRTCSender(rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender) { m_rtcSender = WTFMove(rtcSender); }
+ webrtc::RtpSenderInterface* rtcSender() { return m_rtcSender.get(); }
+
private:
- 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;
+ RTCRtpParameters getParameters() const final;
WeakPtr<LibWebRTCPeerConnectionBackend> m_peerConnectionBackend;
rtc::scoped_refptr<webrtc::RtpSenderInterface> m_rtcSender;