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

Unified Diff: talk/app/webrtc/peerconnection.cc

Issue 1563403002: Adding AddTrack/RemoveTrack to native PeerConnection API. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Adding unit tests and fixing some issues. Created 4 years, 11 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: talk/app/webrtc/peerconnection.cc
diff --git a/talk/app/webrtc/peerconnection.cc b/talk/app/webrtc/peerconnection.cc
index 617eb15518a18bb77730245db63b310ed591cb48..a5a895266741e83563edfb5beef953d17ab5e6cd 100644
--- a/talk/app/webrtc/peerconnection.cc
+++ b/talk/app/webrtc/peerconnection.cc
@@ -791,6 +791,72 @@ void PeerConnection::RemoveStream(MediaStreamInterface* local_stream) {
observer_->OnRenegotiationNeeded();
}
+rtc::scoped_refptr<RtpSenderInterface> PeerConnection::AddTrack(
+ MediaStreamTrackInterface* track,
+ std::vector<MediaStreamInterface*> streams) {
pthatcher1 2016/01/11 17:31:51 Would it make sense to only pass in a std::vector<
Taylor Brandstetter 2016/01/13 00:53:01 The reason for it to take a stream is that I want
+ TRACE_EVENT0("webrtc", "PeerConnection::AddTrack");
+ if (IsClosed()) {
+ return nullptr;
+ }
+ if (FindSenderForTrack(track) != senders_.end()) {
+ LOG(LS_ERROR) << "Sender for track " << track->id() << " already exists.";
+ return nullptr;
pthatcher1 2016/01/11 17:31:51 Will this be supported once we switch to Unified P
Taylor Brandstetter 2016/01/13 00:53:01 I guess I just assumed the spec didn't allow it. I
+ }
+
+ // TODO(deadbeef): Support adding a track to multiple streams.
+ rtc::scoped_refptr<RtpSenderInterface> new_sender;
+ if (track->kind() == MediaStreamTrackInterface::kAudioKind) {
+ new_sender = RtpSenderProxy::Create(
+ signaling_thread(),
+ new AudioRtpSender(static_cast<AudioTrackInterface*>(track),
+ session_.get(), stats_.get()));
pthatcher1 2016/01/11 17:31:51 So later one when we want to do something with an
Taylor Brandstetter 2016/01/13 00:53:01 We would use the proxy object. If a method is call
+ if (!streams.empty()) {
+ new_sender->set_stream_id(streams[0]->label());
+ }
+ const TrackInfo* track_info = FindTrackInfo(
+ local_audio_tracks_, new_sender->stream_id(), track->id());
+ if (track_info) {
+ new_sender->SetSsrc(track_info->ssrc);
+ }
+ } else if (track->kind() == MediaStreamTrackInterface::kVideoKind) {
+ new_sender = RtpSenderProxy::Create(
+ signaling_thread(),
+ new VideoRtpSender(static_cast<VideoTrackInterface*>(track),
+ session_.get()));
+ if (!streams.empty()) {
+ new_sender->set_stream_id(streams[0]->label());
+ }
+ const TrackInfo* track_info = FindTrackInfo(
+ local_video_tracks_, new_sender->stream_id(), track->id());
+ if (track_info) {
+ new_sender->SetSsrc(track_info->ssrc);
+ }
+ } else {
+ LOG(LS_ERROR) << "CreateSender called with invalid kind: " << track->kind();
+ return rtc::scoped_refptr<RtpSenderInterface>();
+ }
+
+ senders_.push_back(new_sender);
+ observer_->OnRenegotiationNeeded();
+ return new_sender;
+}
+
+bool PeerConnection::RemoveTrack(RtpSenderInterface* sender) {
+ TRACE_EVENT0("webrtc", "PeerConnection::RemoveTrack");
+
+ auto it = std::find(senders_.begin(), senders_.end(), sender);
+ if (it == senders_.end()) {
+ LOG(LS_ERROR) << "Couldn't find sender " << sender->id() << " to remove.";
+ return false;
+ }
+ senders_.erase(it);
+
+ if (!IsClosed()) {
+ observer_->OnRenegotiationNeeded();
+ }
pthatcher1 2016/01/11 17:31:51 We can RemoveTrack even if IsClosed()?
Taylor Brandstetter 2016/01/13 00:53:01 I was just matching RemoveStream, but it looks lik
+ return true;
+}
+
rtc::scoped_refptr<DtmfSenderInterface> PeerConnection::CreateDtmfSender(
AudioTrackInterface* track) {
TRACE_EVENT0("webrtc", "PeerConnection::CreateDtmfSender");
@@ -816,39 +882,32 @@ rtc::scoped_refptr<RtpSenderInterface> PeerConnection::CreateSender(
const std::string& kind,
const std::string& stream_id) {
TRACE_EVENT0("webrtc", "PeerConnection::CreateSender");
- RtpSenderInterface* new_sender;
+ rtc::scoped_refptr<RtpSenderInterface> new_sender;
if (kind == MediaStreamTrackInterface::kAudioKind) {
- new_sender = new AudioRtpSender(session_.get(), stats_.get());
+ new_sender = RtpSenderProxy::Create(
+ signaling_thread(), new AudioRtpSender(session_.get(), stats_.get()));
} else if (kind == MediaStreamTrackInterface::kVideoKind) {
- new_sender = new VideoRtpSender(session_.get());
+ new_sender = RtpSenderProxy::Create(signaling_thread(),
+ new VideoRtpSender(session_.get()));
} else {
LOG(LS_ERROR) << "CreateSender called with invalid kind: " << kind;
- return rtc::scoped_refptr<RtpSenderInterface>();
+ return new_sender;
}
if (!stream_id.empty()) {
new_sender->set_stream_id(stream_id);
}
senders_.push_back(new_sender);
- return RtpSenderProxy::Create(signaling_thread(), new_sender);
+ return new_sender;
}
std::vector<rtc::scoped_refptr<RtpSenderInterface>> PeerConnection::GetSenders()
const {
- std::vector<rtc::scoped_refptr<RtpSenderInterface>> senders;
- for (const auto& sender : senders_) {
- senders.push_back(RtpSenderProxy::Create(signaling_thread(), sender.get()));
- }
- return senders;
+ return senders_;
}
std::vector<rtc::scoped_refptr<RtpReceiverInterface>>
PeerConnection::GetReceivers() const {
- std::vector<rtc::scoped_refptr<RtpReceiverInterface>> receivers;
- for (const auto& receiver : receivers_) {
- receivers.push_back(
- RtpReceiverProxy::Create(signaling_thread(), receiver.get()));
- }
- return receivers;
+ return receivers_;
}
bool PeerConnection::GetStats(StatsObserver* observer,
@@ -1318,13 +1377,17 @@ void PeerConnection::OnMessage(rtc::Message* msg) {
void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream,
AudioTrackInterface* audio_track,
uint32_t ssrc) {
- receivers_.push_back(new AudioRtpReceiver(audio_track, ssrc, session_.get()));
+ receivers_.push_back(RtpReceiverProxy::Create(
+ signaling_thread(),
+ new AudioRtpReceiver(audio_track, ssrc, session_.get())));
}
void PeerConnection::CreateVideoReceiver(MediaStreamInterface* stream,
VideoTrackInterface* video_track,
uint32_t ssrc) {
- receivers_.push_back(new VideoRtpReceiver(video_track, ssrc, session_.get()));
+ receivers_.push_back(RtpReceiverProxy::Create(
+ signaling_thread(),
+ new VideoRtpReceiver(video_track, ssrc, session_.get())));
}
// TODO(deadbeef): Keep RtpReceivers around even if track goes away in remote
@@ -1416,8 +1479,9 @@ void PeerConnection::OnAudioTrackAdded(AudioTrackInterface* track,
}
// Normal case; we've never seen this track before.
- AudioRtpSender* new_sender =
- new AudioRtpSender(track, stream->label(), session_.get(), stats_.get());
+ rtc::scoped_refptr<RtpSenderInterface> new_sender = RtpSenderProxy::Create(
+ signaling_thread(),
+ new AudioRtpSender(track, stream->label(), session_.get(), stats_.get()));
senders_.push_back(new_sender);
// If the sender has already been configured in SDP, we call SetSsrc,
// which will connect the sender to the underlying transport. This can
@@ -1457,8 +1521,9 @@ void PeerConnection::OnVideoTrackAdded(VideoTrackInterface* track,
}
// Normal case; we've never seen this track before.
- VideoRtpSender* new_sender =
- new VideoRtpSender(track, stream->label(), session_.get());
+ rtc::scoped_refptr<RtpSenderInterface> new_sender = RtpSenderProxy::Create(
+ signaling_thread(),
+ new VideoRtpSender(track, stream->label(), session_.get()));
senders_.push_back(new_sender);
const TrackInfo* track_info =
FindTrackInfo(local_video_tracks_, stream->label(), track->id());

Powered by Google App Engine
This is Rietveld 408576698