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

Side by Side Diff: talk/app/webrtc/webrtcsessiondescriptionfactory.cc

Issue 1453813005: Fixing some issues with ICE restart signaling. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2013 Google Inc. 3 * Copyright 2013 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 } 103 }
104 104
105 void WebRtcIdentityRequestObserver::OnSuccess( 105 void WebRtcIdentityRequestObserver::OnSuccess(
106 rtc::scoped_ptr<rtc::SSLIdentity> identity) { 106 rtc::scoped_ptr<rtc::SSLIdentity> identity) {
107 SignalCertificateReady(rtc::RTCCertificate::Create(identity.Pass())); 107 SignalCertificateReady(rtc::RTCCertificate::Create(identity.Pass()));
108 } 108 }
109 109
110 // static 110 // static
111 void WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription( 111 void WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription(
112 const SessionDescriptionInterface* source_desc, 112 const SessionDescriptionInterface* source_desc,
113 cricket::MediaType media_type,
113 SessionDescriptionInterface* dest_desc) { 114 SessionDescriptionInterface* dest_desc) {
114 if (!source_desc) 115 if (!source_desc) {
115 return; 116 return;
117 }
118 const cricket::ContentInfos& contents =
119 source_desc->description()->contents();
120 const cricket::ContentInfo* cinfo =
121 GetFirstMediaContent(contents, media_type);
122 if (!cinfo) {
123 return;
124 }
116 for (size_t m = 0; m < source_desc->number_of_mediasections() && 125 for (size_t m = 0; m < source_desc->number_of_mediasections() &&
117 m < dest_desc->number_of_mediasections(); ++m) { 126 m < dest_desc->number_of_mediasections(); ++m) {
118 const IceCandidateCollection* source_candidates = 127 if (&contents[m] == cinfo) {
119 source_desc->candidates(m); 128 const IceCandidateCollection* source_candidates =
120 const IceCandidateCollection* dest_candidates = dest_desc->candidates(m); 129 source_desc->candidates(m);
121 for (size_t n = 0; n < source_candidates->count(); ++n) { 130 const IceCandidateCollection* dest_candidates = dest_desc->candidates(m);
122 const IceCandidateInterface* new_candidate = source_candidates->at(n); 131 for (size_t n = 0; n < source_candidates->count(); ++n) {
123 if (!dest_candidates->HasCandidate(new_candidate)) 132 const IceCandidateInterface* new_candidate = source_candidates->at(n);
124 dest_desc->AddCandidate(source_candidates->at(n)); 133 if (!dest_candidates->HasCandidate(new_candidate)) {
134 dest_desc->AddCandidate(source_candidates->at(n));
135 }
136 }
137 return;
125 } 138 }
126 } 139 }
127 } 140 }
128 141
129 // Private constructor called by other constructors. 142 // Private constructor called by other constructors.
130 WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory( 143 WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
131 rtc::Thread* signaling_thread, 144 rtc::Thread* signaling_thread,
132 cricket::ChannelManager* channel_manager, 145 cricket::ChannelManager* channel_manager,
133 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store, 146 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
134 const rtc::scoped_refptr<WebRtcIdentityRequestObserver>& 147 const rtc::scoped_refptr<WebRtcIdentityRequestObserver>&
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 ASSERT(session_version_ + 1 > session_version_); 395 ASSERT(session_version_ + 1 > session_version_);
383 JsepSessionDescription* offer(new JsepSessionDescription( 396 JsepSessionDescription* offer(new JsepSessionDescription(
384 JsepSessionDescription::kOffer)); 397 JsepSessionDescription::kOffer));
385 if (!offer->Initialize(desc, session_id_, 398 if (!offer->Initialize(desc, session_id_,
386 rtc::ToString(session_version_++))) { 399 rtc::ToString(session_version_++))) {
387 delete offer; 400 delete offer;
388 PostCreateSessionDescriptionFailed(request.observer, 401 PostCreateSessionDescriptionFailed(request.observer,
389 "Failed to initialize the offer."); 402 "Failed to initialize the offer.");
390 return; 403 return;
391 } 404 }
392 if (session_->local_description() && 405 if (session_->local_description()) {
393 !request.options.transport_options.ice_restart) {
394 // Include all local ice candidates in the SessionDescription unless 406 // Include all local ice candidates in the SessionDescription unless
395 // the an ice restart has been requested. 407 // an ICE restart has been requested.
396 CopyCandidatesFromSessionDescription(session_->local_description(), offer); 408 if (!request.options.audio_ice_restart) {
409 CopyCandidatesFromSessionDescription(session_->local_description(),
410 cricket::MEDIA_TYPE_AUDIO, offer);
411 }
412 if (!request.options.video_ice_restart) {
413 CopyCandidatesFromSessionDescription(session_->local_description(),
414 cricket::MEDIA_TYPE_VIDEO, offer);
415 }
416 if (!request.options.data_ice_restart) {
417 CopyCandidatesFromSessionDescription(session_->local_description(),
418 cricket::MEDIA_TYPE_DATA, offer);
419 }
397 } 420 }
398 PostCreateSessionDescriptionSucceeded(request.observer, offer); 421 PostCreateSessionDescriptionSucceeded(request.observer, offer);
399 } 422 }
400 423
401 void WebRtcSessionDescriptionFactory::InternalCreateAnswer( 424 void WebRtcSessionDescriptionFactory::InternalCreateAnswer(
402 CreateSessionDescriptionRequest request) { 425 CreateSessionDescriptionRequest request) {
403 // According to http://tools.ietf.org/html/rfc5245#section-9.2.1.1 426 // According to http://tools.ietf.org/html/rfc5245#section-9.2.1.1
404 // an answer should also contain new ice ufrag and password if an offer has 427 // an answer should also contain new ice ufrag and password if an offer has
405 // been received with new ufrag and password. 428 // been received with new ufrag and password.
406 request.options.transport_options.ice_restart = session_->IceRestartPending(); 429 request.options.audio_ice_restart = session_->AudioIceRestartPending();
430 request.options.video_ice_restart = session_->VideoIceRestartPending();
431 request.options.data_ice_restart = session_->DataIceRestartPending();
407 // We should pass current ssl role to the transport description factory, if 432 // We should pass current ssl role to the transport description factory, if
408 // there is already an existing ongoing session. 433 // there is already an existing ongoing session.
409 rtc::SSLRole ssl_role; 434 rtc::SSLRole ssl_role;
410 if (session_->GetSslRole(&ssl_role)) { 435 if (session_->GetSslRole(&ssl_role)) {
411 request.options.transport_options.prefer_passive_role = 436 request.options.transport_options.prefer_passive_role =
412 (rtc::SSL_SERVER == ssl_role); 437 (rtc::SSL_SERVER == ssl_role);
413 } 438 }
414 439
415 cricket::SessionDescription* desc(session_desc_factory_.CreateAnswer( 440 cricket::SessionDescription* desc(session_desc_factory_.CreateAnswer(
416 session_->remote_description() 441 session_->remote_description()
(...skipping 12 matching lines...) Expand all
429 ASSERT(session_version_ + 1 > session_version_); 454 ASSERT(session_version_ + 1 > session_version_);
430 JsepSessionDescription* answer(new JsepSessionDescription( 455 JsepSessionDescription* answer(new JsepSessionDescription(
431 JsepSessionDescription::kAnswer)); 456 JsepSessionDescription::kAnswer));
432 if (!answer->Initialize(desc, session_id_, 457 if (!answer->Initialize(desc, session_id_,
433 rtc::ToString(session_version_++))) { 458 rtc::ToString(session_version_++))) {
434 delete answer; 459 delete answer;
435 PostCreateSessionDescriptionFailed(request.observer, 460 PostCreateSessionDescriptionFailed(request.observer,
436 "Failed to initialize the answer."); 461 "Failed to initialize the answer.");
437 return; 462 return;
438 } 463 }
439 if (session_->local_description() && 464 if (session_->local_description()) {
440 !request.options.transport_options.ice_restart) {
441 // Include all local ice candidates in the SessionDescription unless 465 // Include all local ice candidates in the SessionDescription unless
442 // the remote peer has requested an ice restart. 466 // the remote peer has requested an ICE restart.
443 CopyCandidatesFromSessionDescription(session_->local_description(), answer); 467 if (!request.options.audio_ice_restart) {
468 CopyCandidatesFromSessionDescription(session_->local_description(),
469 cricket::MEDIA_TYPE_AUDIO, answer);
470 }
471 if (!request.options.video_ice_restart) {
472 CopyCandidatesFromSessionDescription(session_->local_description(),
473 cricket::MEDIA_TYPE_VIDEO, answer);
474 }
475 if (!request.options.data_ice_restart) {
476 CopyCandidatesFromSessionDescription(session_->local_description(),
477 cricket::MEDIA_TYPE_DATA, answer);
478 }
444 } 479 }
445 session_->ResetIceRestartLatch();
446 PostCreateSessionDescriptionSucceeded(request.observer, answer); 480 PostCreateSessionDescriptionSucceeded(request.observer, answer);
447 } 481 }
448 482
449 void WebRtcSessionDescriptionFactory::FailPendingRequests( 483 void WebRtcSessionDescriptionFactory::FailPendingRequests(
450 const std::string& reason) { 484 const std::string& reason) {
451 ASSERT(signaling_thread_->IsCurrent()); 485 ASSERT(signaling_thread_->IsCurrent());
452 while (!create_session_description_requests_.empty()) { 486 while (!create_session_description_requests_.empty()) {
453 const CreateSessionDescriptionRequest& request = 487 const CreateSessionDescriptionRequest& request =
454 create_session_description_requests_.front(); 488 create_session_description_requests_.front();
455 PostCreateSessionDescriptionFailed(request.observer, 489 PostCreateSessionDescriptionFailed(request.observer,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 if (create_session_description_requests_.front().type == 533 if (create_session_description_requests_.front().type ==
500 CreateSessionDescriptionRequest::kOffer) { 534 CreateSessionDescriptionRequest::kOffer) {
501 InternalCreateOffer(create_session_description_requests_.front()); 535 InternalCreateOffer(create_session_description_requests_.front());
502 } else { 536 } else {
503 InternalCreateAnswer(create_session_description_requests_.front()); 537 InternalCreateAnswer(create_session_description_requests_.front());
504 } 538 }
505 create_session_description_requests_.pop(); 539 create_session_description_requests_.pop();
506 } 540 }
507 } 541 }
508 } // namespace webrtc 542 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698