OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 } | 616 } |
617 return nullptr; | 617 return nullptr; |
618 } | 618 } |
619 | 619 |
620 cricket::SecurePolicy WebRtcSession::SdesPolicy() const { | 620 cricket::SecurePolicy WebRtcSession::SdesPolicy() const { |
621 return webrtc_session_desc_factory_->SdesPolicy(); | 621 return webrtc_session_desc_factory_->SdesPolicy(); |
622 } | 622 } |
623 | 623 |
624 bool WebRtcSession::GetSslRole(const std::string& transport_name, | 624 bool WebRtcSession::GetSslRole(const std::string& transport_name, |
625 rtc::SSLRole* role) { | 625 rtc::SSLRole* role) { |
626 if (!local_desc_ || !remote_desc_) { | 626 if (!local_description() || !remote_description()) { |
627 LOG(LS_INFO) << "Local and Remote descriptions must be applied to get " | 627 LOG(LS_INFO) << "Local and Remote descriptions must be applied to get " |
628 << "SSL Role of the session."; | 628 << "SSL Role of the session."; |
629 return false; | 629 return false; |
630 } | 630 } |
631 | 631 |
632 return transport_controller_->GetSslRole(transport_name, role); | 632 return transport_controller_->GetSslRole(transport_name, role); |
633 } | 633 } |
634 | 634 |
635 bool WebRtcSession::GetSslRole(const cricket::BaseChannel* channel, | 635 bool WebRtcSession::GetSslRole(const cricket::BaseChannel* channel, |
636 rtc::SSLRole* role) { | 636 rtc::SSLRole* role) { |
(...skipping 25 matching lines...) Expand all Loading... |
662 return false; | 662 return false; |
663 } | 663 } |
664 | 664 |
665 // Update the initial_offerer flag if this session is the initial_offerer. | 665 // Update the initial_offerer flag if this session is the initial_offerer. |
666 Action action = GetAction(desc->type()); | 666 Action action = GetAction(desc->type()); |
667 if (state() == STATE_INIT && action == kOffer) { | 667 if (state() == STATE_INIT && action == kOffer) { |
668 initial_offerer_ = true; | 668 initial_offerer_ = true; |
669 transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLING); | 669 transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLING); |
670 } | 670 } |
671 | 671 |
672 local_desc_.reset(desc_temp.release()); | 672 if (action == kAnswer) { |
| 673 current_local_description_.reset(desc_temp.release()); |
| 674 pending_local_description_.reset(nullptr); |
| 675 current_remote_description_.reset(pending_remote_description_.release()); |
| 676 } else { |
| 677 pending_local_description_.reset(desc_temp.release()); |
| 678 } |
673 | 679 |
674 // Transport and Media channels will be created only when offer is set. | 680 // Transport and Media channels will be created only when offer is set. |
675 if (action == kOffer && !CreateChannels(local_desc_->description())) { | 681 if (action == kOffer && !CreateChannels(local_description()->description())) { |
676 // TODO(mallinath) - Handle CreateChannel failure, as new local description | 682 // TODO(mallinath) - Handle CreateChannel failure, as new local description |
677 // is applied. Restore back to old description. | 683 // is applied. Restore back to old description. |
678 return BadLocalSdp(desc->type(), kCreateChannelFailed, err_desc); | 684 return BadLocalSdp(desc->type(), kCreateChannelFailed, err_desc); |
679 } | 685 } |
680 | 686 |
681 // Remove unused channels if MediaContentDescription is rejected. | 687 // Remove unused channels if MediaContentDescription is rejected. |
682 RemoveUnusedChannels(local_desc_->description()); | 688 RemoveUnusedChannels(local_description()->description()); |
683 | 689 |
684 if (!UpdateSessionState(action, cricket::CS_LOCAL, err_desc)) { | 690 if (!UpdateSessionState(action, cricket::CS_LOCAL, err_desc)) { |
685 return false; | 691 return false; |
686 } | 692 } |
687 | 693 |
688 if (remote_desc_) { | 694 if (remote_description()) { |
689 // Now that we have a local description, we can push down remote candidates. | 695 // Now that we have a local description, we can push down remote candidates. |
690 UseCandidatesInSessionDescription(remote_desc_.get()); | 696 UseCandidatesInSessionDescription(remote_description()); |
691 } | 697 } |
692 | 698 |
693 pending_ice_restarts_.clear(); | 699 pending_ice_restarts_.clear(); |
694 | 700 |
695 if (error() != ERROR_NONE) { | 701 if (error() != ERROR_NONE) { |
696 return BadLocalSdp(desc->type(), GetSessionErrorMsg(), err_desc); | 702 return BadLocalSdp(desc->type(), GetSessionErrorMsg(), err_desc); |
697 } | 703 } |
698 return true; | 704 return true; |
699 } | 705 } |
700 | 706 |
701 bool WebRtcSession::SetRemoteDescription(SessionDescriptionInterface* desc, | 707 bool WebRtcSession::SetRemoteDescription(SessionDescriptionInterface* desc, |
702 std::string* err_desc) { | 708 std::string* err_desc) { |
703 ASSERT(signaling_thread()->IsCurrent()); | 709 ASSERT(signaling_thread()->IsCurrent()); |
704 | 710 |
705 // Takes the ownership of |desc| regardless of the result. | 711 // Takes the ownership of |desc| regardless of the result. |
706 std::unique_ptr<SessionDescriptionInterface> desc_temp(desc); | 712 std::unique_ptr<SessionDescriptionInterface> desc_temp(desc); |
707 | 713 |
708 // Validate SDP. | 714 // Validate SDP. |
709 if (!ValidateSessionDescription(desc, cricket::CS_REMOTE, err_desc)) { | 715 if (!ValidateSessionDescription(desc, cricket::CS_REMOTE, err_desc)) { |
710 return false; | 716 return false; |
711 } | 717 } |
712 | 718 |
713 std::unique_ptr<SessionDescriptionInterface> old_remote_desc( | 719 const SessionDescriptionInterface* old_remote_description = |
714 remote_desc_.release()); | 720 remote_description(); |
715 remote_desc_.reset(desc_temp.release()); | 721 // Grab ownership of the description being replaced for the remainder of this |
| 722 // method, since it's used below. |
| 723 std::unique_ptr<SessionDescriptionInterface> replaced_remote_description; |
| 724 Action action = GetAction(desc->type()); |
| 725 if (action == kAnswer) { |
| 726 replaced_remote_description.reset( |
| 727 pending_remote_description_ ? pending_remote_description_.release() |
| 728 : current_remote_description_.release()); |
| 729 current_remote_description_.reset(desc_temp.release()); |
| 730 pending_remote_description_.reset(nullptr); |
| 731 current_local_description_.reset(pending_local_description_.release()); |
| 732 } else { |
| 733 replaced_remote_description.reset(pending_remote_description_.release()); |
| 734 pending_remote_description_.reset(desc_temp.release()); |
| 735 } |
716 | 736 |
717 // Transport and Media channels will be created only when offer is set. | 737 // Transport and Media channels will be created only when offer is set. |
718 Action action = GetAction(desc->type()); | |
719 if (action == kOffer && !CreateChannels(desc->description())) { | 738 if (action == kOffer && !CreateChannels(desc->description())) { |
720 // TODO(mallinath) - Handle CreateChannel failure, as new local description | 739 // TODO(mallinath) - Handle CreateChannel failure, as new local description |
721 // is applied. Restore back to old description. | 740 // is applied. Restore back to old description. |
722 return BadRemoteSdp(desc->type(), kCreateChannelFailed, err_desc); | 741 return BadRemoteSdp(desc->type(), kCreateChannelFailed, err_desc); |
723 } | 742 } |
724 | 743 |
725 // Remove unused channels if MediaContentDescription is rejected. | 744 // Remove unused channels if MediaContentDescription is rejected. |
726 RemoveUnusedChannels(desc->description()); | 745 RemoveUnusedChannels(desc->description()); |
727 | 746 |
728 // NOTE: Candidates allocation will be initiated only when SetLocalDescription | 747 // NOTE: Candidates allocation will be initiated only when SetLocalDescription |
729 // is called. | 748 // is called. |
730 if (!UpdateSessionState(action, cricket::CS_REMOTE, err_desc)) { | 749 if (!UpdateSessionState(action, cricket::CS_REMOTE, err_desc)) { |
731 return false; | 750 return false; |
732 } | 751 } |
733 | 752 |
734 if (local_desc_ && !UseCandidatesInSessionDescription(desc)) { | 753 if (local_description() && !UseCandidatesInSessionDescription(desc)) { |
735 return BadRemoteSdp(desc->type(), kInvalidCandidates, err_desc); | 754 return BadRemoteSdp(desc->type(), kInvalidCandidates, err_desc); |
736 } | 755 } |
737 | 756 |
738 if (old_remote_desc) { | 757 if (old_remote_description) { |
739 for (const cricket::ContentInfo& content : | 758 for (const cricket::ContentInfo& content : |
740 old_remote_desc->description()->contents()) { | 759 old_remote_description->description()->contents()) { |
741 // Check if this new SessionDescription contains new ICE ufrag and | 760 // Check if this new SessionDescription contains new ICE ufrag and |
742 // password that indicates the remote peer requests an ICE restart. | 761 // password that indicates the remote peer requests an ICE restart. |
743 // TODO(deadbeef): When we start storing both the current and pending | 762 // TODO(deadbeef): When we start storing both the current and pending |
744 // remote description, this should reset pending_ice_restarts and compare | 763 // remote description, this should reset pending_ice_restarts and compare |
745 // against the current description. | 764 // against the current description. |
746 if (CheckForRemoteIceRestart(old_remote_desc.get(), desc, content.name)) { | 765 if (CheckForRemoteIceRestart(old_remote_description, desc, |
| 766 content.name)) { |
747 if (action == kOffer) { | 767 if (action == kOffer) { |
748 pending_ice_restarts_.insert(content.name); | 768 pending_ice_restarts_.insert(content.name); |
749 } | 769 } |
750 } else { | 770 } else { |
751 // We retain all received candidates only if ICE is not restarted. | 771 // We retain all received candidates only if ICE is not restarted. |
752 // When ICE is restarted, all previous candidates belong to an old | 772 // When ICE is restarted, all previous candidates belong to an old |
753 // generation and should not be kept. | 773 // generation and should not be kept. |
754 // TODO(deadbeef): This goes against the W3C spec which says the remote | 774 // TODO(deadbeef): This goes against the W3C spec which says the remote |
755 // description should only contain candidates from the last set remote | 775 // description should only contain candidates from the last set remote |
756 // description plus any candidates added since then. We should remove | 776 // description plus any candidates added since then. We should remove |
757 // this once we're sure it won't break anything. | 777 // this once we're sure it won't break anything. |
758 WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription( | 778 WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription( |
759 old_remote_desc.get(), content.name, desc); | 779 old_remote_description, content.name, desc); |
760 } | 780 } |
761 } | 781 } |
762 } | 782 } |
763 | 783 |
764 if (error() != ERROR_NONE) { | 784 if (error() != ERROR_NONE) { |
765 return BadRemoteSdp(desc->type(), GetSessionErrorMsg(), err_desc); | 785 return BadRemoteSdp(desc->type(), GetSessionErrorMsg(), err_desc); |
766 } | 786 } |
767 | 787 |
768 // Set the the ICE connection state to connecting since the connection may | 788 // Set the the ICE connection state to connecting since the connection may |
769 // become writable with peer reflexive candidates before any remote candidate | 789 // become writable with peer reflexive candidates before any remote candidate |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 SetState(source == cricket::CS_LOCAL ? STATE_SENTPRANSWER | 852 SetState(source == cricket::CS_LOCAL ? STATE_SENTPRANSWER |
833 : STATE_RECEIVEDPRANSWER); | 853 : STATE_RECEIVEDPRANSWER); |
834 if (!PushdownMediaDescription(cricket::CA_PRANSWER, source, err_desc)) { | 854 if (!PushdownMediaDescription(cricket::CA_PRANSWER, source, err_desc)) { |
835 SetError(ERROR_CONTENT, *err_desc); | 855 SetError(ERROR_CONTENT, *err_desc); |
836 } | 856 } |
837 if (error() != ERROR_NONE) { | 857 if (error() != ERROR_NONE) { |
838 return BadPranswerSdp(source, GetSessionErrorMsg(), err_desc); | 858 return BadPranswerSdp(source, GetSessionErrorMsg(), err_desc); |
839 } | 859 } |
840 } else if (action == kAnswer) { | 860 } else if (action == kAnswer) { |
841 const cricket::ContentGroup* local_bundle = | 861 const cricket::ContentGroup* local_bundle = |
842 local_desc_->description()->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); | 862 local_description()->description()->GetGroupByName( |
| 863 cricket::GROUP_TYPE_BUNDLE); |
843 const cricket::ContentGroup* remote_bundle = | 864 const cricket::ContentGroup* remote_bundle = |
844 remote_desc_->description()->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); | 865 remote_description()->description()->GetGroupByName( |
| 866 cricket::GROUP_TYPE_BUNDLE); |
845 if (local_bundle && remote_bundle) { | 867 if (local_bundle && remote_bundle) { |
846 // The answerer decides the transport to bundle on. | 868 // The answerer decides the transport to bundle on. |
847 const cricket::ContentGroup* answer_bundle = | 869 const cricket::ContentGroup* answer_bundle = |
848 (source == cricket::CS_LOCAL ? local_bundle : remote_bundle); | 870 (source == cricket::CS_LOCAL ? local_bundle : remote_bundle); |
849 if (!EnableBundle(*answer_bundle)) { | 871 if (!EnableBundle(*answer_bundle)) { |
850 LOG(LS_WARNING) << "Failed to enable BUNDLE."; | 872 LOG(LS_WARNING) << "Failed to enable BUNDLE."; |
851 return BadAnswerSdp(source, kEnableBundleFailed, err_desc); | 873 return BadAnswerSdp(source, kEnableBundleFailed, err_desc); |
852 } | 874 } |
853 } | 875 } |
854 // Only push down the transport description after enabling BUNDLE; we don't | 876 // Only push down the transport description after enabling BUNDLE; we don't |
(...skipping 26 matching lines...) Expand all Loading... |
881 } | 903 } |
882 | 904 |
883 bool WebRtcSession::PushdownMediaDescription( | 905 bool WebRtcSession::PushdownMediaDescription( |
884 cricket::ContentAction action, | 906 cricket::ContentAction action, |
885 cricket::ContentSource source, | 907 cricket::ContentSource source, |
886 std::string* err) { | 908 std::string* err) { |
887 auto set_content = [this, action, source, err](cricket::BaseChannel* ch) { | 909 auto set_content = [this, action, source, err](cricket::BaseChannel* ch) { |
888 if (!ch) { | 910 if (!ch) { |
889 return true; | 911 return true; |
890 } else if (source == cricket::CS_LOCAL) { | 912 } else if (source == cricket::CS_LOCAL) { |
891 return ch->PushdownLocalDescription(local_desc_->description(), action, | 913 return ch->PushdownLocalDescription(local_description()->description(), |
892 err); | 914 action, err); |
893 } else { | 915 } else { |
894 return ch->PushdownRemoteDescription(remote_desc_->description(), action, | 916 return ch->PushdownRemoteDescription(remote_description()->description(), |
895 err); | 917 action, err); |
896 } | 918 } |
897 }; | 919 }; |
898 | 920 |
899 return (set_content(voice_channel()) && | 921 return (set_content(voice_channel()) && |
900 set_content(video_channel()) && | 922 set_content(video_channel()) && |
901 set_content(data_channel())); | 923 set_content(data_channel())); |
902 } | 924 } |
903 | 925 |
904 bool WebRtcSession::PushdownTransportDescription(cricket::ContentSource source, | 926 bool WebRtcSession::PushdownTransportDescription(cricket::ContentSource source, |
905 cricket::ContentAction action, | 927 cricket::ContentAction action, |
906 std::string* error_desc) { | 928 std::string* error_desc) { |
907 RTC_DCHECK(signaling_thread()->IsCurrent()); | 929 RTC_DCHECK(signaling_thread()->IsCurrent()); |
908 | 930 |
909 if (source == cricket::CS_LOCAL) { | 931 if (source == cricket::CS_LOCAL) { |
910 return PushdownLocalTransportDescription(local_desc_->description(), action, | 932 return PushdownLocalTransportDescription(local_description()->description(), |
911 error_desc); | 933 action, error_desc); |
912 } | 934 } |
913 return PushdownRemoteTransportDescription(remote_desc_->description(), action, | 935 return PushdownRemoteTransportDescription(remote_description()->description(), |
914 error_desc); | 936 action, error_desc); |
915 } | 937 } |
916 | 938 |
917 bool WebRtcSession::PushdownLocalTransportDescription( | 939 bool WebRtcSession::PushdownLocalTransportDescription( |
918 const SessionDescription* sdesc, | 940 const SessionDescription* sdesc, |
919 cricket::ContentAction action, | 941 cricket::ContentAction action, |
920 std::string* err) { | 942 std::string* err) { |
921 RTC_DCHECK(signaling_thread()->IsCurrent()); | 943 RTC_DCHECK(signaling_thread()->IsCurrent()); |
922 | 944 |
923 if (!sdesc) { | 945 if (!sdesc) { |
924 return false; | 946 return false; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1052 if (!maybe_set_transport(voice_channel()) || | 1074 if (!maybe_set_transport(voice_channel()) || |
1053 !maybe_set_transport(video_channel()) || | 1075 !maybe_set_transport(video_channel()) || |
1054 !maybe_set_transport(data_channel())) { | 1076 !maybe_set_transport(data_channel())) { |
1055 return false; | 1077 return false; |
1056 } | 1078 } |
1057 | 1079 |
1058 return true; | 1080 return true; |
1059 } | 1081 } |
1060 | 1082 |
1061 bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) { | 1083 bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) { |
1062 if (!remote_desc_) { | 1084 if (!remote_description()) { |
1063 LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be added " | 1085 LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be added " |
1064 << "without any remote session description."; | 1086 << "without any remote session description."; |
1065 return false; | 1087 return false; |
1066 } | 1088 } |
1067 | 1089 |
1068 if (!candidate) { | 1090 if (!candidate) { |
1069 LOG(LS_ERROR) << "ProcessIceMessage: Candidate is NULL."; | 1091 LOG(LS_ERROR) << "ProcessIceMessage: Candidate is NULL."; |
1070 return false; | 1092 return false; |
1071 } | 1093 } |
1072 | 1094 |
1073 bool valid = false; | 1095 bool valid = false; |
1074 bool ready = ReadyToUseRemoteCandidate(candidate, NULL, &valid); | 1096 bool ready = ReadyToUseRemoteCandidate(candidate, NULL, &valid); |
1075 if (!valid) { | 1097 if (!valid) { |
1076 return false; | 1098 return false; |
1077 } | 1099 } |
1078 | 1100 |
1079 // Add this candidate to the remote session description. | 1101 // Add this candidate to the remote session description. |
1080 if (!remote_desc_->AddCandidate(candidate)) { | 1102 if (!mutable_remote_description()->AddCandidate(candidate)) { |
1081 LOG(LS_ERROR) << "ProcessIceMessage: Candidate cannot be used."; | 1103 LOG(LS_ERROR) << "ProcessIceMessage: Candidate cannot be used."; |
1082 return false; | 1104 return false; |
1083 } | 1105 } |
1084 | 1106 |
1085 if (ready) { | 1107 if (ready) { |
1086 return UseCandidate(candidate); | 1108 return UseCandidate(candidate); |
1087 } else { | 1109 } else { |
1088 LOG(LS_INFO) << "ProcessIceMessage: Not ready to use candidate."; | 1110 LOG(LS_INFO) << "ProcessIceMessage: Not ready to use candidate."; |
1089 return true; | 1111 return true; |
1090 } | 1112 } |
1091 } | 1113 } |
1092 | 1114 |
1093 bool WebRtcSession::RemoveRemoteIceCandidates( | 1115 bool WebRtcSession::RemoveRemoteIceCandidates( |
1094 const std::vector<cricket::Candidate>& candidates) { | 1116 const std::vector<cricket::Candidate>& candidates) { |
1095 if (!remote_desc_) { | 1117 if (!remote_description()) { |
1096 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: ICE candidates can't be " | 1118 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: ICE candidates can't be " |
1097 << "removed without any remote session description."; | 1119 << "removed without any remote session description."; |
1098 return false; | 1120 return false; |
1099 } | 1121 } |
1100 | 1122 |
1101 if (candidates.empty()) { | 1123 if (candidates.empty()) { |
1102 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: candidates are empty."; | 1124 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: candidates are empty."; |
1103 return false; | 1125 return false; |
1104 } | 1126 } |
1105 | 1127 |
1106 size_t number_removed = remote_desc_->RemoveCandidates(candidates); | 1128 size_t number_removed = |
| 1129 mutable_remote_description()->RemoveCandidates(candidates); |
1107 if (number_removed != candidates.size()) { | 1130 if (number_removed != candidates.size()) { |
1108 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: Failed to remove candidates. " | 1131 LOG(LS_ERROR) << "RemoveRemoteIceCandidates: Failed to remove candidates. " |
1109 << "Requested " << candidates.size() << " but only " | 1132 << "Requested " << candidates.size() << " but only " |
1110 << number_removed << " are removed."; | 1133 << number_removed << " are removed."; |
1111 } | 1134 } |
1112 | 1135 |
1113 // Remove the candidates from the transport controller. | 1136 // Remove the candidates from the transport controller. |
1114 std::string error; | 1137 std::string error; |
1115 bool res = transport_controller_->RemoveRemoteCandidates(candidates, &error); | 1138 bool res = transport_controller_->RemoveRemoteCandidates(candidates, &error); |
1116 if (!res && !error.empty()) { | 1139 if (!res && !error.empty()) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 void WebRtcSession::SetIceConfig(const cricket::IceConfig& config) { | 1173 void WebRtcSession::SetIceConfig(const cricket::IceConfig& config) { |
1151 transport_controller_->SetIceConfig(config); | 1174 transport_controller_->SetIceConfig(config); |
1152 } | 1175 } |
1153 | 1176 |
1154 void WebRtcSession::MaybeStartGathering() { | 1177 void WebRtcSession::MaybeStartGathering() { |
1155 transport_controller_->MaybeStartGathering(); | 1178 transport_controller_->MaybeStartGathering(); |
1156 } | 1179 } |
1157 | 1180 |
1158 bool WebRtcSession::GetLocalTrackIdBySsrc(uint32_t ssrc, | 1181 bool WebRtcSession::GetLocalTrackIdBySsrc(uint32_t ssrc, |
1159 std::string* track_id) { | 1182 std::string* track_id) { |
1160 if (!local_desc_) { | 1183 if (!local_description()) { |
1161 return false; | 1184 return false; |
1162 } | 1185 } |
1163 return webrtc::GetTrackIdBySsrc(local_desc_->description(), ssrc, track_id); | 1186 return webrtc::GetTrackIdBySsrc(local_description()->description(), ssrc, |
| 1187 track_id); |
1164 } | 1188 } |
1165 | 1189 |
1166 bool WebRtcSession::GetRemoteTrackIdBySsrc(uint32_t ssrc, | 1190 bool WebRtcSession::GetRemoteTrackIdBySsrc(uint32_t ssrc, |
1167 std::string* track_id) { | 1191 std::string* track_id) { |
1168 if (!remote_desc_) { | 1192 if (!remote_description()) { |
1169 return false; | 1193 return false; |
1170 } | 1194 } |
1171 return webrtc::GetTrackIdBySsrc(remote_desc_->description(), ssrc, track_id); | 1195 return webrtc::GetTrackIdBySsrc(remote_description()->description(), ssrc, |
| 1196 track_id); |
1172 } | 1197 } |
1173 | 1198 |
1174 std::string WebRtcSession::BadStateErrMsg(State state) { | 1199 std::string WebRtcSession::BadStateErrMsg(State state) { |
1175 std::ostringstream desc; | 1200 std::ostringstream desc; |
1176 desc << "Called in wrong state: " << GetStateString(state); | 1201 desc << "Called in wrong state: " << GetStateString(state); |
1177 return desc.str(); | 1202 return desc.str(); |
1178 } | 1203 } |
1179 | 1204 |
1180 bool WebRtcSession::CanInsertDtmf(const std::string& track_id) { | 1205 bool WebRtcSession::CanInsertDtmf(const std::string& track_id) { |
1181 ASSERT(signaling_thread()->IsCurrent()); | 1206 ASSERT(signaling_thread()->IsCurrent()); |
1182 if (!voice_channel_) { | 1207 if (!voice_channel_) { |
1183 LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists."; | 1208 LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists."; |
1184 return false; | 1209 return false; |
1185 } | 1210 } |
1186 uint32_t send_ssrc = 0; | 1211 uint32_t send_ssrc = 0; |
1187 // The Dtmf is negotiated per channel not ssrc, so we only check if the ssrc | 1212 // The Dtmf is negotiated per channel not ssrc, so we only check if the ssrc |
1188 // exists. | 1213 // exists. |
1189 if (!local_desc_ || | 1214 if (!local_description() || |
1190 !GetAudioSsrcByTrackId(local_desc_->description(), track_id, | 1215 !GetAudioSsrcByTrackId(local_description()->description(), track_id, |
1191 &send_ssrc)) { | 1216 &send_ssrc)) { |
1192 LOG(LS_ERROR) << "CanInsertDtmf: Track does not exist: " << track_id; | 1217 LOG(LS_ERROR) << "CanInsertDtmf: Track does not exist: " << track_id; |
1193 return false; | 1218 return false; |
1194 } | 1219 } |
1195 return voice_channel_->CanInsertDtmf(); | 1220 return voice_channel_->CanInsertDtmf(); |
1196 } | 1221 } |
1197 | 1222 |
1198 bool WebRtcSession::InsertDtmf(const std::string& track_id, | 1223 bool WebRtcSession::InsertDtmf(const std::string& track_id, |
1199 int code, int duration) { | 1224 int code, int duration) { |
1200 ASSERT(signaling_thread()->IsCurrent()); | 1225 ASSERT(signaling_thread()->IsCurrent()); |
1201 if (!voice_channel_) { | 1226 if (!voice_channel_) { |
1202 LOG(LS_ERROR) << "InsertDtmf: No audio channel exists."; | 1227 LOG(LS_ERROR) << "InsertDtmf: No audio channel exists."; |
1203 return false; | 1228 return false; |
1204 } | 1229 } |
1205 uint32_t send_ssrc = 0; | 1230 uint32_t send_ssrc = 0; |
1206 if (!VERIFY(local_desc_ && GetAudioSsrcByTrackId(local_desc_->description(), | 1231 if (!VERIFY(local_description() && |
1207 track_id, &send_ssrc))) { | 1232 GetAudioSsrcByTrackId(local_description()->description(), |
| 1233 track_id, &send_ssrc))) { |
1208 LOG(LS_ERROR) << "InsertDtmf: Track does not exist: " << track_id; | 1234 LOG(LS_ERROR) << "InsertDtmf: Track does not exist: " << track_id; |
1209 return false; | 1235 return false; |
1210 } | 1236 } |
1211 if (!voice_channel_->InsertDtmf(send_ssrc, code, duration)) { | 1237 if (!voice_channel_->InsertDtmf(send_ssrc, code, duration)) { |
1212 LOG(LS_ERROR) << "Failed to insert DTMF to channel."; | 1238 LOG(LS_ERROR) << "Failed to insert DTMF to channel."; |
1213 return false; | 1239 return false; |
1214 } | 1240 } |
1215 return true; | 1241 return true; |
1216 } | 1242 } |
1217 | 1243 |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1395 return; | 1421 return; |
1396 } | 1422 } |
1397 | 1423 |
1398 for (cricket::Candidates::const_iterator citer = candidates.begin(); | 1424 for (cricket::Candidates::const_iterator citer = candidates.begin(); |
1399 citer != candidates.end(); ++citer) { | 1425 citer != candidates.end(); ++citer) { |
1400 // Use transport_name as the candidate media id. | 1426 // Use transport_name as the candidate media id. |
1401 JsepIceCandidate candidate(transport_name, sdp_mline_index, *citer); | 1427 JsepIceCandidate candidate(transport_name, sdp_mline_index, *citer); |
1402 if (ice_observer_) { | 1428 if (ice_observer_) { |
1403 ice_observer_->OnIceCandidate(&candidate); | 1429 ice_observer_->OnIceCandidate(&candidate); |
1404 } | 1430 } |
1405 if (local_desc_) { | 1431 if (local_description()) { |
1406 local_desc_->AddCandidate(&candidate); | 1432 mutable_local_description()->AddCandidate(&candidate); |
1407 } | 1433 } |
1408 } | 1434 } |
1409 } | 1435 } |
1410 | 1436 |
1411 void WebRtcSession::OnTransportControllerCandidatesRemoved( | 1437 void WebRtcSession::OnTransportControllerCandidatesRemoved( |
1412 const std::vector<cricket::Candidate>& candidates) { | 1438 const std::vector<cricket::Candidate>& candidates) { |
1413 ASSERT(signaling_thread()->IsCurrent()); | 1439 ASSERT(signaling_thread()->IsCurrent()); |
1414 // Sanity check. | 1440 // Sanity check. |
1415 for (const cricket::Candidate& candidate : candidates) { | 1441 for (const cricket::Candidate& candidate : candidates) { |
1416 if (candidate.transport_name().empty()) { | 1442 if (candidate.transport_name().empty()) { |
1417 LOG(LS_ERROR) << "OnTransportControllerCandidatesRemoved: " | 1443 LOG(LS_ERROR) << "OnTransportControllerCandidatesRemoved: " |
1418 << "empty content name in candidate " | 1444 << "empty content name in candidate " |
1419 << candidate.ToString(); | 1445 << candidate.ToString(); |
1420 return; | 1446 return; |
1421 } | 1447 } |
1422 } | 1448 } |
1423 | 1449 |
1424 if (local_desc_) { | 1450 if (local_description()) { |
1425 local_desc_->RemoveCandidates(candidates); | 1451 mutable_local_description()->RemoveCandidates(candidates); |
1426 } | 1452 } |
1427 if (ice_observer_) { | 1453 if (ice_observer_) { |
1428 ice_observer_->OnIceCandidatesRemoved(candidates); | 1454 ice_observer_->OnIceCandidatesRemoved(candidates); |
1429 } | 1455 } |
1430 } | 1456 } |
1431 | 1457 |
1432 // Enabling voice and video channel. | 1458 // Enabling voice and video channel. |
1433 void WebRtcSession::EnableChannels() { | 1459 void WebRtcSession::EnableChannels() { |
1434 if (voice_channel_ && !voice_channel_->enabled()) | 1460 if (voice_channel_ && !voice_channel_->enabled()) |
1435 voice_channel_->Enable(true); | 1461 voice_channel_->Enable(true); |
1436 | 1462 |
1437 if (video_channel_ && !video_channel_->enabled()) | 1463 if (video_channel_ && !video_channel_->enabled()) |
1438 video_channel_->Enable(true); | 1464 video_channel_->Enable(true); |
1439 | 1465 |
1440 if (data_channel_ && !data_channel_->enabled()) | 1466 if (data_channel_ && !data_channel_->enabled()) |
1441 data_channel_->Enable(true); | 1467 data_channel_->Enable(true); |
1442 } | 1468 } |
1443 | 1469 |
1444 // Returns the media index for a local ice candidate given the content name. | 1470 // Returns the media index for a local ice candidate given the content name. |
1445 bool WebRtcSession::GetLocalCandidateMediaIndex(const std::string& content_name, | 1471 bool WebRtcSession::GetLocalCandidateMediaIndex(const std::string& content_name, |
1446 int* sdp_mline_index) { | 1472 int* sdp_mline_index) { |
1447 if (!local_desc_ || !sdp_mline_index) { | 1473 if (!local_description() || !sdp_mline_index) { |
1448 return false; | 1474 return false; |
1449 } | 1475 } |
1450 | 1476 |
1451 bool content_found = false; | 1477 bool content_found = false; |
1452 const ContentInfos& contents = local_desc_->description()->contents(); | 1478 const ContentInfos& contents = local_description()->description()->contents(); |
1453 for (size_t index = 0; index < contents.size(); ++index) { | 1479 for (size_t index = 0; index < contents.size(); ++index) { |
1454 if (contents[index].name == content_name) { | 1480 if (contents[index].name == content_name) { |
1455 *sdp_mline_index = static_cast<int>(index); | 1481 *sdp_mline_index = static_cast<int>(index); |
1456 content_found = true; | 1482 content_found = true; |
1457 break; | 1483 break; |
1458 } | 1484 } |
1459 } | 1485 } |
1460 return content_found; | 1486 return content_found; |
1461 } | 1487 } |
1462 | 1488 |
(...skipping 20 matching lines...) Expand all Loading... |
1483 if (!ret) { | 1509 if (!ret) { |
1484 break; | 1510 break; |
1485 } | 1511 } |
1486 } | 1512 } |
1487 } | 1513 } |
1488 return ret; | 1514 return ret; |
1489 } | 1515 } |
1490 | 1516 |
1491 bool WebRtcSession::UseCandidate(const IceCandidateInterface* candidate) { | 1517 bool WebRtcSession::UseCandidate(const IceCandidateInterface* candidate) { |
1492 size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index()); | 1518 size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index()); |
1493 size_t remote_content_size = remote_desc_->description()->contents().size(); | 1519 size_t remote_content_size = |
| 1520 remote_description()->description()->contents().size(); |
1494 if (mediacontent_index >= remote_content_size) { | 1521 if (mediacontent_index >= remote_content_size) { |
1495 LOG(LS_ERROR) << "UseCandidate: Invalid candidate media index."; | 1522 LOG(LS_ERROR) << "UseCandidate: Invalid candidate media index."; |
1496 return false; | 1523 return false; |
1497 } | 1524 } |
1498 | 1525 |
1499 cricket::ContentInfo content = | 1526 cricket::ContentInfo content = |
1500 remote_desc_->description()->contents()[mediacontent_index]; | 1527 remote_description()->description()->contents()[mediacontent_index]; |
1501 std::vector<cricket::Candidate> candidates; | 1528 std::vector<cricket::Candidate> candidates; |
1502 candidates.push_back(candidate->candidate()); | 1529 candidates.push_back(candidate->candidate()); |
1503 // Invoking BaseSession method to handle remote candidates. | 1530 // Invoking BaseSession method to handle remote candidates. |
1504 std::string error; | 1531 std::string error; |
1505 if (transport_controller_->AddRemoteCandidates(content.name, candidates, | 1532 if (transport_controller_->AddRemoteCandidates(content.name, candidates, |
1506 &error)) { | 1533 &error)) { |
1507 // Candidates successfully submitted for checking. | 1534 // Candidates successfully submitted for checking. |
1508 if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew || | 1535 if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew || |
1509 ice_connection_state_ == | 1536 ice_connection_state_ == |
1510 PeerConnectionInterface::kIceConnectionDisconnected) { | 1537 PeerConnectionInterface::kIceConnectionDisconnected) { |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1828 if (!ValidateBundleSettings(sdesc->description())) { | 1855 if (!ValidateBundleSettings(sdesc->description())) { |
1829 return BadSdp(source, type, kBundleWithoutRtcpMux, err_desc); | 1856 return BadSdp(source, type, kBundleWithoutRtcpMux, err_desc); |
1830 } | 1857 } |
1831 | 1858 |
1832 // TODO(skvlad): When the local rtcp-mux policy is Require, reject any | 1859 // TODO(skvlad): When the local rtcp-mux policy is Require, reject any |
1833 // m-lines that do not rtcp-mux enabled. | 1860 // m-lines that do not rtcp-mux enabled. |
1834 | 1861 |
1835 // Verify m-lines in Answer when compared against Offer. | 1862 // Verify m-lines in Answer when compared against Offer. |
1836 if (action == kAnswer) { | 1863 if (action == kAnswer) { |
1837 const cricket::SessionDescription* offer_desc = | 1864 const cricket::SessionDescription* offer_desc = |
1838 (source == cricket::CS_LOCAL) ? remote_desc_->description() | 1865 (source == cricket::CS_LOCAL) ? remote_description()->description() |
1839 : local_desc_->description(); | 1866 : local_description()->description(); |
1840 if (!VerifyMediaDescriptions(sdesc->description(), offer_desc)) { | 1867 if (!VerifyMediaDescriptions(sdesc->description(), offer_desc)) { |
1841 return BadAnswerSdp(source, kMlineMismatch, err_desc); | 1868 return BadAnswerSdp(source, kMlineMismatch, err_desc); |
1842 } | 1869 } |
1843 } | 1870 } |
1844 | 1871 |
1845 return true; | 1872 return true; |
1846 } | 1873 } |
1847 | 1874 |
1848 bool WebRtcSession::ExpectSetLocalDescription(Action action) { | 1875 bool WebRtcSession::ExpectSetLocalDescription(Action action) { |
1849 return ((action == kOffer && state() == STATE_INIT) || | 1876 return ((action == kOffer && state() == STATE_INIT) || |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1883 // them unset while the session has them set from the previous negotiation. | 1910 // them unset while the session has them set from the previous negotiation. |
1884 // Not doing so may trigger the auto generation of transport description and | 1911 // Not doing so may trigger the auto generation of transport description and |
1885 // mess up DTLS identity information, ICE credential, etc. | 1912 // mess up DTLS identity information, ICE credential, etc. |
1886 bool WebRtcSession::ReadyToUseRemoteCandidate( | 1913 bool WebRtcSession::ReadyToUseRemoteCandidate( |
1887 const IceCandidateInterface* candidate, | 1914 const IceCandidateInterface* candidate, |
1888 const SessionDescriptionInterface* remote_desc, | 1915 const SessionDescriptionInterface* remote_desc, |
1889 bool* valid) { | 1916 bool* valid) { |
1890 *valid = true; | 1917 *valid = true; |
1891 | 1918 |
1892 const SessionDescriptionInterface* current_remote_desc = | 1919 const SessionDescriptionInterface* current_remote_desc = |
1893 remote_desc ? remote_desc : remote_desc_.get(); | 1920 remote_desc ? remote_desc : remote_description(); |
1894 | 1921 |
1895 if (!current_remote_desc) { | 1922 if (!current_remote_desc) { |
1896 return false; | 1923 return false; |
1897 } | 1924 } |
1898 | 1925 |
1899 size_t mediacontent_index = | 1926 size_t mediacontent_index = |
1900 static_cast<size_t>(candidate->sdp_mline_index()); | 1927 static_cast<size_t>(candidate->sdp_mline_index()); |
1901 size_t remote_content_size = | 1928 size_t remote_content_size = |
1902 current_remote_desc->description()->contents().size(); | 1929 current_remote_desc->description()->contents().size(); |
1903 if (mediacontent_index >= remote_content_size) { | 1930 if (mediacontent_index >= remote_content_size) { |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2074 } | 2101 } |
2075 | 2102 |
2076 void WebRtcSession::OnDtlsHandshakeError(rtc::SSLHandshakeError error) { | 2103 void WebRtcSession::OnDtlsHandshakeError(rtc::SSLHandshakeError error) { |
2077 if (metrics_observer_) { | 2104 if (metrics_observer_) { |
2078 metrics_observer_->IncrementEnumCounter( | 2105 metrics_observer_->IncrementEnumCounter( |
2079 webrtc::kEnumCounterDtlsHandshakeError, static_cast<int>(error), | 2106 webrtc::kEnumCounterDtlsHandshakeError, static_cast<int>(error), |
2080 static_cast<int>(rtc::SSLHandshakeError::MAX_VALUE)); | 2107 static_cast<int>(rtc::SSLHandshakeError::MAX_VALUE)); |
2081 } | 2108 } |
2082 } | 2109 } |
2083 } // namespace webrtc | 2110 } // namespace webrtc |
OLD | NEW |