| 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);
|
| }
|
|
|