blob: ead1da9cdd3dcd5a5e84127f8f98762932b288a1 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2004 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander65c7f672016-02-12 00:05:01 -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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "pc/channelmanager.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013#include <algorithm>
Steve Anton36b29d12017-10-30 09:57:42 -070014#include <utility>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000015
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "media/base/rtpdataengine.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "rtc_base/checks.h"
18#include "rtc_base/logging.h"
Steve Antonc9e15602017-11-06 15:40:09 -080019#include "rtc_base/ptr_util.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "rtc_base/stringutils.h"
21#include "rtc_base/trace_event.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022
23namespace cricket {
24
Steve Antonc9e15602017-11-06 15:40:09 -080025ChannelManager::ChannelManager(
26 std::unique_ptr<MediaEngineInterface> media_engine,
27 std::unique_ptr<DataEngineInterface> data_engine,
28 rtc::Thread* worker_thread,
29 rtc::Thread* network_thread)
30 : media_engine_(std::move(media_engine)),
31 data_engine_(std::move(data_engine)),
32 main_thread_(rtc::Thread::Current()),
33 worker_thread_(worker_thread),
34 network_thread_(network_thread) {
35 RTC_DCHECK(data_engine_);
36 RTC_DCHECK(worker_thread_);
37 RTC_DCHECK(network_thread_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000038}
39
40ChannelManager::~ChannelManager() {
wu@webrtc.org9dba5252013-08-05 20:36:57 +000041 if (initialized_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042 Terminate();
wu@webrtc.org9dba5252013-08-05 20:36:57 +000043 }
perkjc11b1842016-03-07 17:34:13 -080044 // The media engine needs to be deleted on the worker thread for thread safe
45 // destruction,
Steve Antonc9e15602017-11-06 15:40:09 -080046 worker_thread_->Invoke<void>(RTC_FROM_HERE, [&] { media_engine_.reset(); });
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047}
48
49bool ChannelManager::SetVideoRtxEnabled(bool enable) {
50 // To be safe, this call is only allowed before initialization. Apps like
51 // Flute only have a singleton ChannelManager and we don't want this flag to
52 // be toggled between calls or when there's concurrent calls. We expect apps
53 // to enable this at startup and retain that setting for the lifetime of the
54 // app.
55 if (!initialized_) {
56 enable_rtx_ = enable;
57 return true;
58 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +010059 RTC_LOG(LS_WARNING) << "Cannot toggle rtx after initialization!";
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 return false;
61 }
62}
63
ossudedfd282016-06-14 07:12:39 -070064void ChannelManager::GetSupportedAudioSendCodecs(
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065 std::vector<AudioCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -070066 if (!media_engine_) {
67 return;
68 }
ossudedfd282016-06-14 07:12:39 -070069 *codecs = media_engine_->audio_send_codecs();
70}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071
ossudedfd282016-06-14 07:12:39 -070072void ChannelManager::GetSupportedAudioReceiveCodecs(
73 std::vector<AudioCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -070074 if (!media_engine_) {
75 return;
76 }
ossudedfd282016-06-14 07:12:39 -070077 *codecs = media_engine_->audio_recv_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000078}
79
80void ChannelManager::GetSupportedAudioRtpHeaderExtensions(
81 RtpHeaderExtensions* ext) const {
zhihuang38ede132017-06-15 12:52:32 -070082 if (!media_engine_) {
83 return;
84 }
Stefan Holmer9d69c3f2015-12-07 10:45:43 +010085 *ext = media_engine_->GetAudioCapabilities().header_extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086}
87
magjed3cf8ece2016-11-10 03:36:53 -080088void ChannelManager::GetSupportedVideoCodecs(
89 std::vector<VideoCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -070090 if (!media_engine_) {
91 return;
92 }
magjed3cf8ece2016-11-10 03:36:53 -080093 codecs->clear();
94
brandtrffc61182016-11-28 06:02:22 -080095 std::vector<VideoCodec> video_codecs = media_engine_->video_codecs();
96 for (const auto& video_codec : video_codecs) {
97 if (!enable_rtx_ &&
98 _stricmp(kRtxCodecName, video_codec.name.c_str()) == 0) {
magjed3cf8ece2016-11-10 03:36:53 -080099 continue;
100 }
brandtrffc61182016-11-28 06:02:22 -0800101 codecs->push_back(video_codec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 }
103}
104
105void ChannelManager::GetSupportedVideoRtpHeaderExtensions(
106 RtpHeaderExtensions* ext) const {
zhihuang38ede132017-06-15 12:52:32 -0700107 if (!media_engine_) {
108 return;
109 }
Stefan Holmer9d69c3f2015-12-07 10:45:43 +0100110 *ext = media_engine_->GetVideoCapabilities().header_extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111}
112
113void ChannelManager::GetSupportedDataCodecs(
114 std::vector<DataCodec>* codecs) const {
Steve Antonc9e15602017-11-06 15:40:09 -0800115 *codecs = data_engine_->data_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116}
117
118bool ChannelManager::Init() {
nisseede5da42017-01-12 05:15:36 -0800119 RTC_DCHECK(!initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 if (initialized_) {
121 return false;
122 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200123 RTC_DCHECK(network_thread_);
124 RTC_DCHECK(worker_thread_);
125 if (!network_thread_->IsCurrent()) {
126 // Do not allow invoking calls to other threads on the network thread.
Steve Antonc9e15602017-11-06 15:40:09 -0800127 network_thread_->Invoke<void>(
128 RTC_FROM_HERE, [&] { network_thread_->SetAllowBlockingCalls(false); });
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000129 }
130
zhihuang38ede132017-06-15 12:52:32 -0700131 if (media_engine_) {
Steve Antonc9e15602017-11-06 15:40:09 -0800132 initialized_ = worker_thread_->Invoke<bool>(
133 RTC_FROM_HERE, [&] { return media_engine_->Init(); });
134 RTC_DCHECK(initialized_);
135 } else {
136 initialized_ = true;
zhihuang38ede132017-06-15 12:52:32 -0700137 }
Steve Antonc9e15602017-11-06 15:40:09 -0800138 return initialized_;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000139}
140
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141void ChannelManager::Terminate() {
nisseede5da42017-01-12 05:15:36 -0800142 RTC_DCHECK(initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 if (!initialized_) {
144 return;
145 }
Steve Antonc9e15602017-11-06 15:40:09 -0800146 // Need to destroy the channels on the worker thread.
147 worker_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
148 video_channels_.clear();
149 voice_channels_.clear();
150 data_channels_.clear();
151 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152 initialized_ = false;
153}
154
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000155VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700156 webrtc::Call* call,
157 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800158 DtlsTransportInternal* rtp_transport,
159 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800160 rtc::Thread* signaling_thread,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200161 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800162 bool srtp_required,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200163 const AudioOptions& options) {
Steve Antonc9e15602017-11-06 15:40:09 -0800164 return worker_thread_->Invoke<VoiceChannel*>(RTC_FROM_HERE, [&] {
165 return CreateVoiceChannel_w(
166 call, media_config, rtp_transport, rtcp_transport, rtp_transport,
167 rtcp_transport, signaling_thread, content_name, srtp_required, options);
168 });
deadbeefe814a0d2017-02-25 18:15:09 -0800169}
170
171VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700172 webrtc::Call* call,
173 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800174 rtc::PacketTransportInternal* rtp_transport,
175 rtc::PacketTransportInternal* rtcp_transport,
176 rtc::Thread* signaling_thread,
177 const std::string& content_name,
178 bool srtp_required,
179 const AudioOptions& options) {
Steve Antonc9e15602017-11-06 15:40:09 -0800180 return worker_thread_->Invoke<VoiceChannel*>(RTC_FROM_HERE, [&] {
181 return CreateVoiceChannel_w(call, media_config, nullptr, nullptr,
182 rtp_transport, rtcp_transport, signaling_thread,
183 content_name, srtp_required, options);
184 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185}
186
Zhi Huang2dfc42d2017-12-04 13:38:48 -0800187VoiceChannel* ChannelManager::CreateVoiceChannel(
188 webrtc::Call* call,
189 const cricket::MediaConfig& media_config,
190 webrtc::RtpTransportInternal* rtp_transport,
191 rtc::Thread* signaling_thread,
192 const std::string& content_name,
193 bool srtp_required,
194 const AudioOptions& options) {
195 if (!worker_thread_->IsCurrent()) {
196 return worker_thread_->Invoke<VoiceChannel*>(RTC_FROM_HERE, [&] {
197 return CreateVoiceChannel(call, media_config, rtp_transport,
198 signaling_thread, content_name, srtp_required,
199 options);
200 });
201 }
202
203 RTC_DCHECK_RUN_ON(worker_thread_);
204 RTC_DCHECK(initialized_);
205 RTC_DCHECK(call);
206 if (!media_engine_) {
207 return nullptr;
208 }
209
210 VoiceMediaChannel* media_channel =
211 media_engine_->CreateChannel(call, media_config, options);
212 if (!media_channel) {
213 return nullptr;
214 }
215
216 auto voice_channel = rtc::MakeUnique<VoiceChannel>(
217 worker_thread_, network_thread_, signaling_thread, media_engine_.get(),
218 rtc::WrapUnique(media_channel), content_name,
219 rtp_transport->rtcp_packet_transport() == nullptr, srtp_required);
220
221 voice_channel->Init_w(rtp_transport);
222
223 VoiceChannel* voice_channel_ptr = voice_channel.get();
224 voice_channels_.push_back(std::move(voice_channel));
225 return voice_channel_ptr;
226}
227
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000228VoiceChannel* ChannelManager::CreateVoiceChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700229 webrtc::Call* call,
230 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800231 DtlsTransportInternal* rtp_dtls_transport,
232 DtlsTransportInternal* rtcp_dtls_transport,
233 rtc::PacketTransportInternal* rtp_packet_transport,
234 rtc::PacketTransportInternal* rtcp_packet_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800235 rtc::Thread* signaling_thread,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200236 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800237 bool srtp_required,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200238 const AudioOptions& options) {
Steve Antonc9e15602017-11-06 15:40:09 -0800239 RTC_DCHECK_RUN_ON(worker_thread_);
nisseede5da42017-01-12 05:15:36 -0800240 RTC_DCHECK(initialized_);
Steve Antonc9e15602017-11-06 15:40:09 -0800241 RTC_DCHECK(call);
zhihuang38ede132017-06-15 12:52:32 -0700242 if (!media_engine_) {
243 return nullptr;
244 }
zhihuangf5b251b2017-01-12 19:37:48 -0800245
nisse51542be2016-02-12 02:27:06 -0800246 VoiceMediaChannel* media_channel = media_engine_->CreateChannel(
nisseeaabdf62017-05-05 02:23:02 -0700247 call, media_config, options);
Steve Anton774115c2017-08-30 10:48:46 -0700248 if (!media_channel) {
Jelena Marusicc28a8962015-05-29 15:05:44 +0200249 return nullptr;
Steve Anton774115c2017-08-30 10:48:46 -0700250 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000251
Steve Antonc9e15602017-11-06 15:40:09 -0800252 auto voice_channel = rtc::MakeUnique<VoiceChannel>(
253 worker_thread_, network_thread_, signaling_thread, media_engine_.get(),
Steve Anton8699a322017-11-06 15:53:33 -0800254 rtc::WrapUnique(media_channel), content_name,
255 rtcp_packet_transport == nullptr, srtp_required);
256 voice_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
257 rtp_packet_transport, rtcp_packet_transport);
Steve Antonc9e15602017-11-06 15:40:09 -0800258
Steve Anton774115c2017-08-30 10:48:46 -0700259 VoiceChannel* voice_channel_ptr = voice_channel.get();
260 voice_channels_.push_back(std::move(voice_channel));
261 return voice_channel_ptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000262}
263
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200264void ChannelManager::DestroyVoiceChannel(VoiceChannel* voice_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100265 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel");
Steve Antonc9e15602017-11-06 15:40:09 -0800266 if (!voice_channel) {
267 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000268 }
Steve Antonc9e15602017-11-06 15:40:09 -0800269 if (!worker_thread_->IsCurrent()) {
270 worker_thread_->Invoke<void>(RTC_FROM_HERE,
271 [&] { DestroyVoiceChannel(voice_channel); });
272 return;
273 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000274
nisseede5da42017-01-12 05:15:36 -0800275 RTC_DCHECK(initialized_);
Steve Anton774115c2017-08-30 10:48:46 -0700276
277 auto it = std::find_if(voice_channels_.begin(), voice_channels_.end(),
278 [&](const std::unique_ptr<VoiceChannel>& p) {
279 return p.get() == voice_channel;
280 });
nisseede5da42017-01-12 05:15:36 -0800281 RTC_DCHECK(it != voice_channels_.end());
Steve Antonc9e15602017-11-06 15:40:09 -0800282 if (it == voice_channels_.end()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000283 return;
Steve Antonc9e15602017-11-06 15:40:09 -0800284 }
285
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000286 voice_channels_.erase(it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000287}
288
289VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700290 webrtc::Call* call,
291 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800292 DtlsTransportInternal* rtp_transport,
293 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800294 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000295 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800296 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200297 const VideoOptions& options) {
Steve Antonc9e15602017-11-06 15:40:09 -0800298 return worker_thread_->Invoke<VideoChannel*>(RTC_FROM_HERE, [&] {
299 return CreateVideoChannel_w(
300 call, media_config, rtp_transport, rtcp_transport, rtp_transport,
301 rtcp_transport, signaling_thread, content_name, srtp_required, options);
302 });
deadbeefe814a0d2017-02-25 18:15:09 -0800303}
304
305VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700306 webrtc::Call* call,
307 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800308 rtc::PacketTransportInternal* rtp_transport,
309 rtc::PacketTransportInternal* rtcp_transport,
310 rtc::Thread* signaling_thread,
311 const std::string& content_name,
312 bool srtp_required,
313 const VideoOptions& options) {
Steve Antonc9e15602017-11-06 15:40:09 -0800314 return worker_thread_->Invoke<VideoChannel*>(RTC_FROM_HERE, [&] {
315 return CreateVideoChannel_w(call, media_config, nullptr, nullptr,
316 rtp_transport, rtcp_transport, signaling_thread,
317 content_name, srtp_required, options);
318 });
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000319}
320
Zhi Huang2dfc42d2017-12-04 13:38:48 -0800321VideoChannel* ChannelManager::CreateVideoChannel(
322 webrtc::Call* call,
323 const cricket::MediaConfig& media_config,
324 webrtc::RtpTransportInternal* rtp_transport,
325 rtc::Thread* signaling_thread,
326 const std::string& content_name,
327 bool srtp_required,
328 const VideoOptions& options) {
329 if (!worker_thread_->IsCurrent()) {
330 return worker_thread_->Invoke<VideoChannel*>(RTC_FROM_HERE, [&] {
331 return CreateVideoChannel(call, media_config, rtp_transport,
332 signaling_thread, content_name, srtp_required,
333 options);
334 });
335 }
336
337 RTC_DCHECK_RUN_ON(worker_thread_);
338 RTC_DCHECK(initialized_);
339 RTC_DCHECK(call);
340 if (!media_engine_) {
341 return nullptr;
342 }
343
344 VideoMediaChannel* media_channel =
345 media_engine_->CreateVideoChannel(call, media_config, options);
346 if (!media_channel) {
347 return nullptr;
348 }
349
350 auto video_channel = rtc::MakeUnique<VideoChannel>(
351 worker_thread_, network_thread_, signaling_thread,
352 rtc::WrapUnique(media_channel), content_name,
353 rtp_transport->rtcp_packet_transport() == nullptr, srtp_required);
354 video_channel->Init_w(rtp_transport);
355
356 VideoChannel* video_channel_ptr = video_channel.get();
357 video_channels_.push_back(std::move(video_channel));
358 return video_channel_ptr;
359}
360
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000361VideoChannel* ChannelManager::CreateVideoChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700362 webrtc::Call* call,
363 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800364 DtlsTransportInternal* rtp_dtls_transport,
365 DtlsTransportInternal* rtcp_dtls_transport,
366 rtc::PacketTransportInternal* rtp_packet_transport,
367 rtc::PacketTransportInternal* rtcp_packet_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800368 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000369 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800370 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200371 const VideoOptions& options) {
Steve Antonc9e15602017-11-06 15:40:09 -0800372 RTC_DCHECK_RUN_ON(worker_thread_);
nisseede5da42017-01-12 05:15:36 -0800373 RTC_DCHECK(initialized_);
Steve Antonc9e15602017-11-06 15:40:09 -0800374 RTC_DCHECK(call);
Zhi Huang2dfc42d2017-12-04 13:38:48 -0800375 if (!media_engine_) {
376 return nullptr;
377 }
Steve Antonc9e15602017-11-06 15:40:09 -0800378
nisse51542be2016-02-12 02:27:06 -0800379 VideoMediaChannel* media_channel = media_engine_->CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700380 call, media_config, options);
Steve Anton774115c2017-08-30 10:48:46 -0700381 if (!media_channel) {
382 return nullptr;
deadbeefcbecd352015-09-23 11:50:27 -0700383 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000384
Steve Antonc9e15602017-11-06 15:40:09 -0800385 auto video_channel = rtc::MakeUnique<VideoChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800386 worker_thread_, network_thread_, signaling_thread,
387 rtc::WrapUnique(media_channel), content_name,
388 rtcp_packet_transport == nullptr, srtp_required);
389 video_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
390 rtp_packet_transport, rtcp_packet_transport);
Steve Antonc9e15602017-11-06 15:40:09 -0800391
Steve Anton774115c2017-08-30 10:48:46 -0700392 VideoChannel* video_channel_ptr = video_channel.get();
393 video_channels_.push_back(std::move(video_channel));
394 return video_channel_ptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395}
396
397void ChannelManager::DestroyVideoChannel(VideoChannel* video_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100398 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel");
Steve Antonc9e15602017-11-06 15:40:09 -0800399 if (!video_channel) {
400 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000401 }
Steve Antonc9e15602017-11-06 15:40:09 -0800402 if (!worker_thread_->IsCurrent()) {
403 worker_thread_->Invoke<void>(RTC_FROM_HERE,
404 [&] { DestroyVideoChannel(video_channel); });
405 return;
406 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407
nisseede5da42017-01-12 05:15:36 -0800408 RTC_DCHECK(initialized_);
Steve Anton774115c2017-08-30 10:48:46 -0700409
410 auto it = std::find_if(video_channels_.begin(), video_channels_.end(),
411 [&](const std::unique_ptr<VideoChannel>& p) {
412 return p.get() == video_channel;
413 });
nisseede5da42017-01-12 05:15:36 -0800414 RTC_DCHECK(it != video_channels_.end());
Steve Antonc9e15602017-11-06 15:40:09 -0800415 if (it == video_channels_.end()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 return;
Steve Antonc9e15602017-11-06 15:40:09 -0800417 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418
419 video_channels_.erase(it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420}
421
deadbeef953c2ce2017-01-09 14:53:41 -0800422RtpDataChannel* ChannelManager::CreateRtpDataChannel(
nisseeaabdf62017-05-05 02:23:02 -0700423 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800424 DtlsTransportInternal* rtp_transport,
425 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800426 rtc::Thread* signaling_thread,
zhihuangebbe4f22016-12-06 10:45:42 -0800427 const std::string& content_name,
deadbeef953c2ce2017-01-09 14:53:41 -0800428 bool srtp_required) {
Steve Antonc9e15602017-11-06 15:40:09 -0800429 if (!worker_thread_->IsCurrent()) {
430 return worker_thread_->Invoke<RtpDataChannel*>(RTC_FROM_HERE, [&] {
431 return CreateRtpDataChannel(media_config, rtp_transport, rtcp_transport,
432 signaling_thread, content_name,
433 srtp_required);
434 });
435 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 // This is ok to alloc from a thread other than the worker thread.
nisseede5da42017-01-12 05:15:36 -0800438 RTC_DCHECK(initialized_);
Steve Antonc9e15602017-11-06 15:40:09 -0800439 DataMediaChannel* media_channel = data_engine_->CreateChannel(media_config);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 if (!media_channel) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100441 RTC_LOG(LS_WARNING) << "Failed to create RTP data channel.";
deadbeef953c2ce2017-01-09 14:53:41 -0800442 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443 }
444
Steve Antonc9e15602017-11-06 15:40:09 -0800445 auto data_channel = rtc::MakeUnique<RtpDataChannel>(
Steve Anton8699a322017-11-06 15:53:33 -0800446 worker_thread_, network_thread_, signaling_thread,
447 rtc::WrapUnique(media_channel), content_name, rtcp_transport == nullptr,
448 srtp_required);
449 data_channel->Init_w(rtp_transport, rtcp_transport, rtp_transport,
450 rtcp_transport);
Steve Antonc9e15602017-11-06 15:40:09 -0800451
Steve Anton774115c2017-08-30 10:48:46 -0700452 RtpDataChannel* data_channel_ptr = data_channel.get();
453 data_channels_.push_back(std::move(data_channel));
454 return data_channel_ptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455}
456
Zhi Huang2dfc42d2017-12-04 13:38:48 -0800457RtpDataChannel* ChannelManager::CreateRtpDataChannel(
458 const cricket::MediaConfig& media_config,
459 webrtc::RtpTransportInternal* rtp_transport,
460 rtc::Thread* signaling_thread,
461 const std::string& content_name,
462 bool srtp_required) {
463 if (!worker_thread_->IsCurrent()) {
464 return worker_thread_->Invoke<RtpDataChannel*>(RTC_FROM_HERE, [&] {
465 return CreateRtpDataChannel(media_config, rtp_transport, signaling_thread,
466 content_name, srtp_required);
467 });
468 }
469
470 // This is ok to alloc from a thread other than the worker thread.
471 RTC_DCHECK(initialized_);
472 DataMediaChannel* media_channel = data_engine_->CreateChannel(media_config);
473 if (!media_channel) {
474 RTC_LOG(LS_WARNING) << "Failed to create RTP data channel.";
475 return nullptr;
476 }
477
478 auto data_channel = rtc::MakeUnique<RtpDataChannel>(
479 worker_thread_, network_thread_, signaling_thread,
480 rtc::WrapUnique(media_channel), content_name,
481 rtp_transport->rtcp_packet_transport() == nullptr, srtp_required);
482 data_channel->Init_w(rtp_transport);
483
484 RtpDataChannel* data_channel_ptr = data_channel.get();
485 data_channels_.push_back(std::move(data_channel));
486 return data_channel_ptr;
487}
488
deadbeef953c2ce2017-01-09 14:53:41 -0800489void ChannelManager::DestroyRtpDataChannel(RtpDataChannel* data_channel) {
490 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel");
Steve Antonc9e15602017-11-06 15:40:09 -0800491 if (!data_channel) {
492 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493 }
Steve Antonc9e15602017-11-06 15:40:09 -0800494 if (!worker_thread_->IsCurrent()) {
495 worker_thread_->Invoke<void>(
496 RTC_FROM_HERE, [&] { return DestroyRtpDataChannel(data_channel); });
497 return;
498 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499
nisseede5da42017-01-12 05:15:36 -0800500 RTC_DCHECK(initialized_);
Steve Anton774115c2017-08-30 10:48:46 -0700501
502 auto it = std::find_if(data_channels_.begin(), data_channels_.end(),
503 [&](const std::unique_ptr<RtpDataChannel>& p) {
504 return p.get() == data_channel;
505 });
nisseede5da42017-01-12 05:15:36 -0800506 RTC_DCHECK(it != data_channels_.end());
Steve Antonc9e15602017-11-06 15:40:09 -0800507 if (it == data_channels_.end()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000508 return;
Steve Antonc9e15602017-11-06 15:40:09 -0800509 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510
511 data_channels_.erase(it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000512}
513
ivocd66b44d2016-01-15 03:06:36 -0800514bool ChannelManager::StartAecDump(rtc::PlatformFile file,
515 int64_t max_size_bytes) {
Steve Antonc9e15602017-11-06 15:40:09 -0800516 return worker_thread_->Invoke<bool>(RTC_FROM_HERE, [&] {
517 return media_engine_->StartAecDump(file, max_size_bytes);
518 });
wu@webrtc.orga9890802013-12-13 00:21:03 +0000519}
520
ivoc797ef122015-10-22 03:25:41 -0700521void ChannelManager::StopAecDump() {
Steve Antonc9e15602017-11-06 15:40:09 -0800522 worker_thread_->Invoke<void>(RTC_FROM_HERE,
523 [&] { media_engine_->StopAecDump(); });
ivoc797ef122015-10-22 03:25:41 -0700524}
525
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526} // namespace cricket