Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 6f04b65

Browse files
Harald AlvestrandCommit Bot
authored andcommitted
Move the streams concept into sdp_offer_answer
This makes it easier to see that the tying of tracks to streams affects only the SDP negotiation, and not what's sent on the wire. Bug: webrtc:11995 Change-Id: I8ca5adf0050e4a2be55d164a6d0e4d5811582476 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/187359 Reviewed-by: Henrik Boström <[email protected]> Commit-Queue: Harald Alvestrand <[email protected]> Cr-Commit-Position: refs/heads/master@{#32368}
1 parent 80fb978 commit 6f04b65

File tree

4 files changed

+146
-106
lines changed

4 files changed

+146
-106
lines changed

pc/peer_connection.cc

Lines changed: 10 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -93,20 +93,6 @@ static const char kDefaultVideoSenderId[] = "defaultv0";
9393

9494
static const int REPORT_USAGE_PATTERN_DELAY_MS = 60000;
9595

96-
// Check if we can send |new_stream| on a PeerConnection.
97-
bool CanAddLocalMediaStream(webrtc::StreamCollectionInterface* current_streams,
98-
webrtc::MediaStreamInterface* new_stream) {
99-
if (!new_stream || !current_streams) {
100-
return false;
101-
}
102-
if (current_streams->find(new_stream->id()) != nullptr) {
103-
RTC_LOG(LS_ERROR) << "MediaStream with ID " << new_stream->id()
104-
<< " is already added.";
105-
return false;
106-
}
107-
return true;
108-
}
109-
11096

11197
uint32_t ConvertIceTransportTypeToCandidateFilter(
11298
PeerConnectionInterface::IceTransportsType type) {
@@ -355,8 +341,6 @@ PeerConnection::PeerConnection(PeerConnectionFactory* factory,
355341
: factory_(factory),
356342
event_log_(std::move(event_log)),
357343
event_log_ptr_(event_log_.get()),
358-
local_streams_(StreamCollection::Create()),
359-
remote_streams_(StreamCollection::Create()),
360344
call_(std::move(call)),
361345
call_ptr_(call_.get()),
362346
sdp_handler_(this),
@@ -682,51 +666,23 @@ rtc::scoped_refptr<StreamCollectionInterface> PeerConnection::local_streams() {
682666
RTC_CHECK(!IsUnifiedPlan()) << "local_streams is not available with Unified "
683667
"Plan SdpSemantics. Please use GetSenders "
684668
"instead.";
685-
return local_streams_;
669+
return sdp_handler_.local_streams();
686670
}
687671

688672
rtc::scoped_refptr<StreamCollectionInterface> PeerConnection::remote_streams() {
689673
RTC_DCHECK_RUN_ON(signaling_thread());
690674
RTC_CHECK(!IsUnifiedPlan()) << "remote_streams is not available with Unified "
691675
"Plan SdpSemantics. Please use GetReceivers "
692676
"instead.";
693-
return remote_streams_;
677+
return sdp_handler_.remote_streams();
694678
}
695679

696680
bool PeerConnection::AddStream(MediaStreamInterface* local_stream) {
697681
RTC_DCHECK_RUN_ON(signaling_thread());
698682
RTC_CHECK(!IsUnifiedPlan()) << "AddStream is not available with Unified Plan "
699683
"SdpSemantics. Please use AddTrack instead.";
700684
TRACE_EVENT0("webrtc", "PeerConnection::AddStream");
701-
if (IsClosed()) {
702-
return false;
703-
}
704-
if (!CanAddLocalMediaStream(local_streams_, local_stream)) {
705-
return false;
706-
}
707-
708-
local_streams_->AddStream(local_stream);
709-
MediaStreamObserver* observer = new MediaStreamObserver(local_stream);
710-
observer->SignalAudioTrackAdded.connect(this,
711-
&PeerConnection::OnAudioTrackAdded);
712-
observer->SignalAudioTrackRemoved.connect(
713-
this, &PeerConnection::OnAudioTrackRemoved);
714-
observer->SignalVideoTrackAdded.connect(this,
715-
&PeerConnection::OnVideoTrackAdded);
716-
observer->SignalVideoTrackRemoved.connect(
717-
this, &PeerConnection::OnVideoTrackRemoved);
718-
stream_observers_.push_back(std::unique_ptr<MediaStreamObserver>(observer));
719-
720-
for (const auto& track : local_stream->GetAudioTracks()) {
721-
AddAudioTrack(track.get(), local_stream);
722-
}
723-
for (const auto& track : local_stream->GetVideoTracks()) {
724-
AddVideoTrack(track.get(), local_stream);
725-
}
726-
727-
stats_->AddStream(local_stream);
728-
sdp_handler_.UpdateNegotiationNeeded();
729-
return true;
685+
return sdp_handler_.AddStream(local_stream);
730686
}
731687

732688
void PeerConnection::RemoveStream(MediaStreamInterface* local_stream) {
@@ -735,27 +691,7 @@ void PeerConnection::RemoveStream(MediaStreamInterface* local_stream) {
735691
"Plan SdpSemantics. Please use RemoveTrack "
736692
"instead.";
737693
TRACE_EVENT0("webrtc", "PeerConnection::RemoveStream");
738-
if (!IsClosed()) {
739-
for (const auto& track : local_stream->GetAudioTracks()) {
740-
RemoveAudioTrack(track.get(), local_stream);
741-
}
742-
for (const auto& track : local_stream->GetVideoTracks()) {
743-
RemoveVideoTrack(track.get(), local_stream);
744-
}
745-
}
746-
local_streams_->RemoveStream(local_stream);
747-
stream_observers_.erase(
748-
std::remove_if(
749-
stream_observers_.begin(), stream_observers_.end(),
750-
[local_stream](const std::unique_ptr<MediaStreamObserver>& observer) {
751-
return observer->stream()->id().compare(local_stream->id()) == 0;
752-
}),
753-
stream_observers_.end());
754-
755-
if (IsClosed()) {
756-
return;
757-
}
758-
sdp_handler_.UpdateNegotiationNeeded();
694+
sdp_handler_.RemoveStream(local_stream);
759695
}
760696

761697
RTCErrorOr<rtc::scoped_refptr<RtpSenderInterface>> PeerConnection::AddTrack(
@@ -2027,6 +1963,7 @@ rtc::scoped_refptr<RtpReceiverInterface> PeerConnection::RemoveAndStopReceiver(
20271963

20281964
void PeerConnection::AddAudioTrack(AudioTrackInterface* track,
20291965
MediaStreamInterface* stream) {
1966+
RTC_DCHECK_RUN_ON(signaling_thread());
20301967
RTC_DCHECK(!IsClosed());
20311968
RTC_DCHECK(track);
20321969
RTC_DCHECK(stream);
@@ -2060,6 +1997,7 @@ void PeerConnection::AddAudioTrack(AudioTrackInterface* track,
20601997
// indefinitely, when we have unified plan SDP.
20611998
void PeerConnection::RemoveAudioTrack(AudioTrackInterface* track,
20621999
MediaStreamInterface* stream) {
2000+
RTC_DCHECK_RUN_ON(signaling_thread());
20632001
RTC_DCHECK(!IsClosed());
20642002
auto sender = FindSenderForTrack(track);
20652003
if (!sender) {
@@ -2072,6 +2010,7 @@ void PeerConnection::RemoveAudioTrack(AudioTrackInterface* track,
20722010

20732011
void PeerConnection::AddVideoTrack(VideoTrackInterface* track,
20742012
MediaStreamInterface* stream) {
2013+
RTC_DCHECK_RUN_ON(signaling_thread());
20752014
RTC_DCHECK(!IsClosed());
20762015
RTC_DCHECK(track);
20772016
RTC_DCHECK(stream);
@@ -2097,6 +2036,7 @@ void PeerConnection::AddVideoTrack(VideoTrackInterface* track,
20972036

20982037
void PeerConnection::RemoveVideoTrack(VideoTrackInterface* track,
20992038
MediaStreamInterface* stream) {
2039+
RTC_DCHECK_RUN_ON(signaling_thread());
21002040
RTC_DCHECK(!IsClosed());
21012041
auto sender = FindSenderForTrack(track);
21022042
if (!sender) {
@@ -2262,13 +2202,13 @@ absl::optional<std::string> PeerConnection::GetDataMid() const {
22622202
}
22632203

22642204
void PeerConnection::OnRemoteSenderAdded(const RtpSenderInfo& sender_info,
2205+
MediaStreamInterface* stream,
22652206
cricket::MediaType media_type) {
22662207
RTC_DCHECK_RUN_ON(signaling_thread());
22672208
RTC_LOG(LS_INFO) << "Creating " << cricket::MediaTypeToString(media_type)
22682209
<< " receiver for track_id=" << sender_info.sender_id
22692210
<< " and stream_id=" << sender_info.stream_id;
22702211

2271-
MediaStreamInterface* stream = remote_streams_->find(sender_info.stream_id);
22722212
if (media_type == cricket::MEDIA_TYPE_AUDIO) {
22732213
CreateAudioReceiver(stream, sender_info);
22742214
} else if (media_type == cricket::MEDIA_TYPE_VIDEO) {
@@ -2279,14 +2219,13 @@ void PeerConnection::OnRemoteSenderAdded(const RtpSenderInfo& sender_info,
22792219
}
22802220

22812221
void PeerConnection::OnRemoteSenderRemoved(const RtpSenderInfo& sender_info,
2222+
MediaStreamInterface* stream,
22822223
cricket::MediaType media_type) {
22832224
RTC_DCHECK_RUN_ON(signaling_thread());
22842225
RTC_LOG(LS_INFO) << "Removing " << cricket::MediaTypeToString(media_type)
22852226
<< " receiver for track_id=" << sender_info.sender_id
22862227
<< " and stream_id=" << sender_info.stream_id;
22872228

2288-
MediaStreamInterface* stream = remote_streams_->find(sender_info.stream_id);
2289-
22902229
rtc::scoped_refptr<RtpReceiverInterface> receiver;
22912230
if (media_type == cricket::MEDIA_TYPE_AUDIO) {
22922231
// When the MediaEngine audio channel is destroyed, the RemoteAudioSource

pc/peer_connection.h

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -309,10 +309,6 @@ class PeerConnection : public PeerConnectionInternal,
309309
RTC_DCHECK_RUN_ON(signaling_thread());
310310
return &configuration_;
311311
}
312-
rtc::scoped_refptr<StreamCollection> remote_streams_internal() const {
313-
RTC_DCHECK_RUN_ON(signaling_thread());
314-
return remote_streams_;
315-
}
316312
absl::optional<std::string> sctp_mid() {
317313
RTC_DCHECK_RUN_ON(signaling_thread());
318314
return sctp_mid_s_;
@@ -389,16 +385,12 @@ class PeerConnection : public PeerConnectionInternal,
389385

390386
// May be called either by AddStream/RemoveStream, or when a track is
391387
// added/removed from a stream previously added via AddStream.
392-
void AddAudioTrack(AudioTrackInterface* track, MediaStreamInterface* stream)
393-
RTC_RUN_ON(signaling_thread());
388+
void AddAudioTrack(AudioTrackInterface* track, MediaStreamInterface* stream);
394389
void RemoveAudioTrack(AudioTrackInterface* track,
395-
MediaStreamInterface* stream)
396-
RTC_RUN_ON(signaling_thread());
397-
void AddVideoTrack(VideoTrackInterface* track, MediaStreamInterface* stream)
398-
RTC_RUN_ON(signaling_thread());
390+
MediaStreamInterface* stream);
391+
void AddVideoTrack(VideoTrackInterface* track, MediaStreamInterface* stream);
399392
void RemoveVideoTrack(VideoTrackInterface* track,
400-
MediaStreamInterface* stream)
401-
RTC_RUN_ON(signaling_thread());
393+
MediaStreamInterface* stream);
402394

403395
// AddTrack implementation when Unified Plan is specified.
404396
RTCErrorOr<rtc::scoped_refptr<RtpSenderInterface>> AddTrackUnifiedPlan(
@@ -503,12 +495,14 @@ class PeerConnection : public PeerConnectionInternal,
503495
// session description. It creates a remote MediaStreamTrackInterface
504496
// implementation and triggers CreateAudioReceiver or CreateVideoReceiver.
505497
void OnRemoteSenderAdded(const RtpSenderInfo& sender_info,
498+
MediaStreamInterface* stream,
506499
cricket::MediaType media_type);
507500

508501
// Triggered when a remote sender has been removed from a remote session
509502
// description. It removes the remote sender with id |sender_id| from a remote
510503
// MediaStream and triggers DestroyAudioReceiver or DestroyVideoReceiver.
511504
void OnRemoteSenderRemoved(const RtpSenderInfo& sender_info,
505+
MediaStreamInterface* stream,
512506
cricket::MediaType media_type);
513507

514508
// Triggered when a local sender has been seen for the first time in a local
@@ -764,16 +758,6 @@ class PeerConnection : public PeerConnectionInternal,
764758
tls_cert_verifier_; // TODO(bugs.webrtc.org/9987): Accessed on both
765759
// signaling and network thread.
766760

767-
// Streams added via AddStream.
768-
const rtc::scoped_refptr<StreamCollection> local_streams_
769-
RTC_GUARDED_BY(signaling_thread());
770-
// Streams created as a result of SetRemoteDescription.
771-
const rtc::scoped_refptr<StreamCollection> remote_streams_
772-
RTC_GUARDED_BY(signaling_thread());
773-
774-
std::vector<std::unique_ptr<MediaStreamObserver>> stream_observers_
775-
RTC_GUARDED_BY(signaling_thread());
776-
777761
// These lists store sender info seen in local/remote descriptions.
778762
std::vector<RtpSenderInfo> remote_audio_sender_infos_
779763
RTC_GUARDED_BY(signaling_thread());

0 commit comments

Comments
 (0)