blob: af6e3c7e99e16f9780c4872ee8384a2d006e71df [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
Henrik Kjellander15583c12016-02-10 10:53:12 +010015#include "webrtc/base/bind.h"
nisseede5da42017-01-12 05:15:36 -080016#include "webrtc/base/checks.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010017#include "webrtc/base/logging.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010018#include "webrtc/base/stringencode.h"
19#include "webrtc/base/stringutils.h"
20#include "webrtc/base/trace_event.h"
kjellandera96e2d72016-02-04 23:52:28 -080021#include "webrtc/media/base/device.h"
kjellandera96e2d72016-02-04 23:52:28 -080022#include "webrtc/media/base/rtpdataengine.h"
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010023#include "webrtc/pc/srtpfilter.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;
jbauchcb560652016-08-04 05:20:32 -070056 crypto_options_ = rtc::CryptoOptions::NoGcm();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057}
58
59ChannelManager::~ChannelManager() {
wu@webrtc.org9dba5252013-08-05 20:36:57 +000060 if (initialized_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 Terminate();
wu@webrtc.org9dba5252013-08-05 20:36:57 +000062 // If srtp is initialized (done by the Channel) then we must call
63 // srtp_shutdown to free all crypto kernel lists. But we need to make sure
64 // shutdown always called at the end, after channels are destroyed.
65 // ChannelManager d'tor is always called last, it's safe place to call
66 // shutdown.
67 ShutdownSrtp();
68 }
perkjc11b1842016-03-07 17:34:13 -080069 // The media engine needs to be deleted on the worker thread for thread safe
70 // destruction,
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070071 worker_thread_->Invoke<void>(
72 RTC_FROM_HERE, Bind(&ChannelManager::DestructorDeletes_w, this));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073}
74
75bool ChannelManager::SetVideoRtxEnabled(bool enable) {
76 // To be safe, this call is only allowed before initialization. Apps like
77 // Flute only have a singleton ChannelManager and we don't want this flag to
78 // be toggled between calls or when there's concurrent calls. We expect apps
79 // to enable this at startup and retain that setting for the lifetime of the
80 // app.
81 if (!initialized_) {
82 enable_rtx_ = enable;
83 return true;
84 } else {
85 LOG(LS_WARNING) << "Cannot toggle rtx after initialization!";
86 return false;
87 }
88}
89
ossudedfd282016-06-14 07:12:39 -070090void ChannelManager::GetSupportedAudioSendCodecs(
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091 std::vector<AudioCodec>* codecs) const {
ossudedfd282016-06-14 07:12:39 -070092 *codecs = media_engine_->audio_send_codecs();
93}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094
ossudedfd282016-06-14 07:12:39 -070095void ChannelManager::GetSupportedAudioReceiveCodecs(
96 std::vector<AudioCodec>* codecs) const {
97 *codecs = media_engine_->audio_recv_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098}
99
100void ChannelManager::GetSupportedAudioRtpHeaderExtensions(
101 RtpHeaderExtensions* ext) const {
Stefan Holmer9d69c3f2015-12-07 10:45:43 +0100102 *ext = media_engine_->GetAudioCapabilities().header_extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103}
104
magjed3cf8ece2016-11-10 03:36:53 -0800105void ChannelManager::GetSupportedVideoCodecs(
106 std::vector<VideoCodec>* codecs) const {
107 codecs->clear();
108
brandtrffc61182016-11-28 06:02:22 -0800109 std::vector<VideoCodec> video_codecs = media_engine_->video_codecs();
110 for (const auto& video_codec : video_codecs) {
111 if (!enable_rtx_ &&
112 _stricmp(kRtxCodecName, video_codec.name.c_str()) == 0) {
magjed3cf8ece2016-11-10 03:36:53 -0800113 continue;
114 }
brandtrffc61182016-11-28 06:02:22 -0800115 codecs->push_back(video_codec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116 }
117}
118
119void ChannelManager::GetSupportedVideoRtpHeaderExtensions(
120 RtpHeaderExtensions* ext) const {
Stefan Holmer9d69c3f2015-12-07 10:45:43 +0100121 *ext = media_engine_->GetVideoCapabilities().header_extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122}
123
124void ChannelManager::GetSupportedDataCodecs(
125 std::vector<DataCodec>* codecs) const {
126 *codecs = data_media_engine_->data_codecs();
127}
128
129bool ChannelManager::Init() {
nisseede5da42017-01-12 05:15:36 -0800130 RTC_DCHECK(!initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131 if (initialized_) {
132 return false;
133 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200134 RTC_DCHECK(network_thread_);
135 RTC_DCHECK(worker_thread_);
136 if (!network_thread_->IsCurrent()) {
137 // Do not allow invoking calls to other threads on the network thread.
138 network_thread_->Invoke<bool>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700139 RTC_FROM_HERE,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200140 rtc::Bind(&rtc::Thread::SetAllowBlockingCalls, network_thread_, false));
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000141 }
142
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200143 initialized_ = worker_thread_->Invoke<bool>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700144 RTC_FROM_HERE, Bind(&ChannelManager::InitMediaEngine_w, this));
nisseede5da42017-01-12 05:15:36 -0800145 RTC_DCHECK(initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000146 return initialized_;
147}
148
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000149bool ChannelManager::InitMediaEngine_w() {
nisseede5da42017-01-12 05:15:36 -0800150 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
solenbergff976312016-03-30 23:28:51 -0700151 return media_engine_->Init();
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000152}
153
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154void ChannelManager::Terminate() {
nisseede5da42017-01-12 05:15:36 -0800155 RTC_DCHECK(initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 if (!initialized_) {
157 return;
158 }
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700159 worker_thread_->Invoke<void>(RTC_FROM_HERE,
160 Bind(&ChannelManager::Terminate_w, this));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000161 initialized_ = false;
162}
163
hbos@webrtc.org4aef5fe2015-02-25 10:09:05 +0000164void ChannelManager::DestructorDeletes_w() {
nisseede5da42017-01-12 05:15:36 -0800165 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000166 media_engine_.reset(NULL);
167}
168
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169void ChannelManager::Terminate_w() {
nisseede5da42017-01-12 05:15:36 -0800170 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 // Need to destroy the voice/video channels
172 while (!video_channels_.empty()) {
173 DestroyVideoChannel_w(video_channels_.back());
174 }
175 while (!voice_channels_.empty()) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200176 DestroyVoiceChannel_w(voice_channels_.back());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000177 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000178}
179
180VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700181 webrtc::Call* call,
182 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800183 DtlsTransportInternal* rtp_transport,
184 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800185 rtc::Thread* signaling_thread,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200186 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800187 bool srtp_required,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200188 const AudioOptions& options) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189 return worker_thread_->Invoke<VoiceChannel*>(
zhihuangf5b251b2017-01-12 19:37:48 -0800190 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700191 Bind(&ChannelManager::CreateVoiceChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800192 rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
193 signaling_thread, content_name, srtp_required, options));
194}
195
196VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700197 webrtc::Call* call,
198 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800199 rtc::PacketTransportInternal* rtp_transport,
200 rtc::PacketTransportInternal* rtcp_transport,
201 rtc::Thread* signaling_thread,
202 const std::string& content_name,
203 bool srtp_required,
204 const AudioOptions& options) {
205 return worker_thread_->Invoke<VoiceChannel*>(
206 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700207 Bind(&ChannelManager::CreateVoiceChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800208 nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
209 content_name, srtp_required, options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000210}
211
212VoiceChannel* ChannelManager::CreateVoiceChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700213 webrtc::Call* call,
214 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800215 DtlsTransportInternal* rtp_dtls_transport,
216 DtlsTransportInternal* rtcp_dtls_transport,
217 rtc::PacketTransportInternal* rtp_packet_transport,
218 rtc::PacketTransportInternal* rtcp_packet_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800219 rtc::Thread* signaling_thread,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200220 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800221 bool srtp_required,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200222 const AudioOptions& options) {
nisseede5da42017-01-12 05:15:36 -0800223 RTC_DCHECK(initialized_);
224 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
nisseeaabdf62017-05-05 02:23:02 -0700225 RTC_DCHECK(nullptr != call);
zhihuangf5b251b2017-01-12 19:37:48 -0800226
nisse51542be2016-02-12 02:27:06 -0800227 VoiceMediaChannel* media_channel = media_engine_->CreateChannel(
nisseeaabdf62017-05-05 02:23:02 -0700228 call, media_config, options);
Jelena Marusicc28a8962015-05-29 15:05:44 +0200229 if (!media_channel)
230 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231
deadbeefe814a0d2017-02-25 18:15:09 -0800232 VoiceChannel* voice_channel =
233 new VoiceChannel(worker_thread_, network_thread_, signaling_thread,
234 media_engine_.get(), media_channel, content_name,
235 rtcp_packet_transport == nullptr, srtp_required);
zhihuangf5b251b2017-01-12 19:37:48 -0800236
deadbeefe814a0d2017-02-25 18:15:09 -0800237 if (!voice_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
238 rtp_packet_transport, rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000239 delete voice_channel;
Jelena Marusicc28a8962015-05-29 15:05:44 +0200240 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 }
242 voice_channels_.push_back(voice_channel);
243 return voice_channel;
244}
245
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200246void ChannelManager::DestroyVoiceChannel(VoiceChannel* voice_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100247 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000248 if (voice_channel) {
249 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700250 RTC_FROM_HERE,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200251 Bind(&ChannelManager::DestroyVoiceChannel_w, this, voice_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000252 }
253}
254
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200255void ChannelManager::DestroyVoiceChannel_w(VoiceChannel* voice_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100256 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel_w");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000257 // Destroy voice channel.
nisseede5da42017-01-12 05:15:36 -0800258 RTC_DCHECK(initialized_);
259 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000260 VoiceChannels::iterator it = std::find(voice_channels_.begin(),
261 voice_channels_.end(), voice_channel);
nisseede5da42017-01-12 05:15:36 -0800262 RTC_DCHECK(it != voice_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263 if (it == voice_channels_.end())
264 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000265 voice_channels_.erase(it);
266 delete voice_channel;
267}
268
269VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700270 webrtc::Call* call,
271 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800272 DtlsTransportInternal* rtp_transport,
273 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800274 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000275 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800276 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200277 const VideoOptions& options) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000278 return worker_thread_->Invoke<VideoChannel*>(
zhihuangf5b251b2017-01-12 19:37:48 -0800279 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700280 Bind(&ChannelManager::CreateVideoChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800281 rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
282 signaling_thread, content_name, srtp_required, options));
283}
284
285VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700286 webrtc::Call* call,
287 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800288 rtc::PacketTransportInternal* rtp_transport,
289 rtc::PacketTransportInternal* rtcp_transport,
290 rtc::Thread* signaling_thread,
291 const std::string& content_name,
292 bool srtp_required,
293 const VideoOptions& options) {
294 return worker_thread_->Invoke<VideoChannel*>(
295 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700296 Bind(&ChannelManager::CreateVideoChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800297 nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
298 content_name, srtp_required, options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000299}
300
301VideoChannel* ChannelManager::CreateVideoChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700302 webrtc::Call* call,
303 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800304 DtlsTransportInternal* rtp_dtls_transport,
305 DtlsTransportInternal* rtcp_dtls_transport,
306 rtc::PacketTransportInternal* rtp_packet_transport,
307 rtc::PacketTransportInternal* rtcp_packet_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800308 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000309 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800310 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200311 const VideoOptions& options) {
nisseede5da42017-01-12 05:15:36 -0800312 RTC_DCHECK(initialized_);
313 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
nisseeaabdf62017-05-05 02:23:02 -0700314 RTC_DCHECK(nullptr != call);
nisse51542be2016-02-12 02:27:06 -0800315 VideoMediaChannel* media_channel = media_engine_->CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700316 call, media_config, options);
deadbeefcbecd352015-09-23 11:50:27 -0700317 if (media_channel == NULL) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000318 return NULL;
deadbeefcbecd352015-09-23 11:50:27 -0700319 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000320
deadbeefac22f702017-01-12 21:59:29 -0800321 VideoChannel* video_channel = new VideoChannel(
322 worker_thread_, network_thread_, signaling_thread, media_channel,
deadbeefe814a0d2017-02-25 18:15:09 -0800323 content_name, rtcp_packet_transport == nullptr, srtp_required);
deadbeefe814a0d2017-02-25 18:15:09 -0800324 if (!video_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
325 rtp_packet_transport, rtcp_packet_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000326 delete video_channel;
327 return NULL;
328 }
329 video_channels_.push_back(video_channel);
330 return video_channel;
331}
332
333void ChannelManager::DestroyVideoChannel(VideoChannel* video_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100334 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 if (video_channel) {
336 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700337 RTC_FROM_HERE,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338 Bind(&ChannelManager::DestroyVideoChannel_w, this, video_channel));
339 }
340}
341
342void ChannelManager::DestroyVideoChannel_w(VideoChannel* video_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100343 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel_w");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000344 // Destroy video channel.
nisseede5da42017-01-12 05:15:36 -0800345 RTC_DCHECK(initialized_);
346 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000347 VideoChannels::iterator it = std::find(video_channels_.begin(),
348 video_channels_.end(), video_channel);
nisseede5da42017-01-12 05:15:36 -0800349 RTC_DCHECK(it != video_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000350 if (it == video_channels_.end())
351 return;
352
353 video_channels_.erase(it);
354 delete video_channel;
355}
356
deadbeef953c2ce2017-01-09 14:53:41 -0800357RtpDataChannel* ChannelManager::CreateRtpDataChannel(
nisseeaabdf62017-05-05 02:23:02 -0700358 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800359 DtlsTransportInternal* rtp_transport,
360 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800361 rtc::Thread* signaling_thread,
zhihuangebbe4f22016-12-06 10:45:42 -0800362 const std::string& content_name,
deadbeef953c2ce2017-01-09 14:53:41 -0800363 bool srtp_required) {
364 return worker_thread_->Invoke<RtpDataChannel*>(
deadbeef1a2183d2017-02-10 23:44:49 -0800365 RTC_FROM_HERE, Bind(&ChannelManager::CreateRtpDataChannel_w, this,
nisseeaabdf62017-05-05 02:23:02 -0700366 media_config, rtp_transport, rtcp_transport,
deadbeef1a2183d2017-02-10 23:44:49 -0800367 signaling_thread, content_name, srtp_required));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368}
369
deadbeef953c2ce2017-01-09 14:53:41 -0800370RtpDataChannel* ChannelManager::CreateRtpDataChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700371 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800372 DtlsTransportInternal* rtp_transport,
373 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800374 rtc::Thread* signaling_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700375 const std::string& content_name,
deadbeef953c2ce2017-01-09 14:53:41 -0800376 bool srtp_required) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000377 // This is ok to alloc from a thread other than the worker thread.
nisseede5da42017-01-12 05:15:36 -0800378 RTC_DCHECK(initialized_);
nisseeaabdf62017-05-05 02:23:02 -0700379 DataMediaChannel* media_channel
380 = data_media_engine_->CreateChannel(media_config);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381 if (!media_channel) {
deadbeef953c2ce2017-01-09 14:53:41 -0800382 LOG(LS_WARNING) << "Failed to create RTP data channel.";
383 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000384 }
385
deadbeefac22f702017-01-12 21:59:29 -0800386 RtpDataChannel* data_channel = new RtpDataChannel(
387 worker_thread_, network_thread_, signaling_thread, media_channel,
deadbeef1a2183d2017-02-10 23:44:49 -0800388 content_name, rtcp_transport == nullptr, srtp_required);
deadbeeff5346592017-01-24 21:51:21 -0800389 if (!data_channel->Init_w(rtp_transport, rtcp_transport, rtp_transport,
390 rtcp_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000391 LOG(LS_WARNING) << "Failed to init data channel.";
392 delete data_channel;
deadbeef953c2ce2017-01-09 14:53:41 -0800393 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000394 }
395 data_channels_.push_back(data_channel);
396 return data_channel;
397}
398
deadbeef953c2ce2017-01-09 14:53:41 -0800399void ChannelManager::DestroyRtpDataChannel(RtpDataChannel* data_channel) {
400 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000401 if (data_channel) {
402 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700403 RTC_FROM_HERE,
deadbeef953c2ce2017-01-09 14:53:41 -0800404 Bind(&ChannelManager::DestroyRtpDataChannel_w, this, data_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405 }
406}
407
deadbeef953c2ce2017-01-09 14:53:41 -0800408void ChannelManager::DestroyRtpDataChannel_w(RtpDataChannel* data_channel) {
409 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel_w");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 // Destroy data channel.
nisseede5da42017-01-12 05:15:36 -0800411 RTC_DCHECK(initialized_);
deadbeef953c2ce2017-01-09 14:53:41 -0800412 RtpDataChannels::iterator it =
413 std::find(data_channels_.begin(), data_channels_.end(), data_channel);
nisseede5da42017-01-12 05:15:36 -0800414 RTC_DCHECK(it != data_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 if (it == data_channels_.end())
416 return;
417
418 data_channels_.erase(it);
419 delete data_channel;
420}
421
ivocd66b44d2016-01-15 03:06:36 -0800422bool ChannelManager::StartAecDump(rtc::PlatformFile file,
423 int64_t max_size_bytes) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700424 return worker_thread_->Invoke<bool>(
425 RTC_FROM_HERE, Bind(&MediaEngineInterface::StartAecDump,
426 media_engine_.get(), file, max_size_bytes));
wu@webrtc.orga9890802013-12-13 00:21:03 +0000427}
428
ivoc797ef122015-10-22 03:25:41 -0700429void ChannelManager::StopAecDump() {
430 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700431 RTC_FROM_HERE,
ivoc797ef122015-10-22 03:25:41 -0700432 Bind(&MediaEngineInterface::StopAecDump, media_engine_.get()));
433}
434
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000435} // namespace cricket