Title: [213736] trunk
Revision
213736
Author
commit-qu...@webkit.org
Date
2017-03-10 16:46:44 -0800 (Fri, 10 Mar 2017)

Log Message

Move libwebrtc backend to using tracks
https://bugs.webkit.org/show_bug.cgi?id=169472

Patch by Youenn Fablet <you...@apple.com> on 2017-03-10
Reviewed by Alex Christensen.

Source/ThirdParty/libwebrtc:

* Source/webrtc/pc/rtcstatscollector.cc: Moving from using media stream to tracks.

Source/WebCore:

Covered by current test sets.

This change allows to move away from streams and use more tracks.
This allows future better alignment with the spec and better implementation of sender/receover/transceiver.

Small refactoring to use more Ref<> in WebRTC track-based code.
Added a notifyAddedTrack to notify the backend that a track was added.
For libwebrtc, this allows calling AddTrack before making the offer.
Updated mock libwebrtc backend accordingly.

* Modules/mediastream/MediaEndpointPeerConnection.cpp:
(WebCore::MediaEndpointPeerConnection::replaceTrack):
(WebCore::MediaEndpointPeerConnection::replaceTrackTask):
* Modules/mediastream/MediaEndpointPeerConnection.h:
* Modules/mediastream/PeerConnectionBackend.h:
(WebCore::PeerConnectionBackend::notifyAddedTrack):
* Modules/mediastream/RTCPeerConnection.cpp:
(WebCore::RTCPeerConnection::addTrack):
(WebCore::RTCPeerConnection::replaceTrack):
* Modules/mediastream/RTCPeerConnection.h:
* Modules/mediastream/RTCRtpSender.cpp:
(WebCore::RTCRtpSender::create):
(WebCore::RTCRtpSender::RTCRtpSender):
(WebCore::RTCRtpSender::setTrack):
* Modules/mediastream/RTCRtpSender.h:
* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
(WebCore::LibWebRTCMediaEndpoint::addTrack):
(WebCore::LibWebRTCMediaEndpoint::doCreateOffer):
(WebCore::LibWebRTCMediaEndpoint::doCreateAnswer):
(WebCore::LibWebRTCMediaEndpoint::getStats):
* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
(WebCore::LibWebRTCPeerConnectionBackend::doAddIceCandidate):
(WebCore::LibWebRTCPeerConnectionBackend::notifyAddedTrack):
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
* testing/MockLibWebRTCPeerConnection.cpp:
(WebCore::MockLibWebRTCPeerConnection::AddTrack):
(WebCore::MockLibWebRTCPeerConnection::RemoveTrack):
(WebCore::MockLibWebRTCPeerConnection::CreateOffer):
(WebCore::MockLibWebRTCPeerConnection::CreateAnswer):
* testing/MockLibWebRTCPeerConnection.h:
(WebCore::MockRtpSender::MockRtpSender):
(WebCore::MockRtpSender::ssrc):
(WebCore::MockRtpSender::media_type):
(WebCore::MockRtpSender::id):
(WebCore::MockRtpSender::stream_ids):
(WebCore::MockRtpSender::GetParameters):
(WebCore::MockRtpSender::SetParameters):
(WebCore::MockRtpSender::GetDtmfSender):

LayoutTests:

* TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (213735 => 213736)


--- trunk/LayoutTests/ChangeLog	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/LayoutTests/ChangeLog	2017-03-11 00:46:44 UTC (rev 213736)
@@ -1,3 +1,12 @@
+2017-03-10  Youenn Fablet  <you...@apple.com>
+
+        Move libwebrtc backend to using tracks
+        https://bugs.webkit.org/show_bug.cgi?id=169472
+
+        Reviewed by Alex Christensen.
+
+        * TestExpectations:
+
 2017-03-10  Ryan Haddad  <ryanhad...@apple.com>
 
         Mark compositing/regions/transformed-layer-inside-transformed-layer.html as failing on ios-simulator.

Modified: trunk/LayoutTests/TestExpectations (213735 => 213736)


--- trunk/LayoutTests/TestExpectations	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/LayoutTests/TestExpectations	2017-03-11 00:46:44 UTC (rev 213736)
@@ -715,8 +715,6 @@
 
 # See webkit.org/b/168736
 fast/mediastream/RTCPeerConnection-addIceCandidate.html [ Failure  ]
-fast/mediastream/RTCPeerConnection-addTrack-reuse-sender.html [ Failure  ]
-fast/mediastream/RTCPeerConnection-legacy-stream-based-api.html [ Failure  ]
 imported/w3c/web-platform-tests/webrtc/datachannel-emptystring.html [ Failure  ]
 imported/w3c/web-platform-tests/webrtc/no-media-call.html [ Failure  ]
 imported/w3c/web-platform-tests/webrtc/promises-call.html [ Failure  ]

Modified: trunk/Source/ThirdParty/libwebrtc/ChangeLog (213735 => 213736)


--- trunk/Source/ThirdParty/libwebrtc/ChangeLog	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/ThirdParty/libwebrtc/ChangeLog	2017-03-11 00:46:44 UTC (rev 213736)
@@ -1,3 +1,12 @@
+2017-03-10  Youenn Fablet  <you...@apple.com>
+
+        Move libwebrtc backend to using tracks
+        https://bugs.webkit.org/show_bug.cgi?id=169472
+
+        Reviewed by Alex Christensen.
+
+        * Source/webrtc/pc/rtcstatscollector.cc: Moving from using media stream to tracks.
+
 2017-03-08  Youenn Fablet  <you...@apple.com>
 
         Use H264 hardware encoder for Mac libwebrtc

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/pc/rtcstatscollector.cc (213735 => 213736)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/pc/rtcstatscollector.cc	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/pc/rtcstatscollector.cc	2017-03-11 00:46:44 UTC (rev 213736)
@@ -1198,6 +1198,20 @@
 RTCStatsCollector::PrepareTrackToID_s() const {
   RTC_DCHECK(signaling_thread_->IsCurrent());
   std::map<MediaStreamTrackInterface*, std::string> track_to_id;
+#if defined(WEBRTC_WEBKIT_BUILD)
+  for (auto& sender : pc_->GetSenders()) {
+    auto track = sender->track();
+    if (!track)
+      continue;
+    track_to_id[track.get()] = track->id();
+  }
+  for (auto& receiver : pc_->GetReceivers()) {
+    auto track = receiver->track();
+    if (!track)
+      continue;
+    track_to_id[track.get()] = track->id();
+  }
+#else
   StreamCollectionInterface* local_and_remote_streams[] =
       { pc_->local_streams().get(), pc_->remote_streams().get() };
   for (auto& streams : local_and_remote_streams) {
@@ -1215,6 +1229,7 @@
       }
     }
   }
+#endif
   return track_to_id;
 }
 

Modified: trunk/Source/WebCore/ChangeLog (213735 => 213736)


--- trunk/Source/WebCore/ChangeLog	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/ChangeLog	2017-03-11 00:46:44 UTC (rev 213736)
@@ -1,3 +1,60 @@
+2017-03-10  Youenn Fablet  <you...@apple.com>
+
+        Move libwebrtc backend to using tracks
+        https://bugs.webkit.org/show_bug.cgi?id=169472
+
+        Reviewed by Alex Christensen.
+
+        Covered by current test sets.
+
+        This change allows to move away from streams and use more tracks.
+        This allows future better alignment with the spec and better implementation of sender/receover/transceiver.
+
+        Small refactoring to use more Ref<> in WebRTC track-based code.
+        Added a notifyAddedTrack to notify the backend that a track was added.
+        For libwebrtc, this allows calling AddTrack before making the offer.
+        Updated mock libwebrtc backend accordingly.
+
+        * Modules/mediastream/MediaEndpointPeerConnection.cpp:
+        (WebCore::MediaEndpointPeerConnection::replaceTrack):
+        (WebCore::MediaEndpointPeerConnection::replaceTrackTask):
+        * Modules/mediastream/MediaEndpointPeerConnection.h:
+        * Modules/mediastream/PeerConnectionBackend.h:
+        (WebCore::PeerConnectionBackend::notifyAddedTrack):
+        * Modules/mediastream/RTCPeerConnection.cpp:
+        (WebCore::RTCPeerConnection::addTrack):
+        (WebCore::RTCPeerConnection::replaceTrack):
+        * Modules/mediastream/RTCPeerConnection.h:
+        * Modules/mediastream/RTCRtpSender.cpp:
+        (WebCore::RTCRtpSender::create):
+        (WebCore::RTCRtpSender::RTCRtpSender):
+        (WebCore::RTCRtpSender::setTrack):
+        * Modules/mediastream/RTCRtpSender.h:
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+        (WebCore::LibWebRTCMediaEndpoint::addTrack):
+        (WebCore::LibWebRTCMediaEndpoint::doCreateOffer):
+        (WebCore::LibWebRTCMediaEndpoint::doCreateAnswer):
+        (WebCore::LibWebRTCMediaEndpoint::getStats):
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+        (WebCore::LibWebRTCPeerConnectionBackend::doAddIceCandidate):
+        (WebCore::LibWebRTCPeerConnectionBackend::notifyAddedTrack):
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+        * testing/MockLibWebRTCPeerConnection.cpp:
+        (WebCore::MockLibWebRTCPeerConnection::AddTrack):
+        (WebCore::MockLibWebRTCPeerConnection::RemoveTrack):
+        (WebCore::MockLibWebRTCPeerConnection::CreateOffer):
+        (WebCore::MockLibWebRTCPeerConnection::CreateAnswer):
+        * testing/MockLibWebRTCPeerConnection.h:
+        (WebCore::MockRtpSender::MockRtpSender):
+        (WebCore::MockRtpSender::ssrc):
+        (WebCore::MockRtpSender::media_type):
+        (WebCore::MockRtpSender::id):
+        (WebCore::MockRtpSender::stream_ids):
+        (WebCore::MockRtpSender::GetParameters):
+        (WebCore::MockRtpSender::SetParameters):
+        (WebCore::MockRtpSender::GetDtmfSender):
+
 2017-03-10  Zalan Bujtas  <za...@apple.com>
 
         Simple line layout: Check how many orphans needed on the current page before breaking.

Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp	2017-03-11 00:46:44 UTC (rev 213736)
@@ -693,7 +693,7 @@
     return m_mediaEndpoint->createDataChannelHandler(label, options);
 }
 
-void MediaEndpointPeerConnection::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& withTrack, DOMPromise<void>&& promise)
+void MediaEndpointPeerConnection::replaceTrack(RTCRtpSender& sender, Ref<MediaStreamTrack>&& withTrack, DOMPromise<void>&& promise)
 {
     RTCRtpTransceiver* transceiver = matchTransceiver(m_peerConnection.getTransceivers(), [&sender] (RTCRtpTransceiver& current) {
         return &current.sender() == &sender;
@@ -713,7 +713,7 @@
     });
 }
 
-void MediaEndpointPeerConnection::replaceTrackTask(RTCRtpSender& sender, const String& mid, RefPtr<MediaStreamTrack>&& withTrack, DOMPromise<void>& promise)
+void MediaEndpointPeerConnection::replaceTrackTask(RTCRtpSender& sender, const String& mid, Ref<MediaStreamTrack>&& withTrack, DOMPromise<void>& promise)
 {
     if (m_peerConnection.internalSignalingState() == SignalingState::Closed)
         return;

Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h	2017-03-11 00:46:44 UTC (rev 213736)
@@ -62,7 +62,7 @@
     Vector<RefPtr<MediaStream>> getRemoteStreams() const final;
 
     Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) final;
-    void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromise<void>&&) final;
+    void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) final;
 
     void emulatePlatformEvent(const String& action) final;
 
@@ -84,7 +84,7 @@
 
     void addIceCandidateTask(RTCIceCandidate&);
 
-    void replaceTrackTask(RTCRtpSender&, const String& mid, RefPtr<MediaStreamTrack>&&, DOMPromise<void>&);
+    void replaceTrackTask(RTCRtpSender&, const String& mid, Ref<MediaStreamTrack>&&, DOMPromise<void>&);
 
     bool localDescriptionTypeValidForState(RTCSessionDescription::SdpType) const;
     bool remoteDescriptionTypeValidForState(RTCSessionDescription::SdpType) const;

Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h	2017-03-11 00:46:44 UTC (rev 213736)
@@ -93,7 +93,8 @@
     virtual Vector<RefPtr<MediaStream>> getRemoteStreams() const = 0;
 
     virtual Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0;
-    virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromise<void>&&) = 0;
+    virtual void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) = 0;
+    virtual void notifyAddedTrack(RTCRtpSender&) { }
 
     void markAsNeedingNegotiation();
     bool isNegotiationNeeded() const { return m_negotiationNeeded; };

Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp	2017-03-11 00:46:44 UTC (rev 213736)
@@ -123,6 +123,7 @@
             existingSender.setMediaStreamIds(WTFMove(mediaStreamIds));
             transceiver->enableSendingDirection();
             sender = &existingSender;
+            
             break;
         }
     }
@@ -146,6 +147,7 @@
 
     m_backend->markAsNeedingNegotiation();
 
+    m_backend->notifyAddedTrack(*sender);
     return Ref<RTCRtpSender> { *sender };
 }
 
@@ -510,7 +512,7 @@
     dispatchEvent(event);
 }
 
-void RTCPeerConnection::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& withTrack, DOMPromise<void>&& promise)
+void RTCPeerConnection::replaceTrack(RTCRtpSender& sender, Ref<MediaStreamTrack>&& withTrack, DOMPromise<void>&& promise)
 {
     m_backend->replaceTrack(sender, WTFMove(withTrack), WTFMove(promise));
 }

Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h	2017-03-11 00:46:44 UTC (rev 213736)
@@ -159,7 +159,7 @@
     bool canSuspendForDocumentSuspension() const final;
 
     // RTCRtpSenderClient
-    void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromise<void>&&) final;
+    void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) final;
 
     PeerConnectionStates::SignalingState m_signalingState { PeerConnectionStates::SignalingState::Stable };
     PeerConnectionStates::IceGatheringState m_iceGatheringState { PeerConnectionStates::IceGatheringState::New };

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp	2017-03-11 00:46:44 UTC (rev 213736)
@@ -39,31 +39,29 @@
 
 Ref<RTCRtpSender> RTCRtpSender::create(Ref<MediaStreamTrack>&& track, Vector<String>&& mediaStreamIds, RTCRtpSenderClient& client)
 {
-    const String& trackKind = track->kind();
-    return adoptRef(*new RTCRtpSender(WTFMove(track), trackKind, WTFMove(mediaStreamIds), client));
+    auto sender = adoptRef(*new RTCRtpSender(track->kind(), WTFMove(mediaStreamIds), client));
+    sender->setTrack(WTFMove(track));
+    return sender;
 }
 
 Ref<RTCRtpSender> RTCRtpSender::create(const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient& client)
 {
-    return adoptRef(*new RTCRtpSender(nullptr, trackKind, WTFMove(mediaStreamIds), client));
+    return adoptRef(*new RTCRtpSender(trackKind, WTFMove(mediaStreamIds), client));
 }
 
-RTCRtpSender::RTCRtpSender(RefPtr<MediaStreamTrack>&& track, const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient& client)
+RTCRtpSender::RTCRtpSender(const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient& client)
     : RTCRtpSenderReceiverBase()
     , m_trackKind(trackKind)
     , m_mediaStreamIds(WTFMove(mediaStreamIds))
     , m_client(&client)
 {
-    setTrack(WTFMove(track));
 }
 
-void RTCRtpSender::setTrack(RefPtr<MediaStreamTrack>&& track)
+void RTCRtpSender::setTrack(Ref<MediaStreamTrack>&& track)
 {
-    // Save the id from the first non-null track set. That id will be used to negotiate the sender
-    // even if the track is replaced.
-    if (!m_track && track)
-        m_trackId = track->id();
-
+    ASSERT(!isStopped());
+    ASSERT(!m_track);
+    m_trackId = track->id();
     m_track = WTFMove(track);
 }
 

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h	2017-03-11 00:46:44 UTC (rev 213736)
@@ -39,7 +39,7 @@
 
 class RTCRtpSenderClient {
 public:
-    virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromise<void>&&) = 0;
+    virtual void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) = 0;
 
     virtual ~RTCRtpSenderClient() { }
 };
@@ -57,12 +57,12 @@
 
     bool isStopped() const { return !m_client; }
     void stop() { m_client = nullptr; }
-    void setTrack(RefPtr<MediaStreamTrack>&&);
+    void setTrack(Ref<MediaStreamTrack>&&);
 
     ExceptionOr<void> replaceTrack(Ref<MediaStreamTrack>&&, DOMPromise<void>&&);
 
 private:
-    RTCRtpSender(RefPtr<MediaStreamTrack>&&, const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient&);
+    RTCRtpSender(const String& trackKind, Vector<String>&& mediaStreamIds, RTCRtpSenderClient&);
 
     String m_trackId;
     String m_trackKind;

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2017-03-11 00:46:44 UTC (rev 213736)
@@ -158,19 +158,34 @@
     m_backend->SetRemoteDescription(&m_setRemoteSessionDescriptionObserver, sessionDescription.release());
 }
 
-static inline std::string streamId(RTCPeerConnection& connection)
+void LibWebRTCMediaEndpoint::addTrack(MediaStreamTrack& track, const Vector<String>& mediaStreamIds)
 {
-    auto& senders = connection.getSenders();
-    if (senders.size()) {
-        for (RTCRtpSender& sender : senders) {
-            auto* track = sender.track();
-            if (track) {
-                ASSERT(sender.mediaStreamIds().size() == 1);
-                return std::string(sender.mediaStreamIds().first().utf8().data());
-            }
-        }
+    if (!LibWebRTCProvider::factory())
+        return;
+
+    std::vector<webrtc::MediaStreamInterface*> mediaStreams;
+    rtc::scoped_refptr<webrtc::MediaStreamInterface> mediaStream = nullptr;
+    if (mediaStreamIds.size()) {
+        // libwebrtc is only using the first one if any.
+        mediaStream = LibWebRTCProvider::factory()->CreateLocalMediaStream(mediaStreamIds[0].utf8().data());
+        mediaStreams.push_back(mediaStream.get());
     }
-    return "av_label";
+    
+    auto& source = track.source();
+    ASSERT(source.type() != RealtimeMediaSource::None);
+
+    if (source.type() == RealtimeMediaSource::Audio) {
+        auto trackSource = RealtimeOutgoingAudioSource::create(source);
+        auto audioTrack = LibWebRTCProvider::factory()->CreateAudioTrack(track.id().utf8().data(), trackSource.ptr());
+        trackSource->setTrack(rtc::scoped_refptr<webrtc::AudioTrackInterface>(audioTrack));
+        m_peerConnectionBackend.addAudioSource(WTFMove(trackSource));
+        m_backend->AddTrack(audioTrack.get(), WTFMove(mediaStreams));
+    } else {
+        auto videoSource = RealtimeOutgoingVideoSource::create(source);
+        auto videoTrack = LibWebRTCProvider::factory()->CreateVideoTrack(track.id().utf8().data(), videoSource.ptr());
+        m_peerConnectionBackend.addVideoSource(WTFMove(videoSource));
+        m_backend->AddTrack(videoTrack.get(), WTFMove(mediaStreams));
+    }
 }
 
 void LibWebRTCMediaEndpoint::doCreateOffer()
@@ -181,31 +196,6 @@
     }
         
     m_isInitiator = true;
-    auto& senders = m_peerConnectionBackend.connection().getSenders();
-    if (senders.size()) {
-        // FIXME: We only support one stream for the moment.
-        auto stream = LibWebRTCProvider::factory()->CreateLocalMediaStream(streamId(m_peerConnectionBackend.connection()));
-        for (RTCRtpSender& sender : senders) {
-            auto* track = sender.track();
-            if (track) {
-                ASSERT(sender.mediaStreamIds().size() == 1);
-                auto& source = track->source();
-                if (source.type() == RealtimeMediaSource::Audio) {
-                    auto trackSource = RealtimeOutgoingAudioSource::create(source);
-                    auto rtcTrack = LibWebRTCProvider::factory()->CreateAudioTrack(track->id().utf8().data(), trackSource.ptr());
-                    trackSource->setTrack(rtc::scoped_refptr<webrtc::AudioTrackInterface>(rtcTrack));
-                    m_peerConnectionBackend.addAudioSource(WTFMove(trackSource));
-                    stream->AddTrack(WTFMove(rtcTrack));
-                } else {
-                    auto videoSource = RealtimeOutgoingVideoSource::create(source);
-                    auto videoTrack = LibWebRTCProvider::factory()->CreateVideoTrack(track->id().utf8().data(), videoSource.ptr());
-                    m_peerConnectionBackend.addVideoSource(WTFMove(videoSource));
-                    stream->AddTrack(WTFMove(videoTrack));
-                }
-            }
-        }
-        m_backend->AddStream(stream);
-    }
     m_backend->CreateOffer(&m_createSessionDescriptionObserver, nullptr);
 }
 
@@ -217,37 +207,13 @@
     }
 
     m_isInitiator = false;
-
-    auto& senders = m_peerConnectionBackend.connection().getSenders();
-    if (senders.size()) {
-        // FIXME: We only support one stream for the moment.
-        auto stream = LibWebRTCProvider::factory()->CreateLocalMediaStream(streamId(m_peerConnectionBackend.connection()));
-        for (RTCRtpSender& sender : senders) {
-            auto* track = sender.track();
-            if (track) {
-                ASSERT(sender.mediaStreamIds().size() == 1);
-                auto& source = track->source();
-                if (source.type() == RealtimeMediaSource::Audio) {
-                    auto trackSource = RealtimeOutgoingAudioSource::create(source);
-                    auto rtcTrack = LibWebRTCProvider::factory()->CreateAudioTrack(track->id().utf8().data(), trackSource.ptr());
-                    trackSource->setTrack(rtc::scoped_refptr<webrtc::AudioTrackInterface>(rtcTrack));
-                    m_peerConnectionBackend.addAudioSource(WTFMove(trackSource));
-                    stream->AddTrack(WTFMove(rtcTrack));
-                } else {
-                    auto videoSource = RealtimeOutgoingVideoSource::create(source);
-                    auto videoTrack = LibWebRTCProvider::factory()->CreateVideoTrack(track->id().utf8().data(), videoSource.ptr());
-                    m_peerConnectionBackend.addVideoSource(WTFMove(videoSource));
-                    stream->AddTrack(WTFMove(videoTrack));
-                }
-            }
-        }
-        m_backend->AddStream(stream);
-    }
     m_backend->CreateAnswer(&m_createSessionDescriptionObserver, nullptr);
 }
 
 void LibWebRTCMediaEndpoint::getStats(MediaStreamTrack* track, const DeferredPromise& promise)
 {
+    UNUSED_PARAM(track);
+    UNUSED_PARAM(promise);
     m_backend->GetStats(StatsCollector::create(*this, promise, track).get());
 }
 

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h	2017-03-11 00:46:44 UTC (rev 213736)
@@ -79,6 +79,8 @@
     RefPtr<RTCSessionDescription> pendingLocalDescription() const;
     RefPtr<RTCSessionDescription> pendingRemoteDescription() const;
 
+    void addTrack(MediaStreamTrack&, const Vector<String>&);
+
 private:
     LibWebRTCMediaEndpoint(LibWebRTCPeerConnectionBackend&, LibWebRTCProvider&);
 

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2017-03-11 00:46:44 UTC (rev 213736)
@@ -169,11 +169,6 @@
 
 void LibWebRTCPeerConnectionBackend::doAddIceCandidate(RTCIceCandidate& candidate)
 {
-    if (!m_isRemoteDescriptionSet) {
-        addIceCandidateFailed(Exception { INVALID_STATE_ERR, "No remote description set" });
-        return;
-    }
-
     webrtc::SdpParseError error;
     int sdpMLineIndex = candidate.sdpMLineIndex() ? candidate.sdpMLineIndex().value() : 0;
     std::unique_ptr<webrtc::IceCandidateInterface> rtcCandidate(webrtc::CreateIceCandidate(candidate.sdpMid().utf8().data(), sdpMLineIndex, candidate.candidate().utf8().data(), &error));
@@ -250,6 +245,12 @@
     return m_endpoint->remoteDescription();
 }
 
+void LibWebRTCPeerConnectionBackend::notifyAddedTrack(RTCRtpSender& sender)
+{
+    ASSERT(sender.track());
+    m_endpoint->addTrack(*sender.track(), sender.mediaStreamIds());
+}
+
 } // namespace WebCore
 
 #endif // USE(LIBWEBRTC)

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h (213735 => 213736)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h	2017-03-11 00:46:44 UTC (rev 213736)
@@ -67,9 +67,10 @@
     RefPtr<RTCSessionDescription> currentRemoteDescription() const final;
     RefPtr<RTCSessionDescription> pendingRemoteDescription() const final;
 
+    void notifyAddedTrack(RTCRtpSender&) final;
     // FIXME: API to implement for real
     Vector<RefPtr<MediaStream>> getRemoteStreams() const final { return { }; }
-    void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromise<void>&&) final { }
+    void replaceTrack(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&) final { }
 
     void emulatePlatformEvent(const String&) final { }
 

Modified: trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.cpp (213735 => 213736)


--- trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.cpp	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.cpp	2017-03-11 00:46:44 UTC (rev 213736)
@@ -226,21 +226,31 @@
     return new rtc::RefCountedObject<MockLibWebRTCDataChannel>(std::string(label), parameters.ordered, parameters.reliable, parameters.id);
 }
 
-bool MockLibWebRTCPeerConnection::AddStream(webrtc::MediaStreamInterface* stream)
+rtc::scoped_refptr<webrtc::RtpSenderInterface> MockLibWebRTCPeerConnection::AddTrack(webrtc::MediaStreamTrackInterface* track, std::vector<webrtc::MediaStreamInterface*> streams)
 {
-    m_stream = stream;
     LibWebRTCProvider::callOnWebRTCSignalingThread([observer = &m_observer] {
         observer->OnRenegotiationNeeded();
     });
-    return true;
+
+    if (streams.size())
+        m_streamLabel = streams.front()->label();
+
+    m_senders.append(new rtc::RefCountedObject<MockRtpSender>(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>(track)));
+    return m_senders.last().get();
 }
 
-void MockLibWebRTCPeerConnection::RemoveStream(webrtc::MediaStreamInterface*)
+bool MockLibWebRTCPeerConnection::RemoveTrack(webrtc::RtpSenderInterface* sender)
 {
     LibWebRTCProvider::callOnWebRTCSignalingThread([observer = &m_observer] {
         observer->OnRenegotiationNeeded();
     });
-    m_stream = nullptr;
+    bool isRemoved = false;
+    return m_senders.removeFirstMatching([&](auto& item) {
+        if (item.get() != sender)
+            return false;
+        isRemoved = true;
+        return true;
+    });
 }
 
 void MockLibWebRTCPeerConnection::CreateOffer(webrtc::CreateSessionDescriptionObserver* observer, const webrtc::MediaConstraintsInterface*)
@@ -252,10 +262,13 @@
             "o=- 5667094644266930845 " << m_counter++ << " IN IP4 127.0.0.1\r\n"
             "s=-\r\n"
             "t=0 0\r\n";
-        if (m_stream) {
+        if (m_senders.size()) {
             unsigned partCounter = 1;
-            sdp << "a=msid-semantic:WMS " << m_stream->label() << "\r\n";
-            for (auto& audioTrack : m_stream->GetAudioTracks()) {
+            sdp << "a=msid-semantic:WMS " << m_streamLabel << "\r\n";
+            for (auto& sender : m_senders) {
+                auto track = sender->track();
+                if (track->kind() != "audio")
+                    continue;
                 sdp <<
                     "m=audio 9 UDP/TLS/RTP/SAVPF 111 8 0\r\n"
                     "c=IN IP4 0.0.0.0\r\n"
@@ -266,13 +279,16 @@
                     "a=rtpmap:8 PCMA/8000\r\n"
                     "a=rtpmap:0 PCMU/8000\r\n"
                     "a=ssrc:3409173717 cname:/chKzCS9K6KOgL0n\r\n"
-                    "a=msid:" << m_stream->label() << " " << audioTrack->id() << "\r\n"
+                    "a=msid:" << m_streamLabel << " " << track->id() << "\r\n"
                     "a=ice-ufrag:e/B1\r\n"
                     "a=ice-pwd:Yotk3Im3mnyi+1Q38p51MDub\r\n"
                     "a=fingerprint:sha-256 8B:87:09:8A:5D:C2:F3:33:EF:C5:B1:F6:84:3A:3D:D6:A3:E2:9C:17:4C:E7:46:3B:1B:CE:84:98:DD:8E:AF:7B\r\n"
                     "a=setup:actpass\r\n";
             }
-            for (auto& videoTrack : m_stream->GetVideoTracks()) {
+            for (auto& sender : m_senders) {
+                auto track = sender->track();
+                if (track->kind() != "video")
+                    continue;
                 sdp <<
                     "m=video 9 UDP/TLS/RTP/SAVPF 103 100 120\r\n"
                     "c=IN IP4 0.0.0.0\r\n"
@@ -290,7 +306,7 @@
                     "a=rtcp-fb:103 ccm fir\r\n"
                     "a=rtcp-fb:100 ccm fir\r\n"
                     "a=ssrc:3409173718 cname:/chKzCS9K6KOgL0n\r\n"
-                    "a=msid:" << m_stream->label() << " " << videoTrack->id() << "\r\n"
+                    "a=msid:" << m_streamLabel << " " << track->id() << "\r\n"
                     "a=ice-ufrag:e/B1\r\n"
                     "a=ice-pwd:Yotk3Im3mnyi+1Q38p51MDub\r\n"
                     "a=fingerprint:sha-256 8B:87:09:8A:5D:C2:F3:33:EF:C5:B1:F6:84:3A:3D:D6:A3:E2:9C:17:4C:E7:46:3B:1B:CE:84:98:DD:8E:AF:7B\r\n"
@@ -311,9 +327,11 @@
             "o=- 5667094644266930846 " << m_counter++ << " IN IP4 127.0.0.1\r\n"
             "s=-\r\n"
             "t=0 0\r\n";
-        if (m_stream) {
-            for (auto& audioTrack : m_stream->GetAudioTracks()) {
-                ASSERT_UNUSED(audioTrack, !!audioTrack);
+        if (m_senders.size()) {
+            for (auto& sender : m_senders) {
+                auto track = sender->track();
+                if (track->kind() != "audio")
+                    continue;
                 sdp <<
                     "m=audio 9 UDP/TLS/RTP/SAVPF 111 8 0\r\n"
                     "c=IN IP4 0.0.0.0\r\n"
@@ -329,8 +347,10 @@
                     "a=fingerprint:sha-256 8B:87:09:8A:5D:C2:F3:33:EF:C5:B1:F6:84:3A:3D:D6:A3:E2:9C:17:4C:E7:46:3B:1B:CE:84:98:DD:8E:AF:7B\r\n"
                     "a=setup:active\r\n";
             }
-            for (auto& videoTrack : m_stream->GetVideoTracks()) {
-                ASSERT_UNUSED(videoTrack, !!videoTrack);
+            for (auto& sender : m_senders) {
+                auto track = sender->track();
+                if (track->kind() != "video")
+                    continue;
                 sdp <<
                     "m=video 9 UDP/TLS/RTP/SAVPF 103 100 120\r\n"
                     "c=IN IP4 0.0.0.0\r\n"

Modified: trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h (213735 => 213736)


--- trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h	2017-03-11 00:46:00 UTC (rev 213735)
+++ trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h	2017-03-11 00:46:44 UTC (rev 213736)
@@ -34,6 +34,7 @@
 namespace WebCore {
 
 class LibWebRTCProvider;
+class MockRtpSender;
 
 void useMockRTCPeerConnectionFactory(LibWebRTCProvider*, const String&);
 
@@ -58,12 +59,15 @@
     void StopRtcEventLog() override { }
     void Close() override { }
 
+    bool AddStream(webrtc::MediaStreamInterface*) final { return false; }
+    void RemoveStream(webrtc::MediaStreamInterface*) final { }
+
 protected:
     void SetRemoteDescription(webrtc::SetSessionDescriptionObserver*, webrtc::SessionDescriptionInterface*) final;
     void CreateAnswer(webrtc::CreateSessionDescriptionObserver*, const webrtc::MediaConstraintsInterface*) final;
     rtc::scoped_refptr<webrtc::DataChannelInterface> CreateDataChannel(const std::string&, const webrtc::DataChannelInit*) final;
-    bool AddStream(webrtc::MediaStreamInterface*) final;
-    void RemoveStream(webrtc::MediaStreamInterface*) final;
+    rtc::scoped_refptr<webrtc::RtpSenderInterface> AddTrack(webrtc::MediaStreamTrackInterface*, std::vector<webrtc::MediaStreamInterface*> streams) final;
+    bool RemoveTrack(webrtc::RtpSenderInterface*) final;
 
     void SetLocalDescription(webrtc::SetSessionDescriptionObserver*, webrtc::SessionDescriptionInterface*) override;
     bool GetStats(webrtc::StatsObserver*, webrtc::MediaStreamTrackInterface*, StatsOutputLevel) override { return false; }
@@ -73,10 +77,11 @@
 
     webrtc::PeerConnectionObserver& m_observer;
     unsigned m_counter { 0 };
-    rtc::scoped_refptr<webrtc::MediaStreamInterface> m_stream;
+    Vector<rtc::scoped_refptr<MockRtpSender>> m_senders;
     bool m_isInitiator { true };
     bool m_isReceivingAudio { false };
     bool m_isReceivingVideo { false };
+    std::string m_streamLabel;
 };
 
 class MockLibWebRTCSessionDescription: public webrtc::SessionDescriptionInterface {
@@ -199,6 +204,25 @@
     int m_id { -1 };
 };
 
+class MockRtpSender : public webrtc::RtpSenderInterface {
+public:
+    MockRtpSender(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>&& track) : m_track(WTFMove(track)) { }
+
+    bool SetTrack(webrtc::MediaStreamTrackInterface*) final { return false; }
+    rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track() const final { return m_track; }
+    
+    uint32_t ssrc() const { return 0; }
+    cricket::MediaType media_type() const { return cricket::MEDIA_TYPE_VIDEO; }
+    std::string id() const { return ""; }
+    std::vector<std::string> stream_ids() const { return { }; }
+    webrtc::RtpParameters GetParameters() const { return { }; }
+    bool SetParameters(const webrtc::RtpParameters&) { return false; }
+    rtc::scoped_refptr<webrtc::DtmfSenderInterface> GetDtmfSender() const { return nullptr; }
+
+private:
+    rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> m_track;
+};
+    
 class MockLibWebRTCPeerConnectionFactory : public webrtc::PeerConnectionFactoryInterface {
 public:
     static rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> create(String&& testCase) { return new rtc::RefCountedObject<MockLibWebRTCPeerConnectionFactory>(WTFMove(testCase)); }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to