| Index: webrtc/api/peerconnection.cc
|
| diff --git a/webrtc/api/peerconnection.cc b/webrtc/api/peerconnection.cc
|
| index 506a21582f7ae0ce6f4dffa34497ac72b4dc14ee..5284db37fd7675bb65c01af4417f8a20b66783e3 100644
|
| --- a/webrtc/api/peerconnection.cc
|
| +++ b/webrtc/api/peerconnection.cc
|
| @@ -376,6 +376,23 @@
|
| }
|
| }
|
|
|
| +uint32_t ConvertIceTransportTypeToCandidateFilter(
|
| + PeerConnectionInterface::IceTransportsType type) {
|
| + switch (type) {
|
| + case PeerConnectionInterface::kNone:
|
| + return cricket::CF_NONE;
|
| + case PeerConnectionInterface::kRelay:
|
| + return cricket::CF_RELAY;
|
| + case PeerConnectionInterface::kNoHost:
|
| + return (cricket::CF_ALL & ~cricket::CF_HOST);
|
| + case PeerConnectionInterface::kAll:
|
| + return cricket::CF_ALL;
|
| + default:
|
| + ASSERT(false);
|
| + }
|
| + return cricket::CF_NONE;
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace webrtc {
|
| @@ -536,6 +553,14 @@
|
| for (const auto& receiver : receivers_) {
|
| receiver->Stop();
|
| }
|
| + // Destroy stats_ because it depends on session_.
|
| + stats_.reset(nullptr);
|
| + // Now destroy session_ before destroying other members,
|
| + // because its destruction fires signals (such as VoiceChannelDestroyed)
|
| + // which will trigger some final actions in PeerConnection...
|
| + session_.reset(nullptr);
|
| + // port_allocator_ lives on the worker thread and should be destroyed there.
|
| + worker_thread()->Invoke<void>([this] { port_allocator_.reset(nullptr); });
|
| }
|
|
|
| bool PeerConnection::Initialize(
|
| @@ -552,35 +577,12 @@
|
|
|
| port_allocator_ = std::move(allocator);
|
|
|
| - cricket::ServerAddresses stun_servers;
|
| - std::vector<cricket::RelayServerConfig> turn_servers;
|
| - if (!ParseIceServers(configuration.servers, &stun_servers, &turn_servers)) {
|
| - return false;
|
| - }
|
| - port_allocator_->SetIceServers(stun_servers, turn_servers);
|
| -
|
| - // To handle both internal and externally created port allocator, we will
|
| - // enable BUNDLE here.
|
| - int portallocator_flags = port_allocator_->flags();
|
| - portallocator_flags |= cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET |
|
| - cricket::PORTALLOCATOR_ENABLE_IPV6;
|
| - // If the disable-IPv6 flag was specified, we'll not override it
|
| - // by experiment.
|
| - if (configuration.disable_ipv6) {
|
| - portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
|
| - } else if (webrtc::field_trial::FindFullName("WebRTC-IPv6Default") ==
|
| - "Disabled") {
|
| - portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
|
| - }
|
| -
|
| - if (configuration.tcp_candidate_policy == kTcpCandidatePolicyDisabled) {
|
| - portallocator_flags |= cricket::PORTALLOCATOR_DISABLE_TCP;
|
| - LOG(LS_INFO) << "TCP candidates are disabled.";
|
| - }
|
| -
|
| - port_allocator_->set_flags(portallocator_flags);
|
| - // No step delay is used while allocating ports.
|
| - port_allocator_->set_step_delay(cricket::kMinimumStepDelay);
|
| + // The port allocator lives on the worker thread and should be initialized
|
| + // there.
|
| + if (!worker_thread()->Invoke<bool>(rtc::Bind(
|
| + &PeerConnection::InitializePortAllocator_w, this, configuration))) {
|
| + return false;
|
| + }
|
|
|
| media_controller_.reset(
|
| factory_->CreateMediaController(configuration.media_config));
|
| @@ -1158,18 +1160,19 @@
|
| signaling_thread()->Post(this, MSG_SET_SESSIONDESCRIPTION_SUCCESS, msg);
|
| }
|
|
|
| -bool PeerConnection::SetConfiguration(const RTCConfiguration& config) {
|
| +bool PeerConnection::SetConfiguration(const RTCConfiguration& configuration) {
|
| TRACE_EVENT0("webrtc", "PeerConnection::SetConfiguration");
|
| if (port_allocator_) {
|
| - cricket::ServerAddresses stun_servers;
|
| - std::vector<cricket::RelayServerConfig> turn_servers;
|
| - if (!ParseIceServers(config.servers, &stun_servers, &turn_servers)) {
|
| + if (!worker_thread()->Invoke<bool>(
|
| + rtc::Bind(&PeerConnection::ReconfigurePortAllocator_w, this,
|
| + configuration))) {
|
| return false;
|
| }
|
| - port_allocator_->SetIceServers(stun_servers, turn_servers);
|
| - }
|
| - session_->SetIceConfig(session_->ParseIceConfig(config));
|
| - return session_->SetIceTransports(config.type);
|
| + }
|
| +
|
| + // TODO(deadbeef): Shouldn't have to hop to the worker thread twice...
|
| + session_->SetIceConfig(session_->ParseIceConfig(configuration));
|
| + return true;
|
| }
|
|
|
| bool PeerConnection::AddIceCandidate(
|
| @@ -2084,4 +2087,60 @@
|
| return nullptr;
|
| }
|
|
|
| +bool PeerConnection::InitializePortAllocator_w(
|
| + const RTCConfiguration& configuration) {
|
| + cricket::ServerAddresses stun_servers;
|
| + std::vector<cricket::RelayServerConfig> turn_servers;
|
| + if (!ParseIceServers(configuration.servers, &stun_servers, &turn_servers)) {
|
| + return false;
|
| + }
|
| +
|
| + // To handle both internal and externally created port allocator, we will
|
| + // enable BUNDLE here.
|
| + int portallocator_flags = port_allocator_->flags();
|
| + portallocator_flags |= cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET |
|
| + cricket::PORTALLOCATOR_ENABLE_IPV6;
|
| + // If the disable-IPv6 flag was specified, we'll not override it
|
| + // by experiment.
|
| + if (configuration.disable_ipv6) {
|
| + portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
|
| + } else if (webrtc::field_trial::FindFullName("WebRTC-IPv6Default") ==
|
| + "Disabled") {
|
| + portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
|
| + }
|
| +
|
| + if (configuration.tcp_candidate_policy == kTcpCandidatePolicyDisabled) {
|
| + portallocator_flags |= cricket::PORTALLOCATOR_DISABLE_TCP;
|
| + LOG(LS_INFO) << "TCP candidates are disabled.";
|
| + }
|
| +
|
| + port_allocator_->set_flags(portallocator_flags);
|
| + // No step delay is used while allocating ports.
|
| + port_allocator_->set_step_delay(cricket::kMinimumStepDelay);
|
| + port_allocator_->set_candidate_filter(
|
| + ConvertIceTransportTypeToCandidateFilter(configuration.type));
|
| +
|
| + // Call this last since it may create pooled allocator sessions using the
|
| + // properties set above.
|
| + port_allocator_->SetConfiguration(stun_servers, turn_servers,
|
| + configuration.ice_candidate_pool_size);
|
| + return true;
|
| +}
|
| +
|
| +bool PeerConnection::ReconfigurePortAllocator_w(
|
| + const RTCConfiguration& configuration) {
|
| + cricket::ServerAddresses stun_servers;
|
| + std::vector<cricket::RelayServerConfig> turn_servers;
|
| + if (!ParseIceServers(configuration.servers, &stun_servers, &turn_servers)) {
|
| + return false;
|
| + }
|
| + port_allocator_->set_candidate_filter(
|
| + ConvertIceTransportTypeToCandidateFilter(configuration.type));
|
| + // Call this last since it may create pooled allocator sessions using the
|
| + // candidate filter set above.
|
| + port_allocator_->SetConfiguration(stun_servers, turn_servers,
|
| + configuration.ice_candidate_pool_size);
|
| + return true;
|
| +}
|
| +
|
| } // namespace webrtc
|
|
|