Index: webrtc/api/webrtcsession.cc |
diff --git a/webrtc/api/webrtcsession.cc b/webrtc/api/webrtcsession.cc |
index c693cb1077ee6e1d072bfd9a1308ad1175b6350e..595b9cef2aad75b5026f8ffcfb18ddb9872a0493 100644 |
--- a/webrtc/api/webrtcsession.cc |
+++ b/webrtc/api/webrtcsession.cc |
@@ -554,6 +554,8 @@ WebRtcSession::WebRtcSession(webrtc::MediaControllerInterface* media_controller, |
this, &WebRtcSession::OnTransportControllerGatheringState); |
transport_controller_->SignalCandidatesGathered.connect( |
this, &WebRtcSession::OnTransportControllerCandidatesGathered); |
+ transport_controller_->SignalCandidatesRemoved.connect( |
+ this, &WebRtcSession::OnTransportControllerCandidatesRemoved); |
} |
WebRtcSession::~WebRtcSession() { |
@@ -1151,7 +1153,7 @@ bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) { |
if (!remote_desc_) { |
LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be added " |
<< "without any remote session description."; |
- return false; |
+ return false; |
} |
if (!candidate) { |
@@ -1179,6 +1181,28 @@ bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) { |
} |
} |
+bool WebRtcSession::RemoveRemoteIceCandidates( |
+ const std::vector<IceCandidateInterfaceRefPtr>& candidates) { |
+ if (!remote_desc_) { |
+ LOG(LS_ERROR) << "RemoveRemoteIceCandidates: ICE candidates can't be " |
+ << "removed without any remote session description."; |
+ return false; |
+ } |
+ |
+ if (candidates.empty()) { |
+ LOG(LS_ERROR) << "RemoveRemoteIceCandidates: Candidates is empty."; |
+ return false; |
+ } |
+ |
+ int number_removed = remote_desc_->RemoveCandidates(candidates); |
+ if (number_removed != candidates.size()) { |
+ LOG(LS_ERROR) << "RemoveRemoteIceCandidates: Failed to remove candidates. " |
+ << "Requested " << candidates.size() << " only " |
+ << number_removed << " are removed."; |
+ } |
+ return CeaseRemoteCandidates(candidates); |
+} |
+ |
bool WebRtcSession::SetIceTransports( |
PeerConnectionInterface::IceTransportsType type) { |
return port_allocator()->set_candidate_filter( |
@@ -1589,6 +1613,33 @@ void WebRtcSession::OnTransportControllerCandidatesGathered( |
} |
} |
+void WebRtcSession::OnTransportControllerCandidatesRemoved( |
+ const std::string& transport_name, |
+ const cricket::Candidates& candidates) { |
+ ASSERT(signaling_thread()->IsCurrent()); |
+ int sdp_mline_index; |
+ if (!GetLocalCandidateMediaIndex(transport_name, &sdp_mline_index)) { |
+ LOG(LS_ERROR) << "OnTransportControllerCandidatesRemoved: content name " |
+ << transport_name << " not found"; |
+ return; |
+ } |
+ |
+ std::vector<IceCandidateInterfaceRefPtr> ice_candidates; |
+ for (const cricket::Candidate& cand : candidates) { |
+ // Use transport_name as the candidate media id. |
+ JsepIceCandidate* candidate = |
+ new JsepIceCandidate(transport_name, sdp_mline_index, cand); |
+ ice_candidates.push_back(candidate); |
+ } |
+ |
+ if (local_desc_) { |
+ local_desc_->RemoveCandidates(ice_candidates); |
+ } |
+ if (ice_observer_) { |
+ ice_observer_->OnIceCandidatesRemoved(ice_candidates); |
+ } |
+} |
+ |
// Enabling voice and video channel. |
void WebRtcSession::EnableChannels() { |
if (voice_channel_ && !voice_channel_->enabled()) |
@@ -1648,24 +1699,26 @@ bool WebRtcSession::UseCandidatesInSessionDescription( |
return ret; |
} |
-bool WebRtcSession::UseCandidate( |
- const IceCandidateInterface* candidate) { |
- |
+const cricket::ContentInfo* WebRtcSession::GetRemoteMediaContent( |
+ const IceCandidateInterface* candidate) const { |
size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index()); |
size_t remote_content_size = remote_desc_->description()->contents().size(); |
if (mediacontent_index >= remote_content_size) { |
- LOG(LS_ERROR) |
- << "UseRemoteCandidateInSession: Invalid candidate media index."; |
- return false; |
+ return nullptr; |
} |
+ return &(remote_desc_->description()->contents()[mediacontent_index]); |
+} |
- cricket::ContentInfo content = |
- remote_desc_->description()->contents()[mediacontent_index]; |
- std::vector<cricket::Candidate> candidates; |
- candidates.push_back(candidate->candidate()); |
+bool WebRtcSession::UseCandidate(const IceCandidateInterface* candidate) { |
+ const cricket::ContentInfo* content = GetRemoteMediaContent(candidate); |
+ if (content == nullptr) { |
+ LOG(LS_ERROR) << "UseCandidate: media content not found"; |
+ return false; |
+ } |
+ std::vector<cricket::Candidate> candidates(1, candidate->candidate()); |
// Invoking BaseSession method to handle remote candidates. |
std::string error; |
- if (transport_controller_->AddRemoteCandidates(content.name, candidates, |
+ if (transport_controller_->AddRemoteCandidates(content->name, candidates, |
&error)) { |
// Candidates successfully submitted for checking. |
if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew || |
@@ -1690,6 +1743,34 @@ bool WebRtcSession::UseCandidate( |
return true; |
} |
+bool WebRtcSession::CeaseRemoteCandidates( |
pthatcher1
2016/03/01 23:51:54
Why is this a separate method from RemoveRemoteCan
honghaiz3
2016/03/02 19:06:40
I tried to make it symmetric to the process of add
pthatcher1
2016/03/02 20:37:58
Then please call it RemoveRemoteCandidatesFromTran
honghaiz3
2016/03/03 01:17:40
Done.
|
+ const std::vector<IceCandidateInterfaceRefPtr>& ice_candidates) { |
+ const cricket::ContentInfo* content = nullptr; |
+ cricket::Candidates candidates; |
+ for (auto ice_candidate : ice_candidates) { |
+ const cricket::ContentInfo* new_content = |
+ GetRemoteMediaContent(ice_candidate); |
+ if (!new_content) { |
+ LOG(LS_ERROR) << "CeaseRemoteCandidates: media content not found"; |
+ return false; |
+ } |
+ if (!content) { |
+ content = new_content; |
+ } else if (content != new_content) { |
+ LOG(LS_ERROR) << "CeaseRemoteCandidates: media content is different"; |
+ return false; |
+ } |
+ candidates.push_back(ice_candidate->candidate()); |
+ } |
+ std::string error; |
+ bool res = transport_controller_->RemoveRemoteCandidates(content->name, |
+ candidates, &error); |
+ if (!res) { |
+ LOG(LS_WARNING) << "Error when Removing remote candidate: " << error; |
+ } |
+ return res; |
+} |
+ |
void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) { |
// Destroy video_channel_ first since it may have a pointer to the |
// voice_channel_. |