Chromium Code Reviews| 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 27 matching lines...) Expand all Loading... | |
| 38 #include "talk/app/webrtc/mediaconstraintsinterface.h" | 38 #include "talk/app/webrtc/mediaconstraintsinterface.h" |
| 39 #include "talk/app/webrtc/mediastreamsignaling.h" | 39 #include "talk/app/webrtc/mediastreamsignaling.h" |
| 40 #include "talk/app/webrtc/peerconnectioninterface.h" | 40 #include "talk/app/webrtc/peerconnectioninterface.h" |
| 41 #include "talk/app/webrtc/webrtcsessiondescriptionfactory.h" | 41 #include "talk/app/webrtc/webrtcsessiondescriptionfactory.h" |
| 42 #include "talk/media/base/constants.h" | 42 #include "talk/media/base/constants.h" |
| 43 #include "talk/media/base/videocapturer.h" | 43 #include "talk/media/base/videocapturer.h" |
| 44 #include "talk/session/media/channel.h" | 44 #include "talk/session/media/channel.h" |
| 45 #include "talk/session/media/channelmanager.h" | 45 #include "talk/session/media/channelmanager.h" |
| 46 #include "talk/session/media/mediasession.h" | 46 #include "talk/session/media/mediasession.h" |
| 47 #include "webrtc/base/basictypes.h" | 47 #include "webrtc/base/basictypes.h" |
| 48 #include "webrtc/base/bind.h" | |
| 48 #include "webrtc/base/checks.h" | 49 #include "webrtc/base/checks.h" |
| 49 #include "webrtc/base/helpers.h" | 50 #include "webrtc/base/helpers.h" |
| 50 #include "webrtc/base/logging.h" | 51 #include "webrtc/base/logging.h" |
| 51 #include "webrtc/base/stringencode.h" | 52 #include "webrtc/base/stringencode.h" |
| 52 #include "webrtc/base/stringutils.h" | 53 #include "webrtc/base/stringutils.h" |
| 53 #include "webrtc/p2p/base/portallocator.h" | 54 #include "webrtc/p2p/base/portallocator.h" |
| 55 #include "webrtc/p2p/base/transportchannel.h" | |
| 54 | 56 |
| 55 using cricket::ContentInfo; | 57 using cricket::ContentInfo; |
| 56 using cricket::ContentInfos; | 58 using cricket::ContentInfos; |
| 57 using cricket::MediaContentDescription; | 59 using cricket::MediaContentDescription; |
| 58 using cricket::SessionDescription; | 60 using cricket::SessionDescription; |
| 59 using cricket::TransportInfo; | 61 using cricket::TransportInfo; |
| 60 | 62 |
| 61 using cricket::LOCAL_PORT_TYPE; | 63 using cricket::LOCAL_PORT_TYPE; |
| 62 using cricket::STUN_PORT_TYPE; | 64 using cricket::STUN_PORT_TYPE; |
| 63 using cricket::RELAY_PORT_TYPE; | 65 using cricket::RELAY_PORT_TYPE; |
| 64 using cricket::PRFLX_PORT_TYPE; | 66 using cricket::PRFLX_PORT_TYPE; |
| 65 | 67 |
| 68 using rtc::Bind; | |
| 69 | |
| 66 namespace webrtc { | 70 namespace webrtc { |
| 67 | 71 |
| 68 // Error messages | 72 // Error messages |
| 69 const char kBundleWithoutRtcpMux[] = "RTCP-MUX must be enabled when BUNDLE " | 73 const char kBundleWithoutRtcpMux[] = "RTCP-MUX must be enabled when BUNDLE " |
| 70 "is enabled."; | 74 "is enabled."; |
| 71 const char kCreateChannelFailed[] = "Failed to create channels."; | 75 const char kCreateChannelFailed[] = "Failed to create channels."; |
| 72 const char kInvalidCandidates[] = "Description contains invalid candidates."; | 76 const char kInvalidCandidates[] = "Description contains invalid candidates."; |
| 73 const char kInvalidSdp[] = "Invalid session description."; | 77 const char kInvalidSdp[] = "Invalid session description."; |
| 74 const char kMlineMismatch[] = | 78 const char kMlineMismatch[] = |
| 75 "Offer and answer descriptions m-lines are not matching. Rejecting answer."; | 79 "Offer and answer descriptions m-lines are not matching. Rejecting answer."; |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 529 return true; | 533 return true; |
| 530 } | 534 } |
| 531 } | 535 } |
| 532 return false; | 536 return false; |
| 533 } | 537 } |
| 534 | 538 |
| 535 private: | 539 private: |
| 536 bool ice_restart_; | 540 bool ice_restart_; |
| 537 }; | 541 }; |
| 538 | 542 |
| 539 WebRtcSession::WebRtcSession( | 543 WebRtcSession::WebRtcSession(webrtc::MediaControllerInterface* media_controller, |
| 540 cricket::ChannelManager* channel_manager, | 544 rtc::Thread* signaling_thread, |
| 541 rtc::Thread* signaling_thread, | 545 rtc::Thread* worker_thread, |
| 542 rtc::Thread* worker_thread, | 546 cricket::PortAllocator* port_allocator, |
| 543 cricket::PortAllocator* port_allocator, | 547 MediaStreamSignaling* mediastream_signaling) |
| 544 MediaStreamSignaling* mediastream_signaling) | |
| 545 : cricket::BaseSession(signaling_thread, | 548 : cricket::BaseSession(signaling_thread, |
| 546 worker_thread, | 549 worker_thread, |
| 547 port_allocator, | 550 port_allocator, |
| 548 rtc::ToString(rtc::CreateRandomId64() & LLONG_MAX), | 551 rtc::ToString(rtc::CreateRandomId64() & LLONG_MAX), |
| 549 false), | 552 false), |
| 550 // RFC 3264: The numeric value of the session id and version in the | 553 // RFC 3264: The numeric value of the session id and version in the |
| 551 // o line MUST be representable with a "64 bit signed integer". | 554 // o line MUST be representable with a "64 bit signed integer". |
| 552 // Due to this constraint session id |sid_| is max limited to LLONG_MAX. | 555 // Due to this constraint session id |sid_| is max limited to LLONG_MAX. |
| 553 channel_manager_(channel_manager), | 556 media_controller_(media_controller), |
| 557 channel_manager_(media_controller_->channel_manager()), | |
| 554 mediastream_signaling_(mediastream_signaling), | 558 mediastream_signaling_(mediastream_signaling), |
| 555 ice_observer_(NULL), | 559 ice_observer_(NULL), |
| 556 ice_connection_state_(PeerConnectionInterface::kIceConnectionNew), | 560 ice_connection_state_(PeerConnectionInterface::kIceConnectionNew), |
| 557 ice_connection_receiving_(true), | 561 ice_connection_receiving_(true), |
| 558 older_version_remote_peer_(false), | 562 older_version_remote_peer_(false), |
| 559 dtls_enabled_(false), | 563 dtls_enabled_(false), |
| 560 data_channel_type_(cricket::DCT_NONE), | 564 data_channel_type_(cricket::DCT_NONE), |
| 561 ice_restart_latch_(new IceRestartAnswerLatch), | 565 ice_restart_latch_(new IceRestartAnswerLatch), |
| 562 metrics_observer_(NULL) { | 566 metrics_observer_(NULL) { |
| 563 transport_controller()->SignalConnectionState.connect( | 567 transport_controller()->SignalConnectionState.connect( |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 769 } | 773 } |
| 770 port_allocator()->set_candidate_filter( | 774 port_allocator()->set_candidate_filter( |
| 771 ConvertIceTransportTypeToCandidateFilter(rtc_configuration.type)); | 775 ConvertIceTransportTypeToCandidateFilter(rtc_configuration.type)); |
| 772 | 776 |
| 773 if (rtc_configuration.enable_localhost_ice_candidate) { | 777 if (rtc_configuration.enable_localhost_ice_candidate) { |
| 774 port_allocator()->set_flags( | 778 port_allocator()->set_flags( |
| 775 port_allocator()->flags() | | 779 port_allocator()->flags() | |
| 776 cricket::PORTALLOCATOR_ENABLE_LOCALHOST_CANDIDATE); | 780 cricket::PORTALLOCATOR_ENABLE_LOCALHOST_CANDIDATE); |
| 777 } | 781 } |
| 778 | 782 |
| 779 media_controller_.reset(MediaControllerInterface::Create( | |
| 780 worker_thread(), channel_manager_->media_engine()->GetVoE())); | |
| 781 | |
| 782 return true; | 783 return true; |
| 783 } | 784 } |
| 784 | 785 |
| 785 cricket::IceConfig WebRtcSession::ParseIceConfig( | 786 cricket::IceConfig WebRtcSession::ParseIceConfig( |
| 786 const PeerConnectionInterface::RTCConfiguration& config) const { | 787 const PeerConnectionInterface::RTCConfiguration& config) const { |
| 787 cricket::IceConfig ice_config; | 788 cricket::IceConfig ice_config; |
| 788 ice_config.receiving_timeout_ms = config.ice_connection_receiving_timeout; | 789 ice_config.receiving_timeout_ms = config.ice_connection_receiving_timeout; |
| 789 ice_config.gather_continually = (config.continual_gathering_policy == | 790 ice_config.gather_continually = (config.continual_gathering_policy == |
| 790 PeerConnectionInterface::GATHER_CONTINUALLY); | 791 PeerConnectionInterface::GATHER_CONTINUALLY); |
| 791 return ice_config; | 792 return ice_config; |
| (...skipping 1020 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1812 LOG(LS_WARNING) << "max-bundle failed to enable bundling."; | 1813 LOG(LS_WARNING) << "max-bundle failed to enable bundling."; |
| 1813 return false; | 1814 return false; |
| 1814 } | 1815 } |
| 1815 } | 1816 } |
| 1816 | 1817 |
| 1817 return true; | 1818 return true; |
| 1818 } | 1819 } |
| 1819 | 1820 |
| 1820 bool WebRtcSession::CreateVoiceChannel(const cricket::ContentInfo* content) { | 1821 bool WebRtcSession::CreateVoiceChannel(const cricket::ContentInfo* content) { |
| 1821 voice_channel_.reset(channel_manager_->CreateVoiceChannel( | 1822 voice_channel_.reset(channel_manager_->CreateVoiceChannel( |
| 1822 media_controller_.get(), transport_controller(), content->name, true, | 1823 media_controller_, transport_controller(), content->name, true, |
| 1823 audio_options_)); | 1824 audio_options_)); |
| 1824 if (!voice_channel_) { | 1825 if (!voice_channel_) { |
| 1825 return false; | 1826 return false; |
| 1826 } | 1827 } |
| 1827 | 1828 |
| 1828 voice_channel_->SignalDtlsSetupFailure.connect( | 1829 voice_channel_->SignalDtlsSetupFailure.connect( |
| 1829 this, &WebRtcSession::OnDtlsSetupFailure); | 1830 this, &WebRtcSession::OnDtlsSetupFailure); |
| 1831 voice_channel_->transport_channel()->SignalSentPacket.connect( | |
| 1832 this, &WebRtcSession::OnSentPacket); | |
| 1830 return true; | 1833 return true; |
| 1831 } | 1834 } |
| 1832 | 1835 |
| 1833 bool WebRtcSession::CreateVideoChannel(const cricket::ContentInfo* content) { | 1836 bool WebRtcSession::CreateVideoChannel(const cricket::ContentInfo* content) { |
| 1834 video_channel_.reset(channel_manager_->CreateVideoChannel( | 1837 video_channel_.reset(channel_manager_->CreateVideoChannel( |
| 1835 media_controller_.get(), transport_controller(), content->name, true, | 1838 media_controller_, transport_controller(), content->name, true, |
| 1836 video_options_)); | 1839 video_options_)); |
| 1837 if (!video_channel_) { | 1840 if (!video_channel_) { |
| 1838 return false; | 1841 return false; |
| 1839 } | 1842 } |
| 1840 | 1843 |
| 1841 video_channel_->SignalDtlsSetupFailure.connect( | 1844 video_channel_->SignalDtlsSetupFailure.connect( |
| 1842 this, &WebRtcSession::OnDtlsSetupFailure); | 1845 this, &WebRtcSession::OnDtlsSetupFailure); |
| 1846 video_channel_->transport_channel()->SignalSentPacket.connect( | |
| 1847 this, &WebRtcSession::OnSentPacket); | |
| 1843 return true; | 1848 return true; |
| 1844 } | 1849 } |
| 1845 | 1850 |
| 1846 bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content) { | 1851 bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content) { |
| 1847 bool sctp = (data_channel_type_ == cricket::DCT_SCTP); | 1852 bool sctp = (data_channel_type_ == cricket::DCT_SCTP); |
| 1848 data_channel_.reset(channel_manager_->CreateDataChannel( | 1853 data_channel_.reset(channel_manager_->CreateDataChannel( |
| 1849 transport_controller(), content->name, !sctp, data_channel_type_)); | 1854 transport_controller(), content->name, !sctp, data_channel_type_)); |
| 1850 if (!data_channel_) { | 1855 if (!data_channel_) { |
| 1851 return false; | 1856 return false; |
| 1852 } | 1857 } |
| 1853 | 1858 |
| 1854 if (sctp) { | 1859 if (sctp) { |
| 1855 mediastream_signaling_->OnDataTransportCreatedForSctp(); | 1860 mediastream_signaling_->OnDataTransportCreatedForSctp(); |
| 1856 data_channel_->SignalDataReceived.connect( | 1861 data_channel_->SignalDataReceived.connect( |
| 1857 this, &WebRtcSession::OnDataChannelMessageReceived); | 1862 this, &WebRtcSession::OnDataChannelMessageReceived); |
| 1858 data_channel_->SignalStreamClosedRemotely.connect( | 1863 data_channel_->SignalStreamClosedRemotely.connect( |
| 1859 mediastream_signaling_, | 1864 mediastream_signaling_, |
| 1860 &MediaStreamSignaling::OnRemoteSctpDataChannelClosed); | 1865 &MediaStreamSignaling::OnRemoteSctpDataChannelClosed); |
| 1861 } | 1866 } |
| 1862 | 1867 |
| 1863 data_channel_->SignalDtlsSetupFailure.connect( | 1868 data_channel_->SignalDtlsSetupFailure.connect( |
| 1864 this, &WebRtcSession::OnDtlsSetupFailure); | 1869 this, &WebRtcSession::OnDtlsSetupFailure); |
| 1870 data_channel_->transport_channel()->SignalSentPacket.connect( | |
| 1871 this, &WebRtcSession::OnSentPacket); | |
| 1865 return true; | 1872 return true; |
| 1866 } | 1873 } |
| 1867 | 1874 |
| 1868 void WebRtcSession::OnDtlsSetupFailure(cricket::BaseChannel*, bool rtcp) { | 1875 void WebRtcSession::OnDtlsSetupFailure(cricket::BaseChannel*, bool rtcp) { |
| 1869 SetError(BaseSession::ERROR_TRANSPORT, rtcp ? kDtlsSetupFailureRtcp : | 1876 SetError(BaseSession::ERROR_TRANSPORT, rtcp ? kDtlsSetupFailureRtcp : |
| 1870 kDtlsSetupFailureRtp); | 1877 kDtlsSetupFailureRtp); |
| 1871 } | 1878 } |
| 1872 | 1879 |
| 1873 void WebRtcSession::CopySavedCandidates( | 1880 void WebRtcSession::CopySavedCandidates( |
| 1874 SessionDescriptionInterface* dest_desc) { | 1881 SessionDescriptionInterface* dest_desc) { |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2178 | 2185 |
| 2179 if (!srtp_cipher.empty()) { | 2186 if (!srtp_cipher.empty()) { |
| 2180 metrics_observer_->IncrementSparseEnumCounter( | 2187 metrics_observer_->IncrementSparseEnumCounter( |
| 2181 srtp_counter_type, rtc::GetSrtpCryptoSuiteFromName(srtp_cipher)); | 2188 srtp_counter_type, rtc::GetSrtpCryptoSuiteFromName(srtp_cipher)); |
| 2182 } | 2189 } |
| 2183 if (ssl_cipher) { | 2190 if (ssl_cipher) { |
| 2184 metrics_observer_->IncrementSparseEnumCounter(ssl_counter_type, ssl_cipher); | 2191 metrics_observer_->IncrementSparseEnumCounter(ssl_counter_type, ssl_cipher); |
| 2185 } | 2192 } |
| 2186 } | 2193 } |
| 2187 | 2194 |
| 2195 void WebRtcSession::OnSentPacket(cricket::TransportChannel* channel, | |
| 2196 const rtc::SentPacket& sent_packet) { | |
| 2197 worker_thread()->Invoke<void>( | |
| 2198 rtc::Bind(&WebRtcSession::OnSentPacket_w, this, sent_packet)); | |
| 2199 media_controller_->call_w()->OnSentPacket(sent_packet); | |
|
pthatcher1
2015/10/13 05:31:13
Two things:
1. If you hop to the worker thread,
stefan-webrtc
2015/10/13 08:09:20
You are right, it should. Keeping OnSentPacket_w.
| |
| 2200 } | |
| 2201 | |
| 2202 void WebRtcSession::OnSentPacket_w(const rtc::SentPacket& sent_packet) { | |
| 2203 RTC_DCHECK(worker_thread()->IsCurrent()); | |
| 2204 media_controller_->call_w()->OnSentPacket(sent_packet); | |
| 2205 } | |
| 2206 | |
| 2188 } // namespace webrtc | 2207 } // namespace webrtc |
| OLD | NEW |