Upstream version 9.38.198.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_frame_observer.h"
20 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
21 #include "content/renderer/media/media_stream_source.h"
22 #include "third_party/WebKit/public/platform/WebMediaStream.h"
23 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
24 #include "third_party/WebKit/public/platform/WebVector.h"
25 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.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 PeerConnectionDependencyFactory;
32 class MediaStreamDispatcher;
33 class MediaStreamVideoSource;
34 class VideoCapturerDelegate;
35
36 // MediaStreamImpl is a delegate for the Media Stream GetUserMedia API.
37 // It ties together WebKit and MediaStreamManager
38 // (via MediaStreamDispatcher and MediaStreamDispatcherHost)
39 // in the browser process. It must be created, called and destroyed on the
40 // render thread.
41 class CONTENT_EXPORT MediaStreamImpl
42     : public RenderFrameObserver,
43       NON_EXPORTED_BASE(public blink::WebUserMediaClient),
44       public MediaStreamDispatcherEventHandler,
45       NON_EXPORTED_BASE(public base::NonThreadSafe) {
46  public:
47   // |render_frame| and |dependency_factory| must outlive this instance.
48   MediaStreamImpl(
49       RenderFrame* render_frame,
50       PeerConnectionDependencyFactory* dependency_factory,
51       scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher);
52   virtual ~MediaStreamImpl();
53
54   MediaStreamDispatcher* media_stream_dispatcher() const {
55     return media_stream_dispatcher_.get();
56   }
57
58   // blink::WebUserMediaClient implementation
59   virtual void requestUserMedia(
60       const blink::WebUserMediaRequest& user_media_request);
61   virtual void cancelUserMediaRequest(
62       const blink::WebUserMediaRequest& user_media_request);
63   virtual void requestMediaDevices(
64       const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE;
65   virtual void cancelMediaDevicesRequest(
66       const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE;
67
68   // MediaStreamDispatcherEventHandler implementation.
69   virtual void OnStreamGenerated(
70       int request_id,
71       const std::string& label,
72       const StreamDeviceInfoArray& audio_array,
73       const StreamDeviceInfoArray& video_array) OVERRIDE;
74   virtual void OnStreamGenerationFailed(
75       int request_id,
76       MediaStreamRequestResult result) OVERRIDE;
77   virtual void OnDeviceStopped(const std::string& label,
78                                const StreamDeviceInfo& device_info) OVERRIDE;
79   virtual void OnDevicesEnumerated(
80       int request_id,
81       const StreamDeviceInfoArray& device_array) OVERRIDE;
82   virtual void OnDeviceOpened(
83       int request_id,
84       const std::string& label,
85       const StreamDeviceInfo& device_info) OVERRIDE;
86   virtual void OnDeviceOpenFailed(int request_id) OVERRIDE;
87
88   // RenderFrameObserver OVERRIDE
89   virtual void FrameWillClose() OVERRIDE;
90
91  protected:
92   // Called when |source| has been stopped from JavaScript.
93   void OnLocalSourceStopped(const blink::WebMediaStreamSource& source);
94
95   // These methods are virtual for test purposes. A test can override them to
96   // test requesting local media streams. The function notifies WebKit that the
97   // |request| have completed.
98   virtual void GetUserMediaRequestSucceeded(
99        const blink::WebMediaStream& stream,
100        blink::WebUserMediaRequest* request_info);
101   virtual void GetUserMediaRequestFailed(
102       blink::WebUserMediaRequest* request_info,
103       MediaStreamRequestResult result);
104   virtual void GetUserMediaRequestTrackStartedFailed(
105       blink::WebUserMediaRequest* request_info,
106       MediaStreamRequestResult result,
107       const blink::WebString& result_name);
108   virtual void EnumerateDevicesSucceded(
109       blink::WebMediaDevicesRequest* request,
110       blink::WebVector<blink::WebMediaDeviceInfo>& devices);
111   // Creates a MediaStreamVideoSource object.
112   // This is virtual for test purposes.
113   virtual MediaStreamVideoSource* CreateVideoSource(
114       const StreamDeviceInfo& device,
115       const MediaStreamSource::SourceStoppedCallback& stop_callback);
116
117  private:
118   // Class for storing information about a WebKit request to create a
119   // MediaStream.
120   class UserMediaRequestInfo
121       : public base::SupportsWeakPtr<UserMediaRequestInfo> {
122    public:
123     typedef base::Callback<void(UserMediaRequestInfo* request_info,
124                                 MediaStreamRequestResult result,
125                                 const blink::WebString& result_name)>
126       ResourcesReady;
127
128     UserMediaRequestInfo(int request_id,
129                          const blink::WebUserMediaRequest& request,
130                          bool enable_automatic_output_device_selection);
131     ~UserMediaRequestInfo();
132     int request_id;
133     // True if MediaStreamDispatcher has generated the stream, see
134     // OnStreamGenerated.
135     bool generated;
136     const bool enable_automatic_output_device_selection;
137     blink::WebMediaStream web_stream;
138     blink::WebUserMediaRequest request;
139
140     void StartAudioTrack(const blink::WebMediaStreamTrack& track,
141                          const blink::WebMediaConstraints& constraints);
142
143     blink::WebMediaStreamTrack CreateAndStartVideoTrack(
144         const blink::WebMediaStreamSource& source,
145         const blink::WebMediaConstraints& constraints);
146
147     // Triggers |callback| when all sources used in this request have either
148     // successfully started, or a source has failed to start.
149     void CallbackOnTracksStarted(const ResourcesReady& callback);
150
151     bool IsSourceUsed(const blink::WebMediaStreamSource& source) const;
152     void RemoveSource(const blink::WebMediaStreamSource& source);
153
154     bool HasPendingSources() const;
155
156    private:
157     void OnTrackStarted(
158         MediaStreamSource* source,
159         MediaStreamRequestResult result,
160         const blink::WebString& result_name);
161     void CheckAllTracksStarted();
162
163     ResourcesReady ready_callback_;
164     MediaStreamRequestResult request_result_;
165     blink::WebString request_result_name_;
166     // Sources used in this request.
167     std::vector<blink::WebMediaStreamSource> sources_;
168     std::vector<MediaStreamSource*> sources_waiting_for_callback_;
169   };
170   typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests;
171
172   typedef std::vector<blink::WebMediaStreamSource> LocalStreamSources;
173
174   struct MediaDevicesRequestInfo;
175   typedef ScopedVector<MediaDevicesRequestInfo> MediaDevicesRequests;
176
177   // Creates a WebKit representation of stream sources based on
178   // |devices| from the MediaStreamDispatcher.
179   void InitializeSourceObject(
180       const StreamDeviceInfo& device,
181       blink::WebMediaStreamSource::Type type,
182       const blink::WebMediaConstraints& constraints,
183       blink::WebMediaStreamSource* webkit_source);
184
185   void CreateVideoTracks(
186       const StreamDeviceInfoArray& devices,
187       const blink::WebMediaConstraints& constraints,
188       blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
189       UserMediaRequestInfo* request);
190
191   void CreateAudioTracks(
192       const StreamDeviceInfoArray& devices,
193       const blink::WebMediaConstraints& constraints,
194       blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks,
195       UserMediaRequestInfo* request);
196
197   // Callback function triggered when all native versions of the
198   // underlying media sources and tracks have been created and started.
199   void OnCreateNativeTracksCompleted(
200       UserMediaRequestInfo* request,
201       MediaStreamRequestResult result,
202       const blink::WebString& result_name);
203
204   void OnStreamGeneratedForCancelledRequest(
205       const StreamDeviceInfoArray& audio_array,
206       const StreamDeviceInfoArray& video_array);
207
208   UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id);
209   UserMediaRequestInfo* FindUserMediaRequestInfo(
210       const blink::WebUserMediaRequest& request);
211   void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request);
212   void DeleteAllUserMediaRequests();
213
214   MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(int request_id);
215   MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(
216       const blink::WebMediaDevicesRequest& request);
217   void CancelAndDeleteMediaDevicesRequest(MediaDevicesRequestInfo* request);
218
219   // Returns the source that use a device with |device.session_id|
220   // and |device.device.id|. NULL if such source doesn't exist.
221   const blink::WebMediaStreamSource* FindLocalSource(
222       const StreamDeviceInfo& device) const;
223
224   void StopLocalSource(const blink::WebMediaStreamSource& source,
225                        bool notify_dispatcher);
226
227   // Weak ref to a PeerConnectionDependencyFactory, owned by the RenderThread.
228   // It's valid for the lifetime of RenderThread.
229   // TODO(xians): Remove this dependency once audio do not need it for local
230   // audio.
231   PeerConnectionDependencyFactory* const dependency_factory_;
232
233   // MediaStreamImpl owns MediaStreamDispatcher instead of RenderFrameImpl
234   // (or RenderFrameObserver) to ensure tear-down occurs in the right order.
235   const scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher_;
236
237   LocalStreamSources local_sources_;
238
239   UserMediaRequests user_media_requests_;
240
241   // Requests to enumerate media devices.
242   MediaDevicesRequests media_devices_requests_;
243
244   // Note: This member must be the last to ensure all outstanding weak pointers
245   // are invalidated first.
246   base::WeakPtrFactory<MediaStreamImpl> weak_factory_;
247
248   DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl);
249 };
250
251 }  // namespace content
252
253 #endif  // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_