| 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(),
|
|
|