Title: [208683] trunk/Source/WebCore
Revision
208683
Author
[email protected]
Date
2016-11-14 07:46:05 -0800 (Mon, 14 Nov 2016)

Log Message

RTCRtpTransceiver should have Ref of sender and receiver
https://bugs.webkit.org/show_bug.cgi?id=164665

Patch by Youenn Fablet <[email protected]> on 2016-11-14
Reviewed by Darin Adler.

No change of behavior.

Making RTCRptTransceiver have Ref<RTCRtpSender> and Ref<RTCRtpReceiver>.
Transforming transceiver set list of senders and receivers as vectors of references to reduce count churning.
Also making RTCRptTransceiver have a Ref<RTCIceTransport> instead of a RefPtr.

* Modules/mediastream/MediaEndpointPeerConnection.cpp:
(WebCore::MediaEndpointPeerConnection::createOfferTask):
(WebCore::MediaEndpointPeerConnection::createAnswerTask):
(WebCore::createSourceMap):
(WebCore::MediaEndpointPeerConnection::setRemoteDescriptionTask):
(WebCore::MediaEndpointPeerConnection::createReceiver):
(WebCore::MediaEndpointPeerConnection::replaceTrack):
* Modules/mediastream/MediaEndpointPeerConnection.h:
* Modules/mediastream/PeerConnectionBackend.h:
* Modules/mediastream/RTCPeerConnection.cpp:
(WebCore::RTCPeerConnection::addTrack):
(WebCore::RTCPeerConnection::removeTrack):
(WebCore::RTCPeerConnection::close):
* Modules/mediastream/RTCPeerConnection.h:
* Modules/mediastream/RTCRtpTransceiver.cpp:
(WebCore::RTCRtpTransceiver::RTCRtpTransceiver):
* Modules/mediastream/RTCRtpTransceiver.h:
(WebCore::RTCRtpTransceiver::create):
(WebCore::RTCRtpTransceiver::sender):
(WebCore::RTCRtpTransceiver::receiver):
(WebCore::RTCRtpTransceiver::iceTransport):
(WebCore::RtpTransceiverSet::senders):
(WebCore::RtpTransceiverSet::receivers):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (208682 => 208683)


--- trunk/Source/WebCore/ChangeLog	2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/ChangeLog	2016-11-14 15:46:05 UTC (rev 208683)
@@ -1,3 +1,40 @@
+2016-11-14  Youenn Fablet  <[email protected]>
+
+        RTCRtpTransceiver should have Ref of sender and receiver
+        https://bugs.webkit.org/show_bug.cgi?id=164665
+
+        Reviewed by Darin Adler.
+
+        No change of behavior.
+
+        Making RTCRptTransceiver have Ref<RTCRtpSender> and Ref<RTCRtpReceiver>.
+        Transforming transceiver set list of senders and receivers as vectors of references to reduce count churning.
+        Also making RTCRptTransceiver have a Ref<RTCIceTransport> instead of a RefPtr.
+
+        * Modules/mediastream/MediaEndpointPeerConnection.cpp:
+        (WebCore::MediaEndpointPeerConnection::createOfferTask):
+        (WebCore::MediaEndpointPeerConnection::createAnswerTask):
+        (WebCore::createSourceMap):
+        (WebCore::MediaEndpointPeerConnection::setRemoteDescriptionTask):
+        (WebCore::MediaEndpointPeerConnection::createReceiver):
+        (WebCore::MediaEndpointPeerConnection::replaceTrack):
+        * Modules/mediastream/MediaEndpointPeerConnection.h:
+        * Modules/mediastream/PeerConnectionBackend.h:
+        * Modules/mediastream/RTCPeerConnection.cpp:
+        (WebCore::RTCPeerConnection::addTrack):
+        (WebCore::RTCPeerConnection::removeTrack):
+        (WebCore::RTCPeerConnection::close):
+        * Modules/mediastream/RTCPeerConnection.h:
+        * Modules/mediastream/RTCRtpTransceiver.cpp:
+        (WebCore::RTCRtpTransceiver::RTCRtpTransceiver):
+        * Modules/mediastream/RTCRtpTransceiver.h:
+        (WebCore::RTCRtpTransceiver::create):
+        (WebCore::RTCRtpTransceiver::sender):
+        (WebCore::RTCRtpTransceiver::receiver):
+        (WebCore::RTCRtpTransceiver::iceTransport):
+        (WebCore::RtpTransceiverSet::senders):
+        (WebCore::RtpTransceiverSet::receivers):
+
 2016-11-14  Csaba Osztrogonác  <[email protected]>
 
         Fix various --minimal build issue

Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp (208682 => 208683)


--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp	2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp	2016-11-14 15:46:05 UTC (rev 208683)
@@ -169,7 +169,7 @@
 
         mediaDescription.mode = transceiver->directionString();
         if (transceiver->hasSendingDirection()) {
-            RTCRtpSender& sender = *transceiver->sender();
+            auto& sender = transceiver->sender();
 
             mediaDescription.mediaStreamId = sender.mediaStreamIds()[0];
             mediaDescription.mediaStreamTrackId = sender.trackId();
@@ -181,7 +181,7 @@
     // Add media descriptions for remaining transceivers.
     for (auto& transceiver : transceivers) {
         PeerMediaDescription mediaDescription;
-        RTCRtpSender& sender = *transceiver->sender();
+        auto& sender = transceiver->sender();
 
         mediaDescription.mode = transceiver->directionString();
         mediaDescription.mid = transceiver->provisionalMid();
@@ -247,7 +247,7 @@
         if (i >= configurationSnapshot->mediaDescriptions().size()) {
             PeerMediaDescription newMediaDescription;
 
-            RTCRtpSender& sender = *transceiver->sender();
+            auto& sender = transceiver->sender();
             if (sender.track()) {
                 if (sender.mediaStreamIds().size())
                     newMediaDescription.mediaStreamId = sender.mediaStreamIds()[0];
@@ -306,8 +306,8 @@
 
         RTCRtpTransceiver* transceiver = matchTransceiverByMid(transceivers, remoteMediaDescription.mid);
         if (transceiver) {
-            if (transceiver->hasSendingDirection() && transceiver->sender()->track())
-                sourceMap.set(transceiver->mid(), &transceiver->sender()->track()->source());
+            if (transceiver->hasSendingDirection() && transceiver->sender().track())
+                sourceMap.set(transceiver->mid(), &transceiver->sender().track()->source());
         }
     }
 
@@ -485,7 +485,7 @@
             if (mediaDescription.mode == "sendrecv" || mediaDescription.mode == "recvonly") {
                 // Try to match an existing transceiver.
                 transceiver = matchTransceiver(transceivers, [&mediaDescription] (RTCRtpTransceiver& current) {
-                    return !current.stopped() && current.mid().isNull() && current.sender()->trackKind() == mediaDescription.type;
+                    return !current.stopped() && current.mid().isNull() && current.sender().trackKind() == mediaDescription.type;
                 });
 
                 if (transceiver) {
@@ -512,7 +512,7 @@
         }
 
         if (mediaDescription.mode == "sendrecv" || mediaDescription.mode == "sendonly") {
-            RTCRtpReceiver& receiver = *transceiver->receiver();
+            auto& receiver = transceiver->receiver();
             if (receiver.isDispatched())
                 continue;
             receiver.setDispatched(true);
@@ -693,7 +693,7 @@
     return remoteStreams;
 }
 
-RefPtr<RTCRtpReceiver> MediaEndpointPeerConnection::createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId)
+Ref<RTCRtpReceiver> MediaEndpointPeerConnection::createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId)
 {
     RealtimeMediaSource::Type sourceType = trackKind == "audio" ? RealtimeMediaSource::Type::Audio : RealtimeMediaSource::Type::Video;
 
@@ -708,7 +708,7 @@
 void MediaEndpointPeerConnection::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& withTrack, PeerConnection::VoidPromise&& promise)
 {
     RTCRtpTransceiver* transceiver = matchTransceiver(m_peerConnection.getTransceivers(), [&sender] (RTCRtpTransceiver& current) {
-        return current.sender() == &sender;
+        return &current.sender() == &sender;
     });
     ASSERT(transceiver);
 

Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h (208682 => 208683)


--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h	2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h	2016-11-14 15:46:05 UTC (rev 208683)
@@ -68,7 +68,7 @@
 
     Vector<RefPtr<MediaStream>> getRemoteStreams() const override;
 
-    RefPtr<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) override;
+    Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) override;
     void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) override;
 
     bool isNegotiationNeeded() const override { return m_negotiationNeeded; };

Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (208682 => 208683)


--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h	2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h	2016-11-14 15:46:05 UTC (rev 208683)
@@ -93,7 +93,7 @@
 
     virtual Vector<RefPtr<MediaStream>> getRemoteStreams() const = 0;
 
-    virtual RefPtr<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0;
+    virtual Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0;
     virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) = 0;
 
     virtual bool isNegotiationNeeded() const = 0;

Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (208682 => 208683)


--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp	2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp	2016-11-14 15:46:05 UTC (rev 208683)
@@ -98,8 +98,8 @@
     if (!streams.size())
         return Exception { NOT_SUPPORTED_ERR };
 
-    for (auto& sender : m_transceiverSet->getSenders()) {
-        if (sender->trackId() == track->id())
+    for (RTCRtpSender& sender : m_transceiverSet->senders()) {
+        if (sender.trackId() == track->id())
             return Exception { INVALID_ACCESS_ERR };
     }
 
@@ -111,7 +111,7 @@
 
     // Reuse an existing sender with the same track kind if it has never been used to send before.
     for (auto& transceiver : m_transceiverSet->list()) {
-        RTCRtpSender& existingSender = *transceiver->sender();
+        auto& existingSender = transceiver->sender();
         if (existingSender.trackKind() == track->kind() && existingSender.trackId().isNull() && !transceiver->hasSendingDirection()) {
             existingSender.setTrack(WTFMove(track));
             existingSender.setMediaStreamIds(WTFMove(mediaStreamIds));
@@ -134,7 +134,7 @@
         // provisional mid if the transceiver is used to create an offer.
         transceiver->setProvisionalMid(transceiverMid);
 
-        sender = transceiver->sender();
+        sender = &transceiver->sender();
         m_transceiverSet->append(WTFMove(transceiver));
     }
 
@@ -148,7 +148,14 @@
     if (m_signalingState == SignalingState::Closed)
         return Exception { INVALID_STATE_ERR };
 
-    if (!m_transceiverSet->getSenders().contains(&sender))
+    bool shouldAbort = true;
+    for (RTCRtpSender& senderInSet : m_transceiverSet->senders()) {
+        if (&senderInSet == &sender) {
+            shouldAbort = sender.isStopped();
+            break;
+        }
+    }
+    if (shouldAbort)
         return { };
 
     sender.stop();
@@ -199,7 +206,7 @@
 {
     transceiver.setDirection(static_cast<RTCRtpTransceiver::Direction>(init.direction));
 
-    m_transceiverSet->append(&transceiver);
+    m_transceiverSet->append(transceiver);
     m_backend->markAsNeedingNegotiation();
 }
 
@@ -387,8 +394,8 @@
     m_iceConnectionState = IceConnectionState::Closed;
     m_signalingState = SignalingState::Closed;
 
-    for (auto& sender : m_transceiverSet->getSenders())
-        sender->stop();
+    for (RTCRtpSender& sender : m_transceiverSet->senders())
+        sender.stop();
 }
 
 void RTCPeerConnection::emulatePlatformEvent(const String& action)
@@ -412,7 +419,7 @@
     return false;
 }
 
-void RTCPeerConnection::addTransceiver(RefPtr<RTCRtpTransceiver>&& transceiver)
+void RTCPeerConnection::addTransceiver(Ref<RTCRtpTransceiver>&& transceiver)
 {
     m_transceiverSet->append(WTFMove(transceiver));
 }

Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (208682 => 208683)


--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h	2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h	2016-11-14 15:46:05 UTC (rev 208683)
@@ -66,8 +66,8 @@
 
     ExceptionOr<void> initializeWith(Document&, const Dictionary&);
 
-    const Vector<RefPtr<RTCRtpSender>>& getSenders() const { return m_transceiverSet->getSenders(); }
-    const Vector<RefPtr<RTCRtpReceiver>>& getReceivers() const { return m_transceiverSet->getReceivers(); }
+    const Vector<std::reference_wrapper<RTCRtpSender>>& getSenders() const { return m_transceiverSet->senders(); }
+    const Vector<std::reference_wrapper<RTCRtpReceiver>>& getReceivers() const { return m_transceiverSet->receivers(); }
     const Vector<RefPtr<RTCRtpTransceiver>>& getTransceivers() const { return m_transceiverSet->list(); }
 
     // Part of legacy MediaStream-based API (mostly implemented as JS built-ins)
@@ -126,7 +126,7 @@
     WEBCORE_EXPORT void emulatePlatformEvent(const String& action);
 
     // API used by PeerConnectionBackend and relatives
-    void addTransceiver(RefPtr<RTCRtpTransceiver>&&);
+    void addTransceiver(Ref<RTCRtpTransceiver>&&);
     void setSignalingState(PeerConnectionStates::SignalingState);
     void updateIceGatheringState(PeerConnectionStates::IceGatheringState);
     void updateIceConnectionState(PeerConnectionStates::IceConnectionState);

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp (208682 => 208683)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp	2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp	2016-11-14 15:46:05 UTC (rev 208683)
@@ -49,11 +49,6 @@
 STRING_FUNCTION(recvonly)
 STRING_FUNCTION(inactive)
 
-Ref<RTCRtpTransceiver> RTCRtpTransceiver::create(RefPtr<RTCRtpSender>&& sender, RefPtr<RTCRtpReceiver>&& receiver)
-{
-    return adoptRef(*new RTCRtpTransceiver(WTFMove(sender), WTFMove(receiver)));
-}
-
 String RTCRtpTransceiver::getNextMid()
 {
     static unsigned mid = 0;
@@ -60,10 +55,10 @@
     return String::number(++mid);
 }
 
-RTCRtpTransceiver::RTCRtpTransceiver(RefPtr<RTCRtpSender>&& sender, RefPtr<RTCRtpReceiver>&& receiver)
+RTCRtpTransceiver::RTCRtpTransceiver(Ref<RTCRtpSender>&& sender, Ref<RTCRtpReceiver>&& receiver)
     : m_direction(Direction::Sendrecv)
-    , m_sender(sender)
-    , m_receiver(receiver)
+    , m_sender(WTFMove(sender))
+    , m_receiver(WTFMove(receiver))
     , m_iceTransport(RTCIceTransport::create())
 {
 }
@@ -102,7 +97,7 @@
         m_direction = Direction::Inactive;
 }
 
-void RtpTransceiverSet::append(RefPtr<RTCRtpTransceiver>&& transceiver)
+void RtpTransceiverSet::append(Ref<RTCRtpTransceiver>&& transceiver)
 {
     m_senders.append(transceiver->sender());
     m_receivers.append(transceiver->receiver());

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h (208682 => 208683)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h	2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h	2016-11-14 15:46:05 UTC (rev 208683)
@@ -47,7 +47,7 @@
     // This enum is mirrored in RTCPeerConnection.h
     enum class Direction { Sendrecv, Sendonly, Recvonly, Inactive };
 
-    static Ref<RTCRtpTransceiver> create(RefPtr<RTCRtpSender>&&, RefPtr<RTCRtpReceiver>&&);
+    static Ref<RTCRtpTransceiver> create(Ref<RTCRtpSender>&& sender, Ref<RTCRtpReceiver>&& receiver) { return adoptRef(*new RTCRtpTransceiver(WTFMove(sender), WTFMove(receiver))); }
     virtual ~RTCRtpTransceiver() { }
 
     bool hasSendingDirection() const;
@@ -64,8 +64,8 @@
     const String& mid() const { return m_mid; }
     void setMid(const String& mid) { m_mid = mid; }
 
-    RTCRtpSender* sender() const { return m_sender.get(); }
-    RTCRtpReceiver* receiver() const { return m_receiver.get(); }
+    RTCRtpSender& sender() { return m_sender.get(); }
+    RTCRtpReceiver& receiver() { return m_receiver.get(); }
 
     bool stopped() const { return m_stopped; }
     void stop() { m_stopped = true; }
@@ -73,12 +73,12 @@
     // FIXME: Temporary solution to keep track of ICE states for this transceiver. Later, each
     // sender and receiver will have up to two DTLS transports, which in turn will have an ICE
     // transport each.
-    RTCIceTransport& iceTransport() const { return *m_iceTransport; }
+    RTCIceTransport& iceTransport() { return m_iceTransport.get(); }
 
     static String getNextMid();
 
 private:
-    RTCRtpTransceiver(RefPtr<RTCRtpSender>&&, RefPtr<RTCRtpReceiver>&&);
+    RTCRtpTransceiver(Ref<RTCRtpSender>&&, Ref<RTCRtpReceiver>&&);
 
     String m_provisionalMid;
     String m_mid;
@@ -85,27 +85,27 @@
 
     Direction m_direction;
 
-    RefPtr<RTCRtpSender> m_sender;
-    RefPtr<RTCRtpReceiver> m_receiver;
+    Ref<RTCRtpSender> m_sender;
+    Ref<RTCRtpReceiver> m_receiver;
 
     bool m_stopped { false };
 
-    RefPtr<RTCIceTransport> m_iceTransport;
+    Ref<RTCIceTransport> m_iceTransport;
 };
 
 class RtpTransceiverSet {
 public:
     const Vector<RefPtr<RTCRtpTransceiver>>& list() const { return m_transceivers; }
-    void append(RefPtr<RTCRtpTransceiver>&&);
+    void append(Ref<RTCRtpTransceiver>&&);
 
-    const Vector<RefPtr<RTCRtpSender>>& getSenders() const { return m_senders; }
-    const Vector<RefPtr<RTCRtpReceiver>>& getReceivers() const { return m_receivers; }
+    const Vector<std::reference_wrapper<RTCRtpSender>>& senders() const { return m_senders; }
+    const Vector<std::reference_wrapper<RTCRtpReceiver>>& receivers() const { return m_receivers; }
 
 private:
     Vector<RefPtr<RTCRtpTransceiver>> m_transceivers;
 
-    Vector<RefPtr<RTCRtpSender>> m_senders;
-    Vector<RefPtr<RTCRtpReceiver>> m_receivers;
+    Vector<std::reference_wrapper<RTCRtpSender>> m_senders;
+    Vector<std::reference_wrapper<RTCRtpReceiver>> m_receivers;
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to