Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(760)

Unified Diff: webrtc/api/webrtcsessiondescriptionfactory.cc

Issue 1671173002: Track pending ICE restarts independently for different media sections. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Extend ICE restart test to check that a second answer has new credentials. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/api/webrtcsessiondescriptionfactory.cc
diff --git a/webrtc/api/webrtcsessiondescriptionfactory.cc b/webrtc/api/webrtcsessiondescriptionfactory.cc
index 19ee1e6e03c0b920de0ba4fe9a81284c9d254a07..aa929d3347713fdd1deae1854af9aebbd5d7cfe3 100644
--- a/webrtc/api/webrtcsessiondescriptionfactory.cc
+++ b/webrtc/api/webrtcsessiondescriptionfactory.cc
@@ -95,18 +95,27 @@ void WebRtcIdentityRequestObserver::OnSuccess(
// static
void WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription(
const SessionDescriptionInterface* source_desc,
+ const std::string& content_name,
SessionDescriptionInterface* dest_desc) {
- if (!source_desc)
+ if (!source_desc) {
return;
- for (size_t m = 0; m < source_desc->number_of_mediasections() &&
- m < dest_desc->number_of_mediasections(); ++m) {
- const IceCandidateCollection* source_candidates =
- source_desc->candidates(m);
- const IceCandidateCollection* dest_candidates = dest_desc->candidates(m);
- for (size_t n = 0; n < source_candidates->count(); ++n) {
- const IceCandidateInterface* new_candidate = source_candidates->at(n);
- if (!dest_candidates->HasCandidate(new_candidate))
- dest_desc->AddCandidate(source_candidates->at(n));
+ }
+ const cricket::ContentInfos& contents =
+ source_desc->description()->contents();
+ const cricket::ContentInfo* cinfo =
+ source_desc->description()->GetContentByName(content_name);
+ if (!cinfo) {
+ return;
+ }
+ size_t mediasection_index = static_cast<int>(cinfo - &contents[0]);
+ const IceCandidateCollection* source_candidates =
+ source_desc->candidates(mediasection_index);
+ const IceCandidateCollection* dest_candidates =
+ dest_desc->candidates(mediasection_index);
+ for (size_t n = 0; n < source_candidates->count(); ++n) {
+ const IceCandidateInterface* new_candidate = source_candidates->at(n);
+ if (!dest_candidates->HasCandidate(new_candidate)) {
+ dest_desc->AddCandidate(source_candidates->at(n));
}
}
}
@@ -374,42 +383,38 @@ void WebRtcSessionDescriptionFactory::InternalCreateOffer(
"Failed to initialize the offer.");
return;
}
- if (session_->local_description() &&
- !request.options.audio_transport_options.ice_restart &&
- !request.options.video_transport_options.ice_restart &&
- !request.options.data_transport_options.ice_restart) {
- // Include all local ice candidates in the SessionDescription unless
- // the an ice restart has been requested.
- CopyCandidatesFromSessionDescription(session_->local_description(), offer);
+ if (session_->local_description()) {
+ for (const cricket::ContentInfo& content :
pthatcher1 2016/02/17 06:46:59 Can you make a private helper method for this? co
+ 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) {
+ CopyCandidatesFromSessionDescription(session_->local_description(),
+ content.name, offer);
+ }
+ }
}
PostCreateSessionDescriptionSucceeded(request.observer, offer);
}
void WebRtcSessionDescriptionFactory::InternalCreateAnswer(
CreateSessionDescriptionRequest request) {
- // 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.audio_transport_options.ice_restart =
- session_->IceRestartPending();
- request.options.video_transport_options.ice_restart =
- session_->IceRestartPending();
- request.options.data_transport_options.ice_restart =
- session_->IceRestartPending();
- // We should pass current ssl role to the transport description factory, if
- // there is already an existing ongoing session.
- rtc::SSLRole ssl_role;
- if (session_->GetSslRole(session_->voice_channel(), &ssl_role)) {
- request.options.audio_transport_options.prefer_passive_role =
- (rtc::SSL_SERVER == ssl_role);
- }
- if (session_->GetSslRole(session_->video_channel(), &ssl_role)) {
- request.options.video_transport_options.prefer_passive_role =
- (rtc::SSL_SERVER == ssl_role);
- }
- if (session_->GetSslRole(session_->data_channel(), &ssl_role)) {
- request.options.data_transport_options.prefer_passive_role =
- (rtc::SSL_SERVER == ssl_role);
+ if (session_->remote_description()) {
+ for (const cricket::ContentInfo& content :
+ session_->remote_description()->description()->contents()) {
+ // 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);
pthatcher1 2016/02/17 06:46:58 I can't wait until we can stick all per-content-na
+ // 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(session_->GetChannel(content.name), &ssl_role)) {
+ request.options.transport_options[content.name].prefer_passive_role =
+ (rtc::SSL_SERVER == ssl_role);
+ }
+ }
}
cricket::SessionDescription* desc(session_desc_factory_.CreateAnswer(
@@ -436,15 +441,17 @@ void WebRtcSessionDescriptionFactory::InternalCreateAnswer(
"Failed to initialize the answer.");
return;
}
- if (session_->local_description() &&
- !request.options.audio_transport_options.ice_restart &&
- !request.options.video_transport_options.ice_restart &&
- !request.options.data_transport_options.ice_restart) {
- // Include all local ice candidates in the SessionDescription unless
- // the remote peer has requested an ice restart.
- CopyCandidatesFromSessionDescription(session_->local_description(), answer);
+ 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) {
+ CopyCandidatesFromSessionDescription(session_->local_description(),
+ content.name, answer);
+ }
+ }
pthatcher1 2016/02/17 06:46:58 I don't like seeing this duplicated. Can we make
}
- session_->ResetIceRestartLatch();
pthatcher1 2016/02/17 06:46:59 Well, this was a terrible place to have this befor
PostCreateSessionDescriptionSucceeded(request.observer, answer);
}
« webrtc/api/webrtcsession_unittest.cc ('K') | « webrtc/api/webrtcsessiondescriptionfactory.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698