1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_RENDERER_MEDIA_WEBRTC_PEER_CONNECTION_DEPENDENCY_FACTORY_H_
6#define CONTENT_RENDERER_MEDIA_WEBRTC_PEER_CONNECTION_DEPENDENCY_FACTORY_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/files/file.h"
12#include "base/threading/thread.h"
13#include "content/common/content_export.h"
14#include "content/public/renderer/render_process_observer.h"
15#include "content/renderer/media/aec_dump_message_filter.h"
16#include "content/renderer/p2p/socket_dispatcher.h"
17#include "ipc/ipc_platform_file.h"
18#include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h"
19#include "third_party/libjingle/source/talk/app/webrtc/videosourceinterface.h"
20
21namespace base {
22class WaitableEvent;
23}
24
25namespace rtc {
26class NetworkManager;
27class PacketSocketFactory;
28class Thread;
29}
30
31namespace blink {
32class WebFrame;
33class WebMediaConstraints;
34class WebMediaStream;
35class WebMediaStreamSource;
36class WebMediaStreamTrack;
37class WebRTCPeerConnectionHandler;
38class WebRTCPeerConnectionHandlerClient;
39}
40
41namespace content {
42
43class IpcNetworkManager;
44class IpcPacketSocketFactory;
45class MediaStreamAudioSource;
46class RTCMediaConstraints;
47class WebAudioCapturerSource;
48class WebRtcAudioCapturer;
49class WebRtcAudioDeviceImpl;
50class WebRtcLocalAudioTrack;
51class WebRtcLoggingHandlerImpl;
52class WebRtcLoggingMessageFilter;
53class WebRtcVideoCapturerAdapter;
54struct StreamDeviceInfo;
55
56// Object factory for RTC PeerConnections.
57class CONTENT_EXPORT PeerConnectionDependencyFactory
58    : NON_EXPORTED_BASE(public base::NonThreadSafe),
59      NON_EXPORTED_BASE(public AecDumpMessageFilter::AecDumpDelegate) {
60 public:
61  PeerConnectionDependencyFactory(
62      P2PSocketDispatcher* p2p_socket_dispatcher);
63  virtual ~PeerConnectionDependencyFactory();
64
65  // Create a RTCPeerConnectionHandler object that implements the
66  // WebKit WebRTCPeerConnectionHandler interface.
67  blink::WebRTCPeerConnectionHandler* CreateRTCPeerConnectionHandler(
68      blink::WebRTCPeerConnectionHandlerClient* client);
69
70  // Asks the PeerConnection factory to create a Local MediaStream object.
71  virtual scoped_refptr<webrtc::MediaStreamInterface>
72      CreateLocalMediaStream(const std::string& label);
73
74  // InitializeMediaStreamAudioSource initialize a MediaStream source object
75  // for audio input.
76  bool InitializeMediaStreamAudioSource(
77      int render_view_id,
78      const blink::WebMediaConstraints& audio_constraints,
79      MediaStreamAudioSource* source_data);
80
81  // Creates an implementation of a cricket::VideoCapturer object that can be
82  // used when creating a libjingle webrtc::VideoSourceInterface object.
83  virtual WebRtcVideoCapturerAdapter* CreateVideoCapturer(
84      bool is_screen_capture);
85
86  // Create an instance of WebRtcLocalAudioTrack and store it
87  // in the extraData field of |track|.
88  void CreateLocalAudioTrack(const blink::WebMediaStreamTrack& track);
89
90  // Asks the PeerConnection factory to create a Local VideoTrack object.
91  virtual scoped_refptr<webrtc::VideoTrackInterface>
92      CreateLocalVideoTrack(const std::string& id,
93                            webrtc::VideoSourceInterface* source);
94
95  // Asks the PeerConnection factory to create a Video Source.
96  // The video source takes ownership of |capturer|.
97  virtual scoped_refptr<webrtc::VideoSourceInterface>
98      CreateVideoSource(cricket::VideoCapturer* capturer,
99                        const blink::WebMediaConstraints& constraints);
100
101  // Asks the libjingle PeerConnection factory to create a libjingle
102  // PeerConnection object.
103  // The PeerConnection object is owned by PeerConnectionHandler.
104  virtual scoped_refptr<webrtc::PeerConnectionInterface>
105      CreatePeerConnection(
106          const webrtc::PeerConnectionInterface::RTCConfiguration& config,
107          const webrtc::MediaConstraintsInterface* constraints,
108          blink::WebFrame* web_frame,
109          webrtc::PeerConnectionObserver* observer);
110
111  // Creates a libjingle representation of a Session description. Used by a
112  // RTCPeerConnectionHandler instance.
113  virtual webrtc::SessionDescriptionInterface* CreateSessionDescription(
114      const std::string& type,
115      const std::string& sdp,
116      webrtc::SdpParseError* error);
117
118  // Creates a libjingle representation of an ice candidate.
119  virtual webrtc::IceCandidateInterface* CreateIceCandidate(
120      const std::string& sdp_mid,
121      int sdp_mline_index,
122      const std::string& sdp);
123
124  WebRtcAudioDeviceImpl* GetWebRtcAudioDevice();
125
126  static void AddNativeAudioTrackToBlinkTrack(
127      webrtc::MediaStreamTrackInterface* native_track,
128      const blink::WebMediaStreamTrack& webkit_track,
129      bool is_local_track);
130
131  scoped_refptr<base::MessageLoopProxy> GetWebRtcWorkerThread() const;
132
133  // AecDumpMessageFilter::AecDumpDelegate implementation.
134  // TODO(xians): Remove when option to disable audio track processing is
135  // removed.
136  virtual void OnAecDumpFile(
137      const IPC::PlatformFileForTransit& file_handle) OVERRIDE;
138  virtual void OnDisableAecDump() OVERRIDE;
139  virtual void OnIpcClosing() OVERRIDE;
140
141 protected:
142  // Asks the PeerConnection factory to create a Local Audio Source.
143  virtual scoped_refptr<webrtc::AudioSourceInterface>
144      CreateLocalAudioSource(
145          const webrtc::MediaConstraintsInterface* constraints);
146
147  // Creates a media::AudioCapturerSource with an implementation that is
148  // specific for a WebAudio source. The created WebAudioCapturerSource
149  // instance will function as audio source instead of the default
150  // WebRtcAudioCapturer.
151  virtual scoped_refptr<WebAudioCapturerSource> CreateWebAudioSource(
152      blink::WebMediaStreamSource* source);
153
154  // Asks the PeerConnection factory to create a Local VideoTrack object with
155  // the video source using |capturer|.
156  virtual scoped_refptr<webrtc::VideoTrackInterface>
157      CreateLocalVideoTrack(const std::string& id,
158                            cricket::VideoCapturer* capturer);
159
160  virtual const scoped_refptr<webrtc::PeerConnectionFactoryInterface>&
161      GetPcFactory();
162  virtual bool PeerConnectionFactoryCreated();
163
164  // Returns a new capturer or existing capturer based on the |render_view_id|
165  // and |device_info|. When the |render_view_id| and |device_info| are valid,
166  // it reuses existing capture if any; otherwise it creates a new capturer.
167  virtual scoped_refptr<WebRtcAudioCapturer> CreateAudioCapturer(
168      int render_view_id, const StreamDeviceInfo& device_info,
169      const blink::WebMediaConstraints& constraints,
170      MediaStreamAudioSource* audio_source);
171
172  // Adds the audio device as a sink to the audio track and starts the local
173  // audio track. This is virtual for test purposes since no real audio device
174  // exist in unit tests.
175  virtual void StartLocalAudioTrack(WebRtcLocalAudioTrack* audio_track);
176
177 private:
178  // Creates |pc_factory_|, which in turn is used for
179  // creating PeerConnection objects.
180  void CreatePeerConnectionFactory();
181
182  void InitializeWorkerThread(rtc::Thread** thread,
183                              base::WaitableEvent* event);
184
185  void CreateIpcNetworkManagerOnWorkerThread(base::WaitableEvent* event);
186  void DeleteIpcNetworkManager();
187  void CleanupPeerConnectionFactory();
188
189  // Helper method to create a WebRtcAudioDeviceImpl.
190  void EnsureWebRtcAudioDeviceImpl();
191
192  // We own network_manager_, must be deleted on the worker thread.
193  // The network manager uses |p2p_socket_dispatcher_|.
194  IpcNetworkManager* network_manager_;
195  scoped_ptr<IpcPacketSocketFactory> socket_factory_;
196
197  scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_;
198
199  scoped_refptr<P2PSocketDispatcher> p2p_socket_dispatcher_;
200  scoped_refptr<WebRtcAudioDeviceImpl> audio_device_;
201
202  // This is only used if audio track processing is disabled.
203  // TODO(xians): Remove when option to disable audio track processing is
204  // removed.
205  scoped_refptr<AecDumpMessageFilter> aec_dump_message_filter_;
206
207  // PeerConnection threads. signaling_thread_ is created from the
208  // "current" chrome thread.
209  rtc::Thread* signaling_thread_;
210  rtc::Thread* worker_thread_;
211  base::Thread chrome_worker_thread_;
212
213  DISALLOW_COPY_AND_ASSIGN(PeerConnectionDependencyFactory);
214};
215
216}  // namespace content
217
218#endif  // CONTENT_RENDERER_MEDIA_WEBRTC_PEER_CONNECTION_DEPENDENCY_FACTORY_H_
219