Title: [258493] trunk
Revision
258493
Author
[email protected]
Date
2020-03-16 06:15:08 -0700 (Mon, 16 Mar 2020)

Log Message

Remove the use of empty WebRTC sources for receiver tracks
https://bugs.webkit.org/show_bug.cgi?id=209061

Reviewed by Eric Carlson.

LayoutTests/imported/w3c:

* web-platform-tests/webrtc/RTCPeerConnection-track-stats.https-expected.txt:

Source/WebCore:

We no longer need to create receivers with empty sources since we now always have a libwebrtc receiver from which we can get the track.
We remove that code path.
This sldo allows using the right track parameters from the start, like track id.

Covered by existing and rebased tests.

* Modules/mediastream/RTCPeerConnection.h:
* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
(WebCore::LibWebRTCMediaEndpoint::addPendingTrackEvent):
(WebCore::LibWebRTCMediaEndpoint::collectTransceivers):
(WebCore::LibWebRTCMediaEndpoint::newTransceiver):
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
(WebCore::LibWebRTCPeerConnectionBackend::createReceiver):
(WebCore::LibWebRTCPeerConnectionBackend::addTrack):
(WebCore::LibWebRTCPeerConnectionBackend::addTransceiverFromTrackOrKind):
(WebCore::LibWebRTCPeerConnectionBackend::newRemoteTransceiver):
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
* Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp:
(WebCore::LibWebRTCRtpReceiverBackend::createSource):
* Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h:
* platform/mediastream/RealtimeIncomingAudioSource.cpp:
(WebCore::RealtimeIncomingAudioSource::RealtimeIncomingAudioSource):
* platform/mediastream/RealtimeIncomingAudioSource.h:
* platform/mediastream/RealtimeIncomingVideoSource.cpp:
(WebCore::RealtimeIncomingVideoSource::RealtimeIncomingVideoSource):
* platform/mediastream/RealtimeIncomingVideoSource.h:
* testing/MockLibWebRTCPeerConnection.h:
(WebCore::MockMediaStreamTrack::state const):
(WebCore::MockRtpReceiver::SetObserver):

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (258492 => 258493)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2020-03-16 13:15:08 UTC (rev 258493)
@@ -1,3 +1,12 @@
+2020-03-16  youenn fablet  <[email protected]>
+
+        Remove the use of empty WebRTC sources for receiver tracks
+        https://bugs.webkit.org/show_bug.cgi?id=209061
+
+        Reviewed by Eric Carlson.
+
+        * web-platform-tests/webrtc/RTCPeerConnection-track-stats.https-expected.txt:
+
 2020-03-14  Rob Buis  <[email protected]>
 
         Set Origin header value to null rather than omitting it

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https-expected.txt (258492 => 258493)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https-expected.txt	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https-expected.txt	2020-03-16 13:15:08 UTC (rev 258493)
@@ -11,8 +11,8 @@
 FAIL replaceTrack() after offer, before answer: new track attachment stats present assert_true: Has stats for replaced track expected true got false
 FAIL replaceTrack() after answer: new track attachment stats present assert_true: Has stats for replaced track expected true got false
 FAIL replaceTrack(): original track attachment stats present after replacing assert_true: expected true got undefined
-FAIL RTCRtpSender.getStats() contains only outbound-rtp and related stats promise_test: Unhandled rejection with value: object "TypeError: null is not an object (evaluating 'inboundTrackStats.id')"
-FAIL RTCRtpReceiver.getStats() contains only inbound-rtp and related stats promise_test: Unhandled rejection with value: object "TypeError: null is not an object (evaluating 'inboundTrackStats.id')"
+PASS RTCRtpSender.getStats() contains only outbound-rtp and related stats 
+PASS RTCRtpReceiver.getStats() contains only inbound-rtp and related stats 
 PASS RTCPeerConnection.getStats(sendingTrack) is the same as RTCRtpSender.getStats() 
 PASS RTCPeerConnection.getStats(receivingTrack) is the same as RTCRtpReceiver.getStats() 
 FAIL RTCPeerConnection.getStats(track) throws InvalidAccessError when there are zero senders or receivers for the track assert_unreached: Should have rejected: undefined Reached unreachable code

Modified: trunk/Source/WebCore/ChangeLog (258492 => 258493)


--- trunk/Source/WebCore/ChangeLog	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/ChangeLog	2020-03-16 13:15:08 UTC (rev 258493)
@@ -1,3 +1,40 @@
+2020-03-16  youenn fablet  <[email protected]>
+
+        Remove the use of empty WebRTC sources for receiver tracks
+        https://bugs.webkit.org/show_bug.cgi?id=209061
+
+        Reviewed by Eric Carlson.
+
+        We no longer need to create receivers with empty sources since we now always have a libwebrtc receiver from which we can get the track.
+        We remove that code path.
+        This sldo allows using the right track parameters from the start, like track id.
+
+        Covered by existing and rebased tests.
+
+        * Modules/mediastream/RTCPeerConnection.h:
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+        (WebCore::LibWebRTCMediaEndpoint::addPendingTrackEvent):
+        (WebCore::LibWebRTCMediaEndpoint::collectTransceivers):
+        (WebCore::LibWebRTCMediaEndpoint::newTransceiver):
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+        (WebCore::LibWebRTCPeerConnectionBackend::createReceiver):
+        (WebCore::LibWebRTCPeerConnectionBackend::addTrack):
+        (WebCore::LibWebRTCPeerConnectionBackend::addTransceiverFromTrackOrKind):
+        (WebCore::LibWebRTCPeerConnectionBackend::newRemoteTransceiver):
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+        * Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp:
+        (WebCore::LibWebRTCRtpReceiverBackend::createSource):
+        * Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h:
+        * platform/mediastream/RealtimeIncomingAudioSource.cpp:
+        (WebCore::RealtimeIncomingAudioSource::RealtimeIncomingAudioSource):
+        * platform/mediastream/RealtimeIncomingAudioSource.h:
+        * platform/mediastream/RealtimeIncomingVideoSource.cpp:
+        (WebCore::RealtimeIncomingVideoSource::RealtimeIncomingVideoSource):
+        * platform/mediastream/RealtimeIncomingVideoSource.h:
+        * testing/MockLibWebRTCPeerConnection.h:
+        (WebCore::MockMediaStreamTrack::state const):
+        (WebCore::MockRtpReceiver::SetObserver):
+
 2020-03-16  Hurnjoo Lee  <[email protected]>, Fujii Hironori  <[email protected]>, Carlos Garcia Campos  <[email protected]>
 
         [Cairo][SVG] marker-mid isn't shown on a joint of rectilinearly connected line-to path segments

Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (258492 => 258493)


--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h	2020-03-16 13:15:08 UTC (rev 258493)
@@ -195,7 +195,6 @@
     RTCPeerConnection(Document&);
 
     ExceptionOr<void> initializeConfiguration(RTCConfiguration&&);
-    Ref<RTCRtpTransceiver> completeAddTransceiver(Ref<RTCRtpSender>&&, const RTCRtpTransceiverInit&, const String& trackId, const String& trackKind);
 
     void registerToController(RTCController&);
     void unregisterFromController();

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


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2020-03-16 13:15:08 UTC (rev 258493)
@@ -368,48 +368,13 @@
     m_remoteStreamsFromRemoteTrack.add(&track, WTFMove(streamIds));
 
     m_peerConnectionBackend.addPendingTrackEvent({ WTFMove(receiver), makeRef(track), WTFMove(streams), WTFMove(transceiver) });
-}
 
-static inline void setExistingReceiverSourceTrack(RealtimeMediaSource& existingSource, webrtc::RtpReceiverInterface& rtcReceiver)
-{
-    switch (rtcReceiver.media_type()) {
-    case cricket::MEDIA_TYPE_AUDIO: {
-        ASSERT(existingSource.type() == RealtimeMediaSource::Type::Audio);
-        rtc::scoped_refptr<webrtc::AudioTrackInterface> audioTrack = static_cast<webrtc::AudioTrackInterface*>(rtcReceiver.track().get());
-        downcast<RealtimeIncomingAudioSource>(existingSource).setSourceTrack(WTFMove(audioTrack));
-        return;
-    }
-    case cricket::MEDIA_TYPE_VIDEO: {
-        ASSERT(existingSource.type() == RealtimeMediaSource::Type::Video);
-        rtc::scoped_refptr<webrtc::VideoTrackInterface> videoTrack = static_cast<webrtc::VideoTrackInterface*>(rtcReceiver.track().get());
-        downcast<RealtimeIncomingVideoSource>(existingSource).setSourceTrack(WTFMove(videoTrack));
-        return;
-    }
-    case cricket::MEDIA_TYPE_DATA:
-        ASSERT_NOT_REACHED();
-        return;
-    }
+    // FIXME: We should unmute tracks when receiving the first packet, for now we simulate this by unmuting asynchronously here.
+    callOnMainThread([source = makeRef(track.source())] {
+        source->setMuted(false);
+    });
 }
 
-RefPtr<RealtimeMediaSource> LibWebRTCMediaEndpoint::sourceFromNewReceiver(webrtc::RtpReceiverInterface& rtcReceiver)
-{
-    auto rtcTrack = rtcReceiver.track();
-    switch (rtcReceiver.media_type()) {
-    case cricket::MEDIA_TYPE_DATA:
-        return nullptr;
-    case cricket::MEDIA_TYPE_AUDIO: {
-        rtc::scoped_refptr<webrtc::AudioTrackInterface> audioTrack = static_cast<webrtc::AudioTrackInterface*>(rtcTrack.get());
-        return RealtimeIncomingAudioSource::create(WTFMove(audioTrack), fromStdString(rtcTrack->id()));
-    }
-    case cricket::MEDIA_TYPE_VIDEO: {
-        rtc::scoped_refptr<webrtc::VideoTrackInterface> videoTrack = static_cast<webrtc::VideoTrackInterface*>(rtcTrack.get());
-        return RealtimeIncomingVideoSource::create(WTFMove(videoTrack), fromStdString(rtcTrack->id()));
-    }
-    }
-
-    RELEASE_ASSERT_NOT_REACHED();
-}
-
 void LibWebRTCMediaEndpoint::collectTransceivers()
 {
     if (!m_backend)
@@ -423,34 +388,20 @@
             continue;
 
         auto rtcReceiver = rtcTransceiver->receiver();
-        auto source = sourceFromNewReceiver(*rtcReceiver);
-        if (!source)
-            return;
-
-        m_peerConnectionBackend.newRemoteTransceiver(makeUnique<LibWebRTCRtpTransceiverBackend>(WTFMove(rtcTransceiver)), source.releaseNonNull());
+        m_peerConnectionBackend.newRemoteTransceiver(makeUnique<LibWebRTCRtpTransceiverBackend>(WTFMove(rtcTransceiver)), rtcReceiver->media_type() == cricket::MEDIA_TYPE_AUDIO ? RealtimeMediaSource::Type::Audio : RealtimeMediaSource::Type::Video);
     }
 }
 
 void LibWebRTCMediaEndpoint::newTransceiver(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>&& rtcTransceiver)
 {
+    auto rtcReceiver = rtcTransceiver->receiver();
     auto* transceiver = m_peerConnectionBackend.existingTransceiver([&](auto& transceiverBackend) {
         return rtcTransceiver.get() == transceiverBackend.rtcTransceiver();
     });
-    if (transceiver) {
-        auto rtcReceiver = rtcTransceiver->receiver();
-        setExistingReceiverSourceTrack(transceiver->receiver().track().source(), *rtcReceiver);
-        addPendingTrackEvent(makeRef(transceiver->receiver()), transceiver->receiver().track(), rtcReceiver->streams(), makeRef(*transceiver));
-        return;
-    }
+    if (!transceiver)
+        transceiver = &m_peerConnectionBackend.newRemoteTransceiver(makeUnique<LibWebRTCRtpTransceiverBackend>(WTFMove(rtcTransceiver)), rtcReceiver->media_type() == cricket::MEDIA_TYPE_AUDIO ? RealtimeMediaSource::Type::Audio : RealtimeMediaSource::Type::Video);
 
-    auto rtcReceiver = rtcTransceiver->receiver();
-    auto source = sourceFromNewReceiver(*rtcReceiver);
-    if (!source)
-        return;
-
-    auto& newTransceiver = m_peerConnectionBackend.newRemoteTransceiver(makeUnique<LibWebRTCRtpTransceiverBackend>(WTFMove(rtcTransceiver)), source.releaseNonNull());
-
-    addPendingTrackEvent(makeRef(newTransceiver.receiver()), newTransceiver.receiver().track(), rtcReceiver->streams(), makeRef(newTransceiver));
+    addPendingTrackEvent(makeRef(transceiver->receiver()), transceiver->receiver().track(), rtcReceiver->streams(), makeRef(*transceiver));
 }
 
 void LibWebRTCMediaEndpoint::removeRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&& receiver)

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


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2020-03-16 13:15:08 UTC (rev 258493)
@@ -287,9 +287,13 @@
     addIceCandidateSucceeded();
 }
 
-Ref<RTCRtpReceiver> LibWebRTCPeerConnectionBackend::createReceiverForSource(Ref<RealtimeMediaSource>&& source, std::unique_ptr<RTCRtpReceiverBackend>&& backend)
+Ref<RTCRtpReceiver> LibWebRTCPeerConnectionBackend::createReceiver(std::unique_ptr<LibWebRTCRtpReceiverBackend>&& backend)
 {
     auto& document = downcast<Document>(*m_peerConnection.scriptExecutionContext());
+
+    auto source = backend->createSource();
+    // Remote source is initially muted and will be unmuted when receiving the first packet.
+    source->setMuted(true);
     auto trackID = source->persistentID();
     auto remoteTrackPrivate = MediaStreamTrackPrivate::create(document.logger(), WTFMove(source), WTFMove(trackID));
     auto remoteTrack = MediaStreamTrack::create(document, WTFMove(remoteTrackPrivate));
@@ -297,68 +301,6 @@
     return RTCRtpReceiver::create(*this, WTFMove(remoteTrack), WTFMove(backend));
 }
 
-static inline Ref<RealtimeMediaSource> createEmptySource(const String& trackKind, String&& trackId)
-{
-    // FIXME: trackKind should be an enumeration
-    if (trackKind == "audio")
-        return RealtimeIncomingAudioSource::create(nullptr, WTFMove(trackId));
-    ASSERT(trackKind == "video");
-    return RealtimeIncomingVideoSource::create(nullptr, WTFMove(trackId));
-}
-
-Ref<RTCRtpReceiver> LibWebRTCPeerConnectionBackend::createReceiver(const String& trackKind, const String& trackId)
-{
-    auto receiver = createReceiverForSource(createEmptySource(trackKind, String(trackId)), nullptr);
-    m_pendingReceivers.append(receiver.copyRef());
-    return receiver;
-}
-
-LibWebRTCPeerConnectionBackend::VideoReceiver LibWebRTCPeerConnectionBackend::videoReceiver(String&& trackId)
-{
-    // FIXME: Add to Vector a utility routine for that take-or-create pattern.
-    // FIXME: We should be selecting the receiver based on track id.
-    for (size_t cptr = 0; cptr < m_pendingReceivers.size(); ++cptr) {
-        if (m_pendingReceivers[cptr]->track().source().type() == RealtimeMediaSource::Type::Video) {
-            Ref<RTCRtpReceiver> receiver = m_pendingReceivers[cptr].copyRef();
-            m_pendingReceivers.remove(cptr);
-            Ref<RealtimeIncomingVideoSource> source = static_cast<RealtimeIncomingVideoSource&>(receiver->track().source());
-            return { WTFMove(receiver), WTFMove(source) };
-        }
-    }
-    auto source = RealtimeIncomingVideoSource::create(nullptr, WTFMove(trackId));
-    auto receiver = createReceiverForSource(source.copyRef(), nullptr);
-
-    auto senderBackend = makeUnique<LibWebRTCRtpSenderBackend>(*this, nullptr);
-    auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create(*this, "video"_s, { }, WTFMove(senderBackend)), receiver.copyRef(), nullptr);
-    transceiver->disableSendingDirection();
-    m_peerConnection.addTransceiver(WTFMove(transceiver));
-
-    return { WTFMove(receiver), WTFMove(source) };
-}
-
-LibWebRTCPeerConnectionBackend::AudioReceiver LibWebRTCPeerConnectionBackend::audioReceiver(String&& trackId)
-{
-    // FIXME: Add to Vector a utility routine for that take-or-create pattern.
-    // FIXME: We should be selecting the receiver based on track id.
-    for (size_t cptr = 0; cptr < m_pendingReceivers.size(); ++cptr) {
-        if (m_pendingReceivers[cptr]->track().source().type() == RealtimeMediaSource::Type::Audio) {
-            Ref<RTCRtpReceiver> receiver = m_pendingReceivers[cptr].copyRef();
-            m_pendingReceivers.remove(cptr);
-            Ref<RealtimeIncomingAudioSource> source = static_cast<RealtimeIncomingAudioSource&>(receiver->track().source());
-            return { WTFMove(receiver), WTFMove(source) };
-        }
-    }
-    auto source = RealtimeIncomingAudioSource::create(nullptr, WTFMove(trackId));
-    auto receiver = createReceiverForSource(source.copyRef(), nullptr);
-
-    auto senderBackend = makeUnique<LibWebRTCRtpSenderBackend>(*this, nullptr);
-    auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create(*this, "audio"_s, { }, WTFMove(senderBackend)), receiver.copyRef(), nullptr);
-    transceiver->disableSendingDirection();
-    m_peerConnection.addTransceiver(WTFMove(transceiver));
-
-    return { WTFMove(receiver), WTFMove(source) };
-}
-
 std::unique_ptr<RTCDataChannelHandler> LibWebRTCPeerConnectionBackend::createDataChannelHandler(const String& label, const RTCDataChannelInit& options)
 {
     return m_endpoint->createDataChannel(label, options);
@@ -430,7 +372,7 @@
     auto transceiverBackend = m_endpoint->transceiverBackendFromSender(*senderBackend);
 
     auto sender = RTCRtpSender::create(*this, makeRef(track), WTFMove(mediaStreamIds), WTFMove(senderBackend));
-    auto receiver = createReceiverForSource(createEmptySource(track.kind(), createCanonicalUUIDString()), transceiverBackend->createReceiverBackend());
+    auto receiver = createReceiver(transceiverBackend->createReceiverBackend());
     auto transceiver = RTCRtpTransceiver::create(sender.copyRef(), WTFMove(receiver), WTFMove(transceiverBackend));
     m_peerConnection.addInternalTransceiver(WTFMove(transceiver));
     return sender;
@@ -444,7 +386,7 @@
         return Exception { InvalidAccessError, "Unable to add transceiver"_s };
 
     auto sender = RTCRtpSender::create(*this, WTFMove(trackOrKind), Vector<String> { }, WTFMove(backends->senderBackend));
-    auto receiver = createReceiverForSource(createEmptySource(sender->trackKind(), createCanonicalUUIDString()), WTFMove(backends->receiverBackend));
+    auto receiver = createReceiver(WTFMove(backends->receiverBackend));
     auto transceiver = RTCRtpTransceiver::create(WTFMove(sender), WTFMove(receiver), WTFMove(backends->transceiverBackend));
     m_peerConnection.addInternalTransceiver(transceiver.copyRef());
     return transceiver;
@@ -479,25 +421,15 @@
     return nullptr;
 }
 
-RTCRtpTransceiver& LibWebRTCPeerConnectionBackend::newRemoteTransceiver(std::unique_ptr<LibWebRTCRtpTransceiverBackend>&& transceiverBackend, Ref<RealtimeMediaSource>&& receiverSource)
+RTCRtpTransceiver& LibWebRTCPeerConnectionBackend::newRemoteTransceiver(std::unique_ptr<LibWebRTCRtpTransceiverBackend>&& transceiverBackend, RealtimeMediaSource::Type type)
 {
-    auto sender = RTCRtpSender::create(*this, receiverSource->type() == RealtimeMediaSource::Type::Audio ? "audio"_s : "video"_s, Vector<String> { }, transceiverBackend->createSenderBackend(*this, nullptr));
-    auto receiver = createReceiverForSource(WTFMove(receiverSource), transceiverBackend->createReceiverBackend());
+    auto sender = RTCRtpSender::create(*this, type == RealtimeMediaSource::Type::Audio ? "audio"_s : "video"_s, Vector<String> { }, transceiverBackend->createSenderBackend(*this, nullptr));
+    auto receiver = createReceiver(transceiverBackend->createReceiverBackend());
     auto transceiver = RTCRtpTransceiver::create(WTFMove(sender), WTFMove(receiver), WTFMove(transceiverBackend));
     m_peerConnection.addInternalTransceiver(transceiver.copyRef());
     return transceiver.get();
 }
 
-Ref<RTCRtpTransceiver> LibWebRTCPeerConnectionBackend::completeAddTransceiver(Ref<RTCRtpSender>&& sender, const RTCRtpTransceiverInit& init, const String& trackId, const String& trackKind)
-{
-    auto transceiver = RTCRtpTransceiver::create(WTFMove(sender), createReceiver(trackKind, trackId), nullptr);
-
-    transceiver->setDirection(init.direction);
-
-    m_peerConnection.addInternalTransceiver(transceiver.copyRef());
-    return transceiver;
-}
-
 void LibWebRTCPeerConnectionBackend::collectTransceivers()
 {
     m_endpoint->collectTransceivers();

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


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h	2020-03-16 13:15:08 UTC (rev 258493)
@@ -27,6 +27,7 @@
 #if USE(LIBWEBRTC)
 
 #include "PeerConnectionBackend.h"
+#include "RealtimeMediaSource.h"
 #include <wtf/HashMap.h>
 
 namespace webrtc {
@@ -38,6 +39,7 @@
 class LibWebRTCMediaEndpoint;
 class LibWebRTCProvider;
 class LibWebRTCRtpSenderBackend;
+class LibWebRTCRtpReceiverBackend;
 class LibWebRTCRtpTransceiverBackend;
 class RTCRtpReceiver;
 class RTCRtpReceiverBackend;
@@ -96,32 +98,17 @@
     void setSenderSourceFromTrack(LibWebRTCRtpSenderBackend&, MediaStreamTrack&);
 
     RTCRtpTransceiver* existingTransceiver(WTF::Function<bool(LibWebRTCRtpTransceiverBackend&)>&&);
-    RTCRtpTransceiver& newRemoteTransceiver(std::unique_ptr<LibWebRTCRtpTransceiverBackend>&&, Ref<RealtimeMediaSource>&&);
+    RTCRtpTransceiver& newRemoteTransceiver(std::unique_ptr<LibWebRTCRtpTransceiverBackend>&&, RealtimeMediaSource::Type);
 
     void collectTransceivers() final;
 
-    struct VideoReceiver {
-        Ref<RTCRtpReceiver> receiver;
-        Ref<RealtimeIncomingVideoSource> source;
-    };
-    struct AudioReceiver {
-        Ref<RTCRtpReceiver> receiver;
-        Ref<RealtimeIncomingAudioSource> source;
-    };
-    VideoReceiver videoReceiver(String&& trackId);
-    AudioReceiver audioReceiver(String&& trackId);
-
 private:
     bool isLocalDescriptionSet() const final { return m_isLocalDescriptionSet; }
 
-    Ref<RTCRtpTransceiver> completeAddTransceiver(Ref<RTCRtpSender>&&, const RTCRtpTransceiverInit&, const String& trackId, const String& trackKind);
-
-    Ref<RTCRtpReceiver> createReceiver(const String& trackKind, const String& trackId);
-
     template<typename T>
     ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiverFromTrackOrKind(T&& trackOrKind, const RTCRtpTransceiverInit&);
 
-    Ref<RTCRtpReceiver> createReceiverForSource(Ref<RealtimeMediaSource>&&, std::unique_ptr<RTCRtpReceiverBackend>&&);
+    Ref<RTCRtpReceiver> createReceiver(std::unique_ptr<LibWebRTCRtpReceiverBackend>&&);
 
     void suspend() final;
     void resume() final;

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp (258492 => 258493)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp	2020-03-16 13:15:08 UTC (rev 258493)
@@ -26,6 +26,8 @@
 #include "LibWebRTCRtpReceiverBackend.h"
 
 #include "LibWebRTCUtils.h"
+#include "RealtimeIncomingAudioSource.h"
+#include "RealtimeIncomingVideoSource.h"
 
 #if ENABLE(WEB_RTC) && USE(LIBWEBRTC)
 
@@ -78,6 +80,25 @@
     return sources;
 }
 
+Ref<RealtimeMediaSource> LibWebRTCRtpReceiverBackend::createSource()
+{
+    auto rtcTrack = m_rtcReceiver->track();
+    switch (m_rtcReceiver->media_type()) {
+    case cricket::MEDIA_TYPE_DATA:
+        break;
+    case cricket::MEDIA_TYPE_AUDIO: {
+        rtc::scoped_refptr<webrtc::AudioTrackInterface> audioTrack = static_cast<webrtc::AudioTrackInterface*>(rtcTrack.get());
+        return RealtimeIncomingAudioSource::create(WTFMove(audioTrack), fromStdString(rtcTrack->id()));
+    }
+    case cricket::MEDIA_TYPE_VIDEO: {
+        rtc::scoped_refptr<webrtc::VideoTrackInterface> videoTrack = static_cast<webrtc::VideoTrackInterface*>(rtcTrack.get());
+        return RealtimeIncomingVideoSource::create(WTFMove(videoTrack), fromStdString(rtcTrack->id()));
+    }
+    }
+    RELEASE_ASSERT_NOT_REACHED();
+}
+
+
 } // namespace WebCore
 
 #endif // ENABLE(WEB_RTC) && USE(LIBWEBRTC)

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h (258492 => 258493)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h	2020-03-16 13:15:08 UTC (rev 258493)
@@ -38,6 +38,8 @@
 
 namespace WebCore {
 
+class RealtimeMediaSource;
+
 class LibWebRTCRtpReceiverBackend final : public RTCRtpReceiverBackend {
     WTF_MAKE_FAST_ALLOCATED;
 public:
@@ -48,6 +50,8 @@
 
     webrtc::RtpReceiverInterface* rtcReceiver() { return m_rtcReceiver.get(); }
 
+    Ref<RealtimeMediaSource> createSource();
+
 private:
     RTCRtpParameters getParameters() final;
     Vector<RTCRtpContributingSource> getContributingSources() const final;

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp (258492 => 258493)


--- trunk/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp	2020-03-16 13:15:08 UTC (rev 258493)
@@ -42,7 +42,7 @@
     : RealtimeMediaSource(RealtimeMediaSource::Type::Audio, "remote audio"_s, WTFMove(audioTrackId))
     , m_audioTrack(WTFMove(audioTrack))
 {
-    notifyMutedChange(!m_audioTrack);
+    ASSERT(m_audioTrack);
 }
 
 RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource()
@@ -62,19 +62,6 @@
         m_audioTrack->RemoveSink(this);
 }
 
-void RealtimeIncomingAudioSource::setSourceTrack(rtc::scoped_refptr<webrtc::AudioTrackInterface>&& track)
-{
-    ASSERT(track);
-
-    if (m_audioTrack && isProducingData())
-        m_audioTrack->RemoveSink(this);
-
-    m_audioTrack = WTFMove(track);
-    notifyMutedChange(!m_audioTrack);
-    if (isProducingData())
-        m_audioTrack->AddSink(this);
-}
-
 const RealtimeMediaSourceCapabilities& RealtimeIncomingAudioSource::capabilities()
 {
     return RealtimeMediaSourceCapabilities::emptyCapabilities();

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.h (258492 => 258493)


--- trunk/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.h	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.h	2020-03-16 13:15:08 UTC (rev 258493)
@@ -52,8 +52,6 @@
 public:
     static Ref<RealtimeIncomingAudioSource> create(rtc::scoped_refptr<webrtc::AudioTrackInterface>&&, String&&);
 
-    void setSourceTrack(rtc::scoped_refptr<webrtc::AudioTrackInterface>&&);
-
 protected:
     RealtimeIncomingAudioSource(rtc::scoped_refptr<webrtc::AudioTrackInterface>&&, String&&);
     ~RealtimeIncomingAudioSource();

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp (258492 => 258493)


--- trunk/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp	2020-03-16 13:15:08 UTC (rev 258493)
@@ -39,7 +39,7 @@
     : RealtimeMediaSource(Type::Video, "remote video"_s, WTFMove(videoTrackId))
     , m_videoTrack(WTFMove(videoTrack))
 {
-    notifyMutedChange(!m_videoTrack);
+    ASSERT(m_videoTrack);
 
     RealtimeMediaSourceSupportedConstraints constraints;
     constraints.setSupportsWidth(true);
@@ -54,18 +54,6 @@
         m_videoTrack->AddOrUpdateSink(this, rtc::VideoSinkWants());
 }
 
-void RealtimeIncomingVideoSource::setSourceTrack(rtc::scoped_refptr<webrtc::VideoTrackInterface>&& track)
-{
-    ASSERT(track);
-
-    if (m_videoTrack && isProducingData())
-        m_videoTrack->RemoveSink(this);
-    m_videoTrack = WTFMove(track);
-    notifyMutedChange(!m_videoTrack);
-    if (isProducingData())
-        m_videoTrack->AddOrUpdateSink(this, rtc::VideoSinkWants());
-}
-
 void RealtimeIncomingVideoSource::stopProducingData()
 {
     if (m_videoTrack)

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.h (258492 => 258493)


--- trunk/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.h	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.h	2020-03-16 13:15:08 UTC (rev 258493)
@@ -58,8 +58,6 @@
         stop();
     }
 
-    void setSourceTrack(rtc::scoped_refptr<webrtc::VideoTrackInterface>&&);
-
 protected:
     RealtimeIncomingVideoSource(rtc::scoped_refptr<webrtc::VideoTrackInterface>&&, String&&);
 

Modified: trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h (258492 => 258493)


--- trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h	2020-03-16 12:41:52 UTC (rev 258492)
+++ trunk/Source/WebCore/testing/MockLibWebRTCPeerConnection.h	2020-03-16 13:15:08 UTC (rev 258493)
@@ -189,6 +189,19 @@
     rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> m_track;
 };
 
+class MockMediaStreamTrack : public webrtc::MediaStreamTrackInterface {
+public:
+    MockMediaStreamTrack() = default;
+private:
+    std::string kind() const final { return "video"; }
+    std::string id() const final { return "mymocktrack"; }
+    bool enabled() const final { return true; }
+    bool set_enabled(bool) final { return true; }
+    TrackState state() const  { return TrackState::kLive; }
+    void RegisterObserver(webrtc::ObserverInterface*) final { }
+    void UnregisterObserver(webrtc::ObserverInterface*) final { }
+};
+
 class MockRtpReceiver : public webrtc::RtpReceiverInterface {
 private:
     cricket::MediaType media_type() const final { return cricket::MEDIA_TYPE_VIDEO; }
@@ -196,8 +209,15 @@
     webrtc::RtpParameters GetParameters() const { return { }; }
     bool SetParameters(const webrtc::RtpParameters&) { return true; }
     void SetObserver(webrtc::RtpReceiverObserverInterface*) { }
-    rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track() const final { return { }; }
     void SetJitterBufferMinimumDelay(absl::optional<double>) final { }
+    rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track() const final
+    {
+        if (!m_track)
+            const_cast<MockRtpReceiver*>(this)->m_track = new rtc::RefCountedObject<MockMediaStreamTrack>();
+        return m_track;
+    }
+
+    rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> m_track;
 };
 
 class MockRtpTransceiver : public webrtc::RtpTransceiverInterface {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to