blob: e597032dc164f0b70803bc11f0de5c9479cc6561 [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/device.h"
17#include "media/base/rtpdataengine.h"
18#include "pc/srtpfilter.h"
19#include "rtc_base/bind.h"
20#include "rtc_base/checks.h"
21#include "rtc_base/logging.h"
22#include "rtc_base/stringencode.h"
23#include "rtc_base/stringutils.h"
24#include "rtc_base/trace_event.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000025
26namespace cricket {
27
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000029using rtc::Bind;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030
deadbeef112b2e92017-02-10 20:13:37 -080031ChannelManager::ChannelManager(std::unique_ptr<MediaEngineInterface> me,
32 std::unique_ptr<DataEngineInterface> dme,
Danil Chapovalov33b01f22016-05-11 19:55:27 +020033 rtc::Thread* thread) {
deadbeef112b2e92017-02-10 20:13:37 -080034 Construct(std::move(me), std::move(dme), thread, thread);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035}
36
deadbeef112b2e92017-02-10 20:13:37 -080037ChannelManager::ChannelManager(std::unique_ptr<MediaEngineInterface> me,
Danil Chapovalov33b01f22016-05-11 19:55:27 +020038 rtc::Thread* worker_thread,
39 rtc::Thread* network_thread) {
deadbeef112b2e92017-02-10 20:13:37 -080040 Construct(std::move(me),
41 std::unique_ptr<DataEngineInterface>(new RtpDataEngine()),
42 worker_thread, network_thread);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043}
44
deadbeef112b2e92017-02-10 20:13:37 -080045void ChannelManager::Construct(std::unique_ptr<MediaEngineInterface> me,
46 std::unique_ptr<DataEngineInterface> dme,
Danil Chapovalov33b01f22016-05-11 19:55:27 +020047 rtc::Thread* worker_thread,
48 rtc::Thread* network_thread) {
deadbeef112b2e92017-02-10 20:13:37 -080049 media_engine_ = std::move(me);
50 data_media_engine_ = std::move(dme);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051 initialized_ = false;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000052 main_thread_ = rtc::Thread::Current();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053 worker_thread_ = worker_thread;
Danil Chapovalov33b01f22016-05-11 19:55:27 +020054 network_thread_ = network_thread;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055 capturing_ = false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000056 enable_rtx_ = false;
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 }
perkjc11b1842016-03-07 17:34:13 -080063 // The media engine needs to be deleted on the worker thread for thread safe
64 // destruction,
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -070065 worker_thread_->Invoke<void>(
66 RTC_FROM_HERE, Bind(&ChannelManager::DestructorDeletes_w, this));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067}
68
69bool ChannelManager::SetVideoRtxEnabled(bool enable) {
70 // To be safe, this call is only allowed before initialization. Apps like
71 // Flute only have a singleton ChannelManager and we don't want this flag to
72 // be toggled between calls or when there's concurrent calls. We expect apps
73 // to enable this at startup and retain that setting for the lifetime of the
74 // app.
75 if (!initialized_) {
76 enable_rtx_ = enable;
77 return true;
78 } else {
79 LOG(LS_WARNING) << "Cannot toggle rtx after initialization!";
80 return false;
81 }
82}
83
ossudedfd282016-06-14 07:12:39 -070084void ChannelManager::GetSupportedAudioSendCodecs(
henrike@webrtc.org28e20752013-07-10 00:45:36 +000085 std::vector<AudioCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -070086 if (!media_engine_) {
87 return;
88 }
ossudedfd282016-06-14 07:12:39 -070089 *codecs = media_engine_->audio_send_codecs();
90}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091
ossudedfd282016-06-14 07:12:39 -070092void ChannelManager::GetSupportedAudioReceiveCodecs(
93 std::vector<AudioCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -070094 if (!media_engine_) {
95 return;
96 }
ossudedfd282016-06-14 07:12:39 -070097 *codecs = media_engine_->audio_recv_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098}
99
100void ChannelManager::GetSupportedAudioRtpHeaderExtensions(
101 RtpHeaderExtensions* ext) const {
zhihuang38ede132017-06-15 12:52:32 -0700102 if (!media_engine_) {
103 return;
104 }
Stefan Holmer9d69c3f2015-12-07 10:45:43 +0100105 *ext = media_engine_->GetAudioCapabilities().header_extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106}
107
magjed3cf8ece2016-11-10 03:36:53 -0800108void ChannelManager::GetSupportedVideoCodecs(
109 std::vector<VideoCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -0700110 if (!media_engine_) {
111 return;
112 }
magjed3cf8ece2016-11-10 03:36:53 -0800113 codecs->clear();
114
brandtrffc61182016-11-28 06:02:22 -0800115 std::vector<VideoCodec> video_codecs = media_engine_->video_codecs();
116 for (const auto& video_codec : video_codecs) {
117 if (!enable_rtx_ &&
118 _stricmp(kRtxCodecName, video_codec.name.c_str()) == 0) {
magjed3cf8ece2016-11-10 03:36:53 -0800119 continue;
120 }
brandtrffc61182016-11-28 06:02:22 -0800121 codecs->push_back(video_codec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 }
123}
124
125void ChannelManager::GetSupportedVideoRtpHeaderExtensions(
126 RtpHeaderExtensions* ext) const {
zhihuang38ede132017-06-15 12:52:32 -0700127 if (!media_engine_) {
128 return;
129 }
Stefan Holmer9d69c3f2015-12-07 10:45:43 +0100130 *ext = media_engine_->GetVideoCapabilities().header_extensions;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131}
132
133void ChannelManager::GetSupportedDataCodecs(
134 std::vector<DataCodec>* codecs) const {
zhihuang38ede132017-06-15 12:52:32 -0700135 if (!data_media_engine_) {
136 return;
137 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 *codecs = data_media_engine_->data_codecs();
139}
140
141bool ChannelManager::Init() {
nisseede5da42017-01-12 05:15:36 -0800142 RTC_DCHECK(!initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 if (initialized_) {
144 return false;
145 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200146 RTC_DCHECK(network_thread_);
147 RTC_DCHECK(worker_thread_);
148 if (!network_thread_->IsCurrent()) {
149 // Do not allow invoking calls to other threads on the network thread.
150 network_thread_->Invoke<bool>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700151 RTC_FROM_HERE,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200152 rtc::Bind(&rtc::Thread::SetAllowBlockingCalls, network_thread_, false));
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000153 }
154
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200155 initialized_ = worker_thread_->Invoke<bool>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700156 RTC_FROM_HERE, Bind(&ChannelManager::InitMediaEngine_w, this));
nisseede5da42017-01-12 05:15:36 -0800157 RTC_DCHECK(initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000158 return initialized_;
159}
160
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000161bool ChannelManager::InitMediaEngine_w() {
nisseede5da42017-01-12 05:15:36 -0800162 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
zhihuang38ede132017-06-15 12:52:32 -0700163 if (media_engine_) {
164 return media_engine_->Init();
165 }
166 return true;
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000167}
168
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169void ChannelManager::Terminate() {
nisseede5da42017-01-12 05:15:36 -0800170 RTC_DCHECK(initialized_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 if (!initialized_) {
172 return;
173 }
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700174 worker_thread_->Invoke<void>(RTC_FROM_HERE,
175 Bind(&ChannelManager::Terminate_w, this));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176 initialized_ = false;
177}
178
hbos@webrtc.org4aef5fe2015-02-25 10:09:05 +0000179void ChannelManager::DestructorDeletes_w() {
nisseede5da42017-01-12 05:15:36 -0800180 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
Steve Anton774115c2017-08-30 10:48:46 -0700181 media_engine_.reset(nullptr);
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000182}
183
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000184void ChannelManager::Terminate_w() {
nisseede5da42017-01-12 05:15:36 -0800185 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 // Need to destroy the voice/video channels
Steve Anton774115c2017-08-30 10:48:46 -0700187 video_channels_.clear();
188 voice_channels_.clear();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189}
190
191VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700192 webrtc::Call* call,
193 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800194 DtlsTransportInternal* rtp_transport,
195 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800196 rtc::Thread* signaling_thread,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200197 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800198 bool srtp_required,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200199 const AudioOptions& options) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200 return worker_thread_->Invoke<VoiceChannel*>(
zhihuangf5b251b2017-01-12 19:37:48 -0800201 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700202 Bind(&ChannelManager::CreateVoiceChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800203 rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
204 signaling_thread, content_name, srtp_required, options));
205}
206
207VoiceChannel* ChannelManager::CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -0700208 webrtc::Call* call,
209 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800210 rtc::PacketTransportInternal* rtp_transport,
211 rtc::PacketTransportInternal* rtcp_transport,
212 rtc::Thread* signaling_thread,
213 const std::string& content_name,
214 bool srtp_required,
215 const AudioOptions& options) {
216 return worker_thread_->Invoke<VoiceChannel*>(
217 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700218 Bind(&ChannelManager::CreateVoiceChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800219 nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
220 content_name, srtp_required, options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000221}
222
223VoiceChannel* ChannelManager::CreateVoiceChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700224 webrtc::Call* call,
225 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800226 DtlsTransportInternal* rtp_dtls_transport,
227 DtlsTransportInternal* rtcp_dtls_transport,
228 rtc::PacketTransportInternal* rtp_packet_transport,
229 rtc::PacketTransportInternal* rtcp_packet_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800230 rtc::Thread* signaling_thread,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200231 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800232 bool srtp_required,
Jelena Marusicc28a8962015-05-29 15:05:44 +0200233 const AudioOptions& options) {
nisseede5da42017-01-12 05:15:36 -0800234 RTC_DCHECK(initialized_);
235 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
nisseeaabdf62017-05-05 02:23:02 -0700236 RTC_DCHECK(nullptr != call);
zhihuang38ede132017-06-15 12:52:32 -0700237 if (!media_engine_) {
238 return nullptr;
239 }
zhihuangf5b251b2017-01-12 19:37:48 -0800240
nisse51542be2016-02-12 02:27:06 -0800241 VoiceMediaChannel* media_channel = media_engine_->CreateChannel(
nisseeaabdf62017-05-05 02:23:02 -0700242 call, media_config, options);
Steve Anton774115c2017-08-30 10:48:46 -0700243 if (!media_channel) {
Jelena Marusicc28a8962015-05-29 15:05:44 +0200244 return nullptr;
Steve Anton774115c2017-08-30 10:48:46 -0700245 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000246
Steve Anton774115c2017-08-30 10:48:46 -0700247 std::unique_ptr<VoiceChannel> voice_channel(
deadbeefe814a0d2017-02-25 18:15:09 -0800248 new VoiceChannel(worker_thread_, network_thread_, signaling_thread,
249 media_engine_.get(), media_channel, content_name,
Steve Anton774115c2017-08-30 10:48:46 -0700250 rtcp_packet_transport == nullptr, srtp_required));
zhihuangf5b251b2017-01-12 19:37:48 -0800251
deadbeefe814a0d2017-02-25 18:15:09 -0800252 if (!voice_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
253 rtp_packet_transport, rtcp_packet_transport)) {
Jelena Marusicc28a8962015-05-29 15:05:44 +0200254 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000255 }
Steve Anton774115c2017-08-30 10:48:46 -0700256 VoiceChannel* voice_channel_ptr = voice_channel.get();
257 voice_channels_.push_back(std::move(voice_channel));
258 return voice_channel_ptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000259}
260
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200261void ChannelManager::DestroyVoiceChannel(VoiceChannel* voice_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100262 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263 if (voice_channel) {
264 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700265 RTC_FROM_HERE,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200266 Bind(&ChannelManager::DestroyVoiceChannel_w, this, voice_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000267 }
268}
269
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200270void ChannelManager::DestroyVoiceChannel_w(VoiceChannel* voice_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100271 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel_w");
nisseede5da42017-01-12 05:15:36 -0800272 RTC_DCHECK(initialized_);
273 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
Steve Anton774115c2017-08-30 10:48:46 -0700274
275 auto it = std::find_if(voice_channels_.begin(), voice_channels_.end(),
276 [&](const std::unique_ptr<VoiceChannel>& p) {
277 return p.get() == voice_channel;
278 });
nisseede5da42017-01-12 05:15:36 -0800279 RTC_DCHECK(it != voice_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000280 if (it == voice_channels_.end())
281 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000282 voice_channels_.erase(it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000283}
284
285VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700286 webrtc::Call* call,
287 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800288 DtlsTransportInternal* rtp_transport,
289 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800290 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000291 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800292 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200293 const VideoOptions& options) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000294 return worker_thread_->Invoke<VideoChannel*>(
zhihuangf5b251b2017-01-12 19:37:48 -0800295 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 rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
298 signaling_thread, content_name, srtp_required, options));
299}
300
301VideoChannel* ChannelManager::CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700302 webrtc::Call* call,
303 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800304 rtc::PacketTransportInternal* rtp_transport,
305 rtc::PacketTransportInternal* rtcp_transport,
306 rtc::Thread* signaling_thread,
307 const std::string& content_name,
308 bool srtp_required,
309 const VideoOptions& options) {
310 return worker_thread_->Invoke<VideoChannel*>(
311 RTC_FROM_HERE,
nisseeaabdf62017-05-05 02:23:02 -0700312 Bind(&ChannelManager::CreateVideoChannel_w, this, call, media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800313 nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
314 content_name, srtp_required, options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000315}
316
317VideoChannel* ChannelManager::CreateVideoChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700318 webrtc::Call* call,
319 const cricket::MediaConfig& media_config,
deadbeefe814a0d2017-02-25 18:15:09 -0800320 DtlsTransportInternal* rtp_dtls_transport,
321 DtlsTransportInternal* rtcp_dtls_transport,
322 rtc::PacketTransportInternal* rtp_packet_transport,
323 rtc::PacketTransportInternal* rtcp_packet_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800324 rtc::Thread* signaling_thread,
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000325 const std::string& content_name,
deadbeef7af91dd2016-12-13 11:29:11 -0800326 bool srtp_required,
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200327 const VideoOptions& options) {
nisseede5da42017-01-12 05:15:36 -0800328 RTC_DCHECK(initialized_);
329 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
nisseeaabdf62017-05-05 02:23:02 -0700330 RTC_DCHECK(nullptr != call);
nisse51542be2016-02-12 02:27:06 -0800331 VideoMediaChannel* media_channel = media_engine_->CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -0700332 call, media_config, options);
Steve Anton774115c2017-08-30 10:48:46 -0700333 if (!media_channel) {
334 return nullptr;
deadbeefcbecd352015-09-23 11:50:27 -0700335 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000336
Steve Anton774115c2017-08-30 10:48:46 -0700337 std::unique_ptr<VideoChannel> video_channel(new VideoChannel(
deadbeefac22f702017-01-12 21:59:29 -0800338 worker_thread_, network_thread_, signaling_thread, media_channel,
Steve Anton774115c2017-08-30 10:48:46 -0700339 content_name, rtcp_packet_transport == nullptr, srtp_required));
deadbeefe814a0d2017-02-25 18:15:09 -0800340 if (!video_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
341 rtp_packet_transport, rtcp_packet_transport)) {
Steve Anton774115c2017-08-30 10:48:46 -0700342 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343 }
Steve Anton774115c2017-08-30 10:48:46 -0700344 VideoChannel* video_channel_ptr = video_channel.get();
345 video_channels_.push_back(std::move(video_channel));
346 return video_channel_ptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000347}
348
349void ChannelManager::DestroyVideoChannel(VideoChannel* video_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100350 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 if (video_channel) {
352 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700353 RTC_FROM_HERE,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000354 Bind(&ChannelManager::DestroyVideoChannel_w, this, video_channel));
355 }
356}
357
358void ChannelManager::DestroyVideoChannel_w(VideoChannel* video_channel) {
Peter Boström1a9d6152015-12-08 22:15:17 +0100359 TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel_w");
nisseede5da42017-01-12 05:15:36 -0800360 RTC_DCHECK(initialized_);
361 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
Steve Anton774115c2017-08-30 10:48:46 -0700362
363 auto it = std::find_if(video_channels_.begin(), video_channels_.end(),
364 [&](const std::unique_ptr<VideoChannel>& p) {
365 return p.get() == video_channel;
366 });
nisseede5da42017-01-12 05:15:36 -0800367 RTC_DCHECK(it != video_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 if (it == video_channels_.end())
369 return;
370
371 video_channels_.erase(it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000372}
373
deadbeef953c2ce2017-01-09 14:53:41 -0800374RtpDataChannel* ChannelManager::CreateRtpDataChannel(
nisseeaabdf62017-05-05 02:23:02 -0700375 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800376 DtlsTransportInternal* rtp_transport,
377 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800378 rtc::Thread* signaling_thread,
zhihuangebbe4f22016-12-06 10:45:42 -0800379 const std::string& content_name,
deadbeef953c2ce2017-01-09 14:53:41 -0800380 bool srtp_required) {
381 return worker_thread_->Invoke<RtpDataChannel*>(
deadbeef1a2183d2017-02-10 23:44:49 -0800382 RTC_FROM_HERE, Bind(&ChannelManager::CreateRtpDataChannel_w, this,
nisseeaabdf62017-05-05 02:23:02 -0700383 media_config, rtp_transport, rtcp_transport,
deadbeef1a2183d2017-02-10 23:44:49 -0800384 signaling_thread, content_name, srtp_required));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000385}
386
deadbeef953c2ce2017-01-09 14:53:41 -0800387RtpDataChannel* ChannelManager::CreateRtpDataChannel_w(
nisseeaabdf62017-05-05 02:23:02 -0700388 const cricket::MediaConfig& media_config,
zhihuangb2cdd932017-01-19 16:54:25 -0800389 DtlsTransportInternal* rtp_transport,
390 DtlsTransportInternal* rtcp_transport,
zhihuangf5b251b2017-01-12 19:37:48 -0800391 rtc::Thread* signaling_thread,
deadbeefcbecd352015-09-23 11:50:27 -0700392 const std::string& content_name,
deadbeef953c2ce2017-01-09 14:53:41 -0800393 bool srtp_required) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000394 // This is ok to alloc from a thread other than the worker thread.
nisseede5da42017-01-12 05:15:36 -0800395 RTC_DCHECK(initialized_);
nisseeaabdf62017-05-05 02:23:02 -0700396 DataMediaChannel* media_channel
397 = data_media_engine_->CreateChannel(media_config);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398 if (!media_channel) {
deadbeef953c2ce2017-01-09 14:53:41 -0800399 LOG(LS_WARNING) << "Failed to create RTP data channel.";
400 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000401 }
402
Steve Anton774115c2017-08-30 10:48:46 -0700403 std::unique_ptr<RtpDataChannel> data_channel(new RtpDataChannel(
deadbeefac22f702017-01-12 21:59:29 -0800404 worker_thread_, network_thread_, signaling_thread, media_channel,
Steve Anton774115c2017-08-30 10:48:46 -0700405 content_name, rtcp_transport == nullptr, srtp_required));
deadbeeff5346592017-01-24 21:51:21 -0800406 if (!data_channel->Init_w(rtp_transport, rtcp_transport, rtp_transport,
407 rtcp_transport)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 LOG(LS_WARNING) << "Failed to init data channel.";
deadbeef953c2ce2017-01-09 14:53:41 -0800409 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 }
Steve Anton774115c2017-08-30 10:48:46 -0700411 RtpDataChannel* data_channel_ptr = data_channel.get();
412 data_channels_.push_back(std::move(data_channel));
413 return data_channel_ptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414}
415
deadbeef953c2ce2017-01-09 14:53:41 -0800416void ChannelManager::DestroyRtpDataChannel(RtpDataChannel* data_channel) {
417 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 if (data_channel) {
419 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700420 RTC_FROM_HERE,
deadbeef953c2ce2017-01-09 14:53:41 -0800421 Bind(&ChannelManager::DestroyRtpDataChannel_w, this, data_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422 }
423}
424
deadbeef953c2ce2017-01-09 14:53:41 -0800425void ChannelManager::DestroyRtpDataChannel_w(RtpDataChannel* data_channel) {
426 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel_w");
nisseede5da42017-01-12 05:15:36 -0800427 RTC_DCHECK(initialized_);
Steve Anton774115c2017-08-30 10:48:46 -0700428
429 auto it = std::find_if(data_channels_.begin(), data_channels_.end(),
430 [&](const std::unique_ptr<RtpDataChannel>& p) {
431 return p.get() == data_channel;
432 });
nisseede5da42017-01-12 05:15:36 -0800433 RTC_DCHECK(it != data_channels_.end());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 if (it == data_channels_.end())
435 return;
436
437 data_channels_.erase(it);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438}
439
ivocd66b44d2016-01-15 03:06:36 -0800440bool ChannelManager::StartAecDump(rtc::PlatformFile file,
441 int64_t max_size_bytes) {
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700442 return worker_thread_->Invoke<bool>(
443 RTC_FROM_HERE, Bind(&MediaEngineInterface::StartAecDump,
444 media_engine_.get(), file, max_size_bytes));
wu@webrtc.orga9890802013-12-13 00:21:03 +0000445}
446
ivoc797ef122015-10-22 03:25:41 -0700447void ChannelManager::StopAecDump() {
448 worker_thread_->Invoke<void>(
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700449 RTC_FROM_HERE,
ivoc797ef122015-10-22 03:25:41 -0700450 Bind(&MediaEngineInterface::StopAecDump, media_engine_.get()));
451}
452
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453} // namespace cricket