OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2017 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 |
11 #include "webrtc/ortc/rtptransportcontrolleradapter.h" | 11 #include "webrtc/ortc/rtptransportcontrolleradapter.h" |
12 | 12 |
13 #include <algorithm> // For "remove", "find". | 13 #include <algorithm> // For "remove", "find". |
14 #include <set> | |
14 #include <sstream> | 15 #include <sstream> |
15 #include <set> | |
16 #include <unordered_map> | 16 #include <unordered_map> |
17 #include <utility> // For std::move. | 17 #include <utility> // For std::move. |
18 | 18 |
19 #include "webrtc/api/proxy.h" | 19 #include "webrtc/api/proxy.h" |
20 #include "webrtc/base/checks.h" | 20 #include "webrtc/base/checks.h" |
21 #include "webrtc/media/base/mediaconstants.h" | 21 #include "webrtc/media/base/mediaconstants.h" |
22 #include "webrtc/ortc/ortcrtpreceiveradapter.h" | 22 #include "webrtc/ortc/ortcrtpreceiveradapter.h" |
23 #include "webrtc/ortc/ortcrtpsenderadapter.h" | 23 #include "webrtc/ortc/ortcrtpsenderadapter.h" |
24 #include "webrtc/ortc/rtpparametersconversion.h" | 24 #include "webrtc/ortc/rtpparametersconversion.h" |
25 #include "webrtc/ortc/rtptransportadapter.h" | 25 #include "webrtc/ortc/rtptransportadapter.h" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
131 auto result = | 131 auto result = |
132 RtpTransportAdapter::CreateProxied(rtcp_parameters, rtp, rtcp, this); | 132 RtpTransportAdapter::CreateProxied(rtcp_parameters, rtp, rtcp, this); |
133 if (result.ok()) { | 133 if (result.ok()) { |
134 transport_proxies_.push_back(result.value().get()); | 134 transport_proxies_.push_back(result.value().get()); |
135 transport_proxies_.back()->GetInternal()->SignalDestroyed.connect( | 135 transport_proxies_.back()->GetInternal()->SignalDestroyed.connect( |
136 this, &RtpTransportControllerAdapter::OnRtpTransportDestroyed); | 136 this, &RtpTransportControllerAdapter::OnRtpTransportDestroyed); |
137 } | 137 } |
138 return result; | 138 return result; |
139 } | 139 } |
140 | 140 |
141 RTCErrorOr<std::unique_ptr<SrtpTransportInterface>> | |
142 RtpTransportControllerAdapter::CreateProxiedSrtpTransport( | |
143 const RtcpParameters& rtcp_parameters, | |
144 PacketTransportInterface* rtp, | |
145 PacketTransportInterface* rtcp) { | |
146 auto result = | |
147 RtpTransportAdapter::CreateSrtpProxied(rtcp_parameters, rtp, rtcp, this); | |
148 if (result.ok()) { | |
149 transport_proxies_.push_back(result.value().get()); | |
150 transport_proxies_.back()->GetInternal()->SignalDestroyed.connect( | |
151 this, &RtpTransportControllerAdapter::OnRtpTransportDestroyed); | |
152 } | |
153 return result; | |
154 } | |
155 | |
141 RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>> | 156 RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>> |
142 RtpTransportControllerAdapter::CreateProxiedRtpSender( | 157 RtpTransportControllerAdapter::CreateProxiedRtpSender( |
143 cricket::MediaType kind, | 158 cricket::MediaType kind, |
144 RtpTransportInterface* transport_proxy) { | 159 RtpTransportInterface* transport_proxy) { |
145 RTC_DCHECK(transport_proxy); | 160 RTC_DCHECK(transport_proxy); |
146 RTC_DCHECK(std::find(transport_proxies_.begin(), transport_proxies_.end(), | 161 RTC_DCHECK(std::find(transport_proxies_.begin(), transport_proxies_.end(), |
147 transport_proxy) != transport_proxies_.end()); | 162 transport_proxy) != transport_proxies_.end()); |
148 std::unique_ptr<OrtcRtpSenderAdapter> new_sender( | 163 std::unique_ptr<OrtcRtpSenderAdapter> new_sender( |
149 new OrtcRtpSenderAdapter(kind, transport_proxy, this)); | 164 new OrtcRtpSenderAdapter(kind, transport_proxy, this)); |
150 RTCError err; | 165 RTCError err; |
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
598 "Using two audio RtpSenders with the same " | 613 "Using two audio RtpSenders with the same " |
599 "RtpTransportControllerAdapter is not currently " | 614 "RtpTransportControllerAdapter is not currently " |
600 "supported."); | 615 "supported."); |
601 } | 616 } |
602 if (inner_audio_transport_ && inner_audio_transport_ != inner_transport) { | 617 if (inner_audio_transport_ && inner_audio_transport_ != inner_transport) { |
603 LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION, | 618 LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION, |
604 "Using different transports for the audio " | 619 "Using different transports for the audio " |
605 "RtpSender and RtpReceiver is not currently " | 620 "RtpSender and RtpReceiver is not currently " |
606 "supported."); | 621 "supported."); |
607 } | 622 } |
623 RTCError err = MaybeSetCryptosForAudio(inner_transport); | |
624 if (!err.ok()) { | |
625 return err; | |
626 } | |
608 // If setting new transport, extract its RTCP parameters and create voice | 627 // If setting new transport, extract its RTCP parameters and create voice |
609 // channel. | 628 // channel. |
610 if (!inner_audio_transport_) { | 629 if (!inner_audio_transport_) { |
611 CopyRtcpParametersToDescriptions(inner_transport->GetRtcpParameters(), | 630 CopyRtcpParametersToDescriptions(inner_transport->GetRtcpParameters(), |
612 &local_audio_description_, | 631 &local_audio_description_, |
613 &remote_audio_description_); | 632 &remote_audio_description_); |
614 inner_audio_transport_ = inner_transport; | 633 inner_audio_transport_ = inner_transport; |
615 CreateVoiceChannel(); | 634 CreateVoiceChannel(); |
616 } | 635 } |
617 have_audio_sender_ = true; | 636 have_audio_sender_ = true; |
(...skipping 10 matching lines...) Expand all Loading... | |
628 "Using two video RtpSenders with the same " | 647 "Using two video RtpSenders with the same " |
629 "RtpTransportControllerAdapter is not currently " | 648 "RtpTransportControllerAdapter is not currently " |
630 "supported."); | 649 "supported."); |
631 } | 650 } |
632 if (inner_video_transport_ && inner_video_transport_ != inner_transport) { | 651 if (inner_video_transport_ && inner_video_transport_ != inner_transport) { |
633 LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION, | 652 LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION, |
634 "Using different transports for the video " | 653 "Using different transports for the video " |
635 "RtpSender and RtpReceiver is not currently " | 654 "RtpSender and RtpReceiver is not currently " |
636 "supported."); | 655 "supported."); |
637 } | 656 } |
657 RTCError err = MaybeSetCryptosForVideo(inner_transport); | |
658 if (!err.ok()) { | |
659 return err; | |
660 } | |
638 // If setting new transport, extract its RTCP parameters and create video | 661 // If setting new transport, extract its RTCP parameters and create video |
639 // channel. | 662 // channel. |
640 if (!inner_video_transport_) { | 663 if (!inner_video_transport_) { |
641 CopyRtcpParametersToDescriptions(inner_transport->GetRtcpParameters(), | 664 CopyRtcpParametersToDescriptions(inner_transport->GetRtcpParameters(), |
642 &local_video_description_, | 665 &local_video_description_, |
643 &remote_video_description_); | 666 &remote_video_description_); |
644 inner_video_transport_ = inner_transport; | 667 inner_video_transport_ = inner_transport; |
645 CreateVideoChannel(); | 668 CreateVideoChannel(); |
646 } | 669 } |
647 have_video_sender_ = true; | 670 have_video_sender_ = true; |
(...skipping 10 matching lines...) Expand all Loading... | |
658 "Using two audio RtpReceivers with the same " | 681 "Using two audio RtpReceivers with the same " |
659 "RtpTransportControllerAdapter is not currently " | 682 "RtpTransportControllerAdapter is not currently " |
660 "supported."); | 683 "supported."); |
661 } | 684 } |
662 if (inner_audio_transport_ && inner_audio_transport_ != inner_transport) { | 685 if (inner_audio_transport_ && inner_audio_transport_ != inner_transport) { |
663 LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION, | 686 LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION, |
664 "Using different transports for the audio " | 687 "Using different transports for the audio " |
665 "RtpReceiver and RtpReceiver is not currently " | 688 "RtpReceiver and RtpReceiver is not currently " |
666 "supported."); | 689 "supported."); |
667 } | 690 } |
691 RTCError err = MaybeSetCryptosForAudio(inner_transport); | |
692 if (!err.ok()) { | |
693 return err; | |
694 } | |
668 // If setting new transport, extract its RTCP parameters and create voice | 695 // If setting new transport, extract its RTCP parameters and create voice |
669 // channel. | 696 // channel. |
670 if (!inner_audio_transport_) { | 697 if (!inner_audio_transport_) { |
671 CopyRtcpParametersToDescriptions(inner_transport->GetRtcpParameters(), | 698 CopyRtcpParametersToDescriptions(inner_transport->GetRtcpParameters(), |
672 &local_audio_description_, | 699 &local_audio_description_, |
673 &remote_audio_description_); | 700 &remote_audio_description_); |
674 inner_audio_transport_ = inner_transport; | 701 inner_audio_transport_ = inner_transport; |
675 CreateVoiceChannel(); | 702 CreateVoiceChannel(); |
676 } | 703 } |
677 have_audio_receiver_ = true; | 704 have_audio_receiver_ = true; |
(...skipping 10 matching lines...) Expand all Loading... | |
688 "Using two video RtpReceivers with the same " | 715 "Using two video RtpReceivers with the same " |
689 "RtpTransportControllerAdapter is not currently " | 716 "RtpTransportControllerAdapter is not currently " |
690 "supported."); | 717 "supported."); |
691 } | 718 } |
692 if (inner_video_transport_ && inner_video_transport_ != inner_transport) { | 719 if (inner_video_transport_ && inner_video_transport_ != inner_transport) { |
693 LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION, | 720 LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION, |
694 "Using different transports for the video " | 721 "Using different transports for the video " |
695 "RtpReceiver and RtpReceiver is not currently " | 722 "RtpReceiver and RtpReceiver is not currently " |
696 "supported."); | 723 "supported."); |
697 } | 724 } |
725 RTCError err = MaybeSetCryptosForVideo(inner_transport); | |
726 if (!err.ok()) { | |
727 return err; | |
728 } | |
698 // If setting new transport, extract its RTCP parameters and create video | 729 // If setting new transport, extract its RTCP parameters and create video |
699 // channel. | 730 // channel. |
700 if (!inner_video_transport_) { | 731 if (!inner_video_transport_) { |
701 CopyRtcpParametersToDescriptions(inner_transport->GetRtcpParameters(), | 732 CopyRtcpParametersToDescriptions(inner_transport->GetRtcpParameters(), |
702 &local_video_description_, | 733 &local_video_description_, |
703 &remote_video_description_); | 734 &remote_video_description_); |
704 inner_video_transport_ = inner_transport; | 735 inner_video_transport_ = inner_transport; |
705 CreateVideoChannel(); | 736 CreateVideoChannel(); |
706 } | 737 } |
707 have_video_receiver_ = true; | 738 have_video_receiver_ = true; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
889 auto result = ToCricketStreamParamsVec(encodings); | 920 auto result = ToCricketStreamParamsVec(encodings); |
890 if (!result.ok()) { | 921 if (!result.ok()) { |
891 return result.MoveError(); | 922 return result.MoveError(); |
892 } | 923 } |
893 // If conversion was successful, there should be one StreamParams. | 924 // If conversion was successful, there should be one StreamParams. |
894 RTC_DCHECK_EQ(1u, result.value().size()); | 925 RTC_DCHECK_EQ(1u, result.value().size()); |
895 result.value()[0].cname = cname; | 926 result.value()[0].cname = cname; |
896 return result; | 927 return result; |
897 } | 928 } |
898 | 929 |
930 RTCError RtpTransportControllerAdapter::MaybeSetCryptosForAudio( | |
Taylor Brandstetter
2017/03/01 19:18:08
nit: Instead of two separate methods, there could
Zhi Huang
2017/03/02 23:35:39
Done.
| |
931 RtpTransportInterface* rtp_transport) { | |
932 if (rtp_transport->GetInternal()->is_srtp_transport()) { | |
933 if (!rtp_transport->GetInternal()->key_set()) { | |
934 LOG_AND_RETURN_ERROR(webrtc::RTCErrorType::INVALID_STATE, | |
935 "The SRTP send key or receive key is not set.") | |
936 } | |
937 std::vector<cricket::CryptoParams> cryptos; | |
938 cryptos.push_back(rtp_transport->GetInternal()->receive_key()); | |
939 local_audio_description_.set_cryptos(cryptos); | |
940 | |
941 cryptos.clear(); | |
942 cryptos.push_back(rtp_transport->GetInternal()->send_key()); | |
943 remote_audio_description_.set_cryptos(cryptos); | |
944 } | |
945 return RTCError::OK(); | |
946 } | |
947 | |
948 RTCError RtpTransportControllerAdapter::MaybeSetCryptosForVideo( | |
949 RtpTransportInterface* rtp_transport) { | |
950 if (rtp_transport->GetInternal()->is_srtp_transport()) { | |
951 if (!rtp_transport->GetInternal()->key_set()) { | |
952 LOG_AND_RETURN_ERROR(webrtc::RTCErrorType::INVALID_STATE, | |
953 "The SRTP send key or receive key is not set.") | |
954 } | |
955 std::vector<cricket::CryptoParams> cryptos; | |
956 cryptos.push_back(rtp_transport->GetInternal()->receive_key()); | |
957 local_video_description_.set_cryptos(cryptos); | |
958 | |
959 cryptos.clear(); | |
960 cryptos.push_back(rtp_transport->GetInternal()->send_key()); | |
961 remote_video_description_.set_cryptos(cryptos); | |
962 } | |
963 return RTCError::OK(); | |
964 } | |
965 | |
899 } // namespace webrtc | 966 } // namespace webrtc |
OLD | NEW |