Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Unified Diff: third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp

Issue 2749703005: RTCRtpSender with track behind RuntimeEnabled flag (Closed)
Patch Set: external/wpt/webrtc/RTCPeerConnection-idl-expected.txt updated passing 2 more tests Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_);

Powered by Google App Engine
This is Rietveld 408576698