| 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 c1f8016bf39604cb268a4731cdf76a064d8da59a..1ac67517b4f2f5edce839f9e192072f23d0c80a6 100644
|
| --- a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
|
| +++ b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
|
| @@ -68,6 +68,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"
|
| @@ -1123,6 +1124,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 {
|
| @@ -1178,6 +1182,32 @@ 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 an |RTCRtpSender| for this |WebRTCRtpSender|
|
| + // yet, create it.
|
| + MediaStreamTrack* track = nullptr;
|
| + if (web_rtp_senders[i]->Track()) {
|
| + track = GetLocalTrackById(web_rtp_senders[i]->Track()->Id());
|
| + DCHECK(track);
|
| + }
|
| + 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();
|
| @@ -1243,13 +1273,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(
|
| @@ -1262,6 +1293,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()) {
|
| @@ -1283,7 +1327,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;
|
| @@ -1551,6 +1595,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_);
|
|
|