blob: 197e7228c0b4f1f3d1e391f5d977de1e4b8ef0f2 [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());
Steve Anton774115c2017-08-30 10:48:46 -0700186 media_engine_.reset(nullptr);
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000187}
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
Steve Anton774115c2017-08-30 10:48:46 -0700192 video_channels_.clear();
193 voice_channels_.clear();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000194}
195
196VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700197 webrtc::Call* call,
198 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800199 DtlsTransportInternal* rtp_transport,
200 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800201 rtc::Thread* signaling_thread,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200202 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800203 bool srtp_required,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200204 const AudioOptions& options) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000205 return worker_thread_->Invoke<VoiceChannel*>(
zhihuangf5b251b2017-01-12 19:37:48 -0800206 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 rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
209 signaling_thread, content_name, srtp_required, options));
210}
211
212VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700213 webrtc::Call* call,
214 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800215 rtc::PacketTransportInternal* rtp_transport,
216 rtc::PacketTransportInternal* rtcp_transport,
217 rtc::Thread* signaling_thread,
218 const std::string& content_name,
219 bool srtp_required,
220 const AudioOptions& options) {
221 return worker_thread_->Invoke<VoiceChannel*>(
222 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700223 Bind(&ChannelManager::CreateVoiceChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800224 nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
225 content_name, srtp_required, options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000226}
227
228VoiceChannel* 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) {
nisseede5da42017-01-12 05:15:36 -0800239 RTC_DCHECK(initialized_);
240 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
nisseeaabdf62017-05-05 02:23:02 -0700241 RTC_DCHECK(nullptr != 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 Anton774115c2017-08-30 10:48:46 -0700252 std::unique_ptr<VoiceChannel> voice_channel(
deadbeefe814a0d2017-02-25 18:15:09 -0800253 new VoiceChannel(worker_thread_, network_thread_, signaling_thread,
254 media_engine_.get(), media_channel, content_name,
Steve Anton774115c2017-08-30 10:48:46 -0700255 rtcp_packet_transport == nullptr, srtp_required));
zhihuangf5b251b2017-01-12 19:37:48 -0800256
deadbeefe814a0d2017-02-25 18:15:09 -0800257 if (!voice_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
258 rtp_packet_transport, rtcp_packet_transport)) {
Jelena Marusicc28a8962015-05-29 15:05:44 +0200259 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000260 }
Steve Anton774115c2017-08-30 10:48:46 -0700261 VoiceChannel* voice_channel_ptr = voice_channel.get();
262 voice_channels_.push_back(std::move(voice_channel));
263 return voice_channel_ptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000264}
265
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200266void ChannelManager::DestroyVoiceChannel(VoiceChannel* voice_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100267 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000268 if (voice_channel) {
269 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700270 RTC_FROM_HERE,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200271 Bind(&ChannelManager::DestroyVoiceChannel_w, this, voice_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000272 }
273}
274
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200275void ChannelManager::DestroyVoiceChannel_w(VoiceChannel* voice_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100276 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel_w");
nisseede5da42017-01-12 05:15:36 -0800277 RTC_DCHECK(initialized_);
278 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
Steve Anton774115c2017-08-30 10:48:46 -0700279
280 auto it = std::find_if(voice_channels_.begin(), voice_channels_.end(),
281 [&](const std::unique_ptr<VoiceChannel>& p) {
282 return p.get() == voice_channel;
283 });
nisseede5da42017-01-12 05:15:36 -0800284 RTC_DCHECK(it != voice_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000285 if (it == voice_channels_.end())
286 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000287 voice_channels_.erase(it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000288}
289
290VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700291 webrtc::Call* call,
292 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800293 DtlsTransportInternal* rtp_transport,
294 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800295 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000296 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800297 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200298 const VideoOptions& options) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000299 return worker_thread_->Invoke<VideoChannel*>(
zhihuangf5b251b2017-01-12 19:37:48 -0800300 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700301 Bind(&ChannelManager::CreateVideoChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800302 rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
303 signaling_thread, content_name, srtp_required, options));
304}
305
306VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700307 webrtc::Call* call,
308 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800309 rtc::PacketTransportInternal* rtp_transport,
310 rtc::PacketTransportInternal* rtcp_transport,
311 rtc::Thread* signaling_thread,
312 const std::string& content_name,
313 bool srtp_required,
314 const VideoOptions& options) {
315 return worker_thread_->Invoke<VideoChannel*>(
316 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700317 Bind(&ChannelManager::CreateVideoChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800318 nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
319 content_name, srtp_required, options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000320}
321
322VideoChannel* ChannelManager::CreateVideoChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700323 webrtc::Call* call,
324 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800325 DtlsTransportInternal* rtp_dtls_transport,
326 DtlsTransportInternal* rtcp_dtls_transport,
327 rtc::PacketTransportInternal* rtp_packet_transport,
328 rtc::PacketTransportInternal* rtcp_packet_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800329 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000330 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800331 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200332 const VideoOptions& options) {
nisseede5da42017-01-12 05:15:36 -0800333 RTC_DCHECK(initialized_);
334 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
nisseeaabdf62017-05-05 02:23:02 -0700335 RTC_DCHECK(nullptr != call);
nisse51542be2016-02-12 02:27:06 -0800336 VideoMediaChannel* media_channel = media_engine_->CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700337 call, media_config, options);
Steve Anton774115c2017-08-30 10:48:46 -0700338 if (!media_channel) {
339 return nullptr;
deadbeefcbecd352015-09-23 11:50:27 -0700340 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341
Steve Anton774115c2017-08-30 10:48:46 -0700342 std::unique_ptr<VideoChannel> video_channel(new VideoChannel(
deadbeefac22f702017-01-12 21:59:29 -0800343 worker_thread_, network_thread_, signaling_thread, media_channel,
Steve Anton774115c2017-08-30 10:48:46 -0700344 content_name, rtcp_packet_transport == nullptr, srtp_required));
deadbeefe814a0d2017-02-25 18:15:09 -0800345 if (!video_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
346 rtp_packet_transport, rtcp_packet_transport)) {
Steve Anton774115c2017-08-30 10:48:46 -0700347 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000348 }
Steve Anton774115c2017-08-30 10:48:46 -0700349 VideoChannel* video_channel_ptr = video_channel.get();
350 video_channels_.push_back(std::move(video_channel));
351 return video_channel_ptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000352}
353
354void ChannelManager::DestroyVideoChannel(VideoChannel* video_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100355 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000356 if (video_channel) {
357 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700358 RTC_FROM_HERE,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359 Bind(&ChannelManager::DestroyVideoChannel_w, this, video_channel));
360 }
361}
362
363void ChannelManager::DestroyVideoChannel_w(VideoChannel* video_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100364 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel_w");
nisseede5da42017-01-12 05:15:36 -0800365 RTC_DCHECK(initialized_);
366 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
Steve Anton774115c2017-08-30 10:48:46 -0700367
368 auto it = std::find_if(video_channels_.begin(), video_channels_.end(),
369 [&](const std::unique_ptr<VideoChannel>& p) {
370 return p.get() == video_channel;
371 });
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);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000377}
378
deadbeef953c2ce2017-01-09 14:53:41 -0800379RtpDataChannel* ChannelManager::CreateRtpDataChannel(
nisseeaabdf62017-05-05 02:23:02 -0700380 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800381 DtlsTransportInternal* rtp_transport,
382 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800383 rtc::Thread* signaling_thread,
zhihuangebbe4f22016-12-06 10:45:42 -0800384 const std::string& content_name,
deadbeef953c2ce2017-01-09 14:53:41 -0800385 bool srtp_required) {
386 return worker_thread_->Invoke<RtpDataChannel*>(
deadbeef1a2183d2017-02-10 23:44:49 -0800387 RTC_FROM_HERE, Bind(&ChannelManager::CreateRtpDataChannel_w, this,
nisseeaabdf62017-05-05 02:23:02 -0700388 media_config, rtp_transport, rtcp_transport,
deadbeef1a2183d2017-02-10 23:44:49 -0800389 signaling_thread, content_name, srtp_required));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390}
391
deadbeef953c2ce2017-01-09 14:53:41 -0800392RtpDataChannel* ChannelManager::CreateRtpDataChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700393 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800394 DtlsTransportInternal* rtp_transport,
395 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800396 rtc::Thread* signaling_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700397 const std::string& content_name,
deadbeef953c2ce2017-01-09 14:53:41 -0800398 bool srtp_required) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 // This is ok to alloc from a thread other than the worker thread.
nisseede5da42017-01-12 05:15:36 -0800400 RTC_DCHECK(initialized_);
nisseeaabdf62017-05-05 02:23:02 -0700401 DataMediaChannel* media_channel
402 = data_media_engine_->CreateChannel(media_config);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 if (!media_channel) {
deadbeef953c2ce2017-01-09 14:53:41 -0800404 LOG(LS_WARNING) << "Failed to create RTP data channel.";
405 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000406 }
407
Steve Anton774115c2017-08-30 10:48:46 -0700408 std::unique_ptr<RtpDataChannel> data_channel(new RtpDataChannel(
deadbeefac22f702017-01-12 21:59:29 -0800409 worker_thread_, network_thread_, signaling_thread, media_channel,
Steve Anton774115c2017-08-30 10:48:46 -0700410 content_name, rtcp_transport == nullptr, srtp_required));
deadbeeff5346592017-01-24 21:51:21 -0800411 if (!data_channel->Init_w(rtp_transport, rtcp_transport, rtp_transport,
412 rtcp_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 LOG(LS_WARNING) << "Failed to init data channel.";
deadbeef953c2ce2017-01-09 14:53:41 -0800414 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 }
Steve Anton774115c2017-08-30 10:48:46 -0700416 RtpDataChannel* data_channel_ptr = data_channel.get();
417 data_channels_.push_back(std::move(data_channel));
418 return data_channel_ptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419}
420
deadbeef953c2ce2017-01-09 14:53:41 -0800421void ChannelManager::DestroyRtpDataChannel(RtpDataChannel* data_channel) {
422 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 if (data_channel) {
424 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700425 RTC_FROM_HERE,
deadbeef953c2ce2017-01-09 14:53:41 -0800426 Bind(&ChannelManager::DestroyRtpDataChannel_w, this, data_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 }
428}
429
deadbeef953c2ce2017-01-09 14:53:41 -0800430void ChannelManager::DestroyRtpDataChannel_w(RtpDataChannel* data_channel) {
431 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel_w");
nisseede5da42017-01-12 05:15:36 -0800432 RTC_DCHECK(initialized_);
Steve Anton774115c2017-08-30 10:48:46 -0700433
434 auto it = std::find_if(data_channels_.begin(), data_channels_.end(),
435 [&](const std::unique_ptr<RtpDataChannel>& p) {
436 return p.get() == data_channel;
437 });
nisseede5da42017-01-12 05:15:36 -0800438 RTC_DCHECK(it != data_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 if (it == data_channels_.end())
440 return;
441
442 data_channels_.erase(it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443}
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