Index: webrtc/api/peerconnection.cc |
diff --git a/webrtc/api/peerconnection.cc b/webrtc/api/peerconnection.cc |
index 7f1f4523781685f062bfa0f7e8b639fd1cc1b8d4..249b94b232e8a79f862556ee82b7f25216622262 100644 |
--- a/webrtc/api/peerconnection.cc |
+++ b/webrtc/api/peerconnection.cc |
@@ -46,7 +46,10 @@ using webrtc::DataChannel; |
using webrtc::MediaConstraintsInterface; |
using webrtc::MediaStreamInterface; |
using webrtc::PeerConnectionInterface; |
+using webrtc::RtpSender; |
using webrtc::RtpSenderInterface; |
+using webrtc::RtpSenderProxy; |
+using webrtc::RtpSenderProxyEx; |
using webrtc::StreamCollection; |
static const char kDefaultStreamLabel[] = "default"; |
@@ -347,13 +350,13 @@ bool IsValidOfferToReceiveMedia(int value) { |
// Add the stream and RTP data channel info to |session_options|. |
void AddSendStreams( |
cricket::MediaSessionOptions* session_options, |
- const std::vector<rtc::scoped_refptr<RtpSenderInterface>>& senders, |
+ const std::vector<rtc::scoped_refptr<RtpSenderProxyEx<RtpSender>>>& senders, |
const std::map<std::string, rtc::scoped_refptr<DataChannel>>& |
rtp_data_channels) { |
session_options->streams.clear(); |
for (const auto& sender : senders) { |
session_options->AddSendStream(sender->media_type(), sender->id(), |
- sender->stream_id()); |
+ sender->get()->stream_id()); |
} |
// Check for data channels. |
@@ -517,7 +520,7 @@ PeerConnection::~PeerConnection() { |
// Need to detach RTP senders/receivers from WebRtcSession, |
// since it's about to be destroyed. |
for (const auto& sender : senders_) { |
- sender->Stop(); |
+ sender->get()->Stop(); |
} |
for (const auto& receiver : receivers_) { |
receiver->Stop(); |
@@ -686,32 +689,32 @@ rtc::scoped_refptr<RtpSenderInterface> PeerConnection::AddTrack( |
} |
// TODO(deadbeef): Support adding a track to multiple streams. |
- rtc::scoped_refptr<RtpSenderInterface> new_sender; |
+ rtc::scoped_refptr<RtpSenderProxyEx<RtpSender>> new_sender; |
if (track->kind() == MediaStreamTrackInterface::kAudioKind) { |
- new_sender = RtpSenderProxy::Create( |
+ new_sender = RtpSenderProxyEx<RtpSender>::Create( |
signaling_thread(), |
new AudioRtpSender(static_cast<AudioTrackInterface*>(track), |
session_.get(), stats_.get())); |
if (!streams.empty()) { |
- new_sender->set_stream_id(streams[0]->label()); |
+ new_sender->get()->set_stream_id(streams[0]->label()); |
} |
const TrackInfo* track_info = FindTrackInfo( |
- local_audio_tracks_, new_sender->stream_id(), track->id()); |
+ local_audio_tracks_, new_sender->get()->stream_id(), track->id()); |
if (track_info) { |
- new_sender->SetSsrc(track_info->ssrc); |
+ new_sender->get()->SetSsrc(track_info->ssrc); |
} |
} else if (track->kind() == MediaStreamTrackInterface::kVideoKind) { |
- new_sender = RtpSenderProxy::Create( |
+ new_sender = RtpSenderProxyEx<RtpSender>::Create( |
signaling_thread(), |
new VideoRtpSender(static_cast<VideoTrackInterface*>(track), |
session_.get())); |
if (!streams.empty()) { |
- new_sender->set_stream_id(streams[0]->label()); |
+ new_sender->get()->set_stream_id(streams[0]->label()); |
} |
const TrackInfo* track_info = FindTrackInfo( |
- local_video_tracks_, new_sender->stream_id(), track->id()); |
+ local_video_tracks_, new_sender->get()->stream_id(), track->id()); |
if (track_info) { |
- new_sender->SetSsrc(track_info->ssrc); |
+ new_sender->get()->SetSsrc(track_info->ssrc); |
} |
} else { |
LOG(LS_ERROR) << "CreateSender called with invalid kind: " << track->kind(); |
@@ -734,7 +737,7 @@ bool PeerConnection::RemoveTrack(RtpSenderInterface* sender) { |
LOG(LS_ERROR) << "Couldn't find sender " << sender->id() << " to remove."; |
return false; |
} |
- (*it)->Stop(); |
+ (*it)->get()->Stop(); |
senders_.erase(it); |
observer_->OnRenegotiationNeeded(); |
@@ -766,19 +769,19 @@ rtc::scoped_refptr<RtpSenderInterface> PeerConnection::CreateSender( |
const std::string& kind, |
const std::string& stream_id) { |
TRACE_EVENT0("webrtc", "PeerConnection::CreateSender"); |
- rtc::scoped_refptr<RtpSenderInterface> new_sender; |
+ rtc::scoped_refptr<RtpSenderProxyEx<RtpSender>> new_sender; |
if (kind == MediaStreamTrackInterface::kAudioKind) { |
- new_sender = RtpSenderProxy::Create( |
+ new_sender = RtpSenderProxyEx<RtpSender>::Create( |
signaling_thread(), new AudioRtpSender(session_.get(), stats_.get())); |
} else if (kind == MediaStreamTrackInterface::kVideoKind) { |
- new_sender = RtpSenderProxy::Create(signaling_thread(), |
+ new_sender = RtpSenderProxyEx<RtpSender>::Create(signaling_thread(), |
new VideoRtpSender(session_.get())); |
} else { |
LOG(LS_ERROR) << "CreateSender called with invalid kind: " << kind; |
return new_sender; |
} |
if (!stream_id.empty()) { |
- new_sender->set_stream_id(stream_id); |
+ new_sender->get()->set_stream_id(stream_id); |
} |
senders_.push_back(new_sender); |
return new_sender; |
@@ -786,7 +789,11 @@ rtc::scoped_refptr<RtpSenderInterface> PeerConnection::CreateSender( |
std::vector<rtc::scoped_refptr<RtpSenderInterface>> PeerConnection::GetSenders() |
const { |
- return senders_; |
+ std::vector<rtc::scoped_refptr<RtpSenderInterface>> ret; |
+ for (const auto& sender : senders_) { |
+ ret.push_back(sender.get()); |
+ } |
+ return ret; |
} |
std::vector<rtc::scoped_refptr<RtpReceiverInterface>> |
@@ -1380,12 +1387,12 @@ void PeerConnection::OnAudioTrackAdded(AudioTrackInterface* track, |
if (sender != senders_.end()) { |
// We already have a sender for this track, so just change the stream_id |
// so that it's correct in the next call to CreateOffer. |
- (*sender)->set_stream_id(stream->label()); |
+ (*sender)->get()->set_stream_id(stream->label()); |
return; |
} |
// Normal case; we've never seen this track before. |
- rtc::scoped_refptr<RtpSenderInterface> new_sender = RtpSenderProxy::Create( |
+ rtc::scoped_refptr<RtpSenderProxyEx<RtpSender>> new_sender = RtpSenderProxyEx<RtpSender>::Create( |
signaling_thread(), |
new AudioRtpSender(track, stream->label(), session_.get(), stats_.get())); |
senders_.push_back(new_sender); |
@@ -1398,7 +1405,7 @@ void PeerConnection::OnAudioTrackAdded(AudioTrackInterface* track, |
const TrackInfo* track_info = |
FindTrackInfo(local_audio_tracks_, stream->label(), track->id()); |
if (track_info) { |
- new_sender->SetSsrc(track_info->ssrc); |
+ new_sender->get()->SetSsrc(track_info->ssrc); |
} |
} |
@@ -1412,7 +1419,7 @@ void PeerConnection::OnAudioTrackRemoved(AudioTrackInterface* track, |
<< " doesn't exist."; |
return; |
} |
- (*sender)->Stop(); |
+ (*sender)->get()->Stop(); |
senders_.erase(sender); |
} |
@@ -1422,19 +1429,19 @@ void PeerConnection::OnVideoTrackAdded(VideoTrackInterface* track, |
if (sender != senders_.end()) { |
// We already have a sender for this track, so just change the stream_id |
// so that it's correct in the next call to CreateOffer. |
- (*sender)->set_stream_id(stream->label()); |
+ (*sender)->get()->set_stream_id(stream->label()); |
return; |
} |
// Normal case; we've never seen this track before. |
- rtc::scoped_refptr<RtpSenderInterface> new_sender = RtpSenderProxy::Create( |
+ rtc::scoped_refptr<RtpSenderProxyEx<RtpSender>> new_sender = RtpSenderProxyEx<RtpSender>::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()); |
if (track_info) { |
- new_sender->SetSsrc(track_info->ssrc); |
+ new_sender->get()->SetSsrc(track_info->ssrc); |
} |
} |
@@ -1446,7 +1453,7 @@ void PeerConnection::OnVideoTrackRemoved(VideoTrackInterface* track, |
<< " doesn't exist."; |
return; |
} |
- (*sender)->Stop(); |
+ (*sender)->get()->Stop(); |
senders_.erase(sender); |
} |
@@ -1739,7 +1746,7 @@ void PeerConnection::OnLocalTrackSeen(const std::string& stream_label, |
const std::string& track_id, |
uint32_t ssrc, |
cricket::MediaType media_type) { |
- RtpSenderInterface* sender = FindSenderById(track_id); |
+ RtpSender* sender = FindSenderById(track_id); |
if (!sender) { |
LOG(LS_WARNING) << "An unknown RtpSender with id " << track_id |
<< " has been configured in the local description."; |
@@ -1760,7 +1767,7 @@ void PeerConnection::OnLocalTrackRemoved(const std::string& stream_label, |
const std::string& track_id, |
uint32_t ssrc, |
cricket::MediaType media_type) { |
- RtpSenderInterface* sender = FindSenderById(track_id); |
+ RtpSender* sender = FindSenderById(track_id); |
if (!sender) { |
// This is the normal case. I.e., RemoveStream has been called and the |
// SessionDescriptions has been renegotiated. |
@@ -1999,16 +2006,16 @@ void PeerConnection::OnDataChannelOpenMessage( |
DataChannelProxy::Create(signaling_thread(), channel)); |
} |
-RtpSenderInterface* PeerConnection::FindSenderById(const std::string& id) { |
+RtpSender* PeerConnection::FindSenderById(const std::string& id) { |
auto it = |
std::find_if(senders_.begin(), senders_.end(), |
- [id](const rtc::scoped_refptr<RtpSenderInterface>& sender) { |
+ [id](const rtc::scoped_refptr<RtpSenderProxyEx<RtpSender>>& sender) { |
return sender->id() == id; |
}); |
- return it != senders_.end() ? it->get() : nullptr; |
+ return it != senders_.end() ? it->get()->get() : nullptr; |
} |
-std::vector<rtc::scoped_refptr<RtpSenderInterface>>::iterator |
+std::vector<rtc::scoped_refptr<RtpSenderProxyEx<RtpSender>>>::iterator |
PeerConnection::FindSenderForTrack(MediaStreamTrackInterface* track) { |
return std::find_if( |
senders_.begin(), senders_.end(), |