Advertisement
Guest User

Untitled

a guest
Jul 12th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.41 KB | None | 0 0
  1. diff --git a/webrtc/pc/peerconnection.cc b/webrtc/pc/peerconnection.cc
  2. index 0ce78a72e..06aa23c1a 100644
  3. --- a/webrtc/pc/peerconnection.cc
  4. +++ b/webrtc/pc/peerconnection.cc
  5. @@ -549,10 +549,10 @@ bool PeerConnection::AddStream(MediaStreamInterface* local_stream) {
  6.    stream_observers_.push_back(std::unique_ptr<MediaStreamObserver>(observer));
  7.  
  8.    for (const auto& track : local_stream->GetAudioTracks()) {
  9. -    OnAudioTrackAdded(track.get(), local_stream);
  10. +    AddAudioTrack(track.get(), local_stream);
  11.    }
  12.    for (const auto& track : local_stream->GetVideoTracks()) {
  13. -    OnVideoTrackAdded(track.get(), local_stream);
  14. +    AddVideoTrack(track.get(), local_stream);
  15.    }
  16.  
  17.    stats_->AddStream(local_stream);
  18. @@ -562,13 +562,6 @@ bool PeerConnection::AddStream(MediaStreamInterface* local_stream) {
  19.  
  20.  void PeerConnection::RemoveStream(MediaStreamInterface* local_stream) {
  21.    TRACE_EVENT0("webrtc", "PeerConnection::RemoveStream");
  22. -  for (const auto& track : local_stream->GetAudioTracks()) {
  23. -    OnAudioTrackRemoved(track.get(), local_stream);
  24. -  }
  25. -  for (const auto& track : local_stream->GetVideoTracks()) {
  26. -    OnVideoTrackRemoved(track.get(), local_stream);
  27. -  }
  28. -
  29.    local_streams_->RemoveStream(local_stream);
  30.    stream_observers_.erase(
  31.        std::remove_if(
  32. @@ -582,6 +575,12 @@ void PeerConnection::RemoveStream(MediaStreamInterface* local_stream) {
  33.    if (IsClosed()) {
  34.      return;
  35.    }
  36. +  for (const auto& track : local_stream->GetAudioTracks()) {
  37. +    RemoveAudioTrack(track.get(), local_stream);
  38. +  }
  39. +  for (const auto& track : local_stream->GetVideoTracks()) {
  40. +    RemoveVideoTrack(track.get(), local_stream);
  41. +  }
  42.    observer_->OnRenegotiationNeeded();
  43.  }
  44.  
  45. @@ -1465,6 +1464,89 @@ void PeerConnection::DestroyReceiver(const std::string& track_id) {
  46.    }
  47.  }
  48.  
  49. +void PeerConnection::AddAudioTrack(AudioTrackInterface* track,
  50. +                                   MediaStreamInterface* stream) {
  51. +  RTC_DCHECK(!IsClosed());
  52. +  auto sender = FindSenderForTrack(track);
  53. +  if (sender != senders_.end()) {
  54. +    // We already have a sender for this track, so just change the stream_id
  55. +    // so that it's correct in the next call to CreateOffer.
  56. +    (*sender)->internal()->set_stream_id(stream->label());
  57. +    return;
  58. +  }
  59. +
  60. +  // Normal case; we've never seen this track before.
  61. +  rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender =
  62. +      RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
  63. +          signaling_thread(),
  64. +          new AudioRtpSender(track, stream->label(), session_->voice_channel(),
  65. +                             stats_.get()));
  66. +  senders_.push_back(new_sender);
  67. +  // If the sender has already been configured in SDP, we call SetSsrc,
  68. +  // which will connect the sender to the underlying transport. This can
  69. +  // occur if a local session description that contains the ID of the sender
  70. +  // is set before AddStream is called. It can also occur if the local
  71. +  // session description is not changed and RemoveStream is called, and
  72. +  // later AddStream is called again with the same stream.
  73. +  const TrackInfo* track_info =
  74. +      FindTrackInfo(local_audio_tracks_, stream->label(), track->id());
  75. +  if (track_info) {
  76. +    new_sender->internal()->SetSsrc(track_info->ssrc);
  77. +  }
  78. +}
  79. +
  80. +// TODO(deadbeef): Don't destroy RtpSenders here; they should be kept around
  81. +// indefinitely, when we have unified plan SDP.
  82. +void PeerConnection::RemoveAudioTrack(AudioTrackInterface* track,
  83. +                                      MediaStreamInterface* stream) {
  84. +  RTC_DCHECK(!IsClosed());
  85. +  auto sender = FindSenderForTrack(track);
  86. +  if (sender == senders_.end()) {
  87. +    LOG(LS_WARNING) << "RtpSender for track with id " << track->id()
  88. +                    << " doesn't exist.";
  89. +    return;
  90. +  }
  91. +  (*sender)->internal()->Stop();
  92. +  senders_.erase(sender);
  93. +}
  94. +
  95. +void PeerConnection::AddVideoTrack(VideoTrackInterface* track,
  96. +                                   MediaStreamInterface* stream) {
  97. +  RTC_DCHECK(!IsClosed());
  98. +  auto sender = FindSenderForTrack(track);
  99. +  if (sender != senders_.end()) {
  100. +    // We already have a sender for this track, so just change the stream_id
  101. +    // so that it's correct in the next call to CreateOffer.
  102. +    (*sender)->internal()->set_stream_id(stream->label());
  103. +    return;
  104. +  }
  105. +
  106. +  // Normal case; we've never seen this track before.
  107. +  rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender =
  108. +      RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
  109. +          signaling_thread(), new VideoRtpSender(track, stream->label(),
  110. +                                                 session_->video_channel()));
  111. +  senders_.push_back(new_sender);
  112. +  const TrackInfo* track_info =
  113. +      FindTrackInfo(local_video_tracks_, stream->label(), track->id());
  114. +  if (track_info) {
  115. +    new_sender->internal()->SetSsrc(track_info->ssrc);
  116. +  }
  117. +}
  118. +
  119. +void PeerConnection::RemoveVideoTrack(VideoTrackInterface* track,
  120. +                                      MediaStreamInterface* stream) {
  121. +  RTC_DCHECK(!IsClosed());
  122. +  auto sender = FindSenderForTrack(track);
  123. +  if (sender == senders_.end()) {
  124. +    LOG(LS_WARNING) << "RtpSender for track with id " << track->id()
  125. +                    << " doesn't exist.";
  126. +    return;
  127. +  }
  128. +  (*sender)->internal()->Stop();
  129. +  senders_.erase(sender);
  130. +}
  131. +
  132.  void PeerConnection::OnIceConnectionStateChange(
  133.      PeerConnectionInterface::IceConnectionState new_state) {
  134.    RTC_DCHECK(signaling_thread()->IsCurrent());
  135. @@ -1532,50 +1614,16 @@ void PeerConnection::OnAudioTrackAdded(AudioTrackInterface* track,
  136.    if (IsClosed()) {
  137.      return;
  138.    }
  139. -  auto sender = FindSenderForTrack(track);
  140. -  if (sender != senders_.end()) {
  141. -    // We already have a sender for this track, so just change the stream_id
  142. -    // so that it's correct in the next call to CreateOffer.
  143. -    (*sender)->internal()->set_stream_id(stream->label());
  144. -    return;
  145. -  }
  146. -
  147. -  // Normal case; we've never seen this track before.
  148. -  rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender =
  149. -      RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
  150. -          signaling_thread(),
  151. -          new AudioRtpSender(track, stream->label(), session_->voice_channel(),
  152. -                             stats_.get()));
  153. -  senders_.push_back(new_sender);
  154. -  // If the sender has already been configured in SDP, we call SetSsrc,
  155. -  // which will connect the sender to the underlying transport. This can
  156. -  // occur if a local session description that contains the ID of the sender
  157. -  // is set before AddStream is called. It can also occur if the local
  158. -  // session description is not changed and RemoveStream is called, and
  159. -  // later AddStream is called again with the same stream.
  160. -  const TrackInfo* track_info =
  161. -      FindTrackInfo(local_audio_tracks_, stream->label(), track->id());
  162. -  if (track_info) {
  163. -    new_sender->internal()->SetSsrc(track_info->ssrc);
  164. -  }
  165. +  AddAudioTrack(track, stream);
  166.    observer_->OnRenegotiationNeeded();
  167.  }
  168.  
  169. -// TODO(deadbeef): Don't destroy RtpSenders here; they should be kept around
  170. -// indefinitely, when we have unified plan SDP.
  171.  void PeerConnection::OnAudioTrackRemoved(AudioTrackInterface* track,
  172.                                           MediaStreamInterface* stream) {
  173.    if (IsClosed()) {
  174.      return;
  175.    }
  176. -  auto sender = FindSenderForTrack(track);
  177. -  if (sender == senders_.end()) {
  178. -    LOG(LS_WARNING) << "RtpSender for track with id " << track->id()
  179. -                    << " doesn't exist.";
  180. -    return;
  181. -  }
  182. -  (*sender)->internal()->Stop();
  183. -  senders_.erase(sender);
  184. +  RemoveAudioTrack(track, stream);
  185.    observer_->OnRenegotiationNeeded();
  186.  }
  187.  
  188. @@ -1584,25 +1632,7 @@ void PeerConnection::OnVideoTrackAdded(VideoTrackInterface* track,
  189.    if (IsClosed()) {
  190.      return;
  191.    }
  192. -  auto sender = FindSenderForTrack(track);
  193. -  if (sender != senders_.end()) {
  194. -    // We already have a sender for this track, so just change the stream_id
  195. -    // so that it's correct in the next call to CreateOffer.
  196. -    (*sender)->internal()->set_stream_id(stream->label());
  197. -    return;
  198. -  }
  199. -
  200. -  // Normal case; we've never seen this track before.
  201. -  rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender =
  202. -      RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
  203. -          signaling_thread(), new VideoRtpSender(track, stream->label(),
  204. -                                                 session_->video_channel()));
  205. -  senders_.push_back(new_sender);
  206. -  const TrackInfo* track_info =
  207. -      FindTrackInfo(local_video_tracks_, stream->label(), track->id());
  208. -  if (track_info) {
  209. -    new_sender->internal()->SetSsrc(track_info->ssrc);
  210. -  }
  211. +  AddVideoTrack(track, stream);
  212.    observer_->OnRenegotiationNeeded();
  213.  }
  214.  
  215. @@ -1611,14 +1641,7 @@ void PeerConnection::OnVideoTrackRemoved(VideoTrackInterface* track,
  216.    if (IsClosed()) {
  217.      return;
  218.    }
  219. -  auto sender = FindSenderForTrack(track);
  220. -  if (sender == senders_.end()) {
  221. -    LOG(LS_WARNING) << "RtpSender for track with id " << track->id()
  222. -                    << " doesn't exist.";
  223. -    return;
  224. -  }
  225. -  (*sender)->internal()->Stop();
  226. -  senders_.erase(sender);
  227. +  RemoveVideoTrack(track, stream);
  228.    observer_->OnRenegotiationNeeded();
  229.  }
  230.  
  231. diff --git a/webrtc/pc/peerconnection.h b/webrtc/pc/peerconnection.h
  232. index e563d5139..ff2a2f68e 100644
  233. --- a/webrtc/pc/peerconnection.h
  234. +++ b/webrtc/pc/peerconnection.h
  235. @@ -193,11 +193,15 @@ class PeerConnection : public PeerConnectionInterface,
  236.                             const std::string& track_id,
  237.                             uint32_t ssrc);
  238.    void DestroyReceiver(const std::string& track_id);
  239. -  void DestroyAudioSender(MediaStreamInterface* stream,
  240. -                          AudioTrackInterface* audio_track,
  241. -                          uint32_t ssrc);
  242. -  void DestroyVideoSender(MediaStreamInterface* stream,
  243. -                          VideoTrackInterface* video_track);
  244. +
  245. +  // May be called either by AddStream/RemoveStream, or when a track is
  246. +  // added/removed from a stream previously added via AddStream.
  247. +  void AddAudioTrack(AudioTrackInterface* track, MediaStreamInterface* stream);
  248. +  void RemoveAudioTrack(AudioTrackInterface* track,
  249. +                        MediaStreamInterface* stream);
  250. +  void AddVideoTrack(VideoTrackInterface* track, MediaStreamInterface* stream);
  251. +  void RemoveVideoTrack(VideoTrackInterface* track,
  252. +                        MediaStreamInterface* stream);
  253.  
  254.    // Implements IceObserver
  255.    void OnIceConnectionStateChange(IceConnectionState new_state) override;
  256. diff --git a/webrtc/pc/peerconnectioninterface_unittest.cc b/webrtc/pc/peerconnectioninterface_unittest.cc
  257. index f380d3ba4..9dfc8998f 100644
  258. --- a/webrtc/pc/peerconnectioninterface_unittest.cc
  259. +++ b/webrtc/pc/peerconnectioninterface_unittest.cc
  260. @@ -3718,8 +3718,8 @@ TEST_F(PeerConnectionInterfaceTest, MediaStreamAddTrackRemoveTrackRenegotiate) {
  261.    rtc::scoped_refptr<VideoTrackInterface> video_track(
  262.        pc_factory_->CreateVideoTrack(
  263.            "video_track", pc_factory_->CreateVideoSource(
  264. -              std::unique_ptr<cricket::VideoCapturer>(
  265. -                  new cricket::FakeVideoCapturer()))));
  266. +                             std::unique_ptr<cricket::VideoCapturer>(
  267. +                                 new cricket::FakeVideoCapturer()))));
  268.    stream->AddTrack(audio_track);
  269.    EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout);
  270.    observer_.renegotiation_needed_ = false;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement