| Index: talk/app/webrtc/webrtcsessiondescriptionfactory.cc
|
| diff --git a/talk/app/webrtc/webrtcsessiondescriptionfactory.cc b/talk/app/webrtc/webrtcsessiondescriptionfactory.cc
|
| index d391020cd17cd54bea98322abfb5b1f8a535c2b3..876931539a96e22e5b1a2bfa5803d0fe81c3dd7f 100644
|
| --- a/talk/app/webrtc/webrtcsessiondescriptionfactory.cc
|
| +++ b/talk/app/webrtc/webrtcsessiondescriptionfactory.cc
|
| @@ -31,6 +31,7 @@
|
| #include "talk/app/webrtc/jsep.h"
|
| #include "talk/app/webrtc/jsepsessiondescription.h"
|
| #include "talk/app/webrtc/mediaconstraintsinterface.h"
|
| +#include "talk/app/webrtc/mediastreamsignaling.h"
|
| #include "talk/app/webrtc/webrtcsession.h"
|
| #include "webrtc/base/sslidentity.h"
|
|
|
| @@ -130,13 +131,16 @@
|
| WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| rtc::Thread* signaling_thread,
|
| cricket::ChannelManager* channel_manager,
|
| + MediaStreamSignaling* mediastream_signaling,
|
| rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
|
| const rtc::scoped_refptr<WebRtcIdentityRequestObserver>&
|
| identity_request_observer,
|
| WebRtcSession* session,
|
| const std::string& session_id,
|
| + cricket::DataChannelType dct,
|
| bool dtls_enabled)
|
| : signaling_thread_(signaling_thread),
|
| + mediastream_signaling_(mediastream_signaling),
|
| session_desc_factory_(channel_manager, &transport_desc_factory_),
|
| // RFC 4566 suggested a Network Time Protocol (NTP) format timestamp
|
| // as the session id and session version. To simplify, it should be fine
|
| @@ -147,6 +151,7 @@
|
| identity_request_observer_(identity_request_observer),
|
| session_(session),
|
| session_id_(session_id),
|
| + data_channel_type_(dct),
|
| certificate_request_state_(CERTIFICATE_NOT_NEEDED) {
|
| session_desc_factory_.set_add_legacy_streams(false);
|
| // SRTP-SDES is disabled if DTLS is on.
|
| @@ -156,14 +161,18 @@
|
| WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| rtc::Thread* signaling_thread,
|
| cricket::ChannelManager* channel_manager,
|
| + MediaStreamSignaling* mediastream_signaling,
|
| WebRtcSession* session,
|
| - const std::string& session_id)
|
| + const std::string& session_id,
|
| + cricket::DataChannelType dct)
|
| : WebRtcSessionDescriptionFactory(signaling_thread,
|
| channel_manager,
|
| + mediastream_signaling,
|
| nullptr,
|
| nullptr,
|
| session,
|
| session_id,
|
| + dct,
|
| false) {
|
| LOG(LS_VERBOSE) << "DTLS-SRTP disabled.";
|
| }
|
| @@ -171,17 +180,21 @@
|
| WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| rtc::Thread* signaling_thread,
|
| cricket::ChannelManager* channel_manager,
|
| + MediaStreamSignaling* mediastream_signaling,
|
| rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
|
| WebRtcSession* session,
|
| - const std::string& session_id)
|
| + const std::string& session_id,
|
| + cricket::DataChannelType dct)
|
| : WebRtcSessionDescriptionFactory(
|
| - signaling_thread,
|
| - channel_manager,
|
| - dtls_identity_store.Pass(),
|
| - new rtc::RefCountedObject<WebRtcIdentityRequestObserver>(),
|
| - session,
|
| - session_id,
|
| - true) {
|
| + signaling_thread,
|
| + channel_manager,
|
| + mediastream_signaling,
|
| + dtls_identity_store.Pass(),
|
| + new rtc::RefCountedObject<WebRtcIdentityRequestObserver>(),
|
| + session,
|
| + session_id,
|
| + dct,
|
| + true) {
|
| RTC_DCHECK(dtls_identity_store_);
|
|
|
| certificate_request_state_ = CERTIFICATE_WAITING;
|
| @@ -203,16 +216,14 @@
|
| WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| rtc::Thread* signaling_thread,
|
| cricket::ChannelManager* channel_manager,
|
| + MediaStreamSignaling* mediastream_signaling,
|
| const rtc::scoped_refptr<rtc::RTCCertificate>& certificate,
|
| WebRtcSession* session,
|
| - const std::string& session_id)
|
| - : WebRtcSessionDescriptionFactory(signaling_thread,
|
| - channel_manager,
|
| - nullptr,
|
| - nullptr,
|
| - session,
|
| - session_id,
|
| - true) {
|
| + const std::string& session_id,
|
| + cricket::DataChannelType dct)
|
| + : WebRtcSessionDescriptionFactory(
|
| + signaling_thread, channel_manager, mediastream_signaling, nullptr,
|
| + nullptr, session, session_id, dct, true) {
|
| RTC_DCHECK(certificate);
|
|
|
| certificate_request_state_ = CERTIFICATE_WAITING;
|
| @@ -253,8 +264,9 @@
|
|
|
| void WebRtcSessionDescriptionFactory::CreateOffer(
|
| CreateSessionDescriptionObserver* observer,
|
| - const PeerConnectionInterface::RTCOfferAnswerOptions& options,
|
| - const cricket::MediaSessionOptions& session_options) {
|
| + const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
|
| + cricket::MediaSessionOptions session_options;
|
| +
|
| std::string error = "CreateOffer";
|
| if (certificate_request_state_ == CERTIFICATE_FAILED) {
|
| error += kFailedDueToIdentityFailed;
|
| @@ -263,11 +275,24 @@
|
| return;
|
| }
|
|
|
| + if (!mediastream_signaling_->GetOptionsForOffer(options,
|
| + &session_options)) {
|
| + error += " called with invalid options.";
|
| + LOG(LS_ERROR) << error;
|
| + PostCreateSessionDescriptionFailed(observer, error);
|
| + return;
|
| + }
|
| +
|
| if (!ValidStreams(session_options.streams)) {
|
| error += " called with invalid media streams.";
|
| LOG(LS_ERROR) << error;
|
| PostCreateSessionDescriptionFailed(observer, error);
|
| return;
|
| + }
|
| +
|
| + if (data_channel_type_ == cricket::DCT_SCTP &&
|
| + mediastream_signaling_->HasDataChannels()) {
|
| + session_options.data_channel_type = cricket::DCT_SCTP;
|
| }
|
|
|
| CreateSessionDescriptionRequest request(
|
| @@ -283,8 +308,7 @@
|
|
|
| void WebRtcSessionDescriptionFactory::CreateAnswer(
|
| CreateSessionDescriptionObserver* observer,
|
| - const MediaConstraintsInterface* constraints,
|
| - const cricket::MediaSessionOptions& session_options) {
|
| + const MediaConstraintsInterface* constraints) {
|
| std::string error = "CreateAnswer";
|
| if (certificate_request_state_ == CERTIFICATE_FAILED) {
|
| error += kFailedDueToIdentityFailed;
|
| @@ -306,15 +330,28 @@
|
| return;
|
| }
|
|
|
| - if (!ValidStreams(session_options.streams)) {
|
| + cricket::MediaSessionOptions options;
|
| + if (!mediastream_signaling_->GetOptionsForAnswer(constraints, &options)) {
|
| + error += " called with invalid constraints.";
|
| + LOG(LS_ERROR) << error;
|
| + PostCreateSessionDescriptionFailed(observer, error);
|
| + return;
|
| + }
|
| + if (!ValidStreams(options.streams)) {
|
| error += " called with invalid media streams.";
|
| LOG(LS_ERROR) << error;
|
| PostCreateSessionDescriptionFailed(observer, error);
|
| return;
|
| }
|
| + // RTP data channel is handled in MediaSessionOptions::AddStream. SCTP streams
|
| + // are not signaled in the SDP so does not go through that path and must be
|
| + // handled here.
|
| + if (data_channel_type_ == cricket::DCT_SCTP) {
|
| + options.data_channel_type = cricket::DCT_SCTP;
|
| + }
|
|
|
| CreateSessionDescriptionRequest request(
|
| - CreateSessionDescriptionRequest::kAnswer, observer, session_options);
|
| + CreateSessionDescriptionRequest::kAnswer, observer, options);
|
| if (certificate_request_state_ == CERTIFICATE_WAITING) {
|
| create_session_description_requests_.push(request);
|
| } else {
|
|
|