| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ | 5 #ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ |
| 6 #define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ | 6 #define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
| 13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
| 14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/memory/scoped_vector.h" | 15 #include "base/memory/scoped_vector.h" |
| 16 #include "base/memory/weak_ptr.h" | 16 #include "base/memory/weak_ptr.h" |
| 17 #include "base/threading/non_thread_safe.h" | 17 #include "base/threading/non_thread_safe.h" |
| 18 #include "content/common/content_export.h" | 18 #include "content/common/content_export.h" |
| 19 #include "content/public/renderer/render_view_observer.h" | 19 #include "content/public/renderer/render_frame_observer.h" |
| 20 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" | 20 #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" |
| 21 #include "content/renderer/media/media_stream_source.h" | 21 #include "content/renderer/media/media_stream_source.h" |
| 22 #include "third_party/WebKit/public/platform/WebMediaStream.h" | 22 #include "third_party/WebKit/public/platform/WebMediaStream.h" |
| 23 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | 23 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
| 24 #include "third_party/WebKit/public/platform/WebVector.h" | 24 #include "third_party/WebKit/public/platform/WebVector.h" |
| 25 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.h" | 25 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.h" |
| 26 #include "third_party/WebKit/public/web/WebUserMediaClient.h" | 26 #include "third_party/WebKit/public/web/WebUserMediaClient.h" |
| 27 #include "third_party/WebKit/public/web/WebUserMediaRequest.h" | 27 #include "third_party/WebKit/public/web/WebUserMediaRequest.h" |
| 28 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h" | 28 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h" |
| 29 | 29 |
| 30 namespace content { | 30 namespace content { |
| 31 class PeerConnectionDependencyFactory; | 31 class PeerConnectionDependencyFactory; |
| 32 class MediaStreamDispatcher; | 32 class MediaStreamDispatcher; |
| 33 class MediaStreamVideoSource; | 33 class MediaStreamVideoSource; |
| 34 class VideoCapturerDelegate; | 34 class VideoCapturerDelegate; |
| 35 | 35 |
| 36 // MediaStreamImpl is a delegate for the Media Stream GetUserMedia API. | 36 // MediaStreamImpl is a delegate for the Media Stream GetUserMedia API. |
| 37 // It ties together WebKit and MediaStreamManager | 37 // It ties together WebKit and MediaStreamManager |
| 38 // (via MediaStreamDispatcher and MediaStreamDispatcherHost) | 38 // (via MediaStreamDispatcher and MediaStreamDispatcherHost) |
| 39 // in the browser process. It must be created, called and destroyed on the | 39 // in the browser process. It must be created, called and destroyed on the |
| 40 // render thread. | 40 // render thread. |
| 41 // MediaStreamImpl have weak pointers to a MediaStreamDispatcher. | |
| 42 class CONTENT_EXPORT MediaStreamImpl | 41 class CONTENT_EXPORT MediaStreamImpl |
| 43 : public RenderViewObserver, | 42 : public RenderFrameObserver, |
| 44 NON_EXPORTED_BASE(public blink::WebUserMediaClient), | 43 NON_EXPORTED_BASE(public blink::WebUserMediaClient), |
| 45 public MediaStreamDispatcherEventHandler, | 44 public MediaStreamDispatcherEventHandler, |
| 46 public base::SupportsWeakPtr<MediaStreamImpl>, | |
| 47 NON_EXPORTED_BASE(public base::NonThreadSafe) { | 45 NON_EXPORTED_BASE(public base::NonThreadSafe) { |
| 48 public: | 46 public: |
| 47 // |render_frame| and |dependency_factory| must outlive this instance. |
| 49 MediaStreamImpl( | 48 MediaStreamImpl( |
| 50 RenderView* render_view, | 49 RenderFrame* render_frame, |
| 51 MediaStreamDispatcher* media_stream_dispatcher, | 50 PeerConnectionDependencyFactory* dependency_factory, |
| 52 PeerConnectionDependencyFactory* dependency_factory); | 51 scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher); |
| 53 virtual ~MediaStreamImpl(); | 52 virtual ~MediaStreamImpl(); |
| 54 | 53 |
| 54 MediaStreamDispatcher* media_stream_dispatcher() const { |
| 55 return media_stream_dispatcher_.get(); |
| 56 } |
| 57 |
| 55 // blink::WebUserMediaClient implementation | 58 // blink::WebUserMediaClient implementation |
| 56 virtual void requestUserMedia( | 59 virtual void requestUserMedia( |
| 57 const blink::WebUserMediaRequest& user_media_request); | 60 const blink::WebUserMediaRequest& user_media_request); |
| 58 virtual void cancelUserMediaRequest( | 61 virtual void cancelUserMediaRequest( |
| 59 const blink::WebUserMediaRequest& user_media_request); | 62 const blink::WebUserMediaRequest& user_media_request); |
| 60 virtual void requestMediaDevices( | 63 virtual void requestMediaDevices( |
| 61 const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE; | 64 const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE; |
| 62 virtual void cancelMediaDevicesRequest( | 65 virtual void cancelMediaDevicesRequest( |
| 63 const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE; | 66 const blink::WebMediaDevicesRequest& media_devices_request) OVERRIDE; |
| 64 | 67 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 75 const StreamDeviceInfo& device_info) OVERRIDE; | 78 const StreamDeviceInfo& device_info) OVERRIDE; |
| 76 virtual void OnDevicesEnumerated( | 79 virtual void OnDevicesEnumerated( |
| 77 int request_id, | 80 int request_id, |
| 78 const StreamDeviceInfoArray& device_array) OVERRIDE; | 81 const StreamDeviceInfoArray& device_array) OVERRIDE; |
| 79 virtual void OnDeviceOpened( | 82 virtual void OnDeviceOpened( |
| 80 int request_id, | 83 int request_id, |
| 81 const std::string& label, | 84 const std::string& label, |
| 82 const StreamDeviceInfo& device_info) OVERRIDE; | 85 const StreamDeviceInfo& device_info) OVERRIDE; |
| 83 virtual void OnDeviceOpenFailed(int request_id) OVERRIDE; | 86 virtual void OnDeviceOpenFailed(int request_id) OVERRIDE; |
| 84 | 87 |
| 85 // RenderViewObserver OVERRIDE | 88 // RenderFrameObserver OVERRIDE |
| 86 virtual void FrameDetached(blink::WebFrame* frame) OVERRIDE; | 89 virtual void FrameWillClose() OVERRIDE; |
| 87 virtual void FrameWillClose(blink::WebFrame* frame) OVERRIDE; | |
| 88 | 90 |
| 89 protected: | 91 protected: |
| 90 // Called when |source| has been stopped from JavaScript. | 92 // Called when |source| has been stopped from JavaScript. |
| 91 void OnLocalSourceStopped(const blink::WebMediaStreamSource& source); | 93 void OnLocalSourceStopped(const blink::WebMediaStreamSource& source); |
| 92 | 94 |
| 93 // These methods are virtual for test purposes. A test can override them to | 95 // These methods are virtual for test purposes. A test can override them to |
| 94 // test requesting local media streams. The function notifies WebKit that the | 96 // test requesting local media streams. The function notifies WebKit that the |
| 95 // |request| have completed. | 97 // |request| have completed. |
| 96 virtual void GetUserMediaRequestSucceeded( | 98 virtual void GetUserMediaRequestSucceeded( |
| 97 const blink::WebMediaStream& stream, | 99 const blink::WebMediaStream& stream, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 112 // Class for storing information about a WebKit request to create a | 114 // Class for storing information about a WebKit request to create a |
| 113 // MediaStream. | 115 // MediaStream. |
| 114 class UserMediaRequestInfo | 116 class UserMediaRequestInfo |
| 115 : public base::SupportsWeakPtr<UserMediaRequestInfo> { | 117 : public base::SupportsWeakPtr<UserMediaRequestInfo> { |
| 116 public: | 118 public: |
| 117 typedef base::Callback<void(UserMediaRequestInfo* request_info, | 119 typedef base::Callback<void(UserMediaRequestInfo* request_info, |
| 118 content::MediaStreamRequestResult result)> | 120 content::MediaStreamRequestResult result)> |
| 119 ResourcesReady; | 121 ResourcesReady; |
| 120 | 122 |
| 121 UserMediaRequestInfo(int request_id, | 123 UserMediaRequestInfo(int request_id, |
| 122 blink::WebFrame* frame, | |
| 123 const blink::WebUserMediaRequest& request, | 124 const blink::WebUserMediaRequest& request, |
| 124 bool enable_automatic_output_device_selection); | 125 bool enable_automatic_output_device_selection); |
| 125 ~UserMediaRequestInfo(); | 126 ~UserMediaRequestInfo(); |
| 126 int request_id; | 127 int request_id; |
| 127 // True if MediaStreamDispatcher has generated the stream, see | 128 // True if MediaStreamDispatcher has generated the stream, see |
| 128 // OnStreamGenerated. | 129 // OnStreamGenerated. |
| 129 bool generated; | 130 bool generated; |
| 130 const bool enable_automatic_output_device_selection; | 131 const bool enable_automatic_output_device_selection; |
| 131 blink::WebFrame* frame; // WebFrame that requested the MediaStream. | |
| 132 blink::WebMediaStream web_stream; | 132 blink::WebMediaStream web_stream; |
| 133 blink::WebUserMediaRequest request; | 133 blink::WebUserMediaRequest request; |
| 134 | 134 |
| 135 void StartAudioTrack(const blink::WebMediaStreamTrack& track, | 135 void StartAudioTrack(const blink::WebMediaStreamTrack& track, |
| 136 const blink::WebMediaConstraints& constraints); | 136 const blink::WebMediaConstraints& constraints); |
| 137 | 137 |
| 138 blink::WebMediaStreamTrack CreateAndStartVideoTrack( | 138 blink::WebMediaStreamTrack CreateAndStartVideoTrack( |
| 139 const blink::WebMediaStreamSource& source, | 139 const blink::WebMediaStreamSource& source, |
| 140 const blink::WebMediaConstraints& constraints); | 140 const blink::WebMediaConstraints& constraints); |
| 141 | 141 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 153 void CheckAllTracksStarted(); | 153 void CheckAllTracksStarted(); |
| 154 | 154 |
| 155 ResourcesReady ready_callback_; | 155 ResourcesReady ready_callback_; |
| 156 bool request_failed_; | 156 bool request_failed_; |
| 157 // Sources used in this request. | 157 // Sources used in this request. |
| 158 std::vector<blink::WebMediaStreamSource> sources_; | 158 std::vector<blink::WebMediaStreamSource> sources_; |
| 159 std::vector<MediaStreamSource*> sources_waiting_for_callback_; | 159 std::vector<MediaStreamSource*> sources_waiting_for_callback_; |
| 160 }; | 160 }; |
| 161 typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests; | 161 typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests; |
| 162 | 162 |
| 163 struct LocalStreamSource { | 163 typedef std::vector<blink::WebMediaStreamSource> LocalStreamSources; |
| 164 LocalStreamSource(blink::WebFrame* frame, | |
| 165 const blink::WebMediaStreamSource& source) | |
| 166 : frame(frame), source(source) { | |
| 167 } | |
| 168 // |frame| is the WebFrame that requested |source|. NULL in unit tests. | |
| 169 // TODO(perkj): Change so that |frame| is not NULL in unit tests. | |
| 170 blink::WebFrame* frame; | |
| 171 blink::WebMediaStreamSource source; | |
| 172 }; | |
| 173 typedef std::vector<LocalStreamSource> LocalStreamSources; | |
| 174 | 164 |
| 175 struct MediaDevicesRequestInfo; | 165 struct MediaDevicesRequestInfo; |
| 176 typedef ScopedVector<MediaDevicesRequestInfo> MediaDevicesRequests; | 166 typedef ScopedVector<MediaDevicesRequestInfo> MediaDevicesRequests; |
| 177 | 167 |
| 178 // Creates a WebKit representation of stream sources based on | 168 // Creates a WebKit representation of stream sources based on |
| 179 // |devices| from the MediaStreamDispatcher. | 169 // |devices| from the MediaStreamDispatcher. |
| 180 void InitializeSourceObject( | 170 void InitializeSourceObject( |
| 181 const StreamDeviceInfo& device, | 171 const StreamDeviceInfo& device, |
| 182 blink::WebMediaStreamSource::Type type, | 172 blink::WebMediaStreamSource::Type type, |
| 183 const blink::WebMediaConstraints& constraints, | 173 const blink::WebMediaConstraints& constraints, |
| 184 blink::WebFrame* frame, | |
| 185 blink::WebMediaStreamSource* webkit_source); | 174 blink::WebMediaStreamSource* webkit_source); |
| 186 | 175 |
| 187 void CreateVideoTracks( | 176 void CreateVideoTracks( |
| 188 const StreamDeviceInfoArray& devices, | 177 const StreamDeviceInfoArray& devices, |
| 189 const blink::WebMediaConstraints& constraints, | 178 const blink::WebMediaConstraints& constraints, |
| 190 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 179 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, |
| 191 UserMediaRequestInfo* request); | 180 UserMediaRequestInfo* request); |
| 192 | 181 |
| 193 void CreateAudioTracks( | 182 void CreateAudioTracks( |
| 194 const StreamDeviceInfoArray& devices, | 183 const StreamDeviceInfoArray& devices, |
| 195 const blink::WebMediaConstraints& constraints, | 184 const blink::WebMediaConstraints& constraints, |
| 196 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 185 blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, |
| 197 UserMediaRequestInfo* request); | 186 UserMediaRequestInfo* request); |
| 198 | 187 |
| 199 // Callback function triggered when all native versions of the | 188 // Callback function triggered when all native versions of the |
| 200 // underlying media sources and tracks have been created and started. | 189 // underlying media sources and tracks have been created and started. |
| 201 void OnCreateNativeTracksCompleted( | 190 void OnCreateNativeTracksCompleted( |
| 202 UserMediaRequestInfo* request, | 191 UserMediaRequestInfo* request, |
| 203 content::MediaStreamRequestResult result); | 192 content::MediaStreamRequestResult result); |
| 204 | 193 |
| 205 UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id); | 194 UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id); |
| 206 UserMediaRequestInfo* FindUserMediaRequestInfo( | 195 UserMediaRequestInfo* FindUserMediaRequestInfo( |
| 207 const blink::WebUserMediaRequest& request); | 196 const blink::WebUserMediaRequest& request); |
| 208 void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request); | 197 void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request); |
| 209 | 198 |
| 210 MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(int request_id); | 199 MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(int request_id); |
| 211 MediaDevicesRequestInfo* FindMediaDevicesRequestInfo( | 200 MediaDevicesRequestInfo* FindMediaDevicesRequestInfo( |
| 212 const blink::WebMediaDevicesRequest& request); | 201 const blink::WebMediaDevicesRequest& request); |
| 213 void DeleteMediaDevicesRequestInfo(MediaDevicesRequestInfo* request); | 202 void CancelAndDeleteMediaDevicesRequest(MediaDevicesRequestInfo* request); |
| 214 | 203 |
| 215 // Returns the source that use a device with |device.session_id| | 204 // Returns the source that use a device with |device.session_id| |
| 216 // and |device.device.id|. NULL if such source doesn't exist. | 205 // and |device.device.id|. NULL if such source doesn't exist. |
| 217 const blink::WebMediaStreamSource* FindLocalSource( | 206 const blink::WebMediaStreamSource* FindLocalSource( |
| 218 const StreamDeviceInfo& device) const; | 207 const StreamDeviceInfo& device) const; |
| 219 | 208 |
| 220 void StopLocalSource(const blink::WebMediaStreamSource& source, | 209 void StopLocalSource(const blink::WebMediaStreamSource& source, |
| 221 bool notify_dispatcher); | 210 bool notify_dispatcher); |
| 222 | 211 |
| 223 // Weak ref to a PeerConnectionDependencyFactory, owned by the RenderThread. | 212 // Weak ref to a PeerConnectionDependencyFactory, owned by the RenderThread. |
| 224 // It's valid for the lifetime of RenderThread. | 213 // It's valid for the lifetime of RenderThread. |
| 225 // TODO(xians): Remove this dependency once audio do not need it for local | 214 // TODO(xians): Remove this dependency once audio do not need it for local |
| 226 // audio. | 215 // audio. |
| 227 PeerConnectionDependencyFactory* dependency_factory_; | 216 PeerConnectionDependencyFactory* const dependency_factory_; |
| 228 | 217 |
| 229 // media_stream_dispatcher_ is a weak reference, owned by RenderView. It's | 218 // MediaStreamImpl owns MediaStreamDispatcher instead of RenderFrameImpl |
| 230 // valid for the lifetime of RenderView. | 219 // (or RenderFrameObserver) to ensure tear-down occurs in the right order. |
| 231 MediaStreamDispatcher* media_stream_dispatcher_; | 220 const scoped_ptr<MediaStreamDispatcher> media_stream_dispatcher_; |
| 232 | 221 |
| 233 LocalStreamSources local_sources_; | 222 LocalStreamSources local_sources_; |
| 234 | 223 |
| 235 UserMediaRequests user_media_requests_; | 224 UserMediaRequests user_media_requests_; |
| 236 | 225 |
| 237 // Requests to enumerate media devices. | 226 // Requests to enumerate media devices. |
| 238 MediaDevicesRequests media_devices_requests_; | 227 MediaDevicesRequests media_devices_requests_; |
| 239 | 228 |
| 229 // Note: This member must be the last to ensure all outstanding weak pointers |
| 230 // are invalidated first. |
| 231 base::WeakPtrFactory<MediaStreamImpl> weak_factory_; |
| 232 |
| 240 DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl); | 233 DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl); |
| 241 }; | 234 }; |
| 242 | 235 |
| 243 } // namespace content | 236 } // namespace content |
| 244 | 237 |
| 245 #endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ | 238 #endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ |
| OLD | NEW |