Chromium Code Reviews| Index: third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp |
| diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp |
| index e97e12ef7f150f7430f40e96c3831316ac1be28f..93d5e86e07de10265d1af61dd02370b28380fc56 100644 |
| --- a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp |
| +++ b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp |
| @@ -70,6 +70,7 @@ |
| #include "modules/peerconnection/RTCPeerConnectionErrorCallback.h" |
| #include "modules/peerconnection/RTCPeerConnectionIceEvent.h" |
| #include "modules/peerconnection/RTCRtpReceiver.h" |
| +#include "modules/peerconnection/RTCRtpSender.h" |
| #include "modules/peerconnection/RTCSessionDescription.h" |
| #include "modules/peerconnection/RTCSessionDescriptionCallback.h" |
| #include "modules/peerconnection/RTCSessionDescriptionInit.h" |
| @@ -1124,6 +1125,9 @@ void RTCPeerConnection::removeStream(MediaStream* stream, |
| local_streams_.erase(pos); |
| peer_handler_->RemoveStream(stream->Descriptor()); |
| + |
| + // The senders of removed tracks will have become inactive. |
| + RemoveInactiveSenders(); |
| } |
| MediaStreamVector RTCPeerConnection::getLocalStreams() const { |
| @@ -1179,6 +1183,34 @@ ScriptPromise RTCPeerConnection::getStats(ScriptState* script_state) { |
| return promise; |
| } |
| +HeapVector<Member<RTCRtpSender>> RTCPeerConnection::getSenders() { |
| + WebVector<std::unique_ptr<WebRTCRtpSender>> web_rtp_senders = |
| + peer_handler_->GetSenders(); |
| + HeapVector<Member<RTCRtpSender>> rtp_senders(web_rtp_senders.size()); |
| + for (size_t i = 0; i < web_rtp_senders.size(); ++i) { |
| + uintptr_t id = web_rtp_senders[i]->Id(); |
| + const auto it = rtp_senders_.find(id); |
| + if (it != rtp_senders_.end()) { |
| + rtp_senders[i] = it->value; |
| + } else { |
| + // There does not exist a |RTCRtpSender| for this |WebRTCRtpSender| |
|
Guido Urdaneta
2017/05/02 12:31:48
nit/typo: a -> an
hbos_chromium
2017/05/03 09:54:23
Done.
|
| + // yet, create it. |
| + MediaStreamTrack* track; |
|
Guido Urdaneta
2017/05/02 12:31:48
nit: Initialize track to nullptr and remove the el
hbos_chromium
2017/05/03 09:54:23
Done.
|
| + if (web_rtp_senders[i]->Track()) { |
| + track = GetLocalTrackById(web_rtp_senders[i]->Track()->Id()); |
| + DCHECK(track); |
| + } else { |
| + track = nullptr; |
| + } |
| + RTCRtpSender* rtp_sender = |
| + new RTCRtpSender(std::move(web_rtp_senders[i]), track); |
| + rtp_senders_.insert(id, rtp_sender); |
| + rtp_senders[i] = rtp_sender; |
| + } |
| + } |
| + return rtp_senders; |
| +} |
| + |
| HeapVector<Member<RTCRtpReceiver>> RTCPeerConnection::getReceivers() { |
| WebVector<std::unique_ptr<WebRTCRtpReceiver>> web_rtp_receivers = |
| peer_handler_->GetReceivers(); |
| @@ -1244,13 +1276,14 @@ RTCDataChannel* RTCPeerConnection::createDataChannel( |
| return channel; |
| } |
| -bool RTCPeerConnection::HasLocalStreamWithTrackId(const String& track_id) { |
| - for (MediaStreamVector::iterator iter = local_streams_.begin(); |
| - iter != local_streams_.end(); ++iter) { |
| - if ((*iter)->getTrackById(track_id)) |
| - return true; |
| +MediaStreamTrack* RTCPeerConnection::GetLocalTrackById( |
| + const String& track_id) const { |
| + for (const auto& local_stream : local_streams_) { |
| + MediaStreamTrack* track = local_stream->getTrackById(track_id); |
| + if (track) |
| + return track; |
| } |
| - return false; |
| + return nullptr; |
| } |
| MediaStreamTrack* RTCPeerConnection::GetRemoteTrackById( |
| @@ -1263,6 +1296,19 @@ MediaStreamTrack* RTCPeerConnection::GetRemoteTrackById( |
| return nullptr; |
| } |
| +void RTCPeerConnection::RemoveInactiveSenders() { |
| + std::set<uintptr_t> inactive_sender_ids; |
| + for (uintptr_t id : rtp_senders_.Keys()) { |
| + inactive_sender_ids.insert(id); |
| + } |
| + for (const auto& web_rtp_sender : peer_handler_->GetSenders()) { |
| + inactive_sender_ids.erase(web_rtp_sender->Id()); |
| + } |
| + for (uintptr_t id : inactive_sender_ids) { |
| + rtp_senders_.erase(id); |
| + } |
| +} |
| + |
| void RTCPeerConnection::RemoveInactiveReceivers() { |
| std::set<uintptr_t> inactive_receiver_ids; |
| for (uintptr_t id : rtp_receivers_.Keys()) { |
| @@ -1284,7 +1330,7 @@ RTCDTMFSender* RTCPeerConnection::createDTMFSender( |
| DCHECK(track); |
| - if (!HasLocalStreamWithTrackId(track->id())) { |
| + if (!GetLocalTrackById(track->id())) { |
| exception_state.ThrowDOMException( |
| kSyntaxError, "No local stream is available for the track provided."); |
| return nullptr; |
| @@ -1552,6 +1598,7 @@ void RTCPeerConnection::RecordRapporMetrics() { |
| DEFINE_TRACE(RTCPeerConnection) { |
| visitor->Trace(local_streams_); |
| visitor->Trace(remote_streams_); |
| + visitor->Trace(rtp_senders_); |
| visitor->Trace(rtp_receivers_); |
| visitor->Trace(dispatch_scheduled_event_runner_); |
| visitor->Trace(scheduled_events_); |