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 ¤t.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)); }