| Index: content/renderer/media/media_stream_impl.h | 
| diff --git a/content/renderer/media/media_stream_impl.h b/content/renderer/media/media_stream_impl.h | 
| index f60e8049baff5f5d50a5bab16035d0a2f3ff5cc9..6911c8f8bf6ccd0c29dbfb9be609a7d4d9e4ba96 100644 | 
| --- a/content/renderer/media/media_stream_impl.h | 
| +++ b/content/renderer/media/media_stream_impl.h | 
| @@ -30,7 +30,7 @@ namespace content { | 
| class MediaStreamAudioRenderer; | 
| class MediaStreamDependencyFactory; | 
| class MediaStreamDispatcher; | 
| -class MediaStreamSourceExtraData; | 
| +class MediaStreamSource; | 
| class WebRtcAudioRenderer; | 
| class WebRtcLocalAudioRenderer; | 
|  | 
| @@ -92,19 +92,17 @@ class CONTENT_EXPORT MediaStreamImpl | 
| virtual void FrameWillClose(blink::WebFrame* frame) OVERRIDE; | 
|  | 
| protected: | 
| -  void OnLocalSourceStop(const blink::WebMediaStreamSource& source); | 
| +  // Called when |source| has been stopped from JavaScript. | 
| +  void OnLocalSourceStopped(const blink::WebMediaStreamSource& source); | 
|  | 
| +  // Called when a MediaStream with label |label| has been ordered to stop from | 
| +  // JavaScript. The implementation must stop all sources that are not used by | 
| +  // other MediaStreams. | 
| +  // TODO(perkj): MediaStream::Stop has been deprecated from the spec and all | 
| +  // applications should move to use MediaStreamTrack::Stop instead and this | 
| +  // method be removed. | 
| void OnLocalMediaStreamStop(const std::string& label); | 
|  | 
| -  // Callback function triggered when all native (libjingle) versions of the | 
| -  // underlying media sources have been created and started. | 
| -  // |web_stream| is a raw pointer to the web_stream in | 
| -  // UserMediaRequests::web_stream for which the underlying sources have been | 
| -  // created. | 
| -  void OnCreateNativeSourcesComplete( | 
| -      blink::WebMediaStream* web_stream, | 
| -      bool request_succeeded); | 
| - | 
| // This function is virtual for test purposes. A test can override this to | 
| // test requesting local media streams. The function notifies WebKit that the | 
| // |request| have completed and generated the MediaStream |stream|. | 
| @@ -118,9 +116,14 @@ class CONTENT_EXPORT MediaStreamImpl | 
| virtual blink::WebMediaStream GetMediaStream(const GURL& url); | 
|  | 
| private: | 
| -  // Structure for storing information about a WebKit request to create a | 
| +  // Class for storing information about a WebKit request to create a | 
| // MediaStream. | 
| -  struct UserMediaRequestInfo { | 
| +  class UserMediaRequestInfo | 
| +      : public base::SupportsWeakPtr<UserMediaRequestInfo> { | 
| +   public: | 
| +    typedef base::Callback<void(UserMediaRequestInfo* request_info, | 
| +                                bool request_succeeded)> ResourcesReady; | 
| + | 
| UserMediaRequestInfo(int request_id, | 
| blink::WebFrame* frame, | 
| const blink::WebUserMediaRequest& request, | 
| @@ -134,7 +137,28 @@ class CONTENT_EXPORT MediaStreamImpl | 
| blink::WebFrame* frame;  // WebFrame that requested the MediaStream. | 
| blink::WebMediaStream web_stream; | 
| blink::WebUserMediaRequest request; | 
| -    std::vector<blink::WebMediaStreamSource> sources; | 
| + | 
| +    void StartTrack(const blink::WebMediaStreamTrack& track, | 
| +                    const blink::WebMediaConstraints& constraints); | 
| + | 
| +    // Triggers |callback| when all sources used in this request have either | 
| +    // successfully started, or a source has failed to start. | 
| +    void CallbackOnTracksStarted(const ResourcesReady& callback); | 
| + | 
| +    bool IsSourceUsed(const blink::WebMediaStreamSource& source) const; | 
| +    void RemoveSource(const blink::WebMediaStreamSource& source); | 
| + | 
| +    bool AreAllSourcesRemoved() const { return sources_.empty(); }; | 
| + | 
| +   private: | 
| +    void OnTrackStarted(MediaStreamSource* source, bool success); | 
| +    void CheckAllTracksStarted(); | 
| + | 
| +    ResourcesReady ready_callback_; | 
| +    bool request_failed_; | 
| +    // Sources used in this request. | 
| +    std::vector<blink::WebMediaStreamSource> sources_; | 
| +    std::vector<MediaStreamSource*> sources_waiting_for_callback_; | 
| }; | 
| typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests; | 
|  | 
| @@ -152,17 +176,33 @@ class CONTENT_EXPORT MediaStreamImpl | 
|  | 
| // Creates a WebKit representation of stream sources based on | 
| // |devices| from the MediaStreamDispatcher. | 
| -  void CreateWebKitSourceVector( | 
| -      const std::string& label, | 
| -      const StreamDeviceInfoArray& devices, | 
| +  void InitializeSourceObject( | 
| +      const StreamDeviceInfo& device, | 
| blink::WebMediaStreamSource::Type type, | 
| +      const blink::WebMediaConstraints& constraints, | 
| blink::WebFrame* frame, | 
| -      blink::WebVector<blink::WebMediaStreamSource>& webkit_sources); | 
| +      blink::WebMediaStreamSource* webkit_source); | 
| + | 
| +  void CreateVideoTracks( | 
| +      const StreamDeviceInfoArray& devices, | 
| +      const blink::WebMediaConstraints& constraints, | 
| +      blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 
| +      UserMediaRequestInfo* request); | 
| + | 
| +  void CreateAudioTracks( | 
| +      const StreamDeviceInfoArray& devices, | 
| +      const blink::WebMediaConstraints& constraints, | 
| +      blink::WebVector<blink::WebMediaStreamTrack>* webkit_tracks, | 
| +      UserMediaRequestInfo* request); | 
| + | 
| +  // Callback function triggered when all native versions of the | 
| +  // underlying media sources and tracks have been created and started. | 
| +  void OnCreateNativeTracksCompleted( | 
| +      UserMediaRequestInfo* request, | 
| +      bool request_succeeded); | 
|  | 
| UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id); | 
| UserMediaRequestInfo* FindUserMediaRequestInfo( | 
| -      blink::WebMediaStream* web_stream); | 
| -  UserMediaRequestInfo* FindUserMediaRequestInfo( | 
| const blink::WebUserMediaRequest& request); | 
| UserMediaRequestInfo* FindUserMediaRequestInfo(const std::string& label); | 
| void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request); | 
| @@ -173,7 +213,7 @@ class CONTENT_EXPORT MediaStreamImpl | 
| const StreamDeviceInfo& device) const; | 
|  | 
| // Returns true if |source| exists in |user_media_requests_| | 
| -  bool FindSourceInRequests(const blink::WebMediaStreamSource& source) const; | 
| +  bool IsSourceInRequests(const blink::WebMediaStreamSource& source) const; | 
|  | 
| void StopLocalSource(const blink::WebMediaStreamSource& source, | 
| bool notify_dispatcher); | 
|  |