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 {