Index: content/renderer/media/media_stream_dependency_factory.cc |
diff --git a/content/renderer/media/media_stream_dependency_factory.cc b/content/renderer/media/media_stream_dependency_factory.cc |
index a9e9d469e45882519c97a065c68ef8d902884d06..43c5d60979955ab1c26b1c5a474487830b10c828 100644 |
--- a/content/renderer/media/media_stream_dependency_factory.cc |
+++ b/content/renderer/media/media_stream_dependency_factory.cc |
@@ -4,69 +4,141 @@ |
#include "content/renderer/media/media_stream_dependency_factory.h" |
+#include <vector> |
+ |
#include "content/renderer/media/video_capture_module_impl.h" |
#include "content/renderer/media/webrtc_audio_device_impl.h" |
#include "content/renderer/p2p/ipc_network_manager.h" |
#include "content/renderer/p2p/ipc_socket_factory.h" |
#include "content/renderer/p2p/port_allocator.h" |
#include "jingle/glue/thread_wrapper.h" |
-#include "third_party/libjingle/source/talk/app/webrtcv1/peerconnection.h" |
-#include "third_party/libjingle/source/talk/session/phone/dummydevicemanager.h" |
-#include "third_party/libjingle/source/talk/session/phone/webrtcmediaengine.h" |
+#include "third_party/libjingle/source/talk/app/webrtc/peerconnection.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
+static std::string ParseHostName(const std::string& hostname) { |
+ std::string address; |
+ size_t pos = hostname.find(':'); |
+ if (pos == std::string::npos) { |
+ DVLOG(1) << "No port specified."; |
+ } else { |
+ address = hostname.substr(0, pos); |
+ } |
+ return address; |
+} |
+ |
+class P2PPortAllocatorFactory : public webrtc::PortAllocatorFactoryInterface { |
+ public: |
+ P2PPortAllocatorFactory( |
+ content::P2PSocketDispatcher* socket_dispatcher, |
+ talk_base::NetworkManager* network_manager, |
+ talk_base::PacketSocketFactory* socket_factory) |
+ : socket_dispatcher_(socket_dispatcher), |
+ network_manager_(network_manager), |
+ socket_factory_(socket_factory) { |
+ } |
+ |
+ virtual cricket::PortAllocator* CreatePortAllocator( |
+ const std::vector<StunConfiguration>& stun_servers, |
+ const std::vector<TurnConfiguration>& turn_configurations) OVERRIDE { |
+ WebKit::WebFrame* web_frame = WebKit::WebFrame::frameForCurrentContext(); |
+ if (!web_frame) { |
+ LOG(ERROR) << "WebFrame is NULL."; |
+ return NULL; |
+ } |
+ webkit_glue::P2PTransport::Config config; |
+ if (stun_servers.size() > 0) { |
+ config.stun_server = ParseHostName(stun_servers[0].server.hostname()); |
+ config.stun_server_port = stun_servers[0].server.port(); |
+ } |
+ if (turn_configurations.size() > 0) { |
+ config.relay_server = ParseHostName( |
+ turn_configurations[0].server.hostname()); |
+ config.relay_server_port = turn_configurations[0].server.port(); |
+ config.relay_username = turn_configurations[0].username; |
+ config.relay_password = turn_configurations[0].password; |
+ } |
+ |
+ return new content::P2PPortAllocator(web_frame, |
+ socket_dispatcher_, |
+ network_manager_, |
+ socket_factory_, |
+ config); |
+ } |
+ |
+ protected: |
+ virtual ~P2PPortAllocatorFactory() {} |
+ |
+ private: |
+ // socket_dispatcher_ is a weak reference, owned by RenderView. It's valid |
+ // for the lifetime of RenderView. |
+ content::P2PSocketDispatcher* socket_dispatcher_; |
+ // network_manager_ and socket_factory_ are a weak references, owned by |
+ // MediaStreamImpl. |
+ talk_base::NetworkManager* network_manager_; |
+ talk_base::PacketSocketFactory* socket_factory_; |
+}; |
+ |
+ |
MediaStreamDependencyFactory::MediaStreamDependencyFactory() {} |
MediaStreamDependencyFactory::~MediaStreamDependencyFactory() {} |
-cricket::WebRtcMediaEngine* |
-MediaStreamDependencyFactory::CreateWebRtcMediaEngine() { |
- webrtc::AudioDeviceModule* adm = new WebRtcAudioDeviceImpl(); |
- webrtc::AudioDeviceModule* adm_sc = new WebRtcAudioDeviceImpl(); |
- return new cricket::WebRtcMediaEngine(adm, adm_sc, NULL); |
-} |
- |
bool MediaStreamDependencyFactory::CreatePeerConnectionFactory( |
- cricket::MediaEngineInterface* media_engine, |
- talk_base::Thread* worker_thread) { |
+ talk_base::Thread* worker_thread, |
+ talk_base::Thread* signaling_thread, |
+ content::P2PSocketDispatcher* socket_dispatcher, |
+ talk_base::NetworkManager* network_manager, |
+ talk_base::PacketSocketFactory* socket_factory) { |
if (!pc_factory_.get()) { |
- scoped_ptr<webrtc::PeerConnectionFactory> factory( |
- new webrtc::PeerConnectionFactory(media_engine, |
- new cricket::DummyDeviceManager(), |
- worker_thread)); |
- if (factory->Initialize()) |
- pc_factory_.reset(factory.release()); |
+ talk_base::scoped_refptr<P2PPortAllocatorFactory> pa_factory = |
+ new talk_base::RefCountedObject<P2PPortAllocatorFactory>( |
+ socket_dispatcher, |
+ network_manager, |
+ socket_factory); |
+ |
+ talk_base::scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory( |
+ webrtc::CreatePeerConnectionFactory(worker_thread, |
+ signaling_thread, |
+ pa_factory.release(), |
+ new WebRtcAudioDeviceImpl())); |
+ if (factory.get()) |
+ pc_factory_ = factory.release(); |
} |
return pc_factory_.get() != NULL; |
} |
-void MediaStreamDependencyFactory::DeletePeerConnectionFactory() { |
- pc_factory_.reset(); |
+void MediaStreamDependencyFactory::ReleasePeerConnectionFactory() { |
+ if (pc_factory_.get()) |
+ pc_factory_ = NULL; |
} |
bool MediaStreamDependencyFactory::PeerConnectionFactoryCreated() { |
return pc_factory_.get() != NULL; |
} |
-cricket::PortAllocator* MediaStreamDependencyFactory::CreatePortAllocator( |
- content::P2PSocketDispatcher* socket_dispatcher, |
- talk_base::NetworkManager* network_manager, |
- talk_base::PacketSocketFactory* socket_factory, |
- const webkit_glue::P2PTransport::Config& config) { |
- WebKit::WebFrame* web_frame = WebKit::WebFrame::frameForCurrentContext(); |
- if (!web_frame) { |
- DVLOG(1) << "WebFrame is NULL."; |
- return NULL; |
- } |
- return new content::P2PPortAllocator(web_frame, |
- socket_dispatcher, |
- network_manager, |
- socket_factory, |
- config); |
+talk_base::scoped_refptr<webrtc::PeerConnectionInterface> |
+MediaStreamDependencyFactory::CreatePeerConnection( |
+ const std::string& config, |
+ webrtc::PeerConnectionObserver* observer) { |
+ return pc_factory_->CreatePeerConnection(config, observer); |
+} |
+ |
+talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> |
+MediaStreamDependencyFactory::CreateLocalMediaStream( |
+ const std::string& label) { |
+ return pc_factory_->CreateLocalMediaStream(label); |
+} |
+ |
+talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> |
+MediaStreamDependencyFactory::CreateLocalVideoTrack( |
+ const std::string& label, |
+ cricket::VideoCapturer* video_device) { |
+ return pc_factory_->CreateLocalVideoTrack(label, video_device); |
} |
-webrtc::PeerConnection* MediaStreamDependencyFactory::CreatePeerConnection( |
- cricket::PortAllocator* port_allocator, |
- talk_base::Thread* signaling_thread) { |
- return pc_factory_->CreatePeerConnection(port_allocator, signaling_thread); |
+talk_base::scoped_refptr<webrtc::LocalAudioTrackInterface> |
+MediaStreamDependencyFactory::CreateLocalAudioTrack( |
+ const std::string& label, |
+ webrtc::AudioDeviceModule* audio_device) { |
+ return pc_factory_->CreateLocalAudioTrack(label, audio_device); |
} |