Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/rtc_peer_connection_handler.h" | 5 #include "content/renderer/media/rtc_peer_connection_handler.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 #include "content/renderer/media/webrtc/webrtc_media_stream_adapter.h" | 27 #include "content/renderer/media/webrtc/webrtc_media_stream_adapter.h" |
| 28 #include "content/renderer/media/webrtc_audio_capturer.h" | 28 #include "content/renderer/media/webrtc_audio_capturer.h" |
| 29 #include "content/renderer/media/webrtc_audio_device_impl.h" | 29 #include "content/renderer/media/webrtc_audio_device_impl.h" |
| 30 #include "content/renderer/media/webrtc_uma_histograms.h" | 30 #include "content/renderer/media/webrtc_uma_histograms.h" |
| 31 #include "content/renderer/render_thread_impl.h" | 31 #include "content/renderer/render_thread_impl.h" |
| 32 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" | 32 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" |
| 33 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | 33 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
| 34 #include "third_party/WebKit/public/platform/WebRTCConfiguration.h" | 34 #include "third_party/WebKit/public/platform/WebRTCConfiguration.h" |
| 35 #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h" | 35 #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h" |
| 36 #include "third_party/WebKit/public/platform/WebRTCICECandidate.h" | 36 #include "third_party/WebKit/public/platform/WebRTCICECandidate.h" |
| 37 #include "third_party/WebKit/public/platform/WebRTCOfferOptions.h" | |
| 37 #include "third_party/WebKit/public/platform/WebRTCSessionDescription.h" | 38 #include "third_party/WebKit/public/platform/WebRTCSessionDescription.h" |
| 38 #include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h" | 39 #include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h" |
| 39 #include "third_party/WebKit/public/platform/WebRTCVoidRequest.h" | 40 #include "third_party/WebKit/public/platform/WebRTCVoidRequest.h" |
| 40 #include "third_party/WebKit/public/platform/WebURL.h" | 41 #include "third_party/WebKit/public/platform/WebURL.h" |
| 41 | 42 |
| 42 namespace content { | 43 namespace content { |
| 43 | 44 |
| 44 // Converter functions from libjingle types to WebKit types. | 45 // Converter functions from libjingle types to WebKit types. |
| 45 blink::WebRTCPeerConnectionHandlerClient::ICEGatheringState | 46 blink::WebRTCPeerConnectionHandlerClient::ICEGatheringState |
| 46 GetWebKitIceGatheringState( | 47 GetWebKitIceGatheringState( |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 return description; | 123 return description; |
| 123 } | 124 } |
| 124 | 125 |
| 125 description.initialize(base::UTF8ToUTF16(native_desc->type()), | 126 description.initialize(base::UTF8ToUTF16(native_desc->type()), |
| 126 base::UTF8ToUTF16(sdp)); | 127 base::UTF8ToUTF16(sdp)); |
| 127 return description; | 128 return description; |
| 128 } | 129 } |
| 129 | 130 |
| 130 // Converter functions from WebKit types to libjingle types. | 131 // Converter functions from WebKit types to libjingle types. |
| 131 | 132 |
| 132 static void GetNativeIceServers( | 133 static void GetNativeRtcConfiguration( |
| 133 const blink::WebRTCConfiguration& server_configuration, | 134 const blink::WebRTCConfiguration& server_configuration, |
| 134 webrtc::PeerConnectionInterface::IceServers* servers) { | 135 webrtc::PeerConnectionInterface::RTCConfiguration* config) { |
| 135 if (server_configuration.isNull() || !servers) | 136 if (server_configuration.isNull() || !config) |
| 136 return; | 137 return; |
| 137 for (size_t i = 0; i < server_configuration.numberOfServers(); ++i) { | 138 for (size_t i = 0; i < server_configuration.numberOfServers(); ++i) { |
| 138 webrtc::PeerConnectionInterface::IceServer server; | 139 webrtc::PeerConnectionInterface::IceServer server; |
| 139 const blink::WebRTCICEServer& webkit_server = | 140 const blink::WebRTCICEServer& webkit_server = |
| 140 server_configuration.server(i); | 141 server_configuration.server(i); |
| 141 server.username = base::UTF16ToUTF8(webkit_server.username()); | 142 server.username = base::UTF16ToUTF8(webkit_server.username()); |
| 142 server.password = base::UTF16ToUTF8(webkit_server.credential()); | 143 server.password = base::UTF16ToUTF8(webkit_server.credential()); |
| 143 server.uri = webkit_server.uri().spec(); | 144 server.uri = webkit_server.uri().spec(); |
| 144 servers->push_back(server); | 145 config->servers.push_back(server); |
| 146 } | |
| 147 | |
| 148 switch (server_configuration.iceTransports()) { | |
| 149 case blink::WebRTCIceTransportsNone: | |
| 150 config->type = webrtc::PeerConnectionInterface::kNone; | |
| 151 break; | |
| 152 case blink::WebRTCIceTransportsRelay: | |
| 153 config->type = webrtc::PeerConnectionInterface::kRelay; | |
| 154 break; | |
| 155 case blink::WebRTCIceTransportsAll: | |
| 156 config->type = webrtc::PeerConnectionInterface::kAll; | |
| 157 break; | |
| 158 default: | |
| 159 NOTREACHED(); | |
| 145 } | 160 } |
| 146 } | 161 } |
| 147 | 162 |
| 148 class SessionDescriptionRequestTracker { | 163 class SessionDescriptionRequestTracker { |
| 149 public: | 164 public: |
| 150 SessionDescriptionRequestTracker(RTCPeerConnectionHandler* handler, | 165 SessionDescriptionRequestTracker(RTCPeerConnectionHandler* handler, |
| 151 PeerConnectionTracker::Action action) | 166 PeerConnectionTracker::Action action) |
| 152 : handler_(handler), action_(action) {} | 167 : handler_(handler), action_(action) {} |
| 153 | 168 |
| 154 void TrackOnSuccess(const webrtc::SessionDescriptionInterface* desc) { | 169 void TrackOnSuccess(const webrtc::SessionDescriptionInterface* desc) { |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 394 std::set<RTCPeerConnectionHandler*> handlers( | 409 std::set<RTCPeerConnectionHandler*> handlers( |
| 395 g_peer_connection_handlers.Get().begin(), | 410 g_peer_connection_handlers.Get().begin(), |
| 396 g_peer_connection_handlers.Get().end()); | 411 g_peer_connection_handlers.Get().end()); |
| 397 for (std::set<RTCPeerConnectionHandler*>::iterator handler = handlers.begin(); | 412 for (std::set<RTCPeerConnectionHandler*>::iterator handler = handlers.begin(); |
| 398 handler != handlers.end(); | 413 handler != handlers.end(); |
| 399 ++handler) { | 414 ++handler) { |
| 400 (*handler)->client_->releasePeerConnectionHandler(); | 415 (*handler)->client_->releasePeerConnectionHandler(); |
| 401 } | 416 } |
| 402 } | 417 } |
| 403 | 418 |
| 419 void RTCPeerConnectionHandler::ConvertOfferOptionsToConstraints( | |
|
vrk (LEFT CHROMIUM)
2014/07/23 01:13:05
Why convert the OfferOptions to Constraints instea
jiayl
2014/07/23 16:11:12
Libjingle does not have the interface to receive O
| |
| 420 const blink::WebRTCOfferOptions& options, | |
| 421 RTCMediaConstraints* output) { | |
| 422 output->AddMandatory( | |
| 423 webrtc::MediaConstraintsInterface::kOfferToReceiveAudio, | |
| 424 options.offerToReceiveAudio() > 0 ? "true" : "false", | |
| 425 true); | |
| 426 | |
| 427 output->AddMandatory( | |
| 428 webrtc::MediaConstraintsInterface::kOfferToReceiveVideo, | |
| 429 options.offerToReceiveVideo() > 0 ? "true" : "false", | |
| 430 true); | |
| 431 | |
| 432 if (!options.voiceActivityDetection()) { | |
| 433 output->AddMandatory( | |
| 434 webrtc::MediaConstraintsInterface::kVoiceActivityDetection, | |
| 435 "false", | |
| 436 true); | |
| 437 } | |
| 438 | |
| 439 if (options.iceRestart()) { | |
| 440 output->AddMandatory( | |
| 441 webrtc::MediaConstraintsInterface::kIceRestart, "true", true); | |
| 442 } | |
| 443 } | |
| 444 | |
| 404 void RTCPeerConnectionHandler::associateWithFrame(blink::WebFrame* frame) { | 445 void RTCPeerConnectionHandler::associateWithFrame(blink::WebFrame* frame) { |
| 405 DCHECK(frame); | 446 DCHECK(frame); |
| 406 frame_ = frame; | 447 frame_ = frame; |
| 407 } | 448 } |
| 408 | 449 |
| 409 bool RTCPeerConnectionHandler::initialize( | 450 bool RTCPeerConnectionHandler::initialize( |
| 410 const blink::WebRTCConfiguration& server_configuration, | 451 const blink::WebRTCConfiguration& server_configuration, |
| 411 const blink::WebMediaConstraints& options) { | 452 const blink::WebMediaConstraints& options) { |
| 412 DCHECK(frame_); | 453 DCHECK(frame_); |
| 413 | 454 |
| 414 peer_connection_tracker_ = | 455 peer_connection_tracker_ = |
| 415 RenderThreadImpl::current()->peer_connection_tracker(); | 456 RenderThreadImpl::current()->peer_connection_tracker(); |
| 416 | 457 |
| 417 webrtc::PeerConnectionInterface::IceServers servers; | 458 webrtc::PeerConnectionInterface::RTCConfiguration config; |
| 418 GetNativeIceServers(server_configuration, &servers); | 459 GetNativeRtcConfiguration(server_configuration, &config); |
| 419 | 460 |
| 420 RTCMediaConstraints constraints(options); | 461 RTCMediaConstraints constraints(options); |
| 421 | 462 |
| 422 native_peer_connection_ = | 463 native_peer_connection_ = |
| 423 dependency_factory_->CreatePeerConnection( | 464 dependency_factory_->CreatePeerConnection( |
| 424 servers, &constraints, frame_, this); | 465 config, &constraints, frame_, this); |
| 466 | |
| 425 if (!native_peer_connection_.get()) { | 467 if (!native_peer_connection_.get()) { |
| 426 LOG(ERROR) << "Failed to initialize native PeerConnection."; | 468 LOG(ERROR) << "Failed to initialize native PeerConnection."; |
| 427 return false; | 469 return false; |
| 428 } | 470 } |
| 429 if (peer_connection_tracker_) | 471 if (peer_connection_tracker_) |
| 430 peer_connection_tracker_->RegisterPeerConnection( | 472 peer_connection_tracker_->RegisterPeerConnection( |
| 431 this, servers, constraints, frame_); | 473 this, config, constraints, frame_); |
| 432 | 474 |
| 433 uma_observer_ = new talk_base::RefCountedObject<PeerConnectionUMAObserver>(); | 475 uma_observer_ = new talk_base::RefCountedObject<PeerConnectionUMAObserver>(); |
| 434 native_peer_connection_->RegisterUMAObserver(uma_observer_.get()); | 476 native_peer_connection_->RegisterUMAObserver(uma_observer_.get()); |
| 435 return true; | 477 return true; |
| 436 } | 478 } |
| 437 | 479 |
| 438 bool RTCPeerConnectionHandler::InitializeForTest( | 480 bool RTCPeerConnectionHandler::InitializeForTest( |
| 439 const blink::WebRTCConfiguration& server_configuration, | 481 const blink::WebRTCConfiguration& server_configuration, |
| 440 const blink::WebMediaConstraints& options, | 482 const blink::WebMediaConstraints& options, |
| 441 PeerConnectionTracker* peer_connection_tracker) { | 483 PeerConnectionTracker* peer_connection_tracker) { |
| 442 webrtc::PeerConnectionInterface::IceServers servers; | 484 webrtc::PeerConnectionInterface::RTCConfiguration config; |
| 443 GetNativeIceServers(server_configuration, &servers); | 485 GetNativeRtcConfiguration(server_configuration, &config); |
| 444 | 486 |
| 445 RTCMediaConstraints constraints(options); | 487 RTCMediaConstraints constraints(options); |
| 446 native_peer_connection_ = | 488 native_peer_connection_ = |
| 447 dependency_factory_->CreatePeerConnection( | 489 dependency_factory_->CreatePeerConnection( |
| 448 servers, &constraints, NULL, this); | 490 config, &constraints, NULL, this); |
| 449 if (!native_peer_connection_.get()) { | 491 if (!native_peer_connection_.get()) { |
| 450 LOG(ERROR) << "Failed to initialize native PeerConnection."; | 492 LOG(ERROR) << "Failed to initialize native PeerConnection."; |
| 451 return false; | 493 return false; |
| 452 } | 494 } |
| 453 peer_connection_tracker_ = peer_connection_tracker; | 495 peer_connection_tracker_ = peer_connection_tracker; |
| 454 return true; | 496 return true; |
| 455 } | 497 } |
| 456 | 498 |
| 457 void RTCPeerConnectionHandler::createOffer( | 499 void RTCPeerConnectionHandler::createOffer( |
| 458 const blink::WebRTCSessionDescriptionRequest& request, | 500 const blink::WebRTCSessionDescriptionRequest& request, |
| 459 const blink::WebMediaConstraints& options) { | 501 const blink::WebMediaConstraints& options) { |
| 460 scoped_refptr<CreateSessionDescriptionRequest> description_request( | 502 scoped_refptr<CreateSessionDescriptionRequest> description_request( |
| 461 new talk_base::RefCountedObject<CreateSessionDescriptionRequest>( | 503 new talk_base::RefCountedObject<CreateSessionDescriptionRequest>( |
| 462 request, this, PeerConnectionTracker::ACTION_CREATE_OFFER)); | 504 request, this, PeerConnectionTracker::ACTION_CREATE_OFFER)); |
| 463 RTCMediaConstraints constraints(options); | 505 RTCMediaConstraints constraints(options); |
| 464 native_peer_connection_->CreateOffer(description_request.get(), &constraints); | 506 native_peer_connection_->CreateOffer(description_request.get(), &constraints); |
| 465 | 507 |
| 466 if (peer_connection_tracker_) | 508 if (peer_connection_tracker_) |
| 467 peer_connection_tracker_->TrackCreateOffer(this, constraints); | 509 peer_connection_tracker_->TrackCreateOffer(this, constraints); |
| 468 } | 510 } |
| 469 | 511 |
| 512 void RTCPeerConnectionHandler::createOffer( | |
| 513 const blink::WebRTCSessionDescriptionRequest& request, | |
| 514 const blink::WebRTCOfferOptions& options) { | |
| 515 scoped_refptr<CreateSessionDescriptionRequest> description_request( | |
| 516 new talk_base::RefCountedObject<CreateSessionDescriptionRequest>( | |
| 517 request, this, PeerConnectionTracker::ACTION_CREATE_OFFER)); | |
| 518 | |
| 519 RTCMediaConstraints constraints; | |
| 520 ConvertOfferOptionsToConstraints(options, &constraints); | |
| 521 native_peer_connection_->CreateOffer(description_request.get(), &constraints); | |
| 522 | |
| 523 if (peer_connection_tracker_) | |
| 524 peer_connection_tracker_->TrackCreateOffer(this, constraints); | |
| 525 } | |
| 526 | |
| 470 void RTCPeerConnectionHandler::createAnswer( | 527 void RTCPeerConnectionHandler::createAnswer( |
| 471 const blink::WebRTCSessionDescriptionRequest& request, | 528 const blink::WebRTCSessionDescriptionRequest& request, |
| 472 const blink::WebMediaConstraints& options) { | 529 const blink::WebMediaConstraints& options) { |
| 473 scoped_refptr<CreateSessionDescriptionRequest> description_request( | 530 scoped_refptr<CreateSessionDescriptionRequest> description_request( |
| 474 new talk_base::RefCountedObject<CreateSessionDescriptionRequest>( | 531 new talk_base::RefCountedObject<CreateSessionDescriptionRequest>( |
| 475 request, this, PeerConnectionTracker::ACTION_CREATE_ANSWER)); | 532 request, this, PeerConnectionTracker::ACTION_CREATE_ANSWER)); |
| 476 RTCMediaConstraints constraints(options); | 533 RTCMediaConstraints constraints(options); |
| 477 native_peer_connection_->CreateAnswer(description_request.get(), | 534 native_peer_connection_->CreateAnswer(description_request.get(), |
| 478 &constraints); | 535 &constraints); |
| 479 | 536 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 545 const webrtc::SessionDescriptionInterface* native_desc = | 602 const webrtc::SessionDescriptionInterface* native_desc = |
| 546 native_peer_connection_->remote_description(); | 603 native_peer_connection_->remote_description(); |
| 547 blink::WebRTCSessionDescription description = | 604 blink::WebRTCSessionDescription description = |
| 548 CreateWebKitSessionDescription(native_desc); | 605 CreateWebKitSessionDescription(native_desc); |
| 549 return description; | 606 return description; |
| 550 } | 607 } |
| 551 | 608 |
| 552 bool RTCPeerConnectionHandler::updateICE( | 609 bool RTCPeerConnectionHandler::updateICE( |
| 553 const blink::WebRTCConfiguration& server_configuration, | 610 const blink::WebRTCConfiguration& server_configuration, |
| 554 const blink::WebMediaConstraints& options) { | 611 const blink::WebMediaConstraints& options) { |
| 555 webrtc::PeerConnectionInterface::IceServers servers; | 612 webrtc::PeerConnectionInterface::RTCConfiguration config; |
| 556 GetNativeIceServers(server_configuration, &servers); | 613 GetNativeRtcConfiguration(server_configuration, &config); |
| 557 RTCMediaConstraints constraints(options); | 614 RTCMediaConstraints constraints(options); |
| 558 | 615 |
| 559 if (peer_connection_tracker_) | 616 if (peer_connection_tracker_) |
| 560 peer_connection_tracker_->TrackUpdateIce(this, servers, constraints); | 617 peer_connection_tracker_->TrackUpdateIce(this, config, constraints); |
| 561 | 618 |
| 562 return native_peer_connection_->UpdateIce(servers, | 619 return native_peer_connection_->UpdateIce(config.servers, |
| 563 &constraints); | 620 &constraints); |
| 564 } | 621 } |
| 565 | 622 |
| 566 bool RTCPeerConnectionHandler::addICECandidate( | 623 bool RTCPeerConnectionHandler::addICECandidate( |
| 567 const blink::WebRTCVoidRequest& request, | 624 const blink::WebRTCVoidRequest& request, |
| 568 const blink::WebRTCICECandidate& candidate) { | 625 const blink::WebRTCICECandidate& candidate) { |
| 569 // Libjingle currently does not accept callbacks for addICECandidate. | 626 // Libjingle currently does not accept callbacks for addICECandidate. |
| 570 // For that reason we are going to call callbacks from here. | 627 // For that reason we are going to call callbacks from here. |
| 571 bool result = addICECandidate(candidate); | 628 bool result = addICECandidate(candidate); |
| 572 base::MessageLoop::current()->PostTask( | 629 base::MessageLoop::current()->PostTask( |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 929 webrtc::SessionDescriptionInterface* native_desc = | 986 webrtc::SessionDescriptionInterface* native_desc = |
| 930 dependency_factory_->CreateSessionDescription(type, sdp, error); | 987 dependency_factory_->CreateSessionDescription(type, sdp, error); |
| 931 | 988 |
| 932 LOG_IF(ERROR, !native_desc) << "Failed to create native session description." | 989 LOG_IF(ERROR, !native_desc) << "Failed to create native session description." |
| 933 << " Type: " << type << " SDP: " << sdp; | 990 << " Type: " << type << " SDP: " << sdp; |
| 934 | 991 |
| 935 return native_desc; | 992 return native_desc; |
| 936 } | 993 } |
| 937 | 994 |
| 938 } // namespace content | 995 } // namespace content |
| OLD | NEW |