blob: 368cf450b302694d6e6d9047fc6c47a16a9d0e1d [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
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010011#include "webrtc/pc/channelmanager.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013#include <algorithm>
14
kjellandera96e2d72016-02-04 23:52:28 -080015#include "webrtc/media/base/device.h"
kjellandera96e2d72016-02-04 23:52:28 -080016#include "webrtc/media/base/rtpdataengine.h"
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010017#include "webrtc/pc/srtpfilter.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020018#include "webrtc/rtc_base/bind.h"
19#include "webrtc/rtc_base/checks.h"
20#include "webrtc/rtc_base/logging.h"
21#include "webrtc/rtc_base/stringencode.h"
22#include "webrtc/rtc_base/stringutils.h"
23#include "webrtc/rtc_base/trace_event.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000024
25namespace cricket {
26
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000028using rtc::Bind;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029
deadbeef112b2e92017-02-10 20:13:37 -080030ChannelManager::ChannelManager(std::unique_ptr<MediaEngineInterface> me,
31 std::unique_ptr<DataEngineInterface> dme,
Danil Chapovalov33b01f22016-05-11 19:55:27 +020032 rtc::Thread* thread) {
deadbeef112b2e92017-02-10 20:13:37 -080033 Construct(std::move(me), std::move(dme), thread, thread);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034}
35
deadbeef112b2e92017-02-10 20:13:37 -080036ChannelManager::ChannelManager(std::unique_ptr<MediaEngineInterface> me,
Danil Chapovalov33b01f22016-05-11 19:55:27 +020037 rtc::Thread* worker_thread,
38 rtc::Thread* network_thread) {
deadbeef112b2e92017-02-10 20:13:37 -080039 Construct(std::move(me),
40 std::unique_ptr<DataEngineInterface>(new RtpDataEngine()),
41 worker_thread, network_thread);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042}
43
deadbeef112b2e92017-02-10 20:13:37 -080044void ChannelManager::Construct(std::unique_ptr<MediaEngineInterface> me,
45 std::unique_ptr<DataEngineInterface> dme,
Danil Chapovalov33b01f22016-05-11 19:55:27 +020046 rtc::Thread* worker_thread,
47 rtc::Thread* network_thread) {
deadbeef112b2e92017-02-10 20:13:37 -080048 media_engine_ = std::move(me);
49 data_media_engine_ = std::move(dme);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050 initialized_ = false;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000051 main_thread_ = rtc::Thread::Current();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052 worker_thread_ = worker_thread;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020053 network_thread_ = network_thread;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054 capturing_ = false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055 enable_rtx_ = false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000056}
57
58ChannelManager::~ChannelManager() {
wu@webrtc.org9dba5252013-08-05 20:36:57 +000059 if (initialized_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 Terminate();
wu@webrtc.org9dba5252013-08-05 20:36:57 +000061 // If srtp is initialized (done by the Channel) then we must call
62 // srtp_shutdown to free all crypto kernel lists. But we need to make sure
63 // shutdown always called at the end, after channels are destroyed.
64 // ChannelManager d'tor is always called last, it's safe place to call
65 // shutdown.
66 ShutdownSrtp();
67 }
perkjc11b1842016-03-07 17:34:13 -080068 // The media engine needs to be deleted on the worker thread for thread safe
69 // destruction,
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070070 worker_thread_->Invoke<void>(
71 RTC_FROM_HERE, Bind(&ChannelManager::DestructorDeletes_w, this));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072}
73
74bool ChannelManager::SetVideoRtxEnabled(bool enable) {
75 // To be safe, this call is only allowed before initialization. Apps like
76 // Flute only have a singleton ChannelManager and we don't want this flag to
77 // be toggled between calls or when there's concurrent calls. We expect apps
78 // to enable this at startup and retain that setting for the lifetime of the
79 // app.
80 if (!initialized_) {
81 enable_rtx_ = enable;
82 return true;
83 } else {
84 LOG(LS_WARNING) << "Cannot toggle rtx after initialization!";
85 return false;
86 }
87}
88
ossudedfd282016-06-14 07:12:39 -070089void ChannelManager::GetSupportedAudioSendCodecs(
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090 std::vector<AudioCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -070091 if (!media_engine_) {
92 return;
93 }
ossudedfd282016-06-14 07:12:39 -070094 *codecs = media_engine_->audio_send_codecs();
95}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096
ossudedfd282016-06-14 07:12:39 -070097void ChannelManager::GetSupportedAudioReceiveCodecs(
98 std::vector<AudioCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -070099 if (!media_engine_) {
100 return;
101 }
ossudedfd282016-06-14 07:12:39 -0700102 *codecs = media_engine_->audio_recv_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103}
104
105void ChannelManager::GetSupportedAudioRtpHeaderExtensions(
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_->GetAudioCapabilities().header_extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111}
112
magjed3cf8ece2016-11-10 03:36:53 -0800113void ChannelManager::GetSupportedVideoCodecs(
114 std::vector<VideoCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -0700115 if (!media_engine_) {
116 return;
117 }
magjed3cf8ece2016-11-10 03:36:53 -0800118 codecs->clear();
119
brandtrffc61182016-11-28 06:02:22 -0800120 std::vector<VideoCodec> video_codecs = media_engine_->video_codecs();
121 for (const auto& video_codec : video_codecs) {
122 if (!enable_rtx_ &&
123 _stricmp(kRtxCodecName, video_codec.name.c_str()) == 0) {
magjed3cf8ece2016-11-10 03:36:53 -0800124 continue;
125 }
brandtrffc61182016-11-28 06:02:22 -0800126 codecs->push_back(video_codec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 }
128}
129
130void ChannelManager::GetSupportedVideoRtpHeaderExtensions(
131 RtpHeaderExtensions* ext) const {
zhihuang38ede132017-06-15 12:52:32 -0700132 if (!media_engine_) {
133 return;
134 }
Stefan Holmer9d69c3f2015-12-07 10:45:43 +0100135 *ext = media_engine_->GetVideoCapabilities().header_extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136}
137
138void ChannelManager::GetSupportedDataCodecs(
139 std::vector<DataCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -0700140 if (!data_media_engine_) {
141 return;
142 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 *codecs = data_media_engine_->data_codecs();
144}
145
146bool ChannelManager::Init() {
nisseede5da42017-01-12 05:15:36 -0800147 RTC_DCHECK(!initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000148 if (initialized_) {
149 return false;
150 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200151 RTC_DCHECK(network_thread_);
152 RTC_DCHECK(worker_thread_);
153 if (!network_thread_->IsCurrent()) {
154 // Do not allow invoking calls to other threads on the network thread.
155 network_thread_->Invoke<bool>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700156 RTC_FROM_HERE,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200157 rtc::Bind(&rtc::Thread::SetAllowBlockingCalls, network_thread_, false));
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000158 }
159
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200160 initialized_ = worker_thread_->Invoke<bool>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700161 RTC_FROM_HERE, Bind(&ChannelManager::InitMediaEngine_w, this));
nisseede5da42017-01-12 05:15:36 -0800162 RTC_DCHECK(initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000163 return initialized_;
164}
165
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000166bool ChannelManager::InitMediaEngine_w() {
nisseede5da42017-01-12 05:15:36 -0800167 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
zhihuang38ede132017-06-15 12:52:32 -0700168 if (media_engine_) {
169 return media_engine_->Init();
170 }
171 return true;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000172}
173
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000174void ChannelManager::Terminate() {
nisseede5da42017-01-12 05:15:36 -0800175 RTC_DCHECK(initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176 if (!initialized_) {
177 return;
178 }
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700179 worker_thread_->Invoke<void>(RTC_FROM_HERE,
180 Bind(&ChannelManager::Terminate_w, this));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000181 initialized_ = false;
182}
183
hbos@webrtc.org4aef5fe2015-02-25 10:09:05 +0000184void ChannelManager::DestructorDeletes_w() {
nisseede5da42017-01-12 05:15:36 -0800185 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000186 media_engine_.reset(NULL);
187}
188
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189void ChannelManager::Terminate_w() {
nisseede5da42017-01-12 05:15:36 -0800190 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000191 // Need to destroy the voice/video channels
192 while (!video_channels_.empty()) {
193 DestroyVideoChannel_w(video_channels_.back());
194 }
195 while (!voice_channels_.empty()) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200196 DestroyVoiceChannel_w(voice_channels_.back());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000197 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000198}
199
200VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700201 webrtc::Call* call,
202 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800203 DtlsTransportInternal* rtp_transport,
204 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800205 rtc::Thread* signaling_thread,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200206 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800207 bool srtp_required,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200208 const AudioOptions& options) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000209 return worker_thread_->Invoke<VoiceChannel*>(
zhihuangf5b251b2017-01-12 19:37:48 -0800210 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700211 Bind(&ChannelManager::CreateVoiceChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800212 rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
213 signaling_thread, content_name, srtp_required, options));
214}
215
216VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700217 webrtc::Call* call,
218 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800219 rtc::PacketTransportInternal* rtp_transport,
220 rtc::PacketTransportInternal* rtcp_transport,
221 rtc::Thread* signaling_thread,
222 const std::string& content_name,
223 bool srtp_required,
224 const AudioOptions& options) {
225 return worker_thread_->Invoke<VoiceChannel*>(
226 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700227 Bind(&ChannelManager::CreateVoiceChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800228 nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
229 content_name, srtp_required, options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230}
231
232VoiceChannel* ChannelManager::CreateVoiceChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700233 webrtc::Call* call,
234 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800235 DtlsTransportInternal* rtp_dtls_transport,
236 DtlsTransportInternal* rtcp_dtls_transport,
237 rtc::PacketTransportInternal* rtp_packet_transport,
238 rtc::PacketTransportInternal* rtcp_packet_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800239 rtc::Thread* signaling_thread,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200240 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800241 bool srtp_required,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200242 const AudioOptions& options) {
nisseede5da42017-01-12 05:15:36 -0800243 RTC_DCHECK(initialized_);
244 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
nisseeaabdf62017-05-05 02:23:02 -0700245 RTC_DCHECK(nullptr != call);
zhihuang38ede132017-06-15 12:52:32 -0700246 if (!media_engine_) {
247 return nullptr;
248 }
zhihuangf5b251b2017-01-12 19:37:48 -0800249
nisse51542be2016-02-12 02:27:06 -0800250 VoiceMediaChannel* media_channel = media_engine_->CreateChannel(
nisseeaabdf62017-05-05 02:23:02 -0700251 call, media_config, options);
Jelena Marusicc28a8962015-05-29 15:05:44 +0200252 if (!media_channel)
253 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000254
deadbeefe814a0d2017-02-25 18:15:09 -0800255 VoiceChannel* voice_channel =
256 new VoiceChannel(worker_thread_, network_thread_, signaling_thread,
257 media_engine_.get(), media_channel, content_name,
258 rtcp_packet_transport == nullptr, srtp_required);
zhihuangf5b251b2017-01-12 19:37:48 -0800259
deadbeefe814a0d2017-02-25 18:15:09 -0800260 if (!voice_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
261 rtp_packet_transport, rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000262 delete voice_channel;
Jelena Marusicc28a8962015-05-29 15:05:44 +0200263 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000264 }
265 voice_channels_.push_back(voice_channel);
266 return voice_channel;
267}
268
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200269void ChannelManager::DestroyVoiceChannel(VoiceChannel* voice_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100270 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000271 if (voice_channel) {
272 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700273 RTC_FROM_HERE,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200274 Bind(&ChannelManager::DestroyVoiceChannel_w, this, voice_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000275 }
276}
277
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200278void ChannelManager::DestroyVoiceChannel_w(VoiceChannel* voice_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100279 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel_w");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000280 // Destroy voice channel.
nisseede5da42017-01-12 05:15:36 -0800281 RTC_DCHECK(initialized_);
282 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000283 VoiceChannels::iterator it = std::find(voice_channels_.begin(),
284 voice_channels_.end(), voice_channel);
nisseede5da42017-01-12 05:15:36 -0800285 RTC_DCHECK(it != voice_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000286 if (it == voice_channels_.end())
287 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000288 voice_channels_.erase(it);
289 delete voice_channel;
290}
291
292VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700293 webrtc::Call* call,
294 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800295 DtlsTransportInternal* rtp_transport,
296 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800297 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000298 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800299 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200300 const VideoOptions& options) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000301 return worker_thread_->Invoke<VideoChannel*>(
zhihuangf5b251b2017-01-12 19:37:48 -0800302 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700303 Bind(&ChannelManager::CreateVideoChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800304 rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
305 signaling_thread, content_name, srtp_required, options));
306}
307
308VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700309 webrtc::Call* call,
310 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800311 rtc::PacketTransportInternal* rtp_transport,
312 rtc::PacketTransportInternal* rtcp_transport,
313 rtc::Thread* signaling_thread,
314 const std::string& content_name,
315 bool srtp_required,
316 const VideoOptions& options) {
317 return worker_thread_->Invoke<VideoChannel*>(
318 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700319 Bind(&ChannelManager::CreateVideoChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800320 nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
321 content_name, srtp_required, options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000322}
323
324VideoChannel* ChannelManager::CreateVideoChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700325 webrtc::Call* call,
326 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800327 DtlsTransportInternal* rtp_dtls_transport,
328 DtlsTransportInternal* rtcp_dtls_transport,
329 rtc::PacketTransportInternal* rtp_packet_transport,
330 rtc::PacketTransportInternal* rtcp_packet_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800331 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000332 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800333 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200334 const VideoOptions& options) {
nisseede5da42017-01-12 05:15:36 -0800335 RTC_DCHECK(initialized_);
336 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
nisseeaabdf62017-05-05 02:23:02 -0700337 RTC_DCHECK(nullptr != call);
nisse51542be2016-02-12 02:27:06 -0800338 VideoMediaChannel* media_channel = media_engine_->CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700339 call, media_config, options);
deadbeefcbecd352015-09-23 11:50:27 -0700340 if (media_channel == NULL) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 return NULL;
deadbeefcbecd352015-09-23 11:50:27 -0700342 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343
deadbeefac22f702017-01-12 21:59:29 -0800344 VideoChannel* video_channel = new VideoChannel(
345 worker_thread_, network_thread_, signaling_thread, media_channel,
deadbeefe814a0d2017-02-25 18:15:09 -0800346 content_name, rtcp_packet_transport == nullptr, srtp_required);
deadbeefe814a0d2017-02-25 18:15:09 -0800347 if (!video_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
348 rtp_packet_transport, rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000349 delete video_channel;
350 return NULL;
351 }
352 video_channels_.push_back(video_channel);
353 return video_channel;
354}
355
356void ChannelManager::DestroyVideoChannel(VideoChannel* video_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100357 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000358 if (video_channel) {
359 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700360 RTC_FROM_HERE,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000361 Bind(&ChannelManager::DestroyVideoChannel_w, this, video_channel));
362 }
363}
364
365void ChannelManager::DestroyVideoChannel_w(VideoChannel* video_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100366 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel_w");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 // Destroy video channel.
nisseede5da42017-01-12 05:15:36 -0800368 RTC_DCHECK(initialized_);
369 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000370 VideoChannels::iterator it = std::find(video_channels_.begin(),
371 video_channels_.end(), video_channel);
nisseede5da42017-01-12 05:15:36 -0800372 RTC_DCHECK(it != video_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000373 if (it == video_channels_.end())
374 return;
375
376 video_channels_.erase(it);
377 delete video_channel;
378}
379
deadbeef953c2ce2017-01-09 14:53:41 -0800380RtpDataChannel* ChannelManager::CreateRtpDataChannel(
nisseeaabdf62017-05-05 02:23:02 -0700381 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800382 DtlsTransportInternal* rtp_transport,
383 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800384 rtc::Thread* signaling_thread,
zhihuangebbe4f22016-12-06 10:45:42 -0800385 const std::string& content_name,
deadbeef953c2ce2017-01-09 14:53:41 -0800386 bool srtp_required) {
387 return worker_thread_->Invoke<RtpDataChannel*>(
deadbeef1a2183d2017-02-10 23:44:49 -0800388 RTC_FROM_HERE, Bind(&ChannelManager::CreateRtpDataChannel_w, this,
nisseeaabdf62017-05-05 02:23:02 -0700389 media_config, rtp_transport, rtcp_transport,
deadbeef1a2183d2017-02-10 23:44:49 -0800390 signaling_thread, content_name, srtp_required));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000391}
392
deadbeef953c2ce2017-01-09 14:53:41 -0800393RtpDataChannel* ChannelManager::CreateRtpDataChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700394 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800395 DtlsTransportInternal* rtp_transport,
396 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800397 rtc::Thread* signaling_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700398 const std::string& content_name,
deadbeef953c2ce2017-01-09 14:53:41 -0800399 bool srtp_required) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 // This is ok to alloc from a thread other than the worker thread.
nisseede5da42017-01-12 05:15:36 -0800401 RTC_DCHECK(initialized_);
nisseeaabdf62017-05-05 02:23:02 -0700402 DataMediaChannel* media_channel
403 = data_media_engine_->CreateChannel(media_config);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000404 if (!media_channel) {
deadbeef953c2ce2017-01-09 14:53:41 -0800405 LOG(LS_WARNING) << "Failed to create RTP data channel.";
406 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 }
408
deadbeefac22f702017-01-12 21:59:29 -0800409 RtpDataChannel* data_channel = new RtpDataChannel(
410 worker_thread_, network_thread_, signaling_thread, media_channel,
deadbeef1a2183d2017-02-10 23:44:49 -0800411 content_name, rtcp_transport == nullptr, srtp_required);
deadbeeff5346592017-01-24 21:51:21 -0800412 if (!data_channel->Init_w(rtp_transport, rtcp_transport, rtp_transport,
413 rtcp_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 LOG(LS_WARNING) << "Failed to init data channel.";
415 delete data_channel;
deadbeef953c2ce2017-01-09 14:53:41 -0800416 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 }
418 data_channels_.push_back(data_channel);
419 return data_channel;
420}
421
deadbeef953c2ce2017-01-09 14:53:41 -0800422void ChannelManager::DestroyRtpDataChannel(RtpDataChannel* data_channel) {
423 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424 if (data_channel) {
425 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700426 RTC_FROM_HERE,
deadbeef953c2ce2017-01-09 14:53:41 -0800427 Bind(&ChannelManager::DestroyRtpDataChannel_w, this, data_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 }
429}
430
deadbeef953c2ce2017-01-09 14:53:41 -0800431void ChannelManager::DestroyRtpDataChannel_w(RtpDataChannel* data_channel) {
432 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel_w");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 // Destroy data channel.
nisseede5da42017-01-12 05:15:36 -0800434 RTC_DCHECK(initialized_);
deadbeef953c2ce2017-01-09 14:53:41 -0800435 RtpDataChannels::iterator it =
436 std::find(data_channels_.begin(), data_channels_.end(), data_channel);
nisseede5da42017-01-12 05:15:36 -0800437 RTC_DCHECK(it != data_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438 if (it == data_channels_.end())
439 return;
440
441 data_channels_.erase(it);
442 delete data_channel;
443}
444
ivocd66b44d2016-01-15 03:06:36 -0800445bool ChannelManager::StartAecDump(rtc::PlatformFile file,
446 int64_t max_size_bytes) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700447 return worker_thread_->Invoke<bool>(
448 RTC_FROM_HERE, Bind(&MediaEngineInterface::StartAecDump,
449 media_engine_.get(), file, max_size_bytes));
wu@webrtc.orga9890802013-12-13 00:21:03 +0000450}
451
ivoc797ef122015-10-22 03:25:41 -0700452void ChannelManager::StopAecDump() {
453 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700454 RTC_FROM_HERE,
ivoc797ef122015-10-22 03:25:41 -0700455 Bind(&MediaEngineInterface::StopAecDump, media_engine_.get()));
456}
457
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458} // namespace cricket