OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/pc/channelmanager.h" | 11 #include "webrtc/pc/channelmanager.h" |
12 | 12 |
13 #include <algorithm> | 13 #include <algorithm> |
14 | 14 |
15 #include "webrtc/api/mediacontroller.h" | 15 #include "webrtc/api/mediacontroller.h" |
16 #include "webrtc/base/bind.h" | 16 #include "webrtc/base/bind.h" |
17 #include "webrtc/base/common.h" | 17 #include "webrtc/base/common.h" |
18 #include "webrtc/base/logging.h" | 18 #include "webrtc/base/logging.h" |
19 #include "webrtc/base/stringencode.h" | 19 #include "webrtc/base/stringencode.h" |
20 #include "webrtc/base/stringutils.h" | 20 #include "webrtc/base/stringutils.h" |
21 #include "webrtc/base/trace_event.h" | 21 #include "webrtc/base/trace_event.h" |
22 #include "webrtc/media/base/device.h" | 22 #include "webrtc/media/base/device.h" |
| 23 #include "webrtc/media/base/hybriddataengine.h" |
23 #include "webrtc/media/base/rtpdataengine.h" | 24 #include "webrtc/media/base/rtpdataengine.h" |
| 25 #ifdef HAVE_SCTP |
| 26 #include "webrtc/media/sctp/sctpdataengine.h" |
| 27 #endif |
24 #include "webrtc/pc/srtpfilter.h" | 28 #include "webrtc/pc/srtpfilter.h" |
25 | 29 |
26 namespace cricket { | 30 namespace cricket { |
27 | 31 |
28 | 32 |
29 using rtc::Bind; | 33 using rtc::Bind; |
30 | 34 |
31 static DataEngineInterface* ConstructDataEngine() { | 35 static DataEngineInterface* ConstructDataEngine() { |
| 36 #ifdef HAVE_SCTP |
| 37 return new HybridDataEngine(new RtpDataEngine(), new SctpDataEngine()); |
| 38 #else |
32 return new RtpDataEngine(); | 39 return new RtpDataEngine(); |
| 40 #endif |
33 } | 41 } |
34 | 42 |
35 ChannelManager::ChannelManager(MediaEngineInterface* me, | 43 ChannelManager::ChannelManager(MediaEngineInterface* me, |
36 DataEngineInterface* dme, | 44 DataEngineInterface* dme, |
37 rtc::Thread* thread) { | 45 rtc::Thread* thread) { |
38 Construct(me, dme, thread, thread); | 46 Construct(me, dme, thread, thread); |
39 } | 47 } |
40 | 48 |
41 ChannelManager::ChannelManager(MediaEngineInterface* me, | 49 ChannelManager::ChannelManager(MediaEngineInterface* me, |
42 rtc::Thread* worker_thread, | 50 rtc::Thread* worker_thread, |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 VideoChannels::iterator it = std::find(video_channels_.begin(), | 337 VideoChannels::iterator it = std::find(video_channels_.begin(), |
330 video_channels_.end(), video_channel); | 338 video_channels_.end(), video_channel); |
331 ASSERT(it != video_channels_.end()); | 339 ASSERT(it != video_channels_.end()); |
332 if (it == video_channels_.end()) | 340 if (it == video_channels_.end()) |
333 return; | 341 return; |
334 | 342 |
335 video_channels_.erase(it); | 343 video_channels_.erase(it); |
336 delete video_channel; | 344 delete video_channel; |
337 } | 345 } |
338 | 346 |
339 RtpDataChannel* ChannelManager::CreateRtpDataChannel( | 347 DataChannel* ChannelManager::CreateDataChannel( |
340 webrtc::MediaControllerInterface* media_controller, | 348 webrtc::MediaControllerInterface* media_controller, |
341 TransportController* transport_controller, | 349 TransportController* transport_controller, |
342 const std::string& content_name, | 350 const std::string& content_name, |
343 const std::string* bundle_transport_name, | 351 const std::string* bundle_transport_name, |
344 bool rtcp, | 352 bool rtcp, |
345 bool srtp_required) { | 353 bool srtp_required, |
346 return worker_thread_->Invoke<RtpDataChannel*>( | 354 DataChannelType channel_type) { |
347 RTC_FROM_HERE, Bind(&ChannelManager::CreateRtpDataChannel_w, this, | 355 return worker_thread_->Invoke<DataChannel*>( |
348 media_controller, transport_controller, content_name, | 356 RTC_FROM_HERE, |
349 bundle_transport_name, rtcp, srtp_required)); | 357 Bind(&ChannelManager::CreateDataChannel_w, this, media_controller, |
| 358 transport_controller, content_name, bundle_transport_name, rtcp, |
| 359 srtp_required, channel_type)); |
350 } | 360 } |
351 | 361 |
352 RtpDataChannel* ChannelManager::CreateRtpDataChannel_w( | 362 DataChannel* ChannelManager::CreateDataChannel_w( |
353 webrtc::MediaControllerInterface* media_controller, | 363 webrtc::MediaControllerInterface* media_controller, |
354 TransportController* transport_controller, | 364 TransportController* transport_controller, |
355 const std::string& content_name, | 365 const std::string& content_name, |
356 const std::string* bundle_transport_name, | 366 const std::string* bundle_transport_name, |
357 bool rtcp, | 367 bool rtcp, |
358 bool srtp_required) { | 368 bool srtp_required, |
| 369 DataChannelType data_channel_type) { |
359 // This is ok to alloc from a thread other than the worker thread. | 370 // This is ok to alloc from a thread other than the worker thread. |
360 ASSERT(initialized_); | 371 ASSERT(initialized_); |
361 MediaConfig config; | 372 MediaConfig config; |
362 if (media_controller) { | 373 if (media_controller) { |
363 config = media_controller->config(); | 374 config = media_controller->config(); |
364 } | 375 } |
365 DataMediaChannel* media_channel = data_media_engine_->CreateChannel(config); | 376 DataMediaChannel* media_channel = |
| 377 data_media_engine_->CreateChannel(data_channel_type, config); |
366 if (!media_channel) { | 378 if (!media_channel) { |
367 LOG(LS_WARNING) << "Failed to create RTP data channel."; | 379 LOG(LS_WARNING) << "Failed to create data channel of type " |
368 return nullptr; | 380 << data_channel_type; |
| 381 return NULL; |
369 } | 382 } |
370 | 383 |
371 RtpDataChannel* data_channel = new RtpDataChannel( | 384 // Only RTP data channels need SRTP. |
372 worker_thread_, network_thread_, media_channel, transport_controller, | 385 srtp_required = srtp_required && data_channel_type == DCT_RTP; |
373 content_name, rtcp, srtp_required); | 386 DataChannel* data_channel = |
| 387 new DataChannel(worker_thread_, network_thread_, media_channel, |
| 388 transport_controller, content_name, rtcp, srtp_required); |
374 data_channel->SetCryptoOptions(crypto_options_); | 389 data_channel->SetCryptoOptions(crypto_options_); |
375 if (!data_channel->Init_w(bundle_transport_name)) { | 390 if (!data_channel->Init_w(bundle_transport_name)) { |
376 LOG(LS_WARNING) << "Failed to init data channel."; | 391 LOG(LS_WARNING) << "Failed to init data channel."; |
377 delete data_channel; | 392 delete data_channel; |
378 return nullptr; | 393 return NULL; |
379 } | 394 } |
380 data_channels_.push_back(data_channel); | 395 data_channels_.push_back(data_channel); |
381 return data_channel; | 396 return data_channel; |
382 } | 397 } |
383 | 398 |
384 void ChannelManager::DestroyRtpDataChannel(RtpDataChannel* data_channel) { | 399 void ChannelManager::DestroyDataChannel(DataChannel* data_channel) { |
385 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel"); | 400 TRACE_EVENT0("webrtc", "ChannelManager::DestroyDataChannel"); |
386 if (data_channel) { | 401 if (data_channel) { |
387 worker_thread_->Invoke<void>( | 402 worker_thread_->Invoke<void>( |
388 RTC_FROM_HERE, | 403 RTC_FROM_HERE, |
389 Bind(&ChannelManager::DestroyRtpDataChannel_w, this, data_channel)); | 404 Bind(&ChannelManager::DestroyDataChannel_w, this, data_channel)); |
390 } | 405 } |
391 } | 406 } |
392 | 407 |
393 void ChannelManager::DestroyRtpDataChannel_w(RtpDataChannel* data_channel) { | 408 void ChannelManager::DestroyDataChannel_w(DataChannel* data_channel) { |
394 TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel_w"); | 409 TRACE_EVENT0("webrtc", "ChannelManager::DestroyDataChannel_w"); |
395 // Destroy data channel. | 410 // Destroy data channel. |
396 ASSERT(initialized_); | 411 ASSERT(initialized_); |
397 RtpDataChannels::iterator it = | 412 DataChannels::iterator it = std::find(data_channels_.begin(), |
398 std::find(data_channels_.begin(), data_channels_.end(), data_channel); | 413 data_channels_.end(), data_channel); |
399 ASSERT(it != data_channels_.end()); | 414 ASSERT(it != data_channels_.end()); |
400 if (it == data_channels_.end()) | 415 if (it == data_channels_.end()) |
401 return; | 416 return; |
402 | 417 |
403 data_channels_.erase(it); | 418 data_channels_.erase(it); |
404 delete data_channel; | 419 delete data_channel; |
405 } | 420 } |
406 | 421 |
407 bool ChannelManager::StartAecDump(rtc::PlatformFile file, | 422 bool ChannelManager::StartAecDump(rtc::PlatformFile file, |
408 int64_t max_size_bytes) { | 423 int64_t max_size_bytes) { |
409 return worker_thread_->Invoke<bool>( | 424 return worker_thread_->Invoke<bool>( |
410 RTC_FROM_HERE, Bind(&MediaEngineInterface::StartAecDump, | 425 RTC_FROM_HERE, Bind(&MediaEngineInterface::StartAecDump, |
411 media_engine_.get(), file, max_size_bytes)); | 426 media_engine_.get(), file, max_size_bytes)); |
412 } | 427 } |
413 | 428 |
414 void ChannelManager::StopAecDump() { | 429 void ChannelManager::StopAecDump() { |
415 worker_thread_->Invoke<void>( | 430 worker_thread_->Invoke<void>( |
416 RTC_FROM_HERE, | 431 RTC_FROM_HERE, |
417 Bind(&MediaEngineInterface::StopAecDump, media_engine_.get())); | 432 Bind(&MediaEngineInterface::StopAecDump, media_engine_.get())); |
418 } | 433 } |
419 | 434 |
420 } // namespace cricket | 435 } // namespace cricket |
OLD | NEW |