OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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) { | |
pthatcher1
2016/02/10 00:01:41
I'll need to think about this more to think if thi
honghaiz3
2016/02/10 19:22:43
Looking at the code, I think there are two possibl
pthatcher1
2016/02/11 20:25:51
I think having removals come out of the "added" ev
| |
1198 if (!remote_desc_->RemoveCandidate(candidate)) { | |
1199 LOG(LS_ERROR) << "ProcessIceMessage: Candidate not found"; | |
1200 } | |
1201 return StopUsingCandidate(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; |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 // Use transport_name as the candidate media id. | |
1646 JsepIceCandidate candidate(transport_name, sdp_mline_index, cand); | |
1647 // It will be nicer if we can signal multiple candidates in one message. | |
1648 if (ice_observer_) { | |
1649 ice_observer_->OnIceCandidate(&candidate); | |
pthatcher1
2016/02/10 00:01:40
I think having an event of OnIceCandidateRemoved m
honghaiz3
2016/02/10 19:22:43
See my reply above.
| |
1650 } | |
1651 if (local_desc_) { | |
1652 local_desc_->RemoveCandidate(&candidate); | |
1653 } | |
1654 } | |
1655 } | |
1656 | |
1624 // Enabling voice and video channel. | 1657 // Enabling voice and video channel. |
1625 void WebRtcSession::EnableChannels() { | 1658 void WebRtcSession::EnableChannels() { |
1626 if (voice_channel_ && !voice_channel_->enabled()) | 1659 if (voice_channel_ && !voice_channel_->enabled()) |
1627 voice_channel_->Enable(true); | 1660 voice_channel_->Enable(true); |
1628 | 1661 |
1629 if (video_channel_ && !video_channel_->enabled()) | 1662 if (video_channel_ && !video_channel_->enabled()) |
1630 video_channel_->Enable(true); | 1663 video_channel_->Enable(true); |
1631 | 1664 |
1632 if (data_channel_ && !data_channel_->enabled()) | 1665 if (data_channel_ && !data_channel_->enabled()) |
1633 data_channel_->Enable(true); | 1666 data_channel_->Enable(true); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1673 } | 1706 } |
1674 ret = UseCandidate(candidate); | 1707 ret = UseCandidate(candidate); |
1675 if (!ret) { | 1708 if (!ret) { |
1676 break; | 1709 break; |
1677 } | 1710 } |
1678 } | 1711 } |
1679 } | 1712 } |
1680 return ret; | 1713 return ret; |
1681 } | 1714 } |
1682 | 1715 |
1683 bool WebRtcSession::UseCandidate( | 1716 const cricket::ContentInfo* WebRtcSession::GetRemoteMediaContent( |
1684 const IceCandidateInterface* candidate) { | 1717 const IceCandidateInterface* candidate) const { |
1685 | |
1686 size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index()); | 1718 size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index()); |
1687 size_t remote_content_size = remote_desc_->description()->contents().size(); | 1719 size_t remote_content_size = remote_desc_->description()->contents().size(); |
1688 if (mediacontent_index >= remote_content_size) { | 1720 if (mediacontent_index >= remote_content_size) { |
1689 LOG(LS_ERROR) | 1721 return nullptr; |
1690 << "UseRemoteCandidateInSession: Invalid candidate media index."; | 1722 } |
1723 return &(remote_desc_->description()->contents()[mediacontent_index]); | |
1724 } | |
1725 | |
1726 bool WebRtcSession::UseCandidate(const IceCandidateInterface* candidate) { | |
1727 const cricket::ContentInfo* content = GetRemoteMediaContent(candidate); | |
1728 if (content == nullptr) { | |
1729 LOG(LS_ERROR) << "UseCandidate: media content not found"; | |
1691 return false; | 1730 return false; |
1692 } | 1731 } |
1693 | 1732 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. | 1733 // Invoking BaseSession method to handle remote candidates. |
1699 std::string error; | 1734 std::string error; |
1700 if (transport_controller_->AddRemoteCandidates(content.name, candidates, | 1735 if (transport_controller_->AddRemoteCandidates(content->name, candidates, |
1701 &error)) { | 1736 &error)) { |
1702 // Candidates successfully submitted for checking. | 1737 // Candidates successfully submitted for checking. |
1703 if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew || | 1738 if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew || |
1704 ice_connection_state_ == | 1739 ice_connection_state_ == |
1705 PeerConnectionInterface::kIceConnectionDisconnected) { | 1740 PeerConnectionInterface::kIceConnectionDisconnected) { |
1706 // If state is New, then the session has just gotten its first remote ICE | 1741 // If state is New, then the session has just gotten its first remote ICE |
1707 // candidates, so go to Checking. | 1742 // candidates, so go to Checking. |
1708 // If state is Disconnected, the session is re-using old candidates or | 1743 // If state is Disconnected, the session is re-using old candidates or |
1709 // receiving additional ones, so go to Checking. | 1744 // receiving additional ones, so go to Checking. |
1710 // If state is Connected, stay Connected. | 1745 // If state is Connected, stay Connected. |
1711 // TODO(bemasc): If state is Connected, and the new candidates are for a | 1746 // TODO(bemasc): If state is Connected, and the new candidates are for a |
1712 // newly added transport, then the state actually _should_ move to | 1747 // newly added transport, then the state actually _should_ move to |
1713 // checking. Add a way to distinguish that case. | 1748 // checking. Add a way to distinguish that case. |
1714 SetIceConnectionState(PeerConnectionInterface::kIceConnectionChecking); | 1749 SetIceConnectionState(PeerConnectionInterface::kIceConnectionChecking); |
1715 } | 1750 } |
1716 // TODO(bemasc): If state is Completed, go back to Connected. | 1751 // TODO(bemasc): If state is Completed, go back to Connected. |
1717 } else { | 1752 } else { |
1718 if (!error.empty()) { | 1753 if (!error.empty()) { |
1719 LOG(LS_WARNING) << error; | 1754 LOG(LS_WARNING) << error; |
1720 } | 1755 } |
1721 } | 1756 } |
1722 return true; | 1757 return true; |
1723 } | 1758 } |
1724 | 1759 |
1760 bool WebRtcSession::StopUsingCandidate(const IceCandidateInterface* candidate) { | |
1761 const cricket::ContentInfo* content = GetRemoteMediaContent(candidate); | |
1762 if (!content) { | |
1763 LOG(LS_ERROR) << "StopUsingCandidate: media content not found"; | |
1764 return false; | |
1765 } | |
1766 cricket::Candidates candidates(1, candidate->candidate()); | |
1767 std::string error; | |
1768 bool res = transport_controller_->RemoveRemoteCandidates(content->name, | |
1769 candidates, &error); | |
1770 if (!res) { | |
1771 LOG(LS_WARNING) << "Error when Removing remote candidate: " << error; | |
1772 } | |
1773 return res; | |
1774 } | |
1775 | |
1725 void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) { | 1776 void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) { |
1726 // Destroy video_channel_ first since it may have a pointer to the | 1777 // Destroy video_channel_ first since it may have a pointer to the |
1727 // voice_channel_. | 1778 // voice_channel_. |
1728 const cricket::ContentInfo* video_info = | 1779 const cricket::ContentInfo* video_info = |
1729 cricket::GetFirstVideoContent(desc); | 1780 cricket::GetFirstVideoContent(desc); |
1730 if ((!video_info || video_info->rejected) && video_channel_) { | 1781 if ((!video_info || video_info->rejected) && video_channel_) { |
1731 SignalVideoChannelDestroyed(); | 1782 SignalVideoChannelDestroyed(); |
1732 channel_manager_->DestroyVideoChannel(video_channel_.release()); | 1783 channel_manager_->DestroyVideoChannel(video_channel_.release()); |
1733 } | 1784 } |
1734 | 1785 |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2176 } | 2227 } |
2177 } | 2228 } |
2178 | 2229 |
2179 void WebRtcSession::OnSentPacket_w(cricket::TransportChannel* channel, | 2230 void WebRtcSession::OnSentPacket_w(cricket::TransportChannel* channel, |
2180 const rtc::SentPacket& sent_packet) { | 2231 const rtc::SentPacket& sent_packet) { |
2181 RTC_DCHECK(worker_thread()->IsCurrent()); | 2232 RTC_DCHECK(worker_thread()->IsCurrent()); |
2182 media_controller_->call_w()->OnSentPacket(sent_packet); | 2233 media_controller_->call_w()->OnSentPacket(sent_packet); |
2183 } | 2234 } |
2184 | 2235 |
2185 } // namespace webrtc | 2236 } // namespace webrtc |
OLD | NEW |