Diff
Modified: trunk/Source/WebCore/ChangeLog (208682 => 208683)
--- trunk/Source/WebCore/ChangeLog 2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/ChangeLog 2016-11-14 15:46:05 UTC (rev 208683)
@@ -1,3 +1,40 @@
+2016-11-14 Youenn Fablet <[email protected]>
+
+ RTCRtpTransceiver should have Ref of sender and receiver
+ https://bugs.webkit.org/show_bug.cgi?id=164665
+
+ Reviewed by Darin Adler.
+
+ No change of behavior.
+
+ Making RTCRptTransceiver have Ref<RTCRtpSender> and Ref<RTCRtpReceiver>.
+ Transforming transceiver set list of senders and receivers as vectors of references to reduce count churning.
+ Also making RTCRptTransceiver have a Ref<RTCIceTransport> instead of a RefPtr.
+
+ * Modules/mediastream/MediaEndpointPeerConnection.cpp:
+ (WebCore::MediaEndpointPeerConnection::createOfferTask):
+ (WebCore::MediaEndpointPeerConnection::createAnswerTask):
+ (WebCore::createSourceMap):
+ (WebCore::MediaEndpointPeerConnection::setRemoteDescriptionTask):
+ (WebCore::MediaEndpointPeerConnection::createReceiver):
+ (WebCore::MediaEndpointPeerConnection::replaceTrack):
+ * Modules/mediastream/MediaEndpointPeerConnection.h:
+ * Modules/mediastream/PeerConnectionBackend.h:
+ * Modules/mediastream/RTCPeerConnection.cpp:
+ (WebCore::RTCPeerConnection::addTrack):
+ (WebCore::RTCPeerConnection::removeTrack):
+ (WebCore::RTCPeerConnection::close):
+ * Modules/mediastream/RTCPeerConnection.h:
+ * Modules/mediastream/RTCRtpTransceiver.cpp:
+ (WebCore::RTCRtpTransceiver::RTCRtpTransceiver):
+ * Modules/mediastream/RTCRtpTransceiver.h:
+ (WebCore::RTCRtpTransceiver::create):
+ (WebCore::RTCRtpTransceiver::sender):
+ (WebCore::RTCRtpTransceiver::receiver):
+ (WebCore::RTCRtpTransceiver::iceTransport):
+ (WebCore::RtpTransceiverSet::senders):
+ (WebCore::RtpTransceiverSet::receivers):
+
2016-11-14 Csaba Osztrogonác <[email protected]>
Fix various --minimal build issue
Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp (208682 => 208683)
--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp 2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp 2016-11-14 15:46:05 UTC (rev 208683)
@@ -169,7 +169,7 @@
mediaDescription.mode = transceiver->directionString();
if (transceiver->hasSendingDirection()) {
- RTCRtpSender& sender = *transceiver->sender();
+ auto& sender = transceiver->sender();
mediaDescription.mediaStreamId = sender.mediaStreamIds()[0];
mediaDescription.mediaStreamTrackId = sender.trackId();
@@ -181,7 +181,7 @@
// Add media descriptions for remaining transceivers.
for (auto& transceiver : transceivers) {
PeerMediaDescription mediaDescription;
- RTCRtpSender& sender = *transceiver->sender();
+ auto& sender = transceiver->sender();
mediaDescription.mode = transceiver->directionString();
mediaDescription.mid = transceiver->provisionalMid();
@@ -247,7 +247,7 @@
if (i >= configurationSnapshot->mediaDescriptions().size()) {
PeerMediaDescription newMediaDescription;
- RTCRtpSender& sender = *transceiver->sender();
+ auto& sender = transceiver->sender();
if (sender.track()) {
if (sender.mediaStreamIds().size())
newMediaDescription.mediaStreamId = sender.mediaStreamIds()[0];
@@ -306,8 +306,8 @@
RTCRtpTransceiver* transceiver = matchTransceiverByMid(transceivers, remoteMediaDescription.mid);
if (transceiver) {
- if (transceiver->hasSendingDirection() && transceiver->sender()->track())
- sourceMap.set(transceiver->mid(), &transceiver->sender()->track()->source());
+ if (transceiver->hasSendingDirection() && transceiver->sender().track())
+ sourceMap.set(transceiver->mid(), &transceiver->sender().track()->source());
}
}
@@ -485,7 +485,7 @@
if (mediaDescription.mode == "sendrecv" || mediaDescription.mode == "recvonly") {
// Try to match an existing transceiver.
transceiver = matchTransceiver(transceivers, [&mediaDescription] (RTCRtpTransceiver& current) {
- return !current.stopped() && current.mid().isNull() && current.sender()->trackKind() == mediaDescription.type;
+ return !current.stopped() && current.mid().isNull() && current.sender().trackKind() == mediaDescription.type;
});
if (transceiver) {
@@ -512,7 +512,7 @@
}
if (mediaDescription.mode == "sendrecv" || mediaDescription.mode == "sendonly") {
- RTCRtpReceiver& receiver = *transceiver->receiver();
+ auto& receiver = transceiver->receiver();
if (receiver.isDispatched())
continue;
receiver.setDispatched(true);
@@ -693,7 +693,7 @@
return remoteStreams;
}
-RefPtr<RTCRtpReceiver> MediaEndpointPeerConnection::createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId)
+Ref<RTCRtpReceiver> MediaEndpointPeerConnection::createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId)
{
RealtimeMediaSource::Type sourceType = trackKind == "audio" ? RealtimeMediaSource::Type::Audio : RealtimeMediaSource::Type::Video;
@@ -708,7 +708,7 @@
void MediaEndpointPeerConnection::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& withTrack, PeerConnection::VoidPromise&& promise)
{
RTCRtpTransceiver* transceiver = matchTransceiver(m_peerConnection.getTransceivers(), [&sender] (RTCRtpTransceiver& current) {
- return current.sender() == &sender;
+ return ¤t.sender() == &sender;
});
ASSERT(transceiver);
Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h (208682 => 208683)
--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h 2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h 2016-11-14 15:46:05 UTC (rev 208683)
@@ -68,7 +68,7 @@
Vector<RefPtr<MediaStream>> getRemoteStreams() const override;
- RefPtr<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) override;
+ Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) override;
void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) override;
bool isNegotiationNeeded() const override { return m_negotiationNeeded; };
Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (208682 => 208683)
--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h 2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h 2016-11-14 15:46:05 UTC (rev 208683)
@@ -93,7 +93,7 @@
virtual Vector<RefPtr<MediaStream>> getRemoteStreams() const = 0;
- virtual RefPtr<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0;
+ virtual Ref<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0;
virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) = 0;
virtual bool isNegotiationNeeded() const = 0;
Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (208682 => 208683)
--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp 2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp 2016-11-14 15:46:05 UTC (rev 208683)
@@ -98,8 +98,8 @@
if (!streams.size())
return Exception { NOT_SUPPORTED_ERR };
- for (auto& sender : m_transceiverSet->getSenders()) {
- if (sender->trackId() == track->id())
+ for (RTCRtpSender& sender : m_transceiverSet->senders()) {
+ if (sender.trackId() == track->id())
return Exception { INVALID_ACCESS_ERR };
}
@@ -111,7 +111,7 @@
// Reuse an existing sender with the same track kind if it has never been used to send before.
for (auto& transceiver : m_transceiverSet->list()) {
- RTCRtpSender& existingSender = *transceiver->sender();
+ auto& existingSender = transceiver->sender();
if (existingSender.trackKind() == track->kind() && existingSender.trackId().isNull() && !transceiver->hasSendingDirection()) {
existingSender.setTrack(WTFMove(track));
existingSender.setMediaStreamIds(WTFMove(mediaStreamIds));
@@ -134,7 +134,7 @@
// provisional mid if the transceiver is used to create an offer.
transceiver->setProvisionalMid(transceiverMid);
- sender = transceiver->sender();
+ sender = &transceiver->sender();
m_transceiverSet->append(WTFMove(transceiver));
}
@@ -148,7 +148,14 @@
if (m_signalingState == SignalingState::Closed)
return Exception { INVALID_STATE_ERR };
- if (!m_transceiverSet->getSenders().contains(&sender))
+ bool shouldAbort = true;
+ for (RTCRtpSender& senderInSet : m_transceiverSet->senders()) {
+ if (&senderInSet == &sender) {
+ shouldAbort = sender.isStopped();
+ break;
+ }
+ }
+ if (shouldAbort)
return { };
sender.stop();
@@ -199,7 +206,7 @@
{
transceiver.setDirection(static_cast<RTCRtpTransceiver::Direction>(init.direction));
- m_transceiverSet->append(&transceiver);
+ m_transceiverSet->append(transceiver);
m_backend->markAsNeedingNegotiation();
}
@@ -387,8 +394,8 @@
m_iceConnectionState = IceConnectionState::Closed;
m_signalingState = SignalingState::Closed;
- for (auto& sender : m_transceiverSet->getSenders())
- sender->stop();
+ for (RTCRtpSender& sender : m_transceiverSet->senders())
+ sender.stop();
}
void RTCPeerConnection::emulatePlatformEvent(const String& action)
@@ -412,7 +419,7 @@
return false;
}
-void RTCPeerConnection::addTransceiver(RefPtr<RTCRtpTransceiver>&& transceiver)
+void RTCPeerConnection::addTransceiver(Ref<RTCRtpTransceiver>&& transceiver)
{
m_transceiverSet->append(WTFMove(transceiver));
}
Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (208682 => 208683)
--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h 2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h 2016-11-14 15:46:05 UTC (rev 208683)
@@ -66,8 +66,8 @@
ExceptionOr<void> initializeWith(Document&, const Dictionary&);
- const Vector<RefPtr<RTCRtpSender>>& getSenders() const { return m_transceiverSet->getSenders(); }
- const Vector<RefPtr<RTCRtpReceiver>>& getReceivers() const { return m_transceiverSet->getReceivers(); }
+ const Vector<std::reference_wrapper<RTCRtpSender>>& getSenders() const { return m_transceiverSet->senders(); }
+ const Vector<std::reference_wrapper<RTCRtpReceiver>>& getReceivers() const { return m_transceiverSet->receivers(); }
const Vector<RefPtr<RTCRtpTransceiver>>& getTransceivers() const { return m_transceiverSet->list(); }
// Part of legacy MediaStream-based API (mostly implemented as JS built-ins)
@@ -126,7 +126,7 @@
WEBCORE_EXPORT void emulatePlatformEvent(const String& action);
// API used by PeerConnectionBackend and relatives
- void addTransceiver(RefPtr<RTCRtpTransceiver>&&);
+ void addTransceiver(Ref<RTCRtpTransceiver>&&);
void setSignalingState(PeerConnectionStates::SignalingState);
void updateIceGatheringState(PeerConnectionStates::IceGatheringState);
void updateIceConnectionState(PeerConnectionStates::IceConnectionState);
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp (208682 => 208683)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp 2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp 2016-11-14 15:46:05 UTC (rev 208683)
@@ -49,11 +49,6 @@
STRING_FUNCTION(recvonly)
STRING_FUNCTION(inactive)
-Ref<RTCRtpTransceiver> RTCRtpTransceiver::create(RefPtr<RTCRtpSender>&& sender, RefPtr<RTCRtpReceiver>&& receiver)
-{
- return adoptRef(*new RTCRtpTransceiver(WTFMove(sender), WTFMove(receiver)));
-}
-
String RTCRtpTransceiver::getNextMid()
{
static unsigned mid = 0;
@@ -60,10 +55,10 @@
return String::number(++mid);
}
-RTCRtpTransceiver::RTCRtpTransceiver(RefPtr<RTCRtpSender>&& sender, RefPtr<RTCRtpReceiver>&& receiver)
+RTCRtpTransceiver::RTCRtpTransceiver(Ref<RTCRtpSender>&& sender, Ref<RTCRtpReceiver>&& receiver)
: m_direction(Direction::Sendrecv)
- , m_sender(sender)
- , m_receiver(receiver)
+ , m_sender(WTFMove(sender))
+ , m_receiver(WTFMove(receiver))
, m_iceTransport(RTCIceTransport::create())
{
}
@@ -102,7 +97,7 @@
m_direction = Direction::Inactive;
}
-void RtpTransceiverSet::append(RefPtr<RTCRtpTransceiver>&& transceiver)
+void RtpTransceiverSet::append(Ref<RTCRtpTransceiver>&& transceiver)
{
m_senders.append(transceiver->sender());
m_receivers.append(transceiver->receiver());
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h (208682 => 208683)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h 2016-11-14 15:39:43 UTC (rev 208682)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h 2016-11-14 15:46:05 UTC (rev 208683)
@@ -47,7 +47,7 @@
// This enum is mirrored in RTCPeerConnection.h
enum class Direction { Sendrecv, Sendonly, Recvonly, Inactive };
- static Ref<RTCRtpTransceiver> create(RefPtr<RTCRtpSender>&&, RefPtr<RTCRtpReceiver>&&);
+ static Ref<RTCRtpTransceiver> create(Ref<RTCRtpSender>&& sender, Ref<RTCRtpReceiver>&& receiver) { return adoptRef(*new RTCRtpTransceiver(WTFMove(sender), WTFMove(receiver))); }
virtual ~RTCRtpTransceiver() { }
bool hasSendingDirection() const;
@@ -64,8 +64,8 @@
const String& mid() const { return m_mid; }
void setMid(const String& mid) { m_mid = mid; }
- RTCRtpSender* sender() const { return m_sender.get(); }
- RTCRtpReceiver* receiver() const { return m_receiver.get(); }
+ RTCRtpSender& sender() { return m_sender.get(); }
+ RTCRtpReceiver& receiver() { return m_receiver.get(); }
bool stopped() const { return m_stopped; }
void stop() { m_stopped = true; }
@@ -73,12 +73,12 @@
// FIXME: Temporary solution to keep track of ICE states for this transceiver. Later, each
// sender and receiver will have up to two DTLS transports, which in turn will have an ICE
// transport each.
- RTCIceTransport& iceTransport() const { return *m_iceTransport; }
+ RTCIceTransport& iceTransport() { return m_iceTransport.get(); }
static String getNextMid();
private:
- RTCRtpTransceiver(RefPtr<RTCRtpSender>&&, RefPtr<RTCRtpReceiver>&&);
+ RTCRtpTransceiver(Ref<RTCRtpSender>&&, Ref<RTCRtpReceiver>&&);
String m_provisionalMid;
String m_mid;
@@ -85,27 +85,27 @@
Direction m_direction;
- RefPtr<RTCRtpSender> m_sender;
- RefPtr<RTCRtpReceiver> m_receiver;
+ Ref<RTCRtpSender> m_sender;
+ Ref<RTCRtpReceiver> m_receiver;
bool m_stopped { false };
- RefPtr<RTCIceTransport> m_iceTransport;
+ Ref<RTCIceTransport> m_iceTransport;
};
class RtpTransceiverSet {
public:
const Vector<RefPtr<RTCRtpTransceiver>>& list() const { return m_transceivers; }
- void append(RefPtr<RTCRtpTransceiver>&&);
+ void append(Ref<RTCRtpTransceiver>&&);
- const Vector<RefPtr<RTCRtpSender>>& getSenders() const { return m_senders; }
- const Vector<RefPtr<RTCRtpReceiver>>& getReceivers() const { return m_receivers; }
+ const Vector<std::reference_wrapper<RTCRtpSender>>& senders() const { return m_senders; }
+ const Vector<std::reference_wrapper<RTCRtpReceiver>>& receivers() const { return m_receivers; }
private:
Vector<RefPtr<RTCRtpTransceiver>> m_transceivers;
- Vector<RefPtr<RTCRtpSender>> m_senders;
- Vector<RefPtr<RTCRtpReceiver>> m_receivers;
+ Vector<std::reference_wrapper<RTCRtpSender>> m_senders;
+ Vector<std::reference_wrapper<RTCRtpReceiver>> m_receivers;
};
} // namespace WebCore