| 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 | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 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/WebUserMediaClient.h" | 25 #include "third_party/WebKit/public/web/WebUserMediaClient.h" | 
| 26 #include "third_party/WebKit/public/web/WebUserMediaRequest.h" | 26 #include "third_party/WebKit/public/web/WebUserMediaRequest.h" | 
| 27 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h" | 27 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h" | 
| 28 | 28 | 
| 29 namespace content { | 29 namespace content { | 
| 30 class MediaStreamAudioRenderer; | 30 class MediaStreamAudioRenderer; | 
| 31 class MediaStreamDependencyFactory; | 31 class MediaStreamDependencyFactory; | 
| 32 class MediaStreamDispatcher; | 32 class MediaStreamDispatcher; | 
| 33 class MediaStreamSourceExtraData; | 33 class MediaStreamSource; | 
| 34 class WebRtcAudioRenderer; | 34 class WebRtcAudioRenderer; | 
| 35 class WebRtcLocalAudioRenderer; | 35 class WebRtcLocalAudioRenderer; | 
| 36 | 36 | 
| 37 // MediaStreamImpl is a delegate for the Media Stream API messages used by | 37 // MediaStreamImpl is a delegate for the Media Stream API messages used by | 
| 38 // WebKit. It ties together WebKit, native PeerConnection in libjingle and | 38 // WebKit. It ties together WebKit, native PeerConnection in libjingle and | 
| 39 // MediaStreamManager (via MediaStreamDispatcher and MediaStreamDispatcherHost) | 39 // MediaStreamManager (via MediaStreamDispatcher and MediaStreamDispatcherHost) | 
| 40 // in the browser process. It must be created, called and destroyed on the | 40 // in the browser process. It must be created, called and destroyed on the | 
| 41 // render thread. | 41 // render thread. | 
| 42 // MediaStreamImpl have weak pointers to a MediaStreamDispatcher. | 42 // MediaStreamImpl have weak pointers to a MediaStreamDispatcher. | 
| 43 class CONTENT_EXPORT MediaStreamImpl | 43 class CONTENT_EXPORT MediaStreamImpl | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 85       int request_id, | 85       int request_id, | 
| 86       const std::string& label, | 86       const std::string& label, | 
| 87       const StreamDeviceInfo& device_info) OVERRIDE; | 87       const StreamDeviceInfo& device_info) OVERRIDE; | 
| 88   virtual void OnDeviceOpenFailed(int request_id) OVERRIDE; | 88   virtual void OnDeviceOpenFailed(int request_id) OVERRIDE; | 
| 89 | 89 | 
| 90   // RenderViewObserver OVERRIDE | 90   // RenderViewObserver OVERRIDE | 
| 91   virtual void FrameDetached(blink::WebFrame* frame) OVERRIDE; | 91   virtual void FrameDetached(blink::WebFrame* frame) OVERRIDE; | 
| 92   virtual void FrameWillClose(blink::WebFrame* frame) OVERRIDE; | 92   virtual void FrameWillClose(blink::WebFrame* frame) OVERRIDE; | 
| 93 | 93 | 
| 94  protected: | 94  protected: | 
| 95   void OnLocalSourceStop(const blink::WebMediaStreamSource& source); | 95   // Called when |source| has been stopped from JavaScript. | 
|  | 96   void OnLocalSourceStopped(const blink::WebMediaStreamSource& source); | 
| 96 | 97 | 
|  | 98   // Called when a MediaStream with label |label| has been ordered to stop from | 
|  | 99   // JavaScript. The implementation must stop all sources that are not used by | 
|  | 100   // other MediaStreams. | 
|  | 101   // TODO(perkj): MediaStream::Stop has been deprecated from the spec and all | 
|  | 102   // applications should move to use MediaStreamTrack::Stop instead and this | 
|  | 103   // method be removed. | 
| 97   void OnLocalMediaStreamStop(const std::string& label); | 104   void OnLocalMediaStreamStop(const std::string& label); | 
| 98 | 105 | 
| 99   // Callback function triggered when all native (libjingle) versions of the |  | 
| 100   // underlying media sources have been created and started. |  | 
| 101   // |web_stream| is a raw pointer to the web_stream in |  | 
| 102   // UserMediaRequests::web_stream for which the underlying sources have been |  | 
| 103   // created. |  | 
| 104   void OnCreateNativeSourcesComplete( |  | 
| 105       blink::WebMediaStream* web_stream, |  | 
| 106       bool request_succeeded); |  | 
| 107 |  | 
| 108   // This function is virtual for test purposes. A test can override this to | 106   // This function is virtual for test purposes. A test can override this to | 
| 109   // test requesting local media streams. The function notifies WebKit that the | 107   // test requesting local media streams. The function notifies WebKit that the | 
| 110   // |request| have completed and generated the MediaStream |stream|. | 108   // |request| have completed and generated the MediaStream |stream|. | 
| 111   virtual void CompleteGetUserMediaRequest( | 109   virtual void CompleteGetUserMediaRequest( | 
| 112       const blink::WebMediaStream& stream, | 110       const blink::WebMediaStream& stream, | 
| 113       blink::WebUserMediaRequest* request_info, | 111       blink::WebUserMediaRequest* request_info, | 
| 114       bool request_succeeded); | 112       bool request_succeeded); | 
| 115 | 113 | 
| 116   // Returns the WebKit representation of a MediaStream given an URL. | 114   // Returns the WebKit representation of a MediaStream given an URL. | 
| 117   // This is virtual for test purposes. | 115   // This is virtual for test purposes. | 
| 118   virtual blink::WebMediaStream GetMediaStream(const GURL& url); | 116   virtual blink::WebMediaStream GetMediaStream(const GURL& url); | 
| 119 | 117 | 
| 120  private: | 118  private: | 
| 121   // Structure for storing information about a WebKit request to create a | 119   // Class for storing information about a WebKit request to create a | 
| 122   // MediaStream. | 120   // MediaStream. | 
| 123   struct UserMediaRequestInfo { | 121   class UserMediaRequestInfo | 
|  | 122       : public base::SupportsWeakPtr<UserMediaRequestInfo> { | 
|  | 123    public: | 
|  | 124     typedef base::Callback<void(UserMediaRequestInfo* request_info, | 
|  | 125                                 bool request_succeeded)> ResourcesReady; | 
|  | 126 | 
| 124     UserMediaRequestInfo(int request_id, | 127     UserMediaRequestInfo(int request_id, | 
| 125                          blink::WebFrame* frame, | 128                          blink::WebFrame* frame, | 
| 126                          const blink::WebUserMediaRequest& request, | 129                          const blink::WebUserMediaRequest& request, | 
| 127                          bool enable_automatic_output_device_selection); | 130                          bool enable_automatic_output_device_selection); | 
| 128     ~UserMediaRequestInfo(); | 131     ~UserMediaRequestInfo(); | 
| 129     int request_id; | 132     int request_id; | 
| 130     // True if MediaStreamDispatcher has generated the stream, see | 133     // True if MediaStreamDispatcher has generated the stream, see | 
| 131     // OnStreamGenerated. | 134     // OnStreamGenerated. | 
| 132     bool generated; | 135     bool generated; | 
| 133     const bool enable_automatic_output_device_selection; | 136     const bool enable_automatic_output_device_selection; | 
| 134     blink::WebFrame* frame;  // WebFrame that requested the MediaStream. | 137     blink::WebFrame* frame;  // WebFrame that requested the MediaStream. | 
| 135     blink::WebMediaStream web_stream; | 138     blink::WebMediaStream web_stream; | 
| 136     blink::WebUserMediaRequest request; | 139     blink::WebUserMediaRequest request; | 
| 137     std::vector<blink::WebMediaStreamSource> sources; | 140 | 
|  | 141     void StartTrack(const blink::WebMediaStreamTrack& track, | 
|  | 142                     const blink::WebMediaConstraints& constraints); | 
|  | 143 | 
|  | 144     // Triggers |callback| when all sources used in this request have either | 
|  | 145     // successfully started, or a source has failed to start. | 
|  | 146     void CallbackOnTracksStarted(const ResourcesReady& callback); | 
|  | 147 | 
|  | 148     bool IsSourceUsed(const blink::WebMediaStreamSource& source) const; | 
|  | 149     void RemoveSource(const blink::WebMediaStreamSource& source); | 
|  | 150 | 
|  | 151     bool AreAllSourcesRemoved() const { return sources_.empty(); }; | 
|  | 152 | 
|  | 153    private: | 
|  | 154     void OnTrackStarted(MediaStreamSource* source, bool success); | 
|  | 155     void CheckAllTracksStarted(); | 
|  | 156 | 
|  | 157     ResourcesReady ready_callback_; | 
|  | 158     bool request_failed_; | 
|  | 159     // Sources used in this request. | 
|  | 160     std::vector<blink::WebMediaStreamSource> sources_; | 
|  | 161     std::vector<MediaStreamSource*> sources_waiting_for_callback_; | 
| 138   }; | 162   }; | 
| 139   typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests; | 163   typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests; | 
| 140 | 164 | 
| 141   struct LocalStreamSource { | 165   struct LocalStreamSource { | 
| 142     LocalStreamSource(blink::WebFrame* frame, | 166     LocalStreamSource(blink::WebFrame* frame, | 
| 143                       const blink::WebMediaStreamSource& source) | 167                       const blink::WebMediaStreamSource& source) | 
| 144         : frame(frame), source(source) { | 168         : frame(frame), source(source) { | 
| 145     } | 169     } | 
| 146     // |frame| is the WebFrame that requested |source|. NULL in unit tests. | 170     // |frame| is the WebFrame that requested |source|. NULL in unit tests. | 
| 147     // TODO(perkj): Change so that |frame| is not NULL in unit tests. | 171     // TODO(perkj): Change so that |frame| is not NULL in unit tests. | 
| 148     blink::WebFrame* frame; | 172     blink::WebFrame* frame; | 
| 149     blink::WebMediaStreamSource source; | 173     blink::WebMediaStreamSource source; | 
| 150   }; | 174   }; | 
| 151   typedef std::vector<LocalStreamSource> LocalStreamSources; | 175   typedef std::vector<LocalStreamSource> LocalStreamSources; | 
| 152 | 176 | 
| 153   // Creates a WebKit representation of stream sources based on | 177   // Creates a WebKit representation of stream sources based on | 
| 154   // |devices| from the MediaStreamDispatcher. | 178   // |devices| from the MediaStreamDispatcher. | 
| 155   void CreateWebKitSourceVector( | 179   void InitializeSourceObject( | 
| 156       const std::string& label, | 180       const StreamDeviceInfo& device, | 
|  | 181       blink::WebMediaStreamSource::Type type, | 
|  | 182       const blink::WebMediaConstraints& constraints, | 
|  | 183       blink::WebFrame* frame, | 
|  | 184       blink::WebMediaStreamSource* webkit_source); | 
|  | 185 | 
|  | 186   void CreateVideoTracks( | 
| 157       const StreamDeviceInfoArray& devices, | 187       const StreamDeviceInfoArray& devices, | 
| 158       blink::WebMediaStreamSource::Type type, | 188       const blink::WebMediaConstraints& constraints, | 
| 159       blink::WebFrame* frame, | 189       blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 
| 160       blink::WebVector<blink::WebMediaStreamSource>& webkit_sources); | 190       UserMediaRequestInfo* request); | 
|  | 191 | 
|  | 192   void CreateAudioTracks( | 
|  | 193       const StreamDeviceInfoArray& devices, | 
|  | 194       const blink::WebMediaConstraints& constraints, | 
|  | 195       blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 
|  | 196       UserMediaRequestInfo* request); | 
|  | 197 | 
|  | 198   // Callback function triggered when all native versions of the | 
|  | 199   // underlying media sources and tracks have been created and started. | 
|  | 200   void OnCreateNativeTracksCompleted( | 
|  | 201       UserMediaRequestInfo* request, | 
|  | 202       bool request_succeeded); | 
| 161 | 203 | 
| 162   UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id); | 204   UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id); | 
| 163   UserMediaRequestInfo* FindUserMediaRequestInfo( | 205   UserMediaRequestInfo* FindUserMediaRequestInfo( | 
| 164       blink::WebMediaStream* web_stream); |  | 
| 165   UserMediaRequestInfo* FindUserMediaRequestInfo( |  | 
| 166       const blink::WebUserMediaRequest& request); | 206       const blink::WebUserMediaRequest& request); | 
| 167   UserMediaRequestInfo* FindUserMediaRequestInfo(const std::string& label); | 207   UserMediaRequestInfo* FindUserMediaRequestInfo(const std::string& label); | 
| 168   void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request); | 208   void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request); | 
| 169 | 209 | 
| 170   // Returns the source that use a device with |device.session_id| | 210   // Returns the source that use a device with |device.session_id| | 
| 171   // and |device.device.id|. NULL if such source doesn't exist. | 211   // and |device.device.id|. NULL if such source doesn't exist. | 
| 172   const blink::WebMediaStreamSource* FindLocalSource( | 212   const blink::WebMediaStreamSource* FindLocalSource( | 
| 173       const StreamDeviceInfo& device) const; | 213       const StreamDeviceInfo& device) const; | 
| 174 | 214 | 
| 175   // Returns true if |source| exists in |user_media_requests_| | 215   // Returns true if |source| exists in |user_media_requests_| | 
| 176   bool FindSourceInRequests(const blink::WebMediaStreamSource& source) const; | 216   bool IsSourceInRequests(const blink::WebMediaStreamSource& source) const; | 
| 177 | 217 | 
| 178   void StopLocalSource(const blink::WebMediaStreamSource& source, | 218   void StopLocalSource(const blink::WebMediaStreamSource& source, | 
| 179                        bool notify_dispatcher); | 219                        bool notify_dispatcher); | 
| 180   // Stops all local sources that don't exist in exist in | 220   // Stops all local sources that don't exist in exist in | 
| 181   // |user_media_requests_|. | 221   // |user_media_requests_|. | 
| 182   void StopUnreferencedSources(bool notify_dispatcher); | 222   void StopUnreferencedSources(bool notify_dispatcher); | 
| 183 | 223 | 
| 184   scoped_refptr<WebRtcAudioRenderer> CreateRemoteAudioRenderer( | 224   scoped_refptr<WebRtcAudioRenderer> CreateRemoteAudioRenderer( | 
| 185       webrtc::MediaStreamInterface* stream, int render_frame_id); | 225       webrtc::MediaStreamInterface* stream, int render_frame_id); | 
| 186   scoped_refptr<WebRtcLocalAudioRenderer> CreateLocalAudioRenderer( | 226   scoped_refptr<WebRtcLocalAudioRenderer> CreateLocalAudioRenderer( | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 208   UserMediaRequests user_media_requests_; | 248   UserMediaRequests user_media_requests_; | 
| 209 | 249 | 
| 210   LocalStreamSources local_sources_; | 250   LocalStreamSources local_sources_; | 
| 211 | 251 | 
| 212   DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl); | 252   DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl); | 
| 213 }; | 253 }; | 
| 214 | 254 | 
| 215 }  // namespace content | 255 }  // namespace content | 
| 216 | 256 | 
| 217 #endif  // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ | 257 #endif  // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_ | 
| OLD | NEW | 
|---|