| Index: webrtc/pc/channelmanager.cc
|
| diff --git a/webrtc/pc/channelmanager.cc b/webrtc/pc/channelmanager.cc
|
| index cdfed68bb6bbd7f98b70c2f13a5bec3da48f4e57..a0b3609ecfc89ee61f733082528514007348170a 100644
|
| --- a/webrtc/pc/channelmanager.cc
|
| +++ b/webrtc/pc/channelmanager.cc
|
| @@ -20,7 +20,11 @@
|
| #include "webrtc/base/stringutils.h"
|
| #include "webrtc/base/trace_event.h"
|
| #include "webrtc/media/base/device.h"
|
| +#include "webrtc/media/base/hybriddataengine.h"
|
| #include "webrtc/media/base/rtpdataengine.h"
|
| +#ifdef HAVE_SCTP
|
| +#include "webrtc/media/sctp/sctpdataengine.h"
|
| +#endif
|
| #include "webrtc/pc/srtpfilter.h"
|
|
|
| namespace cricket {
|
| @@ -29,7 +33,11 @@ namespace cricket {
|
| using rtc::Bind;
|
|
|
| static DataEngineInterface* ConstructDataEngine() {
|
| +#ifdef HAVE_SCTP
|
| + return new HybridDataEngine(new RtpDataEngine(), new SctpDataEngine());
|
| +#else
|
| return new RtpDataEngine();
|
| +#endif
|
| }
|
|
|
| ChannelManager::ChannelManager(MediaEngineInterface* me,
|
| @@ -336,66 +344,73 @@ void ChannelManager::DestroyVideoChannel_w(VideoChannel* video_channel) {
|
| delete video_channel;
|
| }
|
|
|
| -RtpDataChannel* ChannelManager::CreateRtpDataChannel(
|
| +DataChannel* ChannelManager::CreateDataChannel(
|
| webrtc::MediaControllerInterface* media_controller,
|
| TransportController* transport_controller,
|
| const std::string& content_name,
|
| const std::string* bundle_transport_name,
|
| bool rtcp,
|
| - bool srtp_required) {
|
| - return worker_thread_->Invoke<RtpDataChannel*>(
|
| - RTC_FROM_HERE, Bind(&ChannelManager::CreateRtpDataChannel_w, this,
|
| - media_controller, transport_controller, content_name,
|
| - bundle_transport_name, rtcp, srtp_required));
|
| + bool srtp_required,
|
| + DataChannelType channel_type) {
|
| + return worker_thread_->Invoke<DataChannel*>(
|
| + RTC_FROM_HERE,
|
| + Bind(&ChannelManager::CreateDataChannel_w, this, media_controller,
|
| + transport_controller, content_name, bundle_transport_name, rtcp,
|
| + srtp_required, channel_type));
|
| }
|
|
|
| -RtpDataChannel* ChannelManager::CreateRtpDataChannel_w(
|
| +DataChannel* ChannelManager::CreateDataChannel_w(
|
| webrtc::MediaControllerInterface* media_controller,
|
| TransportController* transport_controller,
|
| const std::string& content_name,
|
| const std::string* bundle_transport_name,
|
| bool rtcp,
|
| - bool srtp_required) {
|
| + bool srtp_required,
|
| + DataChannelType data_channel_type) {
|
| // This is ok to alloc from a thread other than the worker thread.
|
| ASSERT(initialized_);
|
| MediaConfig config;
|
| if (media_controller) {
|
| config = media_controller->config();
|
| }
|
| - DataMediaChannel* media_channel = data_media_engine_->CreateChannel(config);
|
| + DataMediaChannel* media_channel =
|
| + data_media_engine_->CreateChannel(data_channel_type, config);
|
| if (!media_channel) {
|
| - LOG(LS_WARNING) << "Failed to create RTP data channel.";
|
| - return nullptr;
|
| + LOG(LS_WARNING) << "Failed to create data channel of type "
|
| + << data_channel_type;
|
| + return NULL;
|
| }
|
|
|
| - RtpDataChannel* data_channel = new RtpDataChannel(
|
| - worker_thread_, network_thread_, media_channel, transport_controller,
|
| - content_name, rtcp, srtp_required);
|
| + // Only RTP data channels need SRTP.
|
| + srtp_required = srtp_required && data_channel_type == DCT_RTP;
|
| + DataChannel* data_channel =
|
| + new DataChannel(worker_thread_, network_thread_, media_channel,
|
| + transport_controller, content_name, rtcp, srtp_required);
|
| data_channel->SetCryptoOptions(crypto_options_);
|
| if (!data_channel->Init_w(bundle_transport_name)) {
|
| LOG(LS_WARNING) << "Failed to init data channel.";
|
| delete data_channel;
|
| - return nullptr;
|
| + return NULL;
|
| }
|
| data_channels_.push_back(data_channel);
|
| return data_channel;
|
| }
|
|
|
| -void ChannelManager::DestroyRtpDataChannel(RtpDataChannel* data_channel) {
|
| - TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel");
|
| +void ChannelManager::DestroyDataChannel(DataChannel* data_channel) {
|
| + TRACE_EVENT0("webrtc", "ChannelManager::DestroyDataChannel");
|
| if (data_channel) {
|
| worker_thread_->Invoke<void>(
|
| RTC_FROM_HERE,
|
| - Bind(&ChannelManager::DestroyRtpDataChannel_w, this, data_channel));
|
| + Bind(&ChannelManager::DestroyDataChannel_w, this, data_channel));
|
| }
|
| }
|
|
|
| -void ChannelManager::DestroyRtpDataChannel_w(RtpDataChannel* data_channel) {
|
| - TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel_w");
|
| +void ChannelManager::DestroyDataChannel_w(DataChannel* data_channel) {
|
| + TRACE_EVENT0("webrtc", "ChannelManager::DestroyDataChannel_w");
|
| // Destroy data channel.
|
| ASSERT(initialized_);
|
| - RtpDataChannels::iterator it =
|
| - std::find(data_channels_.begin(), data_channels_.end(), data_channel);
|
| + DataChannels::iterator it = std::find(data_channels_.begin(),
|
| + data_channels_.end(), data_channel);
|
| ASSERT(it != data_channels_.end());
|
| if (it == data_channels_.end())
|
| return;
|
|
|