Separate PC resources required at runtime from PCfactory
This enables modules that share the resources to reuse the connection context object but not take a dependency on PeerConnectionFactory. Bug: webrtc:11967 Change-Id: Ic68cbf061b3226f02f8638abd79ad881e89951d4 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/188120 Reviewed-by: Tommi <tommi@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Henrik Boström <hbos@webrtc.org> Commit-Queue: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32412}
This commit is contained in:

committed by
Commit Bot

parent
ad2ec76387
commit
a39689cc98
19
pc/BUILD.gn
19
pc/BUILD.gn
@ -206,6 +206,7 @@ rtc_library("peerconnection") {
|
||||
deps = [
|
||||
":audio_rtp_receiver",
|
||||
":audio_track",
|
||||
":connection_context",
|
||||
":dtmf_sender",
|
||||
":jitter_buffer_delay",
|
||||
":jitter_buffer_delay_interface",
|
||||
@ -282,6 +283,24 @@ rtc_library("peerconnection") {
|
||||
]
|
||||
}
|
||||
|
||||
rtc_library("connection_context") {
|
||||
sources = [
|
||||
"connection_context.cc",
|
||||
"connection_context.h",
|
||||
]
|
||||
deps = [
|
||||
":rtc_pc_base",
|
||||
"../api:libjingle_peerconnection_api",
|
||||
"../api:media_stream_interface",
|
||||
"../api:scoped_refptr",
|
||||
"../api/transport:field_trial_based_config",
|
||||
"../media:rtc_data",
|
||||
"../media:rtc_media_base",
|
||||
"../p2p:rtc_p2p",
|
||||
"../rtc_base",
|
||||
]
|
||||
}
|
||||
|
||||
rtc_library("peer_connection_message_handler") {
|
||||
sources = [
|
||||
"peer_connection_message_handler.cc",
|
||||
|
137
pc/connection_context.cc
Normal file
137
pc/connection_context.cc
Normal file
@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Copyright 2020 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#include "pc/connection_context.h"
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "api/transport/field_trial_based_config.h"
|
||||
#include "media/base/rtp_data_engine.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
namespace {
|
||||
|
||||
rtc::Thread* MaybeStartThread(rtc::Thread* old_thread,
|
||||
const std::string& thread_name,
|
||||
bool with_socket_server,
|
||||
std::unique_ptr<rtc::Thread>* thread_holder) {
|
||||
if (old_thread) {
|
||||
return old_thread;
|
||||
}
|
||||
if (with_socket_server) {
|
||||
*thread_holder = rtc::Thread::CreateWithSocketServer();
|
||||
} else {
|
||||
*thread_holder = rtc::Thread::Create();
|
||||
}
|
||||
(*thread_holder)->SetName(thread_name, nullptr);
|
||||
(*thread_holder)->Start();
|
||||
return (*thread_holder).get();
|
||||
}
|
||||
|
||||
rtc::Thread* MaybeWrapThread(rtc::Thread* signaling_thread,
|
||||
bool* wraps_current_thread) {
|
||||
*wraps_current_thread = false;
|
||||
if (signaling_thread) {
|
||||
return signaling_thread;
|
||||
}
|
||||
auto this_thread = rtc::Thread::Current();
|
||||
if (!this_thread) {
|
||||
// If this thread isn't already wrapped by an rtc::Thread, create a
|
||||
// wrapper and own it in this class.
|
||||
this_thread = rtc::ThreadManager::Instance()->WrapCurrentThread();
|
||||
*wraps_current_thread = true;
|
||||
}
|
||||
return this_thread;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
ConnectionContext::ConnectionContext(
|
||||
PeerConnectionFactoryDependencies& dependencies)
|
||||
: network_thread_(MaybeStartThread(dependencies.network_thread,
|
||||
"pc_network_thread",
|
||||
true,
|
||||
&owned_network_thread_)),
|
||||
worker_thread_(MaybeStartThread(dependencies.worker_thread,
|
||||
"pc_worker_thread",
|
||||
false,
|
||||
&owned_worker_thread_)),
|
||||
signaling_thread_(MaybeWrapThread(dependencies.signaling_thread,
|
||||
&wraps_current_thread_)),
|
||||
network_monitor_factory_(std::move(dependencies.network_monitor_factory)),
|
||||
call_factory_(std::move(dependencies.call_factory)),
|
||||
media_engine_(std::move(dependencies.media_engine)),
|
||||
sctp_factory_(std::move(dependencies.sctp_factory)),
|
||||
trials_(dependencies.trials ? std::move(dependencies.trials)
|
||||
: std::make_unique<FieldTrialBasedConfig>()) {
|
||||
signaling_thread_->AllowInvokesToThread(worker_thread_);
|
||||
signaling_thread_->AllowInvokesToThread(network_thread_);
|
||||
worker_thread_->AllowInvokesToThread(network_thread_);
|
||||
network_thread_->DisallowAllInvokes();
|
||||
|
||||
#ifdef HAVE_SCTP
|
||||
if (!sctp_factory_) {
|
||||
sctp_factory_ =
|
||||
std::make_unique<cricket::SctpTransportFactory>(network_thread());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
ConnectionContext::~ConnectionContext() {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
channel_manager_.reset(nullptr);
|
||||
|
||||
// Make sure |worker_thread()| and |signaling_thread()| outlive
|
||||
// |default_socket_factory_| and |default_network_manager_|.
|
||||
default_socket_factory_ = nullptr;
|
||||
default_network_manager_ = nullptr;
|
||||
|
||||
if (wraps_current_thread_)
|
||||
rtc::ThreadManager::Instance()->UnwrapCurrentThread();
|
||||
}
|
||||
|
||||
void ConnectionContext::SetOptions(
|
||||
const PeerConnectionFactoryInterface::Options& options) {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
options_ = options;
|
||||
}
|
||||
|
||||
bool ConnectionContext::Initialize() {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
rtc::InitRandom(rtc::Time32());
|
||||
|
||||
// If network_monitor_factory_ is non-null, it will be used to create a
|
||||
// network monitor while on the network thread.
|
||||
default_network_manager_.reset(
|
||||
new rtc::BasicNetworkManager(network_monitor_factory_.get()));
|
||||
if (!default_network_manager_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
default_socket_factory_.reset(
|
||||
new rtc::BasicPacketSocketFactory(network_thread()));
|
||||
if (!default_socket_factory_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
channel_manager_ = std::make_unique<cricket::ChannelManager>(
|
||||
std::move(media_engine_), std::make_unique<cricket::RtpDataEngine>(),
|
||||
worker_thread(), network_thread());
|
||||
|
||||
channel_manager_->SetVideoRtxEnabled(true);
|
||||
return channel_manager_->Init();
|
||||
}
|
||||
|
||||
cricket::ChannelManager* ConnectionContext::channel_manager() const {
|
||||
return channel_manager_.get();
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
120
pc/connection_context.h
Normal file
120
pc/connection_context.h
Normal file
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright 2020 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef PC_CONNECTION_CONTEXT_H_
|
||||
#define PC_CONNECTION_CONTEXT_H_
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "api/media_stream_interface.h"
|
||||
#include "api/peer_connection_interface.h"
|
||||
#include "api/scoped_refptr.h"
|
||||
#include "media/sctp/sctp_transport_internal.h"
|
||||
#include "p2p/base/basic_packet_socket_factory.h"
|
||||
#include "pc/channel_manager.h"
|
||||
#include "rtc_base/rtc_certificate_generator.h"
|
||||
#include "rtc_base/thread.h"
|
||||
|
||||
namespace rtc {
|
||||
class BasicNetworkManager;
|
||||
class BasicPacketSocketFactory;
|
||||
} // namespace rtc
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class RtcEventLog;
|
||||
|
||||
// This class contains resources needed by PeerConnection and associated
|
||||
// objects. A reference to this object is passed to each PeerConnection. The
|
||||
// methods on this object are assumed not to change the state in any way that
|
||||
// interferes with the operation of other PeerConnections.
|
||||
class ConnectionContext : public rtc::RefCountInterface {
|
||||
public:
|
||||
// Functions called from PeerConnectionFactory
|
||||
void SetOptions(const PeerConnectionFactoryInterface::Options& options);
|
||||
|
||||
bool Initialize();
|
||||
|
||||
// Functions called from PeerConnection and friends
|
||||
SctpTransportFactoryInterface* sctp_transport_factory() const {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
return sctp_factory_.get();
|
||||
}
|
||||
|
||||
cricket::ChannelManager* channel_manager() const;
|
||||
|
||||
rtc::Thread* signaling_thread() const { return signaling_thread_; }
|
||||
rtc::Thread* worker_thread() const { return worker_thread_; }
|
||||
rtc::Thread* network_thread() const { return network_thread_; }
|
||||
|
||||
const PeerConnectionFactoryInterface::Options& options() const {
|
||||
return options_;
|
||||
}
|
||||
|
||||
const WebRtcKeyValueConfig& trials() const { return *trials_.get(); }
|
||||
|
||||
// Accessors only used from the PeerConnectionFactory class
|
||||
rtc::BasicNetworkManager* default_network_manager() const {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
return default_network_manager_.get();
|
||||
}
|
||||
rtc::BasicPacketSocketFactory* default_socket_factory() const {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
return default_socket_factory_.get();
|
||||
}
|
||||
CallFactoryInterface* call_factory() const {
|
||||
RTC_DCHECK_RUN_ON(worker_thread());
|
||||
return call_factory_.get();
|
||||
}
|
||||
|
||||
protected:
|
||||
// The Dependencies class allows simple management of all new dependencies
|
||||
// being added to the ConnectionContext.
|
||||
explicit ConnectionContext(PeerConnectionFactoryDependencies& dependencies);
|
||||
|
||||
virtual ~ConnectionContext();
|
||||
|
||||
private:
|
||||
bool wraps_current_thread_;
|
||||
// Note: Since owned_network_thread_ and owned_worker_thread_ are used
|
||||
// in the initialization of network_thread_ and worker_thread_, they
|
||||
// must be declared before them, so that they are initialized first.
|
||||
std::unique_ptr<rtc::Thread> owned_network_thread_
|
||||
RTC_GUARDED_BY(signaling_thread());
|
||||
std::unique_ptr<rtc::Thread> owned_worker_thread_
|
||||
RTC_GUARDED_BY(signaling_thread());
|
||||
rtc::Thread* const network_thread_;
|
||||
rtc::Thread* const worker_thread_;
|
||||
rtc::Thread* const signaling_thread_;
|
||||
PeerConnectionFactoryInterface::Options options_
|
||||
RTC_GUARDED_BY(signaling_thread());
|
||||
// Accessed both on signaling thread and worker thread.
|
||||
std::unique_ptr<cricket::ChannelManager> channel_manager_;
|
||||
std::unique_ptr<rtc::NetworkMonitorFactory> const network_monitor_factory_
|
||||
RTC_GUARDED_BY(signaling_thread());
|
||||
std::unique_ptr<rtc::BasicNetworkManager> default_network_manager_
|
||||
RTC_GUARDED_BY(signaling_thread());
|
||||
std::unique_ptr<webrtc::CallFactoryInterface> const call_factory_
|
||||
RTC_GUARDED_BY(worker_thread());
|
||||
|
||||
std::unique_ptr<rtc::BasicPacketSocketFactory> default_socket_factory_
|
||||
RTC_GUARDED_BY(signaling_thread());
|
||||
std::unique_ptr<cricket::MediaEngineInterface> media_engine_
|
||||
RTC_GUARDED_BY(signaling_thread());
|
||||
std::unique_ptr<SctpTransportFactoryInterface> sctp_factory_
|
||||
RTC_GUARDED_BY(signaling_thread());
|
||||
// Accessed both on signaling thread and worker thread.
|
||||
std::unique_ptr<WebRtcKeyValueConfig> const trials_;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // PC_CONNECTION_CONTEXT_H_
|
@ -335,10 +335,10 @@ bool PeerConnectionInterface::RTCConfiguration::operator!=(
|
||||
return !(*this == o);
|
||||
}
|
||||
|
||||
PeerConnection::PeerConnection(PeerConnectionFactory* factory,
|
||||
PeerConnection::PeerConnection(rtc::scoped_refptr<ConnectionContext> context,
|
||||
std::unique_ptr<RtcEventLog> event_log,
|
||||
std::unique_ptr<Call> call)
|
||||
: factory_(factory),
|
||||
: context_(context),
|
||||
event_log_(std::move(event_log)),
|
||||
event_log_ptr_(event_log_.get()),
|
||||
call_(std::move(call)),
|
||||
@ -464,7 +464,7 @@ bool PeerConnection::Initialize(
|
||||
RTC_HISTOGRAM_ENUMERATION("WebRTC.PeerConnection.IPMetrics", address_family,
|
||||
kPeerConnectionAddressFamilyCounter_Max);
|
||||
|
||||
const PeerConnectionFactoryInterface::Options& options = factory_->options();
|
||||
const PeerConnectionFactoryInterface::Options& options = context_->options();
|
||||
|
||||
// RFC 3264: The numeric value of the session id and version in the
|
||||
// o line MUST be representable with a "64 bit signed integer".
|
||||
@ -474,7 +474,7 @@ bool PeerConnection::Initialize(
|
||||
JsepTransportController::Config config;
|
||||
config.redetermine_role_on_ice_restart =
|
||||
configuration.redetermine_role_on_ice_restart;
|
||||
config.ssl_max_version = factory_->options().ssl_max_version;
|
||||
config.ssl_max_version = context_->options().ssl_max_version;
|
||||
config.disable_encryption = options.disable_encryption;
|
||||
config.bundle_policy = configuration.bundle_policy;
|
||||
config.rtcp_mux_policy = configuration.rtcp_mux_policy;
|
||||
@ -520,7 +520,7 @@ bool PeerConnection::Initialize(
|
||||
// DTLS has to be enabled to use SCTP.
|
||||
if (!options.disable_sctp_data_channels && dtls_enabled_) {
|
||||
data_channel_controller_.set_data_channel_type(cricket::DCT_SCTP);
|
||||
config.sctp_factory = factory_->sctp_transport_factory();
|
||||
config.sctp_factory = context_->sctp_transport_factory();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1650,7 +1650,7 @@ void PeerConnection::SetAudioPlayout(bool playout) {
|
||||
return;
|
||||
}
|
||||
auto audio_state =
|
||||
factory_->channel_manager()->media_engine()->voice().GetAudioState();
|
||||
context_->channel_manager()->media_engine()->voice().GetAudioState();
|
||||
audio_state->SetPlayout(playout);
|
||||
}
|
||||
|
||||
@ -1662,7 +1662,7 @@ void PeerConnection::SetAudioRecording(bool recording) {
|
||||
return;
|
||||
}
|
||||
auto audio_state =
|
||||
factory_->channel_manager()->media_engine()->voice().GetAudioState();
|
||||
context_->channel_manager()->media_engine()->voice().GetAudioState();
|
||||
audio_state->SetRecording(recording);
|
||||
}
|
||||
|
||||
@ -1723,7 +1723,7 @@ bool PeerConnection::StartRtcEventLog(std::unique_ptr<RtcEventLogOutput> output,
|
||||
bool PeerConnection::StartRtcEventLog(
|
||||
std::unique_ptr<RtcEventLogOutput> output) {
|
||||
int64_t output_period_ms = webrtc::RtcEventLog::kImmediateOutput;
|
||||
if (absl::StartsWith(factory_->trials().Lookup("WebRTC-RtcEventLogNewFormat"),
|
||||
if (absl::StartsWith(context_->trials().Lookup("WebRTC-RtcEventLogNewFormat"),
|
||||
"Enabled")) {
|
||||
output_period_ms = 5000;
|
||||
}
|
||||
@ -2400,7 +2400,7 @@ PeerConnection::InitializePortAllocator_n(
|
||||
// by experiment.
|
||||
if (configuration.disable_ipv6) {
|
||||
port_allocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
|
||||
} else if (absl::StartsWith(factory_->trials().Lookup("WebRTC-IPv6Default"),
|
||||
} else if (absl::StartsWith(context_->trials().Lookup("WebRTC-IPv6Default"),
|
||||
"Disabled")) {
|
||||
port_allocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
|
||||
}
|
||||
@ -2480,7 +2480,7 @@ bool PeerConnection::ReconfigurePortAllocator_n(
|
||||
}
|
||||
|
||||
cricket::ChannelManager* PeerConnection::channel_manager() const {
|
||||
return factory_->channel_manager();
|
||||
return context_->channel_manager();
|
||||
}
|
||||
|
||||
bool PeerConnection::StartRtcEventLog_w(
|
||||
@ -3196,7 +3196,7 @@ CryptoOptions PeerConnection::GetCryptoOptions() {
|
||||
// after it has been removed.
|
||||
return configuration_.crypto_options.has_value()
|
||||
? *configuration_.crypto_options
|
||||
: factory_->options().crypto_options;
|
||||
: context_->options().crypto_options;
|
||||
}
|
||||
|
||||
void PeerConnection::ClearStatsCache() {
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "api/peer_connection_interface.h"
|
||||
#include "api/transport/data_channel_transport_interface.h"
|
||||
#include "api/turn_customizer.h"
|
||||
#include "pc/connection_context.h"
|
||||
#include "pc/data_channel_controller.h"
|
||||
#include "pc/ice_server_parsing.h"
|
||||
#include "pc/jsep_transport_controller.h"
|
||||
@ -71,7 +72,7 @@ class PeerConnection : public PeerConnectionInternal,
|
||||
public RtpSenderBase::SetStreamsObserver,
|
||||
public sigslot::has_slots<> {
|
||||
public:
|
||||
explicit PeerConnection(PeerConnectionFactory* factory,
|
||||
explicit PeerConnection(rtc::scoped_refptr<ConnectionContext> context,
|
||||
std::unique_ptr<RtcEventLog> event_log,
|
||||
std::unique_ptr<Call> call);
|
||||
|
||||
@ -220,14 +221,14 @@ class PeerConnection : public PeerConnectionInternal,
|
||||
void Close() override;
|
||||
|
||||
rtc::Thread* signaling_thread() const final {
|
||||
return factory_->signaling_thread();
|
||||
return context_->signaling_thread();
|
||||
}
|
||||
|
||||
// PeerConnectionInternal implementation.
|
||||
rtc::Thread* network_thread() const final {
|
||||
return factory_->network_thread();
|
||||
return context_->network_thread();
|
||||
}
|
||||
rtc::Thread* worker_thread() const final { return factory_->worker_thread(); }
|
||||
rtc::Thread* worker_thread() const final { return context_->worker_thread(); }
|
||||
|
||||
std::string session_id() const override {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
@ -717,7 +718,7 @@ class PeerConnection : public PeerConnectionInternal,
|
||||
// However, since the reference counting is done in the
|
||||
// PeerConnectionFactoryInterface all instances created using the raw pointer
|
||||
// will refer to the same reference count.
|
||||
const rtc::scoped_refptr<PeerConnectionFactory> factory_;
|
||||
const rtc::scoped_refptr<ConnectionContext> context_;
|
||||
PeerConnectionObserver* observer_ RTC_GUARDED_BY(signaling_thread()) =
|
||||
nullptr;
|
||||
|
||||
|
@ -69,124 +69,45 @@ CreateModularPeerConnectionFactory(
|
||||
|
||||
PeerConnectionFactory::PeerConnectionFactory(
|
||||
PeerConnectionFactoryDependencies dependencies)
|
||||
: wraps_current_thread_(false),
|
||||
network_thread_(dependencies.network_thread),
|
||||
worker_thread_(dependencies.worker_thread),
|
||||
signaling_thread_(dependencies.signaling_thread),
|
||||
: context_(new rtc::RefCountedObject<ConnectionContext>(dependencies)),
|
||||
task_queue_factory_(std::move(dependencies.task_queue_factory)),
|
||||
network_monitor_factory_(std::move(dependencies.network_monitor_factory)),
|
||||
media_engine_(std::move(dependencies.media_engine)),
|
||||
call_factory_(std::move(dependencies.call_factory)),
|
||||
event_log_factory_(std::move(dependencies.event_log_factory)),
|
||||
fec_controller_factory_(std::move(dependencies.fec_controller_factory)),
|
||||
network_state_predictor_factory_(
|
||||
std::move(dependencies.network_state_predictor_factory)),
|
||||
injected_network_controller_factory_(
|
||||
std::move(dependencies.network_controller_factory)),
|
||||
neteq_factory_(std::move(dependencies.neteq_factory)),
|
||||
sctp_factory_(std::move(dependencies.sctp_factory)),
|
||||
trials_(dependencies.trials ? std::move(dependencies.trials)
|
||||
: std::make_unique<FieldTrialBasedConfig>()) {
|
||||
if (!network_thread_) {
|
||||
owned_network_thread_ = rtc::Thread::CreateWithSocketServer();
|
||||
owned_network_thread_->SetName("pc_network_thread", nullptr);
|
||||
owned_network_thread_->Start();
|
||||
network_thread_ = owned_network_thread_.get();
|
||||
}
|
||||
|
||||
if (!worker_thread_) {
|
||||
owned_worker_thread_ = rtc::Thread::Create();
|
||||
owned_worker_thread_->SetName("pc_worker_thread", nullptr);
|
||||
owned_worker_thread_->Start();
|
||||
worker_thread_ = owned_worker_thread_.get();
|
||||
}
|
||||
|
||||
if (!signaling_thread_) {
|
||||
signaling_thread_ = rtc::Thread::Current();
|
||||
if (!signaling_thread_) {
|
||||
// If this thread isn't already wrapped by an rtc::Thread, create a
|
||||
// wrapper and own it in this class.
|
||||
signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread();
|
||||
wraps_current_thread_ = true;
|
||||
}
|
||||
}
|
||||
signaling_thread_->AllowInvokesToThread(worker_thread_);
|
||||
signaling_thread_->AllowInvokesToThread(network_thread_);
|
||||
worker_thread_->AllowInvokesToThread(network_thread_);
|
||||
network_thread_->DisallowAllInvokes();
|
||||
|
||||
#ifdef HAVE_SCTP
|
||||
if (!sctp_factory_) {
|
||||
sctp_factory_ =
|
||||
std::make_unique<cricket::SctpTransportFactory>(network_thread_);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
neteq_factory_(std::move(dependencies.neteq_factory)) {}
|
||||
|
||||
PeerConnectionFactory::~PeerConnectionFactory() {
|
||||
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||
channel_manager_.reset(nullptr);
|
||||
|
||||
// Make sure |worker_thread_| and |signaling_thread_| outlive
|
||||
// |default_socket_factory_| and |default_network_manager_|.
|
||||
default_socket_factory_ = nullptr;
|
||||
default_network_manager_ = nullptr;
|
||||
|
||||
if (wraps_current_thread_)
|
||||
rtc::ThreadManager::Instance()->UnwrapCurrentThread();
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
}
|
||||
|
||||
bool PeerConnectionFactory::Initialize() {
|
||||
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||
rtc::InitRandom(rtc::Time32());
|
||||
|
||||
// If network_monitor_factory_ is non-null, it will be used to create a
|
||||
// network monitor while on the network thread.
|
||||
default_network_manager_.reset(
|
||||
new rtc::BasicNetworkManager(network_monitor_factory_.get()));
|
||||
if (!default_network_manager_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
default_socket_factory_.reset(
|
||||
new rtc::BasicPacketSocketFactory(network_thread_));
|
||||
if (!default_socket_factory_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
channel_manager_ = std::make_unique<cricket::ChannelManager>(
|
||||
std::move(media_engine_), std::make_unique<cricket::RtpDataEngine>(),
|
||||
worker_thread_, network_thread_);
|
||||
|
||||
channel_manager_->SetVideoRtxEnabled(true);
|
||||
if (!channel_manager_->Init()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return context_->Initialize();
|
||||
}
|
||||
|
||||
void PeerConnectionFactory::SetOptions(const Options& options) {
|
||||
options_ = options;
|
||||
context_->SetOptions(options);
|
||||
}
|
||||
|
||||
RtpCapabilities PeerConnectionFactory::GetRtpSenderCapabilities(
|
||||
cricket::MediaType kind) const {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread_);
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
switch (kind) {
|
||||
case cricket::MEDIA_TYPE_AUDIO: {
|
||||
cricket::AudioCodecs cricket_codecs;
|
||||
channel_manager_->GetSupportedAudioSendCodecs(&cricket_codecs);
|
||||
channel_manager()->GetSupportedAudioSendCodecs(&cricket_codecs);
|
||||
return ToRtpCapabilities(
|
||||
cricket_codecs,
|
||||
channel_manager_->GetDefaultEnabledAudioRtpHeaderExtensions());
|
||||
channel_manager()->GetDefaultEnabledAudioRtpHeaderExtensions());
|
||||
}
|
||||
case cricket::MEDIA_TYPE_VIDEO: {
|
||||
cricket::VideoCodecs cricket_codecs;
|
||||
channel_manager_->GetSupportedVideoSendCodecs(&cricket_codecs);
|
||||
channel_manager()->GetSupportedVideoSendCodecs(&cricket_codecs);
|
||||
return ToRtpCapabilities(
|
||||
cricket_codecs,
|
||||
channel_manager_->GetDefaultEnabledVideoRtpHeaderExtensions());
|
||||
channel_manager()->GetDefaultEnabledVideoRtpHeaderExtensions());
|
||||
}
|
||||
case cricket::MEDIA_TYPE_DATA:
|
||||
return RtpCapabilities();
|
||||
@ -197,21 +118,21 @@ RtpCapabilities PeerConnectionFactory::GetRtpSenderCapabilities(
|
||||
|
||||
RtpCapabilities PeerConnectionFactory::GetRtpReceiverCapabilities(
|
||||
cricket::MediaType kind) const {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread_);
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
switch (kind) {
|
||||
case cricket::MEDIA_TYPE_AUDIO: {
|
||||
cricket::AudioCodecs cricket_codecs;
|
||||
channel_manager_->GetSupportedAudioReceiveCodecs(&cricket_codecs);
|
||||
channel_manager()->GetSupportedAudioReceiveCodecs(&cricket_codecs);
|
||||
return ToRtpCapabilities(
|
||||
cricket_codecs,
|
||||
channel_manager_->GetDefaultEnabledAudioRtpHeaderExtensions());
|
||||
channel_manager()->GetDefaultEnabledAudioRtpHeaderExtensions());
|
||||
}
|
||||
case cricket::MEDIA_TYPE_VIDEO: {
|
||||
cricket::VideoCodecs cricket_codecs;
|
||||
channel_manager_->GetSupportedVideoReceiveCodecs(&cricket_codecs);
|
||||
channel_manager()->GetSupportedVideoReceiveCodecs(&cricket_codecs);
|
||||
return ToRtpCapabilities(
|
||||
cricket_codecs,
|
||||
channel_manager_->GetDefaultEnabledVideoRtpHeaderExtensions());
|
||||
channel_manager()->GetDefaultEnabledVideoRtpHeaderExtensions());
|
||||
}
|
||||
case cricket::MEDIA_TYPE_DATA:
|
||||
return RtpCapabilities();
|
||||
@ -222,20 +143,20 @@ RtpCapabilities PeerConnectionFactory::GetRtpReceiverCapabilities(
|
||||
|
||||
rtc::scoped_refptr<AudioSourceInterface>
|
||||
PeerConnectionFactory::CreateAudioSource(const cricket::AudioOptions& options) {
|
||||
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||
RTC_DCHECK(signaling_thread()->IsCurrent());
|
||||
rtc::scoped_refptr<LocalAudioSource> source(
|
||||
LocalAudioSource::Create(&options));
|
||||
return source;
|
||||
}
|
||||
|
||||
bool PeerConnectionFactory::StartAecDump(FILE* file, int64_t max_size_bytes) {
|
||||
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||
return channel_manager_->StartAecDump(FileWrapper(file), max_size_bytes);
|
||||
RTC_DCHECK(signaling_thread()->IsCurrent());
|
||||
return channel_manager()->StartAecDump(FileWrapper(file), max_size_bytes);
|
||||
}
|
||||
|
||||
void PeerConnectionFactory::StopAecDump() {
|
||||
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||
channel_manager_->StopAecDump();
|
||||
RTC_DCHECK(signaling_thread()->IsCurrent());
|
||||
channel_manager()->StopAecDump();
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<PeerConnectionInterface>
|
||||
@ -256,7 +177,7 @@ rtc::scoped_refptr<PeerConnectionInterface>
|
||||
PeerConnectionFactory::CreatePeerConnection(
|
||||
const PeerConnectionInterface::RTCConfiguration& configuration,
|
||||
PeerConnectionDependencies dependencies) {
|
||||
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||
RTC_DCHECK(signaling_thread()->IsCurrent());
|
||||
RTC_DCHECK(!(dependencies.allocator && dependencies.packet_socket_factory))
|
||||
<< "You can't set both allocator and packet_socket_factory; "
|
||||
"the former is going away (see bugs.webrtc.org/7447";
|
||||
@ -264,18 +185,18 @@ PeerConnectionFactory::CreatePeerConnection(
|
||||
// Set internal defaults if optional dependencies are not set.
|
||||
if (!dependencies.cert_generator) {
|
||||
dependencies.cert_generator =
|
||||
std::make_unique<rtc::RTCCertificateGenerator>(signaling_thread_,
|
||||
network_thread_);
|
||||
std::make_unique<rtc::RTCCertificateGenerator>(signaling_thread(),
|
||||
network_thread());
|
||||
}
|
||||
if (!dependencies.allocator) {
|
||||
rtc::PacketSocketFactory* packet_socket_factory;
|
||||
if (dependencies.packet_socket_factory)
|
||||
packet_socket_factory = dependencies.packet_socket_factory.get();
|
||||
else
|
||||
packet_socket_factory = default_socket_factory_.get();
|
||||
packet_socket_factory = context_->default_socket_factory();
|
||||
|
||||
dependencies.allocator = std::make_unique<cricket::BasicPortAllocator>(
|
||||
default_network_manager_.get(), packet_socket_factory,
|
||||
context_->default_network_manager(), packet_socket_factory,
|
||||
configuration.turn_customizer);
|
||||
}
|
||||
|
||||
@ -289,19 +210,19 @@ PeerConnectionFactory::CreatePeerConnection(
|
||||
std::make_unique<DefaultIceTransportFactory>();
|
||||
}
|
||||
|
||||
dependencies.allocator->SetNetworkIgnoreMask(options_.network_ignore_mask);
|
||||
dependencies.allocator->SetNetworkIgnoreMask(options().network_ignore_mask);
|
||||
|
||||
std::unique_ptr<RtcEventLog> event_log =
|
||||
worker_thread_->Invoke<std::unique_ptr<RtcEventLog>>(
|
||||
worker_thread()->Invoke<std::unique_ptr<RtcEventLog>>(
|
||||
RTC_FROM_HERE,
|
||||
rtc::Bind(&PeerConnectionFactory::CreateRtcEventLog_w, this));
|
||||
|
||||
std::unique_ptr<Call> call = worker_thread_->Invoke<std::unique_ptr<Call>>(
|
||||
std::unique_ptr<Call> call = worker_thread()->Invoke<std::unique_ptr<Call>>(
|
||||
RTC_FROM_HERE,
|
||||
rtc::Bind(&PeerConnectionFactory::CreateCall_w, this, event_log.get()));
|
||||
|
||||
rtc::scoped_refptr<PeerConnection> pc(
|
||||
new rtc::RefCountedObject<PeerConnection>(this, std::move(event_log),
|
||||
new rtc::RefCountedObject<PeerConnection>(context_, std::move(event_log),
|
||||
std::move(call)));
|
||||
ActionsBeforeInitializeForTesting(pc);
|
||||
if (!pc->Initialize(configuration, std::move(dependencies))) {
|
||||
@ -312,34 +233,34 @@ PeerConnectionFactory::CreatePeerConnection(
|
||||
|
||||
rtc::scoped_refptr<MediaStreamInterface>
|
||||
PeerConnectionFactory::CreateLocalMediaStream(const std::string& stream_id) {
|
||||
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||
return MediaStreamProxy::Create(signaling_thread_,
|
||||
RTC_DCHECK(signaling_thread()->IsCurrent());
|
||||
return MediaStreamProxy::Create(signaling_thread(),
|
||||
MediaStream::Create(stream_id));
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<VideoTrackInterface> PeerConnectionFactory::CreateVideoTrack(
|
||||
const std::string& id,
|
||||
VideoTrackSourceInterface* source) {
|
||||
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||
RTC_DCHECK(signaling_thread()->IsCurrent());
|
||||
rtc::scoped_refptr<VideoTrackInterface> track(
|
||||
VideoTrack::Create(id, source, worker_thread_));
|
||||
return VideoTrackProxy::Create(signaling_thread_, worker_thread_, track);
|
||||
VideoTrack::Create(id, source, worker_thread()));
|
||||
return VideoTrackProxy::Create(signaling_thread(), worker_thread(), track);
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<AudioTrackInterface> PeerConnectionFactory::CreateAudioTrack(
|
||||
const std::string& id,
|
||||
AudioSourceInterface* source) {
|
||||
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||
RTC_DCHECK(signaling_thread()->IsCurrent());
|
||||
rtc::scoped_refptr<AudioTrackInterface> track(AudioTrack::Create(id, source));
|
||||
return AudioTrackProxy::Create(signaling_thread_, track);
|
||||
return AudioTrackProxy::Create(signaling_thread(), track);
|
||||
}
|
||||
|
||||
cricket::ChannelManager* PeerConnectionFactory::channel_manager() {
|
||||
return channel_manager_.get();
|
||||
return context_->channel_manager();
|
||||
}
|
||||
|
||||
std::unique_ptr<RtcEventLog> PeerConnectionFactory::CreateRtcEventLog_w() {
|
||||
RTC_DCHECK_RUN_ON(worker_thread_);
|
||||
RTC_DCHECK_RUN_ON(worker_thread());
|
||||
|
||||
auto encoding_type = RtcEventLog::EncodingType::Legacy;
|
||||
if (IsTrialEnabled("WebRTC-RtcEventLogNewFormat"))
|
||||
@ -351,14 +272,14 @@ std::unique_ptr<RtcEventLog> PeerConnectionFactory::CreateRtcEventLog_w() {
|
||||
|
||||
std::unique_ptr<Call> PeerConnectionFactory::CreateCall_w(
|
||||
RtcEventLog* event_log) {
|
||||
RTC_DCHECK_RUN_ON(worker_thread_);
|
||||
RTC_DCHECK_RUN_ON(worker_thread());
|
||||
|
||||
webrtc::Call::Config call_config(event_log);
|
||||
if (!channel_manager_->media_engine() || !call_factory_) {
|
||||
if (!channel_manager()->media_engine() || !context_->call_factory()) {
|
||||
return nullptr;
|
||||
}
|
||||
call_config.audio_state =
|
||||
channel_manager_->media_engine()->voice().GetAudioState();
|
||||
channel_manager()->media_engine()->voice().GetAudioState();
|
||||
|
||||
FieldTrialParameter<DataRate> min_bandwidth("min",
|
||||
DataRate::KilobitsPerSec(30));
|
||||
@ -367,7 +288,7 @@ std::unique_ptr<Call> PeerConnectionFactory::CreateCall_w(
|
||||
FieldTrialParameter<DataRate> max_bandwidth("max",
|
||||
DataRate::KilobitsPerSec(2000));
|
||||
ParseFieldTrial({&min_bandwidth, &start_bandwidth, &max_bandwidth},
|
||||
trials_->Lookup("WebRTC-PcFactoryDefaultBitrates"));
|
||||
trials().Lookup("WebRTC-PcFactoryDefaultBitrates"));
|
||||
|
||||
call_config.bitrate_config.min_bitrate_bps =
|
||||
rtc::saturated_cast<int>(min_bandwidth->bps());
|
||||
@ -390,14 +311,14 @@ std::unique_ptr<Call> PeerConnectionFactory::CreateCall_w(
|
||||
RTC_LOG(LS_INFO) << "Using default network controller factory";
|
||||
}
|
||||
|
||||
call_config.trials = trials_.get();
|
||||
call_config.trials = &trials();
|
||||
|
||||
return std::unique_ptr<Call>(call_factory_->CreateCall(call_config));
|
||||
return std::unique_ptr<Call>(
|
||||
context_->call_factory()->CreateCall(call_config));
|
||||
}
|
||||
|
||||
bool PeerConnectionFactory::IsTrialEnabled(absl::string_view key) const {
|
||||
RTC_DCHECK(trials_);
|
||||
return absl::StartsWith(trials_->Lookup(key), "Enabled");
|
||||
return absl::StartsWith(trials().Lookup(key), "Enabled");
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "api/scoped_refptr.h"
|
||||
#include "media/sctp/sctp_transport_internal.h"
|
||||
#include "pc/channel_manager.h"
|
||||
#include "pc/connection_context.h"
|
||||
#include "rtc_base/rtc_certificate_generator.h"
|
||||
#include "rtc_base/thread.h"
|
||||
|
||||
@ -72,22 +73,22 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface {
|
||||
void StopAecDump() override;
|
||||
|
||||
SctpTransportFactoryInterface* sctp_transport_factory() {
|
||||
return sctp_factory_.get();
|
||||
return context_->sctp_transport_factory();
|
||||
}
|
||||
|
||||
virtual cricket::ChannelManager* channel_manager();
|
||||
|
||||
rtc::Thread* signaling_thread() {
|
||||
rtc::Thread* signaling_thread() const {
|
||||
// This method can be called on a different thread when the factory is
|
||||
// created in CreatePeerConnectionFactory().
|
||||
return signaling_thread_;
|
||||
return context_->signaling_thread();
|
||||
}
|
||||
rtc::Thread* worker_thread() { return worker_thread_; }
|
||||
rtc::Thread* network_thread() { return network_thread_; }
|
||||
rtc::Thread* worker_thread() const { return context_->worker_thread(); }
|
||||
rtc::Thread* network_thread() const { return context_->network_thread(); }
|
||||
|
||||
const Options& options() const { return options_; }
|
||||
const Options& options() const { return context_->options(); }
|
||||
|
||||
const WebRtcKeyValueConfig& trials() const { return *trials_.get(); }
|
||||
const WebRtcKeyValueConfig& trials() const { return context_->trials(); }
|
||||
|
||||
protected:
|
||||
// This structure allows simple management of all new dependencies being added
|
||||
@ -103,24 +104,15 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface {
|
||||
|
||||
private:
|
||||
bool IsTrialEnabled(absl::string_view key) const;
|
||||
const cricket::ChannelManager* channel_manager() const {
|
||||
return context_->channel_manager();
|
||||
}
|
||||
|
||||
std::unique_ptr<RtcEventLog> CreateRtcEventLog_w();
|
||||
std::unique_ptr<Call> CreateCall_w(RtcEventLog* event_log);
|
||||
|
||||
bool wraps_current_thread_;
|
||||
rtc::Thread* network_thread_;
|
||||
rtc::Thread* worker_thread_;
|
||||
rtc::Thread* signaling_thread_;
|
||||
std::unique_ptr<rtc::Thread> owned_network_thread_;
|
||||
std::unique_ptr<rtc::Thread> owned_worker_thread_;
|
||||
const std::unique_ptr<TaskQueueFactory> task_queue_factory_;
|
||||
Options options_;
|
||||
std::unique_ptr<cricket::ChannelManager> channel_manager_;
|
||||
const std::unique_ptr<rtc::NetworkMonitorFactory> network_monitor_factory_;
|
||||
std::unique_ptr<rtc::BasicNetworkManager> default_network_manager_;
|
||||
std::unique_ptr<rtc::BasicPacketSocketFactory> default_socket_factory_;
|
||||
std::unique_ptr<cricket::MediaEngineInterface> media_engine_;
|
||||
std::unique_ptr<webrtc::CallFactoryInterface> call_factory_;
|
||||
rtc::scoped_refptr<ConnectionContext> context_;
|
||||
std::unique_ptr<TaskQueueFactory> task_queue_factory_;
|
||||
std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory_;
|
||||
std::unique_ptr<FecControllerFactoryInterface> fec_controller_factory_;
|
||||
std::unique_ptr<NetworkStatePredictorFactoryInterface>
|
||||
@ -128,8 +120,6 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface {
|
||||
std::unique_ptr<NetworkControllerFactoryInterface>
|
||||
injected_network_controller_factory_;
|
||||
std::unique_ptr<NetEqFactory> neteq_factory_;
|
||||
std::unique_ptr<SctpTransportFactoryInterface> sctp_factory_;
|
||||
const std::unique_ptr<WebRtcKeyValueConfig> trials_;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
Reference in New Issue
Block a user