OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2004 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/pc/peerconnectionfactory.h" | 11 #include "webrtc/pc/peerconnectionfactory.h" |
12 | 12 |
13 #include <utility> | 13 #include <utility> |
14 | 14 |
15 #include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" | |
16 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" | |
17 #include "webrtc/api/mediaconstraintsinterface.h" | 15 #include "webrtc/api/mediaconstraintsinterface.h" |
18 #include "webrtc/api/mediastreamproxy.h" | 16 #include "webrtc/api/mediastreamproxy.h" |
19 #include "webrtc/api/mediastreamtrackproxy.h" | 17 #include "webrtc/api/mediastreamtrackproxy.h" |
20 #include "webrtc/api/peerconnectionfactoryproxy.h" | 18 #include "webrtc/api/peerconnectionfactoryproxy.h" |
21 #include "webrtc/api/peerconnectionproxy.h" | 19 #include "webrtc/api/peerconnectionproxy.h" |
22 #include "webrtc/api/videosourceproxy.h" | 20 #include "webrtc/api/videosourceproxy.h" |
23 #include "webrtc/base/bind.h" | 21 #include "webrtc/base/bind.h" |
24 #include "webrtc/base/checks.h" | 22 #include "webrtc/base/checks.h" |
25 #include "webrtc/media/engine/webrtcmediaengine.h" | 23 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
26 #include "webrtc/media/engine/webrtcvideodecoderfactory.h" | 24 // Adding 'nogncheck' to disable the gn include headers check to support modular |
27 #include "webrtc/media/engine/webrtcvideoencoderfactory.h" | 25 // WebRTC build targets. |
28 #include "webrtc/modules/audio_device/include/audio_device.h" | 26 // TODO(deadbeef): This wouldn't be necessary if the interface and |
| 27 // implementation of the media engine were in separate build targets. |
| 28 #include "webrtc/media/engine/webrtcmediaengine.h" // nogncheck |
| 29 #include "webrtc/media/engine/webrtcvideodecoderfactory.h" // nogncheck |
| 30 #include "webrtc/media/engine/webrtcvideoencoderfactory.h" // nogncheck |
| 31 #include "webrtc/modules/audio_device/include/audio_device.h" // nogncheck |
29 #include "webrtc/p2p/base/basicpacketsocketfactory.h" | 32 #include "webrtc/p2p/base/basicpacketsocketfactory.h" |
30 #include "webrtc/p2p/client/basicportallocator.h" | 33 #include "webrtc/p2p/client/basicportallocator.h" |
31 #include "webrtc/pc/audiotrack.h" | 34 #include "webrtc/pc/audiotrack.h" |
32 #include "webrtc/pc/localaudiosource.h" | 35 #include "webrtc/pc/localaudiosource.h" |
33 #include "webrtc/pc/mediastream.h" | 36 #include "webrtc/pc/mediastream.h" |
34 #include "webrtc/pc/peerconnection.h" | 37 #include "webrtc/pc/peerconnection.h" |
35 #include "webrtc/pc/videocapturertracksource.h" | 38 #include "webrtc/pc/videocapturertracksource.h" |
36 #include "webrtc/pc/videotrack.h" | 39 #include "webrtc/pc/videotrack.h" |
37 | 40 |
38 namespace webrtc { | 41 namespace webrtc { |
39 | 42 |
40 rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory( | |
41 rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory, | |
42 rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory) { | |
43 rtc::scoped_refptr<PeerConnectionFactory> pc_factory( | |
44 new rtc::RefCountedObject<PeerConnectionFactory>(audio_encoder_factory, | |
45 audio_decoder_factory)); | |
46 | |
47 RTC_CHECK(rtc::Thread::Current() == pc_factory->signaling_thread()); | |
48 // The signaling thread is the current thread so we can | |
49 // safely call Initialize directly. | |
50 if (!pc_factory->Initialize()) { | |
51 return nullptr; | |
52 } | |
53 return PeerConnectionFactoryProxy::Create(pc_factory->signaling_thread(), | |
54 pc_factory); | |
55 } | |
56 | |
57 rtc::scoped_refptr<PeerConnectionFactoryInterface> | 43 rtc::scoped_refptr<PeerConnectionFactoryInterface> |
58 CreatePeerConnectionFactory() { | 44 CreateModularPeerConnectionFactory( |
59 return CreatePeerConnectionFactory(CreateBuiltinAudioEncoderFactory(), | |
60 CreateBuiltinAudioDecoderFactory()); | |
61 } | |
62 | |
63 rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory( | |
64 rtc::Thread* network_thread, | 45 rtc::Thread* network_thread, |
65 rtc::Thread* worker_thread, | 46 rtc::Thread* worker_thread, |
66 rtc::Thread* signaling_thread, | 47 rtc::Thread* signaling_thread, |
67 AudioDeviceModule* default_adm, | |
68 rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory, | |
69 rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory, | |
70 cricket::WebRtcVideoEncoderFactory* video_encoder_factory, | |
71 cricket::WebRtcVideoDecoderFactory* video_decoder_factory) { | |
72 return CreatePeerConnectionFactoryWithAudioMixer( | |
73 network_thread, worker_thread, signaling_thread, default_adm, | |
74 audio_encoder_factory, audio_decoder_factory, video_encoder_factory, | |
75 video_decoder_factory, nullptr); | |
76 } | |
77 | |
78 rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory( | |
79 rtc::Thread* network_thread, | |
80 rtc::Thread* worker_thread, | |
81 rtc::Thread* signaling_thread, | |
82 AudioDeviceModule* default_adm, | |
83 cricket::WebRtcVideoEncoderFactory* encoder_factory, | |
84 cricket::WebRtcVideoDecoderFactory* decoder_factory) { | |
85 return CreatePeerConnectionFactoryWithAudioMixer( | |
86 network_thread, worker_thread, signaling_thread, default_adm, | |
87 encoder_factory, decoder_factory, nullptr); | |
88 } | |
89 | |
90 rtc::scoped_refptr<PeerConnectionFactoryInterface> | |
91 CreatePeerConnectionFactoryWithAudioMixer( | |
92 rtc::Thread* network_thread, | |
93 rtc::Thread* worker_thread, | |
94 rtc::Thread* signaling_thread, | |
95 AudioDeviceModule* default_adm, | 48 AudioDeviceModule* default_adm, |
96 rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory, | 49 rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory, |
97 rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory, | 50 rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory, |
98 cricket::WebRtcVideoEncoderFactory* video_encoder_factory, | 51 cricket::WebRtcVideoEncoderFactory* video_encoder_factory, |
99 cricket::WebRtcVideoDecoderFactory* video_decoder_factory, | 52 cricket::WebRtcVideoDecoderFactory* video_decoder_factory, |
100 rtc::scoped_refptr<AudioMixer> audio_mixer) { | 53 rtc::scoped_refptr<AudioMixer> audio_mixer, |
| 54 std::unique_ptr<cricket::MediaEngineInterface> media_engine, |
| 55 std::unique_ptr<CallFactoryInterface> call_factory, |
| 56 std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory) { |
101 rtc::scoped_refptr<PeerConnectionFactory> pc_factory( | 57 rtc::scoped_refptr<PeerConnectionFactory> pc_factory( |
102 new rtc::RefCountedObject<PeerConnectionFactory>( | 58 new rtc::RefCountedObject<PeerConnectionFactory>( |
103 network_thread, worker_thread, signaling_thread, default_adm, | 59 network_thread, worker_thread, signaling_thread, default_adm, |
104 audio_encoder_factory, audio_decoder_factory, video_encoder_factory, | 60 audio_encoder_factory, audio_decoder_factory, video_encoder_factory, |
105 video_decoder_factory, audio_mixer)); | 61 video_decoder_factory, audio_mixer, std::move(media_engine), |
| 62 std::move(call_factory), std::move(event_log_factory))); |
106 | 63 |
107 // Call Initialize synchronously but make sure it is executed on | 64 // Call Initialize synchronously but make sure it is executed on |
108 // |signaling_thread|. | 65 // |signaling_thread|. |
109 MethodCall0<PeerConnectionFactory, bool> call( | 66 MethodCall0<PeerConnectionFactory, bool> call( |
110 pc_factory.get(), &PeerConnectionFactory::Initialize); | 67 pc_factory.get(), &PeerConnectionFactory::Initialize); |
111 bool result = call.Marshal(RTC_FROM_HERE, signaling_thread); | 68 bool result = call.Marshal(RTC_FROM_HERE, signaling_thread); |
112 | 69 |
113 if (!result) { | 70 if (!result) { |
114 return nullptr; | 71 return nullptr; |
115 } | 72 } |
116 return PeerConnectionFactoryProxy::Create(signaling_thread, pc_factory); | 73 return PeerConnectionFactoryProxy::Create(signaling_thread, pc_factory); |
117 } | 74 } |
118 | 75 |
119 rtc::scoped_refptr<PeerConnectionFactoryInterface> | |
120 CreatePeerConnectionFactoryWithAudioMixer( | |
121 rtc::Thread* network_thread, | |
122 rtc::Thread* worker_thread, | |
123 rtc::Thread* signaling_thread, | |
124 AudioDeviceModule* default_adm, | |
125 cricket::WebRtcVideoEncoderFactory* encoder_factory, | |
126 cricket::WebRtcVideoDecoderFactory* decoder_factory, | |
127 rtc::scoped_refptr<AudioMixer> audio_mixer) { | |
128 return CreatePeerConnectionFactoryWithAudioMixer( | |
129 network_thread, worker_thread, signaling_thread, default_adm, | |
130 CreateBuiltinAudioEncoderFactory(), CreateBuiltinAudioDecoderFactory(), | |
131 encoder_factory, decoder_factory, audio_mixer); | |
132 } | |
133 | |
134 PeerConnectionFactory::PeerConnectionFactory( | 76 PeerConnectionFactory::PeerConnectionFactory( |
135 rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory, | 77 rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory, |
136 rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory) | 78 rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory) |
137 : owns_ptrs_(true), | 79 : PeerConnectionFactory(nullptr /*network_thread*/, |
138 wraps_current_thread_(false), | 80 rtc::Thread::Create().release(), |
139 network_thread_(rtc::Thread::CreateWithSocketServer().release()), | 81 nullptr /*signaling_thread*/, |
140 worker_thread_(rtc::Thread::Create().release()), | 82 nullptr /*default_adm */, |
141 signaling_thread_(rtc::Thread::Current()), | 83 audio_encoder_factory, |
142 audio_encoder_factory_(audio_encoder_factory), | 84 audio_decoder_factory, |
143 audio_decoder_factory_(audio_decoder_factory) { | 85 nullptr /*video_encoder_factory*/, |
144 if (!signaling_thread_) { | 86 nullptr /*video_decoder_factory*/, |
145 signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread(); | 87 nullptr /*audio_mixer*/, |
146 wraps_current_thread_ = true; | 88 std::unique_ptr<cricket::MediaEngineInterface>(), |
147 } | 89 std::unique_ptr<webrtc::CallFactoryInterface>(), |
148 network_thread_->Start(); | 90 std::unique_ptr<RtcEventLogFactoryInterface>()) { |
149 worker_thread_->Start(); | 91 worker_thread_->Start(); |
150 } | 92 } |
151 | 93 |
152 PeerConnectionFactory::PeerConnectionFactory( | 94 PeerConnectionFactory::PeerConnectionFactory( |
153 rtc::Thread* network_thread, | 95 rtc::Thread* network_thread, |
154 rtc::Thread* worker_thread, | 96 rtc::Thread* worker_thread, |
155 rtc::Thread* signaling_thread, | 97 rtc::Thread* signaling_thread, |
156 AudioDeviceModule* default_adm, | 98 AudioDeviceModule* default_adm, |
157 rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory, | 99 rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory, |
158 rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory, | 100 rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory, |
159 cricket::WebRtcVideoEncoderFactory* video_encoder_factory, | 101 cricket::WebRtcVideoEncoderFactory* video_encoder_factory, |
160 cricket::WebRtcVideoDecoderFactory* video_decoder_factory, | 102 cricket::WebRtcVideoDecoderFactory* video_decoder_factory, |
161 rtc::scoped_refptr<AudioMixer> audio_mixer) | 103 rtc::scoped_refptr<AudioMixer> audio_mixer) |
| 104 : PeerConnectionFactory(network_thread, |
| 105 worker_thread, |
| 106 signaling_thread, |
| 107 default_adm, |
| 108 audio_encoder_factory, |
| 109 audio_decoder_factory, |
| 110 video_encoder_factory, |
| 111 video_decoder_factory, |
| 112 audio_mixer, |
| 113 std::unique_ptr<cricket::MediaEngineInterface>(), |
| 114 std::unique_ptr<webrtc::CallFactoryInterface>(), |
| 115 std::unique_ptr<RtcEventLogFactoryInterface>()) {} |
| 116 |
| 117 PeerConnectionFactory::PeerConnectionFactory( |
| 118 rtc::Thread* network_thread, |
| 119 rtc::Thread* worker_thread, |
| 120 rtc::Thread* signaling_thread, |
| 121 AudioDeviceModule* default_adm, |
| 122 rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory, |
| 123 rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory, |
| 124 cricket::WebRtcVideoEncoderFactory* video_encoder_factory, |
| 125 cricket::WebRtcVideoDecoderFactory* video_decoder_factory, |
| 126 rtc::scoped_refptr<AudioMixer> audio_mixer, |
| 127 std::unique_ptr<cricket::MediaEngineInterface> media_engine, |
| 128 std::unique_ptr<webrtc::CallFactoryInterface> call_factory, |
| 129 std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory) |
162 : owns_ptrs_(false), | 130 : owns_ptrs_(false), |
163 wraps_current_thread_(false), | 131 wraps_current_thread_(false), |
164 network_thread_(network_thread), | 132 network_thread_(network_thread), |
165 worker_thread_(worker_thread), | 133 worker_thread_(worker_thread), |
166 signaling_thread_(signaling_thread), | 134 signaling_thread_(signaling_thread), |
167 default_adm_(default_adm), | 135 default_adm_(default_adm), |
168 audio_encoder_factory_(audio_encoder_factory), | 136 audio_encoder_factory_(audio_encoder_factory), |
169 audio_decoder_factory_(audio_decoder_factory), | 137 audio_decoder_factory_(audio_decoder_factory), |
170 video_encoder_factory_(video_encoder_factory), | 138 video_encoder_factory_(video_encoder_factory), |
171 video_decoder_factory_(video_decoder_factory), | 139 video_decoder_factory_(video_decoder_factory), |
172 external_audio_mixer_(audio_mixer) { | 140 external_audio_mixer_(audio_mixer), |
173 RTC_DCHECK(network_thread); | 141 media_engine_(std::move(media_engine)), |
| 142 call_factory_(std::move(call_factory)), |
| 143 event_log_factory_(std::move(event_log_factory)) { |
174 RTC_DCHECK(worker_thread); | 144 RTC_DCHECK(worker_thread); |
175 RTC_DCHECK(signaling_thread); | 145 |
| 146 // Create the threads internally and own them. |
| 147 if (!network_thread || !signaling_thread) { |
| 148 owns_ptrs_ = true; |
| 149 network_thread_ = rtc::Thread::CreateWithSocketServer().release(); |
| 150 signaling_thread_ = rtc::Thread::Current(); |
| 151 |
| 152 if (!signaling_thread_) { |
| 153 signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread(); |
| 154 wraps_current_thread_ = true; |
| 155 } |
| 156 network_thread_->Start(); |
| 157 } |
| 158 |
176 // TODO: Currently there is no way creating an external adm in | 159 // TODO: Currently there is no way creating an external adm in |
177 // libjingle source tree. So we can 't currently assert if this is NULL. | 160 // libjingle source tree. So we can 't currently assert if this is NULL. |
178 // RTC_DCHECK(default_adm != NULL); | 161 // RTC_DCHECK(default_adm != NULL); |
179 } | 162 } |
180 | 163 |
181 PeerConnectionFactory::~PeerConnectionFactory() { | 164 PeerConnectionFactory::~PeerConnectionFactory() { |
182 RTC_DCHECK(signaling_thread_->IsCurrent()); | 165 RTC_DCHECK(signaling_thread_->IsCurrent()); |
183 channel_manager_.reset(nullptr); | 166 channel_manager_.reset(nullptr); |
184 | 167 |
185 // Make sure |worker_thread_| and |signaling_thread_| outlive | 168 // Make sure |worker_thread_| and |signaling_thread_| outlive |
(...skipping 17 matching lines...) Expand all Loading... |
203 if (!default_network_manager_) { | 186 if (!default_network_manager_) { |
204 return false; | 187 return false; |
205 } | 188 } |
206 | 189 |
207 default_socket_factory_.reset( | 190 default_socket_factory_.reset( |
208 new rtc::BasicPacketSocketFactory(network_thread_)); | 191 new rtc::BasicPacketSocketFactory(network_thread_)); |
209 if (!default_socket_factory_) { | 192 if (!default_socket_factory_) { |
210 return false; | 193 return false; |
211 } | 194 } |
212 | 195 |
213 std::unique_ptr<cricket::MediaEngineInterface> media_engine = | |
214 worker_thread_->Invoke<std::unique_ptr<cricket::MediaEngineInterface>>( | |
215 RTC_FROM_HERE, | |
216 rtc::Bind(&PeerConnectionFactory::CreateMediaEngine_w, this)); | |
217 | |
218 channel_manager_.reset(new cricket::ChannelManager( | 196 channel_manager_.reset(new cricket::ChannelManager( |
219 std::move(media_engine), worker_thread_, network_thread_)); | 197 std::move(media_engine_), worker_thread_, network_thread_)); |
220 | 198 |
221 channel_manager_->SetVideoRtxEnabled(true); | 199 channel_manager_->SetVideoRtxEnabled(true); |
222 if (!channel_manager_->Init()) { | 200 if (!channel_manager_->Init()) { |
223 return false; | 201 return false; |
224 } | 202 } |
225 | 203 |
226 return true; | 204 return true; |
227 } | 205 } |
228 | 206 |
229 void PeerConnectionFactory::SetOptions(const Options& options) { | 207 void PeerConnectionFactory::SetOptions(const Options& options) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 } | 291 } |
314 | 292 |
315 if (!allocator) { | 293 if (!allocator) { |
316 allocator.reset(new cricket::BasicPortAllocator( | 294 allocator.reset(new cricket::BasicPortAllocator( |
317 default_network_manager_.get(), default_socket_factory_.get())); | 295 default_network_manager_.get(), default_socket_factory_.get())); |
318 } | 296 } |
319 network_thread_->Invoke<void>( | 297 network_thread_->Invoke<void>( |
320 RTC_FROM_HERE, rtc::Bind(&cricket::PortAllocator::SetNetworkIgnoreMask, | 298 RTC_FROM_HERE, rtc::Bind(&cricket::PortAllocator::SetNetworkIgnoreMask, |
321 allocator.get(), options_.network_ignore_mask)); | 299 allocator.get(), options_.network_ignore_mask)); |
322 | 300 |
| 301 std::unique_ptr<RtcEventLog> event_log(new RtcEventLogNullImpl()); |
| 302 if (event_log_factory_) { |
| 303 event_log = event_log_factory_->CreateRtcEventLog(); |
| 304 } |
| 305 |
| 306 std::unique_ptr<Call> call = worker_thread_->Invoke<std::unique_ptr<Call>>( |
| 307 RTC_FROM_HERE, |
| 308 rtc::Bind(&PeerConnectionFactory::CreateCall_w, this, event_log.get())); |
| 309 |
323 rtc::scoped_refptr<PeerConnection> pc( | 310 rtc::scoped_refptr<PeerConnection> pc( |
324 new rtc::RefCountedObject<PeerConnection>(this)); | 311 new rtc::RefCountedObject<PeerConnection>(this, std::move(event_log), |
| 312 std::move(call))); |
325 | 313 |
326 if (!pc->Initialize(configuration, std::move(allocator), | 314 if (!pc->Initialize(configuration, std::move(allocator), |
327 std::move(cert_generator), observer)) { | 315 std::move(cert_generator), observer)) { |
328 return nullptr; | 316 return nullptr; |
329 } | 317 } |
330 return PeerConnectionProxy::Create(signaling_thread(), pc); | 318 return PeerConnectionProxy::Create(signaling_thread(), pc); |
331 } | 319 } |
332 | 320 |
333 rtc::scoped_refptr<MediaStreamInterface> | 321 rtc::scoped_refptr<MediaStreamInterface> |
334 PeerConnectionFactory::CreateLocalMediaStream(const std::string& label) { | 322 PeerConnectionFactory::CreateLocalMediaStream(const std::string& label) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 } | 362 } |
375 | 363 |
376 rtc::Thread* PeerConnectionFactory::worker_thread() { | 364 rtc::Thread* PeerConnectionFactory::worker_thread() { |
377 return worker_thread_; | 365 return worker_thread_; |
378 } | 366 } |
379 | 367 |
380 rtc::Thread* PeerConnectionFactory::network_thread() { | 368 rtc::Thread* PeerConnectionFactory::network_thread() { |
381 return network_thread_; | 369 return network_thread_; |
382 } | 370 } |
383 | 371 |
384 std::unique_ptr<cricket::MediaEngineInterface> | 372 std::unique_ptr<Call> PeerConnectionFactory::CreateCall_w( |
385 PeerConnectionFactory::CreateMediaEngine_w() { | 373 RtcEventLog* event_log) { |
386 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); | 374 const int kMinBandwidthBps = 30000; |
387 return std::unique_ptr<cricket::MediaEngineInterface>( | 375 const int kStartBandwidthBps = 300000; |
388 cricket::WebRtcMediaEngineFactory::Create( | 376 const int kMaxBandwidthBps = 2000000; |
389 default_adm_.get(), audio_encoder_factory_, | 377 |
390 audio_decoder_factory_, | 378 webrtc::Call::Config call_config(event_log); |
391 video_encoder_factory_.get(), video_decoder_factory_.get(), | 379 if (!channel_manager_->media_engine() || !call_factory_) { |
392 external_audio_mixer_)); | 380 return nullptr; |
| 381 } |
| 382 call_config.audio_state = channel_manager_->media_engine()->GetAudioState(); |
| 383 call_config.bitrate_config.min_bitrate_bps = kMinBandwidthBps; |
| 384 call_config.bitrate_config.start_bitrate_bps = kStartBandwidthBps; |
| 385 call_config.bitrate_config.max_bitrate_bps = kMaxBandwidthBps; |
| 386 |
| 387 return std::unique_ptr<Call>(call_factory_->CreateCall(call_config)); |
393 } | 388 } |
394 | 389 |
395 } // namespace webrtc | 390 } // namespace webrtc |
OLD | NEW |