blob: 08007180afeda1d82c7e5ee71ab537d8e8c4cc02 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2004 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#include "pc/peer_connection_factory.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012
Ying Wang0810a7c2019-04-10 13:48:24 +020013#include <memory>
kwiberg0eb15ed2015-12-17 03:04:15 -080014#include <utility>
Florent Castelli72b751a2018-06-28 14:09:33 +020015#include <vector>
kwiberg0eb15ed2015-12-17 03:04:15 -080016
Ying Wang0dd1b0a2018-02-20 12:50:27 +010017#include "api/fec_controller.h"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "api/media_stream_proxy.h"
19#include "api/media_stream_track_proxy.h"
Ying Wang0810a7c2019-04-10 13:48:24 +020020#include "api/network_state_predictor.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "api/peer_connection_factory_proxy.h"
22#include "api/peer_connection_proxy.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020023#include "api/rtc_event_log/rtc_event_log.h"
Niels Möller65f17ca2019-09-12 13:59:36 +020024#include "api/transport/media/media_transport_interface.h"
Steve Anton10542f22019-01-11 09:11:00 -080025#include "api/turn_customizer.h"
Elad Alon9cfdb202019-08-13 10:48:48 +020026#include "api/units/data_rate.h"
Steve Anton10542f22019-01-11 09:11:00 -080027#include "api/video_track_source_proxy.h"
Steve Anton10542f22019-01-11 09:11:00 -080028#include "media/base/rtp_data_engine.h"
29#include "media/sctp/sctp_transport.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "p2p/base/basic_packet_socket_factory.h"
31#include "p2p/client/basic_port_allocator.h"
32#include "pc/audio_track.h"
33#include "pc/local_audio_source.h"
34#include "pc/media_stream.h"
35#include "pc/peer_connection.h"
Ying Wang0810a7c2019-04-10 13:48:24 +020036#include "pc/rtp_parameters_conversion.h"
Steve Anton10542f22019-01-11 09:11:00 -080037#include "pc/video_track.h"
Ying Wang0810a7c2019-04-10 13:48:24 +020038#include "rtc_base/bind.h"
39#include "rtc_base/checks.h"
Elad Alon9cfdb202019-08-13 10:48:48 +020040#include "rtc_base/experiments/field_trial_parser.h"
41#include "rtc_base/experiments/field_trial_units.h"
42#include "rtc_base/numerics/safe_conversions.h"
Niels Möllere8e4dc42019-06-11 14:04:16 +020043#include "rtc_base/system/file_wrapper.h"
Bjorn Tereliusb26cf2f2018-10-26 20:39:33 +020044#include "system_wrappers/include/field_trial.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046namespace webrtc {
47
kwiberg1e4e8cb2017-01-31 01:48:08 -080048rtc::scoped_refptr<PeerConnectionFactoryInterface>
zhihuang38ede132017-06-15 12:52:32 -070049CreateModularPeerConnectionFactory(
Benjamin Wright5234a492018-05-29 15:04:32 -070050 PeerConnectionFactoryDependencies dependencies) {
gyzhou95aa9642016-12-13 14:06:26 -080051 rtc::scoped_refptr<PeerConnectionFactory> pc_factory(
52 new rtc::RefCountedObject<PeerConnectionFactory>(
Benjamin Wright5234a492018-05-29 15:04:32 -070053 std::move(dependencies)));
gyzhou95aa9642016-12-13 14:06:26 -080054 // Call Initialize synchronously but make sure it is executed on
55 // |signaling_thread|.
56 MethodCall0<PeerConnectionFactory, bool> call(
57 pc_factory.get(), &PeerConnectionFactory::Initialize);
zhihuang38ede132017-06-15 12:52:32 -070058 bool result = call.Marshal(RTC_FROM_HERE, pc_factory->signaling_thread());
gyzhou95aa9642016-12-13 14:06:26 -080059
60 if (!result) {
61 return nullptr;
62 }
zhihuang38ede132017-06-15 12:52:32 -070063 return PeerConnectionFactoryProxy::Create(pc_factory->signaling_thread(),
64 pc_factory);
kwiberg1e4e8cb2017-01-31 01:48:08 -080065}
66
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067PeerConnectionFactory::PeerConnectionFactory(
Danil Chapovalovf5258be2019-03-19 17:45:24 +010068 PeerConnectionFactoryDependencies dependencies)
zhihuang38ede132017-06-15 12:52:32 -070069 : wraps_current_thread_(false),
Danil Chapovalovf5258be2019-03-19 17:45:24 +010070 network_thread_(dependencies.network_thread),
71 worker_thread_(dependencies.worker_thread),
72 signaling_thread_(dependencies.signaling_thread),
Danil Chapovalov9435c612019-04-01 10:33:16 +020073 task_queue_factory_(std::move(dependencies.task_queue_factory)),
Danil Chapovalovf5258be2019-03-19 17:45:24 +010074 media_engine_(std::move(dependencies.media_engine)),
75 call_factory_(std::move(dependencies.call_factory)),
76 event_log_factory_(std::move(dependencies.event_log_factory)),
77 fec_controller_factory_(std::move(dependencies.fec_controller_factory)),
Ying Wang0810a7c2019-04-10 13:48:24 +020078 network_state_predictor_factory_(
79 std::move(dependencies.network_state_predictor_factory)),
Sebastian Janssondfce03a2018-05-18 18:05:10 +020080 injected_network_controller_factory_(
Danil Chapovalovf5258be2019-03-19 17:45:24 +010081 std::move(dependencies.network_controller_factory)),
82 media_transport_factory_(
83 std::move(dependencies.media_transport_factory)) {
zhihuang38ede132017-06-15 12:52:32 -070084 if (!network_thread_) {
85 owned_network_thread_ = rtc::Thread::CreateWithSocketServer();
Sebastian Jansson13f35ec2017-11-13 10:54:45 +010086 owned_network_thread_->SetName("pc_network_thread", nullptr);
zhihuang38ede132017-06-15 12:52:32 -070087 owned_network_thread_->Start();
88 network_thread_ = owned_network_thread_.get();
89 }
90
91 if (!worker_thread_) {
92 owned_worker_thread_ = rtc::Thread::Create();
Sebastian Jansson13f35ec2017-11-13 10:54:45 +010093 owned_worker_thread_->SetName("pc_worker_thread", nullptr);
zhihuang38ede132017-06-15 12:52:32 -070094 owned_worker_thread_->Start();
95 worker_thread_ = owned_worker_thread_.get();
96 }
97
98 if (!signaling_thread_) {
99 signaling_thread_ = rtc::Thread::Current();
100 if (!signaling_thread_) {
101 // If this thread isn't already wrapped by an rtc::Thread, create a
102 // wrapper and own it in this class.
103 signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread();
104 wraps_current_thread_ = true;
105 }
106 }
Piotr (Peter) Slatalae0c2e972018-10-08 09:43:21 -0700107}
Benjamin Wright5234a492018-05-29 15:04:32 -0700108
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109PeerConnectionFactory::~PeerConnectionFactory() {
henrikg91d6ede2015-09-17 00:24:34 -0700110 RTC_DCHECK(signaling_thread_->IsCurrent());
Henrik Boström5e56c592015-08-11 10:33:13 +0200111 channel_manager_.reset(nullptr);
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000112
113 // Make sure |worker_thread_| and |signaling_thread_| outlive
Henrik Boströmcebf0a22016-06-01 15:45:30 +0200114 // |default_socket_factory_| and |default_network_manager_|.
deadbeef41b07982015-12-01 15:01:24 -0800115 default_socket_factory_ = nullptr;
116 default_network_manager_ = nullptr;
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000117
zhihuang38ede132017-06-15 12:52:32 -0700118 if (wraps_current_thread_)
119 rtc::ThreadManager::Instance()->UnwrapCurrentThread();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120}
121
122bool PeerConnectionFactory::Initialize() {
henrikg91d6ede2015-09-17 00:24:34 -0700123 RTC_DCHECK(signaling_thread_->IsCurrent());
Honghai Zhang82d78622016-05-06 11:29:15 -0700124 rtc::InitRandom(rtc::Time32());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125
deadbeef41b07982015-12-01 15:01:24 -0800126 default_network_manager_.reset(new rtc::BasicNetworkManager());
127 if (!default_network_manager_) {
128 return false;
129 }
130
131 default_socket_factory_.reset(
danilchape9021a32016-05-17 01:52:02 -0700132 new rtc::BasicPacketSocketFactory(network_thread_));
deadbeef41b07982015-12-01 15:01:24 -0800133 if (!default_socket_factory_) {
134 return false;
135 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200137 channel_manager_ = std::make_unique<cricket::ChannelManager>(
138 std::move(media_engine_), std::make_unique<cricket::RtpDataEngine>(),
Steve Antonc9e15602017-11-06 15:40:09 -0800139 worker_thread_, network_thread_);
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000140
stefan@webrtc.org85d27942014-06-09 12:51:39 +0000141 channel_manager_->SetVideoRtxEnabled(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 if (!channel_manager_->Init()) {
143 return false;
144 }
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +0000145
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000146 return true;
147}
148
jbauchcb560652016-08-04 05:20:32 -0700149void PeerConnectionFactory::SetOptions(const Options& options) {
150 options_ = options;
jbauchcb560652016-08-04 05:20:32 -0700151}
152
Florent Castelli72b751a2018-06-28 14:09:33 +0200153RtpCapabilities PeerConnectionFactory::GetRtpSenderCapabilities(
154 cricket::MediaType kind) const {
155 RTC_DCHECK_RUN_ON(signaling_thread_);
156 switch (kind) {
157 case cricket::MEDIA_TYPE_AUDIO: {
158 cricket::AudioCodecs cricket_codecs;
159 cricket::RtpHeaderExtensions cricket_extensions;
160 channel_manager_->GetSupportedAudioSendCodecs(&cricket_codecs);
161 channel_manager_->GetSupportedAudioRtpHeaderExtensions(
162 &cricket_extensions);
163 return ToRtpCapabilities(cricket_codecs, cricket_extensions);
164 }
165 case cricket::MEDIA_TYPE_VIDEO: {
166 cricket::VideoCodecs cricket_codecs;
167 cricket::RtpHeaderExtensions cricket_extensions;
168 channel_manager_->GetSupportedVideoCodecs(&cricket_codecs);
169 channel_manager_->GetSupportedVideoRtpHeaderExtensions(
170 &cricket_extensions);
171 return ToRtpCapabilities(cricket_codecs, cricket_extensions);
172 }
173 case cricket::MEDIA_TYPE_DATA:
174 return RtpCapabilities();
175 }
176 // Not reached; avoids compile warning.
177 FATAL();
178}
179
180RtpCapabilities PeerConnectionFactory::GetRtpReceiverCapabilities(
181 cricket::MediaType kind) const {
182 RTC_DCHECK_RUN_ON(signaling_thread_);
183 switch (kind) {
184 case cricket::MEDIA_TYPE_AUDIO: {
185 cricket::AudioCodecs cricket_codecs;
186 cricket::RtpHeaderExtensions cricket_extensions;
187 channel_manager_->GetSupportedAudioReceiveCodecs(&cricket_codecs);
188 channel_manager_->GetSupportedAudioRtpHeaderExtensions(
189 &cricket_extensions);
190 return ToRtpCapabilities(cricket_codecs, cricket_extensions);
191 }
192 case cricket::MEDIA_TYPE_VIDEO: {
193 cricket::VideoCodecs cricket_codecs;
194 cricket::RtpHeaderExtensions cricket_extensions;
195 channel_manager_->GetSupportedVideoCodecs(&cricket_codecs);
196 channel_manager_->GetSupportedVideoRtpHeaderExtensions(
197 &cricket_extensions);
198 return ToRtpCapabilities(cricket_codecs, cricket_extensions);
199 }
200 case cricket::MEDIA_TYPE_DATA:
201 return RtpCapabilities();
202 }
203 // Not reached; avoids compile warning.
204 FATAL();
205}
206
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000207rtc::scoped_refptr<AudioSourceInterface>
htaa2a49d92016-03-04 02:51:39 -0800208PeerConnectionFactory::CreateAudioSource(const cricket::AudioOptions& options) {
209 RTC_DCHECK(signaling_thread_->IsCurrent());
210 rtc::scoped_refptr<LocalAudioSource> source(
deadbeef757146b2017-02-10 21:26:48 -0800211 LocalAudioSource::Create(&options));
htaa2a49d92016-03-04 02:51:39 -0800212 return source;
213}
214
Niels Möllere8e4dc42019-06-11 14:04:16 +0200215bool PeerConnectionFactory::StartAecDump(FILE* file, int64_t max_size_bytes) {
216 RTC_DCHECK(signaling_thread_->IsCurrent());
217 return channel_manager_->StartAecDump(FileWrapper(file), max_size_bytes);
218}
219
ivoc797ef122015-10-22 03:25:41 -0700220void PeerConnectionFactory::StopAecDump() {
221 RTC_DCHECK(signaling_thread_->IsCurrent());
222 channel_manager_->StopAecDump();
223}
224
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000225rtc::scoped_refptr<PeerConnectionInterface>
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000226PeerConnectionFactory::CreatePeerConnection(
htaa2a49d92016-03-04 02:51:39 -0800227 const PeerConnectionInterface::RTCConfiguration& configuration,
kwibergd1fe2812016-04-27 06:47:29 -0700228 std::unique_ptr<cricket::PortAllocator> allocator,
Henrik Boströmd03c23b2016-06-01 11:44:18 +0200229 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
htaa2a49d92016-03-04 02:51:39 -0800230 PeerConnectionObserver* observer) {
Patrik Höglund662e31f2019-09-05 14:35:04 +0200231 // Convert the legacy API into the new dependency structure.
Benjamin Wright6f7e6d62018-05-02 13:46:31 -0700232 PeerConnectionDependencies dependencies(observer);
233 dependencies.allocator = std::move(allocator);
234 dependencies.cert_generator = std::move(cert_generator);
235 // Pass that into the new API.
236 return CreatePeerConnection(configuration, std::move(dependencies));
237}
238
239rtc::scoped_refptr<PeerConnectionInterface>
240PeerConnectionFactory::CreatePeerConnection(
241 const PeerConnectionInterface::RTCConfiguration& configuration,
242 PeerConnectionDependencies dependencies) {
htaa2a49d92016-03-04 02:51:39 -0800243 RTC_DCHECK(signaling_thread_->IsCurrent());
Patrik Höglund662e31f2019-09-05 14:35:04 +0200244 RTC_DCHECK(!(dependencies.allocator && dependencies.packet_socket_factory))
245 << "You can't set both allocator and packet_socket_factory; "
246 "the former is going away (see bugs.webrtc.org/7447";
htaa2a49d92016-03-04 02:51:39 -0800247
Benjamin Wright6f7e6d62018-05-02 13:46:31 -0700248 // Set internal defaults if optional dependencies are not set.
249 if (!dependencies.cert_generator) {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200250 dependencies.cert_generator =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200251 std::make_unique<rtc::RTCCertificateGenerator>(signaling_thread_,
252 network_thread_);
deadbeef41b07982015-12-01 15:01:24 -0800253 }
Benjamin Wright6f7e6d62018-05-02 13:46:31 -0700254 if (!dependencies.allocator) {
Patrik Höglund662e31f2019-09-05 14:35:04 +0200255 rtc::PacketSocketFactory* packet_socket_factory;
256 if (dependencies.packet_socket_factory)
257 packet_socket_factory = dependencies.packet_socket_factory.get();
258 else
259 packet_socket_factory = default_socket_factory_.get();
260
Qingsi Wang7852d292018-10-31 11:17:07 -0700261 network_thread_->Invoke<void>(RTC_FROM_HERE, [this, &configuration,
Patrik Höglund662e31f2019-09-05 14:35:04 +0200262 &dependencies,
263 &packet_socket_factory]() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200264 dependencies.allocator = std::make_unique<cricket::BasicPortAllocator>(
Patrik Höglund662e31f2019-09-05 14:35:04 +0200265 default_network_manager_.get(), packet_socket_factory,
Qingsi Wang7852d292018-10-31 11:17:07 -0700266 configuration.turn_customizer);
267 });
jonasoc251cb12017-08-29 03:20:58 -0700268 }
Benjamin Wright6f7e6d62018-05-02 13:46:31 -0700269
Zach Steine20867f2018-08-02 13:20:15 -0700270 // TODO(zstein): Once chromium injects its own AsyncResolverFactory, set
271 // |dependencies.async_resolver_factory| to a new
272 // |rtc::BasicAsyncResolverFactory| if no factory is provided.
273
jonasoc251cb12017-08-29 03:20:58 -0700274 network_thread_->Invoke<void>(
Benjamin Wright6f7e6d62018-05-02 13:46:31 -0700275 RTC_FROM_HERE,
276 rtc::Bind(&cricket::PortAllocator::SetNetworkIgnoreMask,
277 dependencies.allocator.get(), options_.network_ignore_mask));
jonasoc251cb12017-08-29 03:20:58 -0700278
eladalon393a9f62017-09-05 04:30:30 -0700279 std::unique_ptr<RtcEventLog> event_log =
eladalon248fd4f2017-09-06 05:18:15 -0700280 worker_thread_->Invoke<std::unique_ptr<RtcEventLog>>(
281 RTC_FROM_HERE,
282 rtc::Bind(&PeerConnectionFactory::CreateRtcEventLog_w, this));
maxmorine9ef9072017-08-29 04:49:00 -0700283
zhihuang38ede132017-06-15 12:52:32 -0700284 std::unique_ptr<Call> call = worker_thread_->Invoke<std::unique_ptr<Call>>(
285 RTC_FROM_HERE,
286 rtc::Bind(&PeerConnectionFactory::CreateCall_w, this, event_log.get()));
287
deadbeef41b07982015-12-01 15:01:24 -0800288 rtc::scoped_refptr<PeerConnection> pc(
zhihuang38ede132017-06-15 12:52:32 -0700289 new rtc::RefCountedObject<PeerConnection>(this, std::move(event_log),
290 std::move(call)));
Harald Alvestrand19793842018-06-25 12:03:50 +0200291 ActionsBeforeInitializeForTesting(pc);
Benjamin Wrightcab58882018-05-02 15:12:47 -0700292 if (!pc->Initialize(configuration, std::move(dependencies))) {
deadbeef41b07982015-12-01 15:01:24 -0800293 return nullptr;
294 }
295 return PeerConnectionProxy::Create(signaling_thread(), pc);
296}
297
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000298rtc::scoped_refptr<MediaStreamInterface>
Seth Hampson845e8782018-03-02 11:34:10 -0800299PeerConnectionFactory::CreateLocalMediaStream(const std::string& stream_id) {
henrikg91d6ede2015-09-17 00:24:34 -0700300 RTC_DCHECK(signaling_thread_->IsCurrent());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000301 return MediaStreamProxy::Create(signaling_thread_,
Seth Hampson845e8782018-03-02 11:34:10 -0800302 MediaStream::Create(stream_id));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000303}
304
perkja3ede6c2016-03-08 01:27:48 +0100305rtc::scoped_refptr<VideoTrackInterface> PeerConnectionFactory::CreateVideoTrack(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000306 const std::string& id,
perkja3ede6c2016-03-08 01:27:48 +0100307 VideoTrackSourceInterface* source) {
henrikg91d6ede2015-09-17 00:24:34 -0700308 RTC_DCHECK(signaling_thread_->IsCurrent());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000309 rtc::scoped_refptr<VideoTrackInterface> track(
perkj773be362017-07-31 23:22:01 -0700310 VideoTrack::Create(id, source, worker_thread_));
nisse5b68ab52016-04-07 07:45:54 -0700311 return VideoTrackProxy::Create(signaling_thread_, worker_thread_, track);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000312}
313
Yves Gerey665174f2018-06-19 15:03:05 +0200314rtc::scoped_refptr<AudioTrackInterface> PeerConnectionFactory::CreateAudioTrack(
315 const std::string& id,
316 AudioSourceInterface* source) {
henrikg91d6ede2015-09-17 00:24:34 -0700317 RTC_DCHECK(signaling_thread_->IsCurrent());
tommi6eca7e32015-12-15 04:27:11 -0800318 rtc::scoped_refptr<AudioTrackInterface> track(AudioTrack::Create(id, source));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000319 return AudioTrackProxy::Create(signaling_thread_, track);
320}
321
Steve Antonda6c0952017-10-23 11:41:54 -0700322std::unique_ptr<cricket::SctpTransportInternalFactory>
323PeerConnectionFactory::CreateSctpTransportInternalFactory() {
324#ifdef HAVE_SCTP
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200325 return std::make_unique<cricket::SctpTransportFactory>(network_thread());
Steve Antonda6c0952017-10-23 11:41:54 -0700326#else
327 return nullptr;
328#endif
329}
330
nisseeaabdf62017-05-05 02:23:02 -0700331cricket::ChannelManager* PeerConnectionFactory::channel_manager() {
332 return channel_manager_.get();
333}
334
eladalon248fd4f2017-09-06 05:18:15 -0700335std::unique_ptr<RtcEventLog> PeerConnectionFactory::CreateRtcEventLog_w() {
eladalon591753b2017-09-06 12:33:43 -0700336 RTC_DCHECK_RUN_ON(worker_thread_);
Bjorn Tereliusb26cf2f2018-10-26 20:39:33 +0200337
338 auto encoding_type = RtcEventLog::EncodingType::Legacy;
339 if (field_trial::IsEnabled("WebRTC-RtcEventLogNewFormat"))
340 encoding_type = RtcEventLog::EncodingType::NewFormat;
Elad Alon4a87e1c2017-10-03 16:11:34 +0200341 return event_log_factory_
342 ? event_log_factory_->CreateRtcEventLog(encoding_type)
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200343 : std::make_unique<RtcEventLogNull>();
eladalon248fd4f2017-09-06 05:18:15 -0700344}
345
zhihuang38ede132017-06-15 12:52:32 -0700346std::unique_ptr<Call> PeerConnectionFactory::CreateCall_w(
347 RtcEventLog* event_log) {
eladalon591753b2017-09-06 12:33:43 -0700348 RTC_DCHECK_RUN_ON(worker_thread_);
349
zhihuang38ede132017-06-15 12:52:32 -0700350 webrtc::Call::Config call_config(event_log);
351 if (!channel_manager_->media_engine() || !call_factory_) {
352 return nullptr;
353 }
Sebastian Jansson6eb8a162018-11-16 11:29:55 +0100354 call_config.audio_state =
355 channel_manager_->media_engine()->voice().GetAudioState();
Elad Alon9cfdb202019-08-13 10:48:48 +0200356
357 FieldTrialParameter<DataRate> min_bandwidth("min", DataRate::kbps(30));
358 FieldTrialParameter<DataRate> start_bandwidth("start", DataRate::kbps(300));
359 FieldTrialParameter<DataRate> max_bandwidth("max", DataRate::kbps(2000));
360 ParseFieldTrial({&min_bandwidth, &start_bandwidth, &max_bandwidth},
361 field_trial::FindFullName("WebRTC-PcFactoryDefaultBitrates"));
362
363 call_config.bitrate_config.min_bitrate_bps =
364 rtc::saturated_cast<int>(min_bandwidth->bps());
365 call_config.bitrate_config.start_bitrate_bps =
366 rtc::saturated_cast<int>(start_bandwidth->bps());
367 call_config.bitrate_config.max_bitrate_bps =
368 rtc::saturated_cast<int>(max_bandwidth->bps());
zhihuang38ede132017-06-15 12:52:32 -0700369
Ying Wang0dd1b0a2018-02-20 12:50:27 +0100370 call_config.fec_controller_factory = fec_controller_factory_.get();
Danil Chapovalov9435c612019-04-01 10:33:16 +0200371 call_config.task_queue_factory = task_queue_factory_.get();
Ying Wang0810a7c2019-04-10 13:48:24 +0200372 call_config.network_state_predictor_factory =
373 network_state_predictor_factory_.get();
Ying Wang0dd1b0a2018-02-20 12:50:27 +0100374
Sebastian Jansson7f577882018-12-20 09:46:29 +0100375 if (field_trial::IsEnabled("WebRTC-Bwe-InjectedCongestionController")) {
Sebastian Janssondfce03a2018-05-18 18:05:10 +0200376 RTC_LOG(LS_INFO) << "Using injected network controller factory";
377 call_config.network_controller_factory =
378 injected_network_controller_factory_.get();
379 } else {
380 RTC_LOG(LS_INFO) << "Using default network controller factory";
381 }
382
zhihuang38ede132017-06-15 12:52:32 -0700383 return std::unique_ptr<Call>(call_factory_->CreateCall(call_config));
384}
385
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386} // namespace webrtc