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

Side by Side Diff: talk/app/webrtc/webrtcsession.cc

Issue 1648813004: Remove candidates when doing continual gathering (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Created 4 years, 10 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 metrics_observer_(NULL) { 564 metrics_observer_(NULL) {
565 transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLED); 565 transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLED);
566 transport_controller_->SignalConnectionState.connect( 566 transport_controller_->SignalConnectionState.connect(
567 this, &WebRtcSession::OnTransportControllerConnectionState); 567 this, &WebRtcSession::OnTransportControllerConnectionState);
568 transport_controller_->SignalReceiving.connect( 568 transport_controller_->SignalReceiving.connect(
569 this, &WebRtcSession::OnTransportControllerReceiving); 569 this, &WebRtcSession::OnTransportControllerReceiving);
570 transport_controller_->SignalGatheringState.connect( 570 transport_controller_->SignalGatheringState.connect(
571 this, &WebRtcSession::OnTransportControllerGatheringState); 571 this, &WebRtcSession::OnTransportControllerGatheringState);
572 transport_controller_->SignalCandidatesGathered.connect( 572 transport_controller_->SignalCandidatesGathered.connect(
573 this, &WebRtcSession::OnTransportControllerCandidatesGathered); 573 this, &WebRtcSession::OnTransportControllerCandidatesGathered);
574 transport_controller_->SignalCandidatesRemoved.connect(
575 this, &WebRtcSession::OnTransportControllerCandidatesRemoved);
574 } 576 }
575 577
576 WebRtcSession::~WebRtcSession() { 578 WebRtcSession::~WebRtcSession() {
577 ASSERT(signaling_thread()->IsCurrent()); 579 ASSERT(signaling_thread()->IsCurrent());
578 // Destroy video_channel_ first since it may have a pointer to the 580 // Destroy video_channel_ first since it may have a pointer to the
579 // voice_channel_. 581 // voice_channel_.
580 if (video_channel_) { 582 if (video_channel_) {
581 SignalVideoChannelDestroyed(); 583 SignalVideoChannelDestroyed();
582 channel_manager_->DestroyVideoChannel(video_channel_.release()); 584 channel_manager_->DestroyVideoChannel(video_channel_.release());
583 } 585 }
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
1175 !maybe_set_transport(video_channel()) || 1177 !maybe_set_transport(video_channel()) ||
1176 !maybe_set_transport(data_channel())) { 1178 !maybe_set_transport(data_channel())) {
1177 return false; 1179 return false;
1178 } 1180 }
1179 1181
1180 return true; 1182 return true;
1181 } 1183 }
1182 1184
1183 bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) { 1185 bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) {
1184 if (!remote_desc_) { 1186 if (!remote_desc_) {
1185 LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be added " 1187 LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be processed "
1186 << "without any remote session description."; 1188 << "without any remote session description.";
1187 return false; 1189 return false;
1188 } 1190 }
1189 1191
1190 if (!candidate) { 1192 if (!candidate) {
1191 LOG(LS_ERROR) << "ProcessIceMessage: Candidate is NULL."; 1193 LOG(LS_ERROR) << "ProcessIceMessage: Candidate is NULL.";
1192 return false; 1194 return false;
1193 } 1195 }
1194 1196
1197 if (candidate->candidate().priority() == 0) {
Taylor Brandstetter 2016/02/10 21:58:08 Using a priority of 0 doesn't seem like an ideal l
pthatcher1 2016/02/11 20:25:51 I agree.
1198 if (!remote_desc_->RemoveCandidate(candidate)) {
1199 LOG(LS_ERROR) << "ProcessIceMessage: Candidate not found";
1200 }
1201 return RemoveRemoteCandidate(candidate);
1202 }
1203
1195 bool valid = false; 1204 bool valid = false;
1196 bool ready = ReadyToUseRemoteCandidate(candidate, NULL, &valid); 1205 bool ready = ReadyToUseRemoteCandidate(candidate, NULL, &valid);
1197 if (!valid) { 1206 if (!valid) {
1198 return false; 1207 return false;
1199 } 1208 }
1200 1209
1201 // Add this candidate to the remote session description. 1210 // Add this candidate to the remote session description.
1202 if (!remote_desc_->AddCandidate(candidate)) { 1211 if (!remote_desc_->AddCandidate(candidate)) {
1203 LOG(LS_ERROR) << "ProcessIceMessage: Candidate cannot be used."; 1212 LOG(LS_ERROR) << "ProcessIceMessage: Candidate cannot be used.";
1204 return false; 1213 return false;
1205 } 1214 }
1206 1215
1207 if (ready) { 1216 if (ready) {
1208 return UseCandidate(candidate); 1217 return AddRemoteCandidate(candidate);
1209 } else { 1218 } else {
1210 LOG(LS_INFO) << "ProcessIceMessage: Not ready to use candidate."; 1219 LOG(LS_INFO) << "ProcessIceMessage: Not ready to use candidate.";
1211 return true; 1220 return true;
1212 } 1221 }
1213 } 1222 }
1214 1223
1215 bool WebRtcSession::SetIceTransports( 1224 bool WebRtcSession::SetIceTransports(
1216 PeerConnectionInterface::IceTransportsType type) { 1225 PeerConnectionInterface::IceTransportsType type) {
1217 return port_allocator()->set_candidate_filter( 1226 return port_allocator()->set_candidate_filter(
1218 ConvertIceTransportTypeToCandidateFilter(type)); 1227 ConvertIceTransportTypeToCandidateFilter(type));
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1614 JsepIceCandidate candidate(transport_name, sdp_mline_index, *citer); 1623 JsepIceCandidate candidate(transport_name, sdp_mline_index, *citer);
1615 if (ice_observer_) { 1624 if (ice_observer_) {
1616 ice_observer_->OnIceCandidate(&candidate); 1625 ice_observer_->OnIceCandidate(&candidate);
1617 } 1626 }
1618 if (local_desc_) { 1627 if (local_desc_) {
1619 local_desc_->AddCandidate(&candidate); 1628 local_desc_->AddCandidate(&candidate);
1620 } 1629 }
1621 } 1630 }
1622 } 1631 }
1623 1632
1633 void WebRtcSession::OnTransportControllerCandidatesRemoved(
1634 const std::string& transport_name,
1635 const cricket::Candidates& candidates) {
1636 ASSERT(signaling_thread()->IsCurrent());
1637 int sdp_mline_index;
1638 if (!GetLocalCandidateMediaIndex(transport_name, &sdp_mline_index)) {
1639 LOG(LS_ERROR) << "OnTransportControllerCandidatesRemoved: content name "
1640 << transport_name << " not found";
1641 return;
1642 }
1643
1644 for (const cricket::Candidate& cand : candidates) {
1645 ASSERT(cand.priority() == 0);
1646 // Use transport_name as the candidate media id.
1647 JsepIceCandidate candidate(transport_name, sdp_mline_index, cand);
1648 // It will be nicer if we can signal multiple candidates in one message.
1649 if (ice_observer_) {
1650 ice_observer_->OnIceCandidate(&candidate);
1651 }
1652 if (local_desc_) {
1653 local_desc_->RemoveCandidate(&candidate);
1654 }
1655 }
1656 }
1657
1624 // Enabling voice and video channel. 1658 // Enabling voice and video channel.
1625 void WebRtcSession::EnableChannels() { 1659 void WebRtcSession::EnableChannels() {
1626 if (voice_channel_ && !voice_channel_->enabled()) 1660 if (voice_channel_ && !voice_channel_->enabled())
1627 voice_channel_->Enable(true); 1661 voice_channel_->Enable(true);
1628 1662
1629 if (video_channel_ && !video_channel_->enabled()) 1663 if (video_channel_ && !video_channel_->enabled())
1630 video_channel_->Enable(true); 1664 video_channel_->Enable(true);
1631 1665
1632 if (data_channel_ && !data_channel_->enabled()) 1666 if (data_channel_ && !data_channel_->enabled())
1633 data_channel_->Enable(true); 1667 data_channel_->Enable(true);
(...skipping 30 matching lines...) Expand all
1664 for (size_t n = 0; n < candidates->count(); ++n) { 1698 for (size_t n = 0; n < candidates->count(); ++n) {
1665 const IceCandidateInterface* candidate = candidates->at(n); 1699 const IceCandidateInterface* candidate = candidates->at(n);
1666 bool valid = false; 1700 bool valid = false;
1667 if (!ReadyToUseRemoteCandidate(candidate, remote_desc, &valid)) { 1701 if (!ReadyToUseRemoteCandidate(candidate, remote_desc, &valid)) {
1668 if (valid) { 1702 if (valid) {
1669 LOG(LS_INFO) << "UseCandidatesInSessionDescription: Not ready to use " 1703 LOG(LS_INFO) << "UseCandidatesInSessionDescription: Not ready to use "
1670 << "candidate."; 1704 << "candidate.";
1671 } 1705 }
1672 continue; 1706 continue;
1673 } 1707 }
1674 ret = UseCandidate(candidate); 1708 ret = AddRemoteCandidate(candidate);
1675 if (!ret) { 1709 if (!ret) {
1676 break; 1710 break;
1677 } 1711 }
1678 } 1712 }
1679 } 1713 }
1680 return ret; 1714 return ret;
1681 } 1715 }
1682 1716
1683 bool WebRtcSession::UseCandidate( 1717 const cricket::ContentInfo* WebRtcSession::GetRemoteMediaContent(
Taylor Brandstetter 2016/02/10 21:58:08 As long as you're making this a standalone method,
honghaiz3 2016/02/12 00:56:55 How do you know if sdp_mline_index is set or not?
Taylor Brandstetter 2016/02/12 02:30:38 Extremely unfortunately, the default value appears
1684 const IceCandidateInterface* candidate) { 1718 const IceCandidateInterface* candidate) const {
1685
1686 size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index()); 1719 size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index());
1687 size_t remote_content_size = remote_desc_->description()->contents().size(); 1720 size_t remote_content_size = remote_desc_->description()->contents().size();
1688 if (mediacontent_index >= remote_content_size) { 1721 if (mediacontent_index >= remote_content_size) {
1689 LOG(LS_ERROR) 1722 return nullptr;
1690 << "UseRemoteCandidateInSession: Invalid candidate media index."; 1723 }
1724 return &(remote_desc_->description()->contents()[mediacontent_index]);
1725 }
1726
1727 bool WebRtcSession::AddRemoteCandidate(const IceCandidateInterface* candidate) {
1728 const cricket::ContentInfo* content = GetRemoteMediaContent(candidate);
1729 if (content == nullptr) {
1730 LOG(LS_ERROR) << "AddRemoteCandidate: media content not found";
1691 return false; 1731 return false;
1692 } 1732 }
1693 1733 std::vector<cricket::Candidate> candidates(1, candidate->candidate());
1694 cricket::ContentInfo content =
1695 remote_desc_->description()->contents()[mediacontent_index];
1696 std::vector<cricket::Candidate> candidates;
1697 candidates.push_back(candidate->candidate());
1698 // Invoking BaseSession method to handle remote candidates. 1734 // Invoking BaseSession method to handle remote candidates.
1699 std::string error; 1735 std::string error;
1700 if (transport_controller_->AddRemoteCandidates(content.name, candidates, 1736 if (transport_controller_->AddRemoteCandidates(content->name, candidates,
1701 &error)) { 1737 &error)) {
1702 // Candidates successfully submitted for checking. 1738 // Candidates successfully submitted for checking.
1703 if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew || 1739 if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew ||
1704 ice_connection_state_ == 1740 ice_connection_state_ ==
1705 PeerConnectionInterface::kIceConnectionDisconnected) { 1741 PeerConnectionInterface::kIceConnectionDisconnected) {
1706 // If state is New, then the session has just gotten its first remote ICE 1742 // If state is New, then the session has just gotten its first remote ICE
1707 // candidates, so go to Checking. 1743 // candidates, so go to Checking.
1708 // If state is Disconnected, the session is re-using old candidates or 1744 // If state is Disconnected, the session is re-using old candidates or
1709 // receiving additional ones, so go to Checking. 1745 // receiving additional ones, so go to Checking.
1710 // If state is Connected, stay Connected. 1746 // If state is Connected, stay Connected.
1711 // TODO(bemasc): If state is Connected, and the new candidates are for a 1747 // TODO(bemasc): If state is Connected, and the new candidates are for a
1712 // newly added transport, then the state actually _should_ move to 1748 // newly added transport, then the state actually _should_ move to
1713 // checking. Add a way to distinguish that case. 1749 // checking. Add a way to distinguish that case.
1714 SetIceConnectionState(PeerConnectionInterface::kIceConnectionChecking); 1750 SetIceConnectionState(PeerConnectionInterface::kIceConnectionChecking);
1715 } 1751 }
1716 // TODO(bemasc): If state is Completed, go back to Connected. 1752 // TODO(bemasc): If state is Completed, go back to Connected.
1717 } else { 1753 } else {
1718 if (!error.empty()) { 1754 if (!error.empty()) {
1719 LOG(LS_WARNING) << error; 1755 LOG(LS_WARNING) << error;
1720 } 1756 }
1721 } 1757 }
1722 return true; 1758 return true;
1723 } 1759 }
1724 1760
1761 bool WebRtcSession::RemoveRemoteCandidate(
1762 const IceCandidateInterface* candidate) {
1763 const cricket::ContentInfo* content = GetRemoteMediaContent(candidate);
1764 if (!content) {
1765 LOG(LS_ERROR) << "RemoveRemoteCandidate: media content not found";
1766 return false;
1767 }
1768 cricket::Candidates candidates(1, candidate->candidate());
1769 std::string error;
1770 bool res = transport_controller_->RemoveRemoteCandidates(content->name,
1771 candidates, &error);
1772 if (!res) {
1773 LOG(LS_WARNING) << "Error when Removing remote candidate: " << error;
1774 }
1775 return res;
1776 }
1777
1725 void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) { 1778 void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) {
1726 // Destroy video_channel_ first since it may have a pointer to the 1779 // Destroy video_channel_ first since it may have a pointer to the
1727 // voice_channel_. 1780 // voice_channel_.
1728 const cricket::ContentInfo* video_info = 1781 const cricket::ContentInfo* video_info =
1729 cricket::GetFirstVideoContent(desc); 1782 cricket::GetFirstVideoContent(desc);
1730 if ((!video_info || video_info->rejected) && video_channel_) { 1783 if ((!video_info || video_info->rejected) && video_channel_) {
1731 SignalVideoChannelDestroyed(); 1784 SignalVideoChannelDestroyed();
1732 channel_manager_->DestroyVideoChannel(video_channel_.release()); 1785 channel_manager_->DestroyVideoChannel(video_channel_.release());
1733 } 1786 }
1734 1787
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
2176 } 2229 }
2177 } 2230 }
2178 2231
2179 void WebRtcSession::OnSentPacket_w(cricket::TransportChannel* channel, 2232 void WebRtcSession::OnSentPacket_w(cricket::TransportChannel* channel,
2180 const rtc::SentPacket& sent_packet) { 2233 const rtc::SentPacket& sent_packet) {
2181 RTC_DCHECK(worker_thread()->IsCurrent()); 2234 RTC_DCHECK(worker_thread()->IsCurrent());
2182 media_controller_->call_w()->OnSentPacket(sent_packet); 2235 media_controller_->call_w()->OnSentPacket(sent_packet);
2183 } 2236 }
2184 2237
2185 } // namespace webrtc 2238 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698