• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_DEPENDENCY_FACTORY_H_
6 #define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_DEPENDENCY_FACTORY_H_
7 
8 #include <string>
9 
10 #include "base/basictypes.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/threading/thread.h"
13 #include "content/common/content_export.h"
14 #include "content/renderer/media/media_stream_extra_data.h"
15 #include "content/renderer/p2p/socket_dispatcher.h"
16 #include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h"
17 #include "third_party/libjingle/source/talk/app/webrtc/videosourceinterface.h"
18 
19 namespace base {
20 class WaitableEvent;
21 }
22 
23 namespace talk_base {
24 class NetworkManager;
25 class PacketSocketFactory;
26 class Thread;
27 }
28 
29 namespace webrtc {
30 class PeerConnection;
31 }
32 
33 namespace blink {
34 class WebFrame;
35 class WebMediaConstraints;
36 class WebMediaStream;
37 class WebRTCPeerConnectionHandler;
38 class WebRTCPeerConnectionHandlerClient;
39 }
40 
41 namespace content {
42 
43 class IpcNetworkManager;
44 class IpcPacketSocketFactory;
45 class RTCMediaConstraints;
46 class VideoCaptureImplManager;
47 class WebAudioCapturerSource;
48 class WebRtcAudioCapturer;
49 class WebRtcAudioDeviceImpl;
50 class WebRtcLoggingHandlerImpl;
51 class WebRtcLoggingMessageFilter;
52 struct StreamDeviceInfo;
53 
54 #if defined(GOOGLE_TV)
55 class RTCVideoDecoderFactoryTv;
56 #endif
57 
58 // Object factory for RTC MediaStreams and RTC PeerConnections.
59 class CONTENT_EXPORT MediaStreamDependencyFactory
NON_EXPORTED_BASE(public base::NonThreadSafe)60     : NON_EXPORTED_BASE(public base::NonThreadSafe) {
61  public:
62   // MediaSourcesCreatedCallback is used in CreateNativeMediaSources.
63   typedef base::Callback<void(blink::WebMediaStream* web_stream,
64                               bool live)> MediaSourcesCreatedCallback;
65   MediaStreamDependencyFactory(
66       VideoCaptureImplManager* vc_manager,
67       P2PSocketDispatcher* p2p_socket_dispatcher);
68   virtual ~MediaStreamDependencyFactory();
69 
70   // Create a RTCPeerConnectionHandler object that implements the
71   // WebKit WebRTCPeerConnectionHandler interface.
72   blink::WebRTCPeerConnectionHandler* CreateRTCPeerConnectionHandler(
73       blink::WebRTCPeerConnectionHandlerClient* client);
74 
75   // CreateNativeMediaSources creates libjingle representations of
76   // the underlying sources to the tracks in |web_stream|.
77   // |sources_created| is invoked when the sources have either been created and
78   // transitioned to a live state or failed.
79   // The libjingle sources is stored in the extra data field of
80   // WebMediaStreamSource.
81   // |audio_constraints| and |video_constraints| set parameters for the sources.
82   void CreateNativeMediaSources(
83       int render_view_id,
84       const blink::WebMediaConstraints& audio_constraints,
85       const blink::WebMediaConstraints& video_constraints,
86       blink::WebMediaStream* web_stream,
87       const MediaSourcesCreatedCallback& sources_created);
88 
89   // Creates a libjingle representation of a MediaStream and stores
90   // it in the extra data field of |web_stream|.
91   void CreateNativeLocalMediaStream(
92       blink::WebMediaStream* web_stream);
93 
94   // Creates a libjingle representation of a MediaStream and stores
95   // it in the extra data field of |web_stream|.
96   // |stream_stopped| is a callback that is run when a MediaStream have been
97   // stopped.
98   void CreateNativeLocalMediaStream(
99       blink::WebMediaStream* web_stream,
100       const MediaStreamExtraData::StreamStopCallback& stream_stop);
101 
102   // Creates a libjingle representation of a MediaStreamTrack and stores
103   // it in the extra data field of |track|.
104   void CreateNativeMediaStreamTrack(const blink::WebMediaStreamTrack& track);
105 
106   // Adds a libjingle representation of a MediaStreamTrack to |stream| based
107   // on the source of |track|.
108   bool AddNativeMediaStreamTrack(const blink::WebMediaStream& stream,
109                                  const blink::WebMediaStreamTrack& track);
110 
111   // Creates and adds libjingle representation of a MediaStreamTrack to |stream|
112   // based on the desired |track_id| and |capturer|.
113   bool AddNativeVideoMediaTrack(const std::string& track_id,
114                                 blink::WebMediaStream* stream,
115                                 cricket::VideoCapturer* capturer);
116 
117   bool RemoveNativeMediaStreamTrack(const blink::WebMediaStream& stream,
118                                     const blink::WebMediaStreamTrack& track);
119 
120   // Asks the libjingle PeerConnection factory to create a libjingle
121   // PeerConnection object.
122   // The PeerConnection object is owned by PeerConnectionHandler.
123   virtual scoped_refptr<webrtc::PeerConnectionInterface>
124       CreatePeerConnection(
125           const webrtc::PeerConnectionInterface::IceServers& ice_servers,
126           const webrtc::MediaConstraintsInterface* constraints,
127           blink::WebFrame* web_frame,
128           webrtc::PeerConnectionObserver* observer);
129 
130   // Creates a libjingle representation of a Session description. Used by a
131   // RTCPeerConnectionHandler instance.
132   virtual webrtc::SessionDescriptionInterface* CreateSessionDescription(
133       const std::string& type,
134       const std::string& sdp,
135       webrtc::SdpParseError* error);
136 
137   // Creates a libjingle representation of an ice candidate.
138   virtual webrtc::IceCandidateInterface* CreateIceCandidate(
139       const std::string& sdp_mid,
140       int sdp_mline_index,
141       const std::string& sdp);
142 
143   WebRtcAudioDeviceImpl* GetWebRtcAudioDevice();
144 
145 #if defined(GOOGLE_TV)
146   RTCVideoDecoderFactoryTv* decoder_factory_tv() { return decoder_factory_tv_; }
147 #endif
148 
149   static void AddNativeTrackToBlinkTrack(
150       webrtc::MediaStreamTrackInterface* native_track,
151       const blink::WebMediaStreamTrack& webkit_track,
152       bool is_local_track);
153 
154   static webrtc::MediaStreamInterface* GetNativeMediaStream(
155       const blink::WebMediaStream& stream);
156 
157   static webrtc::MediaStreamTrackInterface* GetNativeMediaStreamTrack(
158       const blink::WebMediaStreamTrack& track);
159 
160  protected:
161   // Asks the PeerConnection factory to create a Local MediaStream object.
162   virtual scoped_refptr<webrtc::MediaStreamInterface>
163       CreateLocalMediaStream(const std::string& label);
164 
165   // Asks the PeerConnection factory to create a Local Audio Source.
166   virtual scoped_refptr<webrtc::AudioSourceInterface>
167       CreateLocalAudioSource(
168           const webrtc::MediaConstraintsInterface* constraints);
169 
170   // Asks the PeerConnection factory to create a Local Video Source.
171   virtual scoped_refptr<webrtc::VideoSourceInterface>
172       CreateLocalVideoSource(
173           int video_session_id,
174           bool is_screen_cast,
175           const webrtc::MediaConstraintsInterface* constraints);
176 
177   // Creates a media::AudioCapturerSource with an implementation that is
178   // specific for a WebAudio source. The created WebAudioCapturerSource
179   // instance will function as audio source instead of the default
180   // WebRtcAudioCapturer.
181   // The |constraints| will be modified to include the default, mandatory
182   // WebAudio constraints.
183   virtual scoped_refptr<WebAudioCapturerSource> CreateWebAudioSource(
184       blink::WebMediaStreamSource* source, RTCMediaConstraints* constraints);
185 
186   // Asks the PeerConnection factory to create a Local AudioTrack object.
187   virtual scoped_refptr<webrtc::AudioTrackInterface>
188       CreateLocalAudioTrack(
189           const std::string& id,
190           const scoped_refptr<WebRtcAudioCapturer>& capturer,
191           WebAudioCapturerSource* webaudio_source,
192           webrtc::AudioSourceInterface* source,
193           const webrtc::MediaConstraintsInterface* constraints);
194 
195   // Asks the PeerConnection factory to create a Local VideoTrack object.
196   virtual scoped_refptr<webrtc::VideoTrackInterface>
197       CreateLocalVideoTrack(const std::string& id,
198                             webrtc::VideoSourceInterface* source);
199 
200   // Asks the PeerConnection factory to create a Local VideoTrack object with
201   // the video source using |capturer|.
202   virtual scoped_refptr<webrtc::VideoTrackInterface>
203       CreateLocalVideoTrack(const std::string& id,
204                             cricket::VideoCapturer* capturer);
205 
206   virtual bool EnsurePeerConnectionFactory();
207   virtual bool PeerConnectionFactoryCreated();
208 
209   // Returns a new capturer or existing capturer based on the |render_view_id|
210   // and |device_info|. When the |render_view_id| and |device_info| are valid,
211   // it reuses existing capture if any; otherwise it creates a new capturer.
212   virtual scoped_refptr<WebRtcAudioCapturer> MaybeCreateAudioCapturer(
213       int render_view_id, const StreamDeviceInfo& device_info);
214 
215  private:
216   // Creates and deletes |pc_factory_|, which in turn is used for
217   // creating PeerConnection objects.
218   bool CreatePeerConnectionFactory();
219 
220   void InitializeWorkerThread(talk_base::Thread** thread,
221                               base::WaitableEvent* event);
222 
223   void CreateIpcNetworkManagerOnWorkerThread(base::WaitableEvent* event);
224   void DeleteIpcNetworkManager();
225   void CleanupPeerConnectionFactory();
226 
227   scoped_refptr<webrtc::AudioTrackInterface>
228   CreateNativeAudioMediaStreamTrack(const blink::WebMediaStreamTrack& track);
229 
230   scoped_refptr<webrtc::VideoTrackInterface>
231   CreateNativeVideoMediaStreamTrack(const blink::WebMediaStreamTrack& track);
232 
233   // We own network_manager_, must be deleted on the worker thread.
234   // The network manager uses |p2p_socket_dispatcher_|.
235   IpcNetworkManager* network_manager_;
236   scoped_ptr<IpcPacketSocketFactory> socket_factory_;
237 
238   scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_;
239 
240 #if defined(GOOGLE_TV)
241   // |pc_factory_| will hold the ownership of this object, and |pc_factory_|
242   // outlives this object. Thus weak pointer is sufficient.
243   RTCVideoDecoderFactoryTv* decoder_factory_tv_;
244 #endif
245 
246   scoped_refptr<VideoCaptureImplManager> vc_manager_;
247   scoped_refptr<P2PSocketDispatcher> p2p_socket_dispatcher_;
248   scoped_refptr<WebRtcAudioDeviceImpl> audio_device_;
249 
250   // PeerConnection threads. signaling_thread_ is created from the
251   // "current" chrome thread.
252   talk_base::Thread* signaling_thread_;
253   talk_base::Thread* worker_thread_;
254   base::Thread chrome_worker_thread_;
255 
256   DISALLOW_COPY_AND_ASSIGN(MediaStreamDependencyFactory);
257 };
258 
259 }  // namespace content
260 
261 #endif  // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_DEPENDENCY_FACTORY_H_
262