Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / renderer / media / media_stream_impl.h
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_IMPL_H_
6 #define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/scoped_vector.h"
16 #include "base/memory/weak_ptr.h"
17 #include "base/threading/non_thread_safe.h"
18 #include "content/common/content_export.h"
19 #include "content/public/renderer/render_view_observer.h"
20 #include "content/renderer/media/media_stream_client.h"
21 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
22 #include "content/renderer/media/media_stream_source.h"
23 #include "third_party/WebKit/public/platform/WebMediaStream.h"
24 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
25 #include "third_party/WebKit/public/platform/WebVector.h"
26 #include "third_party/WebKit/public/web/WebUserMediaClient.h"
27 #include "third_party/WebKit/public/web/WebUserMediaRequest.h"
28 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
29
30 namespace content {
31 class MediaStreamAudioRenderer;
32 class MediaStreamDependencyFactory;
33 class MediaStreamDispatcher;
34 class MediaStreamVideoSource;
35 class VideoCapturerDelegate;
36 class WebRtcAudioRenderer;
37 class WebRtcLocalAudioRenderer;
38
39 // MediaStreamImpl is a delegate for the Media Stream API messages used by
40 // WebKit. It ties together WebKit, native PeerConnection in libjingle and
41 // MediaStreamManager (via MediaStreamDispatcher and MediaStreamDispatcherHost)
42 // in the browser process. It must be created, called and destroyed on the
43 // render thread.
44 // MediaStreamImpl have weak pointers to a MediaStreamDispatcher.
45 class CONTENT_EXPORT MediaStreamImpl
46     : public RenderViewObserver,
47       NON_EXPORTED_BASE(public blink::WebUserMediaClient),
48       NON_EXPORTED_BASE(public MediaStreamClient),
49       public MediaStreamDispatcherEventHandler,
50       public base::SupportsWeakPtr<MediaStreamImpl>,
51       NON_EXPORTED_BASE(public base::NonThreadSafe) {
52  public:
53   MediaStreamImpl(
54       RenderView* render_view,
55       MediaStreamDispatcher* media_stream_dispatcher,
56       MediaStreamDependencyFactory* dependency_factory);
57   virtual ~MediaStreamImpl();
58
59   // blink::WebUserMediaClient implementation
60   virtual void requestUserMedia(
61       const blink::WebUserMediaRequest& user_media_request) OVERRIDE;
62   virtual void cancelUserMediaRequest(
63       const blink::WebUserMediaRequest& user_media_request) OVERRIDE;
64
65   // MediaStreamClient implementation.
66   virtual bool IsMediaStream(const GURL& url) OVERRIDE;
67   virtual scoped_refptr<VideoFrameProvider> GetVideoFrameProvider(
68       const GURL& url,
69       const base::Closure& error_cb,
70       const VideoFrameProvider::RepaintCB& repaint_cb) OVERRIDE;
71   virtual scoped_refptr<MediaStreamAudioRenderer>
72       GetAudioRenderer(const GURL& url, int render_frame_id) OVERRIDE;
73
74   // MediaStreamDispatcherEventHandler implementation.
75   virtual void OnStreamGenerated(
76       int request_id,
77       const std::string& label,
78       const StreamDeviceInfoArray& audio_array,
79       const StreamDeviceInfoArray& video_array) OVERRIDE;
80   virtual void OnStreamGenerationFailed(
81       int request_id,
82       content::MediaStreamRequestResult result) OVERRIDE;
83   virtual void OnDeviceStopped(const std::string& label,
84                                const StreamDeviceInfo& device_info) OVERRIDE;
85   virtual void OnDevicesEnumerated(
86       int request_id,
87       const StreamDeviceInfoArray& device_array) OVERRIDE;
88   virtual void OnDeviceOpened(
89       int request_id,
90       const std::string& label,
91       const StreamDeviceInfo& device_info) OVERRIDE;
92   virtual void OnDeviceOpenFailed(int request_id) OVERRIDE;
93
94   // RenderViewObserver OVERRIDE
95   virtual void FrameDetached(blink::WebFrame* frame) OVERRIDE;
96   virtual void FrameWillClose(blink::WebFrame* frame) OVERRIDE;
97
98  protected:
99   // Called when |source| has been stopped from JavaScript.
100   void OnLocalSourceStopped(const blink::WebMediaStreamSource& source);
101
102   // These methods are virtual for test purposes. A test can override them to
103   // test requesting local media streams. The function notifies WebKit that the
104   // |request| have completed.
105   virtual void GetUserMediaRequestSucceeded(
106        const blink::WebMediaStream& stream,
107        blink::WebUserMediaRequest* request_info);
108   virtual void GetUserMediaRequestFailed(
109       blink::WebUserMediaRequest* request_info,
110       content::MediaStreamRequestResult result);
111
112
113   // Returns the WebKit representation of a MediaStream given an URL.
114   // This is virtual for test purposes.
115   virtual blink::WebMediaStream GetMediaStream(const GURL& url);
116
117   // Creates a MediaStreamVideoSource object.
118   // This is virtual for test purposes.
119   virtual MediaStreamVideoSource* CreateVideoSource(
120       const StreamDeviceInfo& device,
121       const MediaStreamSource::SourceStoppedCallback& stop_callback);
122
123  private:
124   // Class for storing information about a WebKit request to create a
125   // MediaStream.
126   class UserMediaRequestInfo
127       : public base::SupportsWeakPtr<UserMediaRequestInfo> {
128    public:
129     typedef base::Callback<void(UserMediaRequestInfo* request_info,
130                                 content::MediaStreamRequestResult result)>
131       ResourcesReady;
132
133     UserMediaRequestInfo(int request_id,
134                          blink::WebFrame* frame,
135                          const blink::WebUserMediaRequest& request,
136                          bool enable_automatic_output_device_selection);
137     ~UserMediaRequestInfo();
138     int request_id;
139     // True if MediaStreamDispatcher has generated the stream, see
140     // OnStreamGenerated.
141     bool generated;
142     const bool enable_automatic_output_device_selection;
143     blink::WebFrame* frame;  // WebFrame that requested the MediaStream.
144     blink::WebMediaStream web_stream;
145     blink::WebUserMediaRequest request;
146
147     void StartAudioTrack(const blink::WebMediaStreamTrack& track,
148                          const blink::WebMediaConstraints& constraints);
149
150     blink::WebMediaStreamTrack CreateAndStartVideoTrack(
151         const blink::WebMediaStreamSource& source,
152         const blink::WebMediaConstraints& constraints,
153         MediaStreamDependencyFactory* factory);
154
155     // Triggers |callback| when all sources used in this request have either
156     // successfully started, or a source has failed to start.
157     void CallbackOnTracksStarted(const ResourcesReady& callback);
158
159     bool IsSourceUsed(const blink::WebMediaStreamSource& source) const;
160     void RemoveSource(const blink::WebMediaStreamSource& source);
161
162     bool AreAllSourcesRemoved() const { return sources_.empty(); };
163
164    private:
165     void OnTrackStarted(MediaStreamSource* source, bool success);
166     void CheckAllTracksStarted();
167
168     ResourcesReady ready_callback_;
169     bool request_failed_;
170     // Sources used in this request.
171     std::vector<blink::WebMediaStreamSource> sources_;
172     std::vector<MediaStreamSource*> sources_waiting_for_callback_;
173   };
174   typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests;
175
176   struct LocalStreamSource {
177     LocalStreamSource(blink::WebFrame* frame,
178                       const blink::WebMediaStreamSource& source)
179         : frame(frame), source(source) {
180     }
181     // |frame| is the WebFrame that requested |source|. NULL in unit tests.
182     // TODO(perkj): Change so that |frame| is not NULL in unit tests.
183     blink::WebFrame* frame;
184     blink::WebMediaStreamSource source;
185   };
186   typedef std::vector<LocalStreamSource> LocalStreamSources;
187
188   // Creates a WebKit representation of stream sources based on
189   // |devices| from the MediaStreamDispatcher.
190   void InitializeSourceObject(
191       const StreamDeviceInfo& device,
192       blink::WebMediaStreamSource::Type type,
193       const blink::WebMediaConstraints& constraints,
194       blink::WebFrame* frame,
195       blink::WebMediaStreamSource* webkit_source);
196
197   void CreateVideoTracks(
198       const StreamDeviceInfoArray& devices,
199       const blink::WebMediaConstraints& constraints,
200       blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
201       UserMediaRequestInfo* request);
202
203   void CreateAudioTracks(
204       const StreamDeviceInfoArray& devices,
205       const blink::WebMediaConstraints& constraints,
206       blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
207       UserMediaRequestInfo* request);
208
209   // Callback function triggered when all native versions of the
210   // underlying media sources and tracks have been created and started.
211   void OnCreateNativeTracksCompleted(
212       UserMediaRequestInfo* request,
213       content::MediaStreamRequestResult result);
214
215   UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id);
216   UserMediaRequestInfo* FindUserMediaRequestInfo(
217       const blink::WebUserMediaRequest& request);
218   void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request);
219
220   // Returns the source that use a device with |device.session_id|
221   // and |device.device.id|. NULL if such source doesn't exist.
222   const blink::WebMediaStreamSource* FindLocalSource(
223       const StreamDeviceInfo& device) const;
224
225   void StopLocalSource(const blink::WebMediaStreamSource& source,
226                        bool notify_dispatcher);
227
228   scoped_refptr<WebRtcAudioRenderer> CreateRemoteAudioRenderer(
229       webrtc::MediaStreamInterface* stream, int render_frame_id);
230   scoped_refptr<WebRtcLocalAudioRenderer> CreateLocalAudioRenderer(
231       const blink::WebMediaStreamTrack& audio_track,
232       int render_frame_id);
233
234   // Returns a valid session id if a single capture device is currently open
235   // (and then the matching session_id), otherwise -1.
236   // This is used to pass on a session id to a webrtc audio renderer (either
237   // local or remote), so that audio will be rendered to a matching output
238   // device, should one exist.
239   // Note that if there are more than one open capture devices the function
240   // will not be able to pick an appropriate device and return false.
241   bool GetAuthorizedDeviceInfoForAudioRenderer(
242       int* session_id, int* output_sample_rate, int* output_buffer_size);
243
244   // Weak ref to a MediaStreamDependencyFactory, owned by the RenderThread.
245   // It's valid for the lifetime of RenderThread.
246   MediaStreamDependencyFactory* dependency_factory_;
247
248   // media_stream_dispatcher_ is a weak reference, owned by RenderView. It's
249   // valid for the lifetime of RenderView.
250   MediaStreamDispatcher* media_stream_dispatcher_;
251
252   LocalStreamSources local_sources_;
253
254   UserMediaRequests user_media_requests_;
255
256   DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl);
257 };
258
259 }  // namespace content
260
261 #endif  // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_