| Index: webrtc/pc/webrtcsessiondescriptionfactory.cc
|
| diff --git a/webrtc/pc/webrtcsessiondescriptionfactory.cc b/webrtc/pc/webrtcsessiondescriptionfactory.cc
|
| index 8eccd65767dcd92190780e2de469d46e9d880759..beb8d1e5a1bb86b7b04722f9baa329d433e206f7 100644
|
| --- a/webrtc/pc/webrtcsessiondescriptionfactory.cc
|
| +++ b/webrtc/pc/webrtcsessiondescriptionfactory.cc
|
| @@ -30,24 +30,30 @@ static const char kFailedDueToSessionShutdown[] =
|
|
|
| static const uint64_t kInitSessionVersion = 2;
|
|
|
| -static bool CompareStream(const MediaSessionOptions::Stream& stream1,
|
| - const MediaSessionOptions::Stream& stream2) {
|
| - return stream1.id < stream2.id;
|
| +static bool CompareSenderOptions(const cricket::SenderOptions& sender1,
|
| + const cricket::SenderOptions& sender2) {
|
| + return sender1.track_id < sender2.track_id;
|
| }
|
|
|
| -static bool SameId(const MediaSessionOptions::Stream& stream1,
|
| - const MediaSessionOptions::Stream& stream2) {
|
| - return stream1.id == stream2.id;
|
| +static bool SameId(const cricket::SenderOptions& sender1,
|
| + const cricket::SenderOptions& sender2) {
|
| + return sender1.track_id == sender2.track_id;
|
| }
|
|
|
| -// Checks if each Stream within the |streams| has unique id.
|
| -static bool ValidStreams(const MediaSessionOptions::Streams& streams) {
|
| - MediaSessionOptions::Streams sorted_streams = streams;
|
| - std::sort(sorted_streams.begin(), sorted_streams.end(), CompareStream);
|
| - MediaSessionOptions::Streams::iterator it =
|
| - std::adjacent_find(sorted_streams.begin(), sorted_streams.end(),
|
| - SameId);
|
| - return it == sorted_streams.end();
|
| +// Check that each sender has a unique ID.
|
| +static bool ValidMediaSessionOptions(
|
| + const cricket::MediaSessionOptions& session_options) {
|
| + std::vector<cricket::SenderOptions> sorted_senders;
|
| + for (const cricket::MediaDescriptionOptions& media_description_options :
|
| + session_options.media_description_options) {
|
| + sorted_senders.insert(sorted_senders.end(),
|
| + media_description_options.sender_options.begin(),
|
| + media_description_options.sender_options.end());
|
| + }
|
| + std::sort(sorted_senders.begin(), sorted_senders.end(), CompareSenderOptions);
|
| + std::vector<cricket::SenderOptions>::iterator it =
|
| + std::adjacent_find(sorted_senders.begin(), sorted_senders.end(), SameId);
|
| + return it == sorted_senders.end();
|
| }
|
|
|
| enum {
|
| @@ -128,7 +134,6 @@ WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| session_id_(session_id),
|
| certificate_request_state_(CERTIFICATE_NOT_NEEDED) {
|
| RTC_DCHECK(signaling_thread_);
|
| - session_desc_factory_.set_add_legacy_streams(false);
|
| bool dtls_enabled = cert_generator_ || certificate;
|
| // SRTP-SDES is disabled if DTLS is on.
|
| SetSdesPolicy(dtls_enabled ? cricket::SEC_DISABLED : cricket::SEC_REQUIRED);
|
| @@ -237,8 +242,8 @@ void WebRtcSessionDescriptionFactory::CreateOffer(
|
| return;
|
| }
|
|
|
| - if (!ValidStreams(session_options.streams)) {
|
| - error += " called with invalid media streams.";
|
| + if (!ValidMediaSessionOptions(session_options)) {
|
| + error += " called with invalid session options";
|
| LOG(LS_ERROR) << error;
|
| PostCreateSessionDescriptionFailed(observer, error);
|
| return;
|
| @@ -279,8 +284,8 @@ void WebRtcSessionDescriptionFactory::CreateAnswer(
|
| return;
|
| }
|
|
|
| - if (!ValidStreams(session_options.streams)) {
|
| - error += " called with invalid media streams.";
|
| + if (!ValidMediaSessionOptions(session_options)) {
|
| + error += " called with invalid session options.";
|
| LOG(LS_ERROR) << error;
|
| PostCreateSessionDescriptionFailed(observer, error);
|
| return;
|
| @@ -340,13 +345,12 @@ void WebRtcSessionDescriptionFactory::OnMessage(rtc::Message* msg) {
|
| void WebRtcSessionDescriptionFactory::InternalCreateOffer(
|
| CreateSessionDescriptionRequest request) {
|
| if (session_->local_description()) {
|
| - for (const cricket::TransportInfo& transport :
|
| - session_->local_description()->description()->transport_infos()) {
|
| - // If the needs-ice-restart flag is set as described by JSEP, we should
|
| - // generate an offer with a new ufrag/password to trigger an ICE restart.
|
| - if (session_->NeedsIceRestart(transport.content_name)) {
|
| - request.options.transport_options[transport.content_name].ice_restart =
|
| - true;
|
| + // If the needs-ice-restart flag is set as described by JSEP, we should
|
| + // generate an offer with a new ufrag/password to trigger an ICE restart.
|
| + for (cricket::MediaDescriptionOptions& options :
|
| + request.options.media_description_options) {
|
| + if (session_->NeedsIceRestart(options.mid)) {
|
| + options.transport_options.ice_restart = true;
|
| }
|
| }
|
| }
|
| @@ -375,13 +379,11 @@ void WebRtcSessionDescriptionFactory::InternalCreateOffer(
|
| return;
|
| }
|
| if (session_->local_description()) {
|
| - for (const cricket::ContentInfo& content :
|
| - session_->local_description()->description()->contents()) {
|
| - // Include all local ICE candidates in the SessionDescription unless
|
| - // an ICE restart was requested.
|
| - if (!request.options.transport_options[content.name].ice_restart) {
|
| + for (const cricket::MediaDescriptionOptions& options :
|
| + request.options.media_description_options) {
|
| + if (!options.transport_options.ice_restart) {
|
| CopyCandidatesFromSessionDescription(session_->local_description(),
|
| - content.name, offer);
|
| + options.mid, offer);
|
| }
|
| }
|
| }
|
| @@ -391,18 +393,18 @@ void WebRtcSessionDescriptionFactory::InternalCreateOffer(
|
| void WebRtcSessionDescriptionFactory::InternalCreateAnswer(
|
| CreateSessionDescriptionRequest request) {
|
| if (session_->remote_description()) {
|
| - for (const cricket::ContentInfo& content :
|
| - session_->remote_description()->description()->contents()) {
|
| + for (cricket::MediaDescriptionOptions& options :
|
| + request.options.media_description_options) {
|
| // According to http://tools.ietf.org/html/rfc5245#section-9.2.1.1
|
| // an answer should also contain new ICE ufrag and password if an offer
|
| // has been received with new ufrag and password.
|
| - request.options.transport_options[content.name].ice_restart =
|
| - session_->IceRestartPending(content.name);
|
| + options.transport_options.ice_restart =
|
| + session_->IceRestartPending(options.mid);
|
| // We should pass the current SSL role to the transport description
|
| // factory, if there is already an existing ongoing session.
|
| rtc::SSLRole ssl_role;
|
| - if (session_->GetSslRole(content.name, &ssl_role)) {
|
| - request.options.transport_options[content.name].prefer_passive_role =
|
| + if (session_->GetSslRole(options.mid, &ssl_role)) {
|
| + options.transport_options.prefer_passive_role =
|
| (rtc::SSL_SERVER == ssl_role);
|
| }
|
| }
|
| @@ -433,13 +435,13 @@ void WebRtcSessionDescriptionFactory::InternalCreateAnswer(
|
| return;
|
| }
|
| if (session_->local_description()) {
|
| - for (const cricket::ContentInfo& content :
|
| - session_->local_description()->description()->contents()) {
|
| - // Include all local ICE candidates in the SessionDescription unless
|
| - // the remote peer has requested an ICE restart.
|
| - if (!request.options.transport_options[content.name].ice_restart) {
|
| + // Include all local ICE candidates in the SessionDescription unless
|
| + // the remote peer has requested an ICE restart.
|
| + for (const cricket::MediaDescriptionOptions& options :
|
| + request.options.media_description_options) {
|
| + if (!options.transport_options.ice_restart) {
|
| CopyCandidatesFromSessionDescription(session_->local_description(),
|
| - content.name, answer);
|
| + options.mid, answer);
|
| }
|
| }
|
| }
|
|
|