| Index: talk/app/webrtc/webrtcsession.cc
|
| diff --git a/talk/app/webrtc/webrtcsession.cc b/talk/app/webrtc/webrtcsession.cc
|
| index bdc47840bd1274380b10c906a4287ac63e9a9ba4..1a5751a111ed089af01b63e25ec4c2728091c845 100644
|
| --- a/talk/app/webrtc/webrtcsession.cc
|
| +++ b/talk/app/webrtc/webrtcsession.cc
|
| @@ -38,6 +38,7 @@
|
| #include "talk/app/webrtc/mediaconstraintsinterface.h"
|
| #include "talk/app/webrtc/mediastreamsignaling.h"
|
| #include "talk/app/webrtc/peerconnectioninterface.h"
|
| +#include "talk/app/webrtc/sctputils.h"
|
| #include "talk/app/webrtc/webrtcsessiondescriptionfactory.h"
|
| #include "talk/media/base/constants.h"
|
| #include "talk/media/base/videocapturer.h"
|
| @@ -536,12 +537,10 @@ class IceRestartAnswerLatch {
|
| bool ice_restart_;
|
| };
|
|
|
| -WebRtcSession::WebRtcSession(
|
| - cricket::ChannelManager* channel_manager,
|
| - rtc::Thread* signaling_thread,
|
| - rtc::Thread* worker_thread,
|
| - cricket::PortAllocator* port_allocator,
|
| - MediaStreamSignaling* mediastream_signaling)
|
| +WebRtcSession::WebRtcSession(cricket::ChannelManager* channel_manager,
|
| + rtc::Thread* signaling_thread,
|
| + rtc::Thread* worker_thread,
|
| + cricket::PortAllocator* port_allocator)
|
| : cricket::BaseSession(signaling_thread,
|
| worker_thread,
|
| port_allocator,
|
| @@ -551,7 +550,6 @@ WebRtcSession::WebRtcSession(
|
| // o line MUST be representable with a "64 bit signed integer".
|
| // Due to this constraint session id |sid_| is max limited to LLONG_MAX.
|
| channel_manager_(channel_manager),
|
| - mediastream_signaling_(mediastream_signaling),
|
| ice_observer_(NULL),
|
| ice_connection_state_(PeerConnectionInterface::kIceConnectionNew),
|
| ice_connection_receiving_(true),
|
| @@ -643,9 +641,6 @@ bool WebRtcSession::Initialize(
|
| data_channel_type_ = cricket::DCT_SCTP;
|
| }
|
| }
|
| - if (data_channel_type_ != cricket::DCT_NONE) {
|
| - mediastream_signaling_->SetDataChannelFactory(this);
|
| - }
|
|
|
| // Find DSCP constraint.
|
| if (FindConstraint(
|
| @@ -743,21 +738,19 @@ bool WebRtcSession::Initialize(
|
| if (!dtls_enabled_) {
|
| // Construct with DTLS disabled.
|
| webrtc_session_desc_factory_.reset(new WebRtcSessionDescriptionFactory(
|
| - signaling_thread(), channel_manager_, mediastream_signaling_, this,
|
| - id(), data_channel_type_));
|
| + signaling_thread(), channel_manager_, this, id()));
|
| } else {
|
| // Construct with DTLS enabled.
|
| if (!certificate) {
|
| // Use the |dtls_identity_store| to generate a certificate.
|
| RTC_DCHECK(dtls_identity_store);
|
| webrtc_session_desc_factory_.reset(new WebRtcSessionDescriptionFactory(
|
| - signaling_thread(), channel_manager_, mediastream_signaling_,
|
| - dtls_identity_store.Pass(), this, id(), data_channel_type_));
|
| + signaling_thread(), channel_manager_, dtls_identity_store.Pass(),
|
| + this, id()));
|
| } else {
|
| // Use the already generated certificate.
|
| webrtc_session_desc_factory_.reset(new WebRtcSessionDescriptionFactory(
|
| - signaling_thread(), channel_manager_, mediastream_signaling_,
|
| - certificate, this, id(), data_channel_type_));
|
| + signaling_thread(), channel_manager_, certificate, this, id()));
|
| }
|
| }
|
|
|
| @@ -819,13 +812,17 @@ bool WebRtcSession::GetSslRole(rtc::SSLRole* role) {
|
|
|
| void WebRtcSession::CreateOffer(
|
| CreateSessionDescriptionObserver* observer,
|
| - const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
|
| - webrtc_session_desc_factory_->CreateOffer(observer, options);
|
| + const PeerConnectionInterface::RTCOfferAnswerOptions& options,
|
| + const cricket::MediaSessionOptions& session_options) {
|
| + webrtc_session_desc_factory_->CreateOffer(observer, options, session_options);
|
| }
|
|
|
| -void WebRtcSession::CreateAnswer(CreateSessionDescriptionObserver* observer,
|
| - const MediaConstraintsInterface* constraints) {
|
| - webrtc_session_desc_factory_->CreateAnswer(observer, constraints);
|
| +void WebRtcSession::CreateAnswer(
|
| + CreateSessionDescriptionObserver* observer,
|
| + const MediaConstraintsInterface* constraints,
|
| + const cricket::MediaSessionOptions& session_options) {
|
| + webrtc_session_desc_factory_->CreateAnswer(observer, constraints,
|
| + session_options);
|
| }
|
|
|
| bool WebRtcSession::SetLocalDescription(SessionDescriptionInterface* desc,
|
| @@ -883,14 +880,6 @@ bool WebRtcSession::SetLocalDescription(SessionDescriptionInterface* desc,
|
| UseCandidatesInSessionDescription(remote_desc_.get());
|
| }
|
|
|
| - // Update state and SSRC of local MediaStreams and DataChannels based on the
|
| - // local session description.
|
| - mediastream_signaling_->OnLocalDescriptionChanged(local_desc_.get());
|
| -
|
| - rtc::SSLRole role;
|
| - if (data_channel_type_ == cricket::DCT_SCTP && GetSslRole(&role)) {
|
| - mediastream_signaling_->OnDtlsRoleReadyForSctp(role);
|
| - }
|
| if (error() != cricket::BaseSession::ERROR_NONE) {
|
| return BadLocalSdp(desc->type(), GetSessionErrorMsg(), err_desc);
|
| }
|
| @@ -927,8 +916,6 @@ bool WebRtcSession::SetRemoteDescription(SessionDescriptionInterface* desc,
|
| return false;
|
| }
|
|
|
| - // Update remote MediaStreams.
|
| - mediastream_signaling_->OnRemoteDescriptionChanged(desc);
|
| if (local_description() && !UseCandidatesInSessionDescription(desc)) {
|
| return BadRemoteSdp(desc->type(), kInvalidCandidates, err_desc);
|
| }
|
| @@ -950,11 +937,6 @@ bool WebRtcSession::SetRemoteDescription(SessionDescriptionInterface* desc,
|
|
|
| remote_desc_.reset(desc_temp.release());
|
|
|
| - rtc::SSLRole role;
|
| - if (data_channel_type_ == cricket::DCT_SCTP && GetSslRole(&role)) {
|
| - mediastream_signaling_->OnDtlsRoleReadyForSctp(role);
|
| - }
|
| -
|
| if (error() != cricket::BaseSession::ERROR_NONE) {
|
| return BadRemoteSdp(desc->type(), GetSessionErrorMsg(), err_desc);
|
| }
|
| @@ -1387,6 +1369,8 @@ bool WebRtcSession::ConnectDataChannel(DataChannel* webrtc_data_channel) {
|
| &DataChannel::OnChannelReady);
|
| data_channel_->SignalDataReceived.connect(webrtc_data_channel,
|
| &DataChannel::OnDataReceived);
|
| + data_channel_->SignalStreamClosedRemotely.connect(
|
| + webrtc_data_channel, &DataChannel::OnStreamClosedRemotely);
|
| return true;
|
| }
|
|
|
| @@ -1397,6 +1381,7 @@ void WebRtcSession::DisconnectDataChannel(DataChannel* webrtc_data_channel) {
|
| }
|
| data_channel_->SignalReadyToSendData.disconnect(webrtc_data_channel);
|
| data_channel_->SignalDataReceived.disconnect(webrtc_data_channel);
|
| + data_channel_->SignalStreamClosedRemotely.disconnect(webrtc_data_channel);
|
| }
|
|
|
| void WebRtcSession::AddSctpDataStream(int sid) {
|
| @@ -1409,8 +1394,6 @@ void WebRtcSession::AddSctpDataStream(int sid) {
|
| }
|
|
|
| void WebRtcSession::RemoveSctpDataStream(int sid) {
|
| - mediastream_signaling_->RemoveSctpDataChannel(sid);
|
| -
|
| if (!data_channel_) {
|
| LOG(LS_ERROR) << "RemoveDataChannelStreams called when data_channel_ is "
|
| << "NULL.";
|
| @@ -1424,41 +1407,6 @@ bool WebRtcSession::ReadyToSendData() const {
|
| return data_channel_ && data_channel_->ready_to_send_data();
|
| }
|
|
|
| -rtc::scoped_refptr<DataChannel> WebRtcSession::CreateDataChannel(
|
| - const std::string& label,
|
| - const InternalDataChannelInit* config) {
|
| - if (state() == STATE_RECEIVEDTERMINATE) {
|
| - return NULL;
|
| - }
|
| - if (data_channel_type_ == cricket::DCT_NONE) {
|
| - LOG(LS_ERROR) << "CreateDataChannel: Data is not supported in this call.";
|
| - return NULL;
|
| - }
|
| - InternalDataChannelInit new_config =
|
| - config ? (*config) : InternalDataChannelInit();
|
| - if (data_channel_type_ == cricket::DCT_SCTP) {
|
| - if (new_config.id < 0) {
|
| - rtc::SSLRole role;
|
| - if (GetSslRole(&role) &&
|
| - !mediastream_signaling_->AllocateSctpSid(role, &new_config.id)) {
|
| - LOG(LS_ERROR) << "No id can be allocated for the SCTP data channel.";
|
| - return NULL;
|
| - }
|
| - } else if (!mediastream_signaling_->IsSctpSidAvailable(new_config.id)) {
|
| - LOG(LS_ERROR) << "Failed to create a SCTP data channel "
|
| - << "because the id is already in use or out of range.";
|
| - return NULL;
|
| - }
|
| - }
|
| -
|
| - rtc::scoped_refptr<DataChannel> channel(DataChannel::Create(
|
| - this, data_channel_type_, label, new_config));
|
| - if (channel && !mediastream_signaling_->AddDataChannel(channel))
|
| - return NULL;
|
| -
|
| - return channel;
|
| -}
|
| -
|
| cricket::DataChannelType WebRtcSession::data_channel_type() const {
|
| return data_channel_type_;
|
| }
|
| @@ -1727,7 +1675,6 @@ void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) {
|
| const cricket::ContentInfo* video_info =
|
| cricket::GetFirstVideoContent(desc);
|
| if ((!video_info || video_info->rejected) && video_channel_) {
|
| - mediastream_signaling_->OnVideoChannelClose();
|
| SignalVideoChannelDestroyed();
|
| const std::string content_name = video_channel_->content_name();
|
| channel_manager_->DestroyVideoChannel(video_channel_.release());
|
| @@ -1736,7 +1683,6 @@ void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) {
|
| const cricket::ContentInfo* voice_info =
|
| cricket::GetFirstAudioContent(desc);
|
| if ((!voice_info || voice_info->rejected) && voice_channel_) {
|
| - mediastream_signaling_->OnAudioChannelClose();
|
| SignalVoiceChannelDestroyed();
|
| const std::string content_name = voice_channel_->content_name();
|
| channel_manager_->DestroyVoiceChannel(voice_channel_.release());
|
| @@ -1745,7 +1691,6 @@ void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) {
|
| const cricket::ContentInfo* data_info =
|
| cricket::GetFirstDataContent(desc);
|
| if ((!data_info || data_info->rejected) && data_channel_) {
|
| - mediastream_signaling_->OnDataChannelClose();
|
| SignalDataChannelDestroyed();
|
| const std::string content_name = data_channel_->content_name();
|
| channel_manager_->DestroyDataChannel(data_channel_.release());
|
| @@ -1820,6 +1765,8 @@ bool WebRtcSession::CreateVoiceChannel(const cricket::ContentInfo* content) {
|
|
|
| voice_channel_->SignalDtlsSetupFailure.connect(
|
| this, &WebRtcSession::OnDtlsSetupFailure);
|
| +
|
| + SignalVoiceChannelCreated();
|
| return true;
|
| }
|
|
|
| @@ -1833,6 +1780,8 @@ bool WebRtcSession::CreateVideoChannel(const cricket::ContentInfo* content) {
|
|
|
| video_channel_->SignalDtlsSetupFailure.connect(
|
| this, &WebRtcSession::OnDtlsSetupFailure);
|
| +
|
| + SignalVideoChannelCreated();
|
| return true;
|
| }
|
|
|
| @@ -1845,16 +1794,14 @@ bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content) {
|
| }
|
|
|
| if (sctp) {
|
| - mediastream_signaling_->OnDataTransportCreatedForSctp();
|
| data_channel_->SignalDataReceived.connect(
|
| this, &WebRtcSession::OnDataChannelMessageReceived);
|
| - data_channel_->SignalStreamClosedRemotely.connect(
|
| - mediastream_signaling_,
|
| - &MediaStreamSignaling::OnRemoteSctpDataChannelClosed);
|
| }
|
|
|
| data_channel_->SignalDtlsSetupFailure.connect(
|
| this, &WebRtcSession::OnDtlsSetupFailure);
|
| +
|
| + SignalDataChannelCreated();
|
| return true;
|
| }
|
|
|
| @@ -1880,13 +1827,22 @@ void WebRtcSession::OnDataChannelMessageReceived(
|
| cricket::DataChannel* channel,
|
| const cricket::ReceiveDataParams& params,
|
| const rtc::Buffer& payload) {
|
| - ASSERT(data_channel_type_ == cricket::DCT_SCTP);
|
| - if (params.type == cricket::DMT_CONTROL &&
|
| - mediastream_signaling_->IsSctpSidAvailable(params.ssrc)) {
|
| - // Received CONTROL on unused sid, process as an OPEN message.
|
| - mediastream_signaling_->AddDataChannelFromOpenMessage(params, payload);
|
| + RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
|
| + if (params.type == cricket::DMT_CONTROL && IsOpenMessage(payload)) {
|
| + // Received OPEN message; parse and signal that a new data channel should
|
| + // be created.
|
| + std::string label;
|
| + InternalDataChannelInit config;
|
| + config.id = params.ssrc;
|
| + if (!ParseDataChannelOpenMessage(payload, &label, &config)) {
|
| + LOG(LS_WARNING) << "Failed to parse the OPEN message for sid "
|
| + << params.ssrc;
|
| + return;
|
| + }
|
| + config.open_handshake_role = InternalDataChannelInit::kAcker;
|
| + SignalDataChannelOpenMessage(label, config);
|
| }
|
| - // otherwise ignore the message.
|
| + // Otherwise ignore the message.
|
| }
|
|
|
| // Returns false if bundle is enabled and rtcp_mux is disabled.
|
|
|