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

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

Issue 1351803002: Exposing RtpSenders and RtpReceivers from PeerConnection. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing indentation. Created 5 years, 3 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 9e2cc731c07cdab9af64a69c103f30ccb28878cc..45bb6829699c444477086a366f9c79c78afd293b 100644
--- a/talk/app/webrtc/peerconnection.cc
+++ b/talk/app/webrtc/peerconnection.cc
@@ -33,7 +33,6 @@
#include "talk/app/webrtc/jsepicecandidate.h"
#include "talk/app/webrtc/jsepsessiondescription.h"
#include "talk/app/webrtc/mediaconstraintsinterface.h"
-#include "talk/app/webrtc/mediastreamhandler.h"
#include "talk/app/webrtc/streamcollection.h"
#include "webrtc/p2p/client/basicportallocator.h"
#include "talk/session/media/channelmanager.h"
@@ -339,10 +338,17 @@ PeerConnection::PeerConnection(PeerConnectionFactory* factory)
PeerConnection::~PeerConnection() {
ASSERT(signaling_thread()->IsCurrent());
- if (mediastream_signaling_)
+ if (mediastream_signaling_) {
mediastream_signaling_->TearDown();
- if (stream_handler_container_)
- stream_handler_container_->TearDown();
+ }
+ // Need to detach RTP senders/receivers from WebRtcSession,
+ // since it's about to be destroyed.
+ for (const auto& pair : rtp_sender_pairs_) {
+ pair.first->DetachFromProvider();
+ }
+ for (const auto& pair : rtp_receiver_pairs_) {
+ pair.first->DetachFromProvider();
+ }
}
bool PeerConnection::Initialize(
@@ -399,8 +405,6 @@ bool PeerConnection::Initialize(
factory_->worker_thread(),
port_allocator_.get(),
mediastream_signaling_.get()));
- stream_handler_container_.reset(new MediaStreamHandlerContainer(
- session_.get(), session_.get()));
stats_.reset(new StatsCollector(session_.get()));
// Initialize the WebRtcSession. It creates transport channels etc.
@@ -425,6 +429,8 @@ PeerConnection::remote_streams() {
return mediastream_signaling_->remote_streams();
}
+// TODO(deadbeef): Create RtpSenders immediately here, even if local
+// description hasn't yet been set.
pthatcher1 2015/09/23 14:47:39 More like "Replace with addTrack, which may create
pthatcher1 2015/09/24 06:32:29 Can you update this comment?
bool PeerConnection::AddStream(MediaStreamInterface* local_stream) {
if (IsClosed()) {
return false;
@@ -469,6 +475,22 @@ rtc::scoped_refptr<DtmfSenderInterface> PeerConnection::CreateDtmfSender(
return DtmfSenderProxy::Create(signaling_thread(), sender.get());
}
+RtpSenderRefptrs PeerConnection::GetSenders() const {
+ RtpSenderRefptrs senders;
+ for (const auto& pair : rtp_sender_pairs_) {
+ senders.push_back(pair.second);
+ }
+ return senders;
+}
+
+RtpReceiverRefptrs PeerConnection::GetReceivers() const {
+ RtpReceiverRefptrs receivers;
+ for (const auto& pair : rtp_receiver_pairs_) {
+ receivers.push_back(pair.second);
+ }
+ return receivers;
+}
+
bool PeerConnection::GetStats(StatsObserver* observer,
MediaStreamTrackInterface* track,
StatsOutputLevel level) {
@@ -806,7 +828,6 @@ void PeerConnection::OnAddRemoteStream(MediaStreamInterface* stream) {
}
void PeerConnection::OnRemoveRemoteStream(MediaStreamInterface* stream) {
- stream_handler_container_->RemoveRemoteStream(stream);
observer_->OnRemoveStream(stream);
}
@@ -818,52 +839,87 @@ void PeerConnection::OnAddDataChannel(DataChannelInterface* data_channel) {
void PeerConnection::OnAddRemoteAudioTrack(MediaStreamInterface* stream,
AudioTrackInterface* audio_track,
uint32 ssrc) {
- stream_handler_container_->AddRemoteAudioTrack(stream, audio_track, ssrc);
+ AddRtpReceiver(new AudioRtpReceiver(audio_track, ssrc, session_.get()));
}
void PeerConnection::OnAddRemoteVideoTrack(MediaStreamInterface* stream,
VideoTrackInterface* video_track,
uint32 ssrc) {
- stream_handler_container_->AddRemoteVideoTrack(stream, video_track, ssrc);
+ AddRtpReceiver(new VideoRtpReceiver(video_track, ssrc, session_.get()));
}
+// TODO(deadbeef): Keep RtpReceivers around even if track goes away in remote
+// description.
pthatcher1 2015/09/23 14:47:39 Well, in unified plan m-lines can never go away.
void PeerConnection::OnRemoveRemoteAudioTrack(
MediaStreamInterface* stream,
AudioTrackInterface* audio_track) {
- stream_handler_container_->RemoveRemoteTrack(stream, audio_track);
+ auto it = FindRtpReceiverPairForTrack(audio_track);
+ if (it == rtp_receiver_pairs_.end()) {
+ LOG(LS_WARNING) << "RtpReceiver for track with id " << audio_track->id()
+ << " doesn't exist.";
+ } else {
+ it->first->DetachFromProvider();
+ rtp_receiver_pairs_.erase(it);
+ }
}
void PeerConnection::OnRemoveRemoteVideoTrack(
MediaStreamInterface* stream,
VideoTrackInterface* video_track) {
- stream_handler_container_->RemoveRemoteTrack(stream, video_track);
+ auto it = FindRtpReceiverPairForTrack(video_track);
+ if (it == rtp_receiver_pairs_.end()) {
+ LOG(LS_WARNING) << "RtpReceiver for track with id " << video_track->id()
+ << " doesn't exist.";
+ } else {
+ it->first->DetachFromProvider();
+ rtp_receiver_pairs_.erase(it);
+ }
}
+
void PeerConnection::OnAddLocalAudioTrack(MediaStreamInterface* stream,
AudioTrackInterface* audio_track,
uint32 ssrc) {
- stream_handler_container_->AddLocalAudioTrack(stream, audio_track, ssrc);
+ AddRtpSender(new AudioRtpSender(audio_track, ssrc, session_.get()));
stats_->AddLocalAudioTrack(audio_track, ssrc);
}
+
void PeerConnection::OnAddLocalVideoTrack(MediaStreamInterface* stream,
VideoTrackInterface* video_track,
uint32 ssrc) {
- stream_handler_container_->AddLocalVideoTrack(stream, video_track, ssrc);
+ AddRtpSender(new VideoRtpSender(video_track, ssrc, session_.get()));
}
+// TODO(deadbeef): Keep RtpSenders around even if track goes away in local
+// description.
void PeerConnection::OnRemoveLocalAudioTrack(MediaStreamInterface* stream,
AudioTrackInterface* audio_track,
uint32 ssrc) {
- stream_handler_container_->RemoveLocalTrack(stream, audio_track);
+ auto it = FindRtpSenderPairForTrack(audio_track);
+ if (it == rtp_sender_pairs_.end()) {
+ LOG(LS_WARNING) << "RtpSender for track with id " << audio_track->id()
+ << " doesn't exist.";
+ return;
+ } else {
+ it->first->DetachFromProvider();
+ rtp_sender_pairs_.erase(it);
+ }
stats_->RemoveLocalAudioTrack(audio_track, ssrc);
}
void PeerConnection::OnRemoveLocalVideoTrack(MediaStreamInterface* stream,
VideoTrackInterface* video_track) {
- stream_handler_container_->RemoveLocalTrack(stream, video_track);
+ auto it = FindRtpSenderPairForTrack(video_track);
+ if (it == rtp_sender_pairs_.end()) {
+ LOG(LS_WARNING) << "RtpSender for track with id " << video_track->id()
+ << " doesn't exist.";
+ return;
+ } else {
+ it->first->DetachFromProvider();
+ rtp_sender_pairs_.erase(it);
+ }
}
void PeerConnection::OnRemoveLocalStream(MediaStreamInterface* stream) {
- stream_handler_container_->RemoveLocalStream(stream);
}
void PeerConnection::OnIceConnectionChange(
@@ -913,4 +969,30 @@ void PeerConnection::ChangeSignalingState(
observer_->OnStateChange(PeerConnectionObserver::kSignalingState);
}
+void PeerConnection::AddRtpSender(BaseRtpSender* sender) {
+ rtp_sender_pairs_.push_back(RtpSenderPair(
+ sender, RtpSenderProxy::Create(signaling_thread(), sender)));
+}
+
+void PeerConnection::AddRtpReceiver(BaseRtpReceiver* receiver) {
+ rtp_receiver_pairs_.push_back(RtpReceiverPair(
+ receiver, RtpReceiverProxy::Create(signaling_thread(), receiver)));
+}
+
+PeerConnection::RtpSenderPairList::iterator
+PeerConnection::FindRtpSenderPairForTrack(MediaStreamTrackInterface* track) {
+ return std::find_if(rtp_sender_pairs_.begin(), rtp_sender_pairs_.end(),
+ [track](const RtpSenderPair& pair) {
+ return pair.first->track() == track;
+ });
+}
+
+PeerConnection::RtpReceiverPairList::iterator
+PeerConnection::FindRtpReceiverPairForTrack(MediaStreamTrackInterface* track) {
+ return std::find_if(rtp_receiver_pairs_.begin(), rtp_receiver_pairs_.end(),
+ [track](const RtpReceiverPair& pair) {
+ return pair.first->track() == track;
+ });
+}
+
} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698