blob: fb3db970744f43b995335a66753669ea848152b5 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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"
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010020#include "content/renderer/media/media_stream_client.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000021#include "content/renderer/media/media_stream_dispatcher_eventhandler.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010022#include "third_party/WebKit/public/platform/WebMediaStream.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010023#include "third_party/WebKit/public/web/WebUserMediaClient.h"
24#include "third_party/WebKit/public/web/WebUserMediaRequest.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000025#include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000026
27namespace content {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010028class MediaStreamAudioRenderer;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000029class MediaStreamDependencyFactory;
30class MediaStreamDispatcher;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000031class WebRtcAudioRenderer;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000032class WebRtcLocalAudioRenderer;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000033
34// MediaStreamImpl is a delegate for the Media Stream API messages used by
35// WebKit. It ties together WebKit, native PeerConnection in libjingle and
36// MediaStreamManager (via MediaStreamDispatcher and MediaStreamDispatcherHost)
37// in the browser process. It must be created, called and destroyed on the
38// render thread.
39// MediaStreamImpl have weak pointers to a MediaStreamDispatcher.
40class CONTENT_EXPORT MediaStreamImpl
41 : public RenderViewObserver,
42 NON_EXPORTED_BASE(public WebKit::WebUserMediaClient),
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010043 NON_EXPORTED_BASE(public MediaStreamClient),
Torne (Richard Coles)58218062012-11-14 11:43:16 +000044 public MediaStreamDispatcherEventHandler,
45 public base::SupportsWeakPtr<MediaStreamImpl>,
46 NON_EXPORTED_BASE(public base::NonThreadSafe) {
47 public:
48 MediaStreamImpl(
49 RenderView* render_view,
50 MediaStreamDispatcher* media_stream_dispatcher,
Torne (Richard Coles)58218062012-11-14 11:43:16 +000051 MediaStreamDependencyFactory* dependency_factory);
52 virtual ~MediaStreamImpl();
53
Torne (Richard Coles)58218062012-11-14 11:43:16 +000054 // WebKit::WebUserMediaClient implementation
55 virtual void requestUserMedia(
Ben Murdocheb525c52013-07-10 11:40:50 +010056 const WebKit::WebUserMediaRequest& user_media_request) OVERRIDE;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000057 virtual void cancelUserMediaRequest(
58 const WebKit::WebUserMediaRequest& user_media_request) OVERRIDE;
59
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010060 // MediaStreamClient implementation.
Torne (Richard Coles)58218062012-11-14 11:43:16 +000061 virtual bool IsMediaStream(const GURL& url) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010062 virtual scoped_refptr<VideoFrameProvider> GetVideoFrameProvider(
Torne (Richard Coles)58218062012-11-14 11:43:16 +000063 const GURL& url,
64 const base::Closure& error_cb,
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010065 const VideoFrameProvider::RepaintCB& repaint_cb) OVERRIDE;
66 virtual scoped_refptr<MediaStreamAudioRenderer>
Torne (Richard Coles)58218062012-11-14 11:43:16 +000067 GetAudioRenderer(const GURL& url) OVERRIDE;
68
69 // MediaStreamDispatcherEventHandler implementation.
70 virtual void OnStreamGenerated(
71 int request_id,
72 const std::string& label,
73 const StreamDeviceInfoArray& audio_array,
74 const StreamDeviceInfoArray& video_array) OVERRIDE;
75 virtual void OnStreamGenerationFailed(int request_id) OVERRIDE;
76 virtual void OnDevicesEnumerated(
77 int request_id,
78 const StreamDeviceInfoArray& device_array) OVERRIDE;
79 virtual void OnDevicesEnumerationFailed(int request_id) OVERRIDE;
80 virtual void OnDeviceOpened(
81 int request_id,
82 const std::string& label,
83 const StreamDeviceInfo& device_info) OVERRIDE;
84 virtual void OnDeviceOpenFailed(int request_id) OVERRIDE;
85
86 // RenderViewObserver OVERRIDE
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010087 virtual void FrameDetached(WebKit::WebFrame* frame) OVERRIDE;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000088 virtual void FrameWillClose(WebKit::WebFrame* frame) OVERRIDE;
89
90 protected:
91 // Stops a local MediaStream by notifying the MediaStreamDispatcher that the
92 // stream no longer may be used.
93 void OnLocalMediaStreamStop(const std::string& label);
94
95 // Callback function triggered when all native (libjingle) versions of the
96 // underlying media sources have been created and started.
Ben Murdochbbcdd452013-07-25 10:06:34 +010097 // |web_stream| is a raw pointer to the web_stream in
98 // UserMediaRequests::web_stream for which the underlying sources have been
Torne (Richard Coles)58218062012-11-14 11:43:16 +000099 // created.
100 void OnCreateNativeSourcesComplete(
Ben Murdochbbcdd452013-07-25 10:06:34 +0100101 WebKit::WebMediaStream* web_stream,
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000102 bool request_succeeded);
103
104 // This function is virtual for test purposes. A test can override this to
105 // test requesting local media streams. The function notifies WebKit that the
106 // |request| have completed and generated the MediaStream |stream|.
107 virtual void CompleteGetUserMediaRequest(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000108 const WebKit::WebMediaStream& stream,
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000109 WebKit::WebUserMediaRequest* request_info,
110 bool request_succeeded);
111
112 // Returns the WebKit representation of a MediaStream given an URL.
113 // This is virtual for test purposes.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000114 virtual WebKit::WebMediaStream GetMediaStream(const GURL& url);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000115
116 private:
117 // Structure for storing information about a WebKit request to create a
118 // MediaStream.
119 struct UserMediaRequestInfo {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100120 UserMediaRequestInfo();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000121 UserMediaRequestInfo(int request_id,
122 WebKit::WebFrame* frame,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100123 const WebKit::WebUserMediaRequest& request);
124 ~UserMediaRequestInfo();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000125 int request_id;
126 // True if MediaStreamDispatcher has generated the stream, see
127 // OnStreamGenerated.
128 bool generated;
129 WebKit::WebFrame* frame; // WebFrame that requested the MediaStream.
Ben Murdochbbcdd452013-07-25 10:06:34 +0100130 WebKit::WebMediaStream web_stream;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000131 WebKit::WebUserMediaRequest request;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100132 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources;
133 WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000134 };
135 typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests;
136
137 UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id);
138 UserMediaRequestInfo* FindUserMediaRequestInfo(
Ben Murdochbbcdd452013-07-25 10:06:34 +0100139 WebKit::WebMediaStream* web_stream);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000140 UserMediaRequestInfo* FindUserMediaRequestInfo(
141 const WebKit::WebUserMediaRequest& request);
142 UserMediaRequestInfo* FindUserMediaRequestInfo(const std::string& label);
143 void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request);
144
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100145 scoped_refptr<VideoFrameProvider>
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000146 CreateVideoFrameProvider(
147 webrtc::MediaStreamInterface* stream,
148 const base::Closure& error_cb,
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100149 const VideoFrameProvider::RepaintCB& repaint_cb);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000150 scoped_refptr<WebRtcAudioRenderer> CreateRemoteAudioRenderer(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000151 webrtc::MediaStreamInterface* stream);
152 scoped_refptr<WebRtcLocalAudioRenderer> CreateLocalAudioRenderer(
153 webrtc::MediaStreamInterface* stream);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000154
155 // Weak ref to a MediaStreamDependencyFactory, owned by the RenderThread.
156 // It's valid for the lifetime of RenderThread.
157 MediaStreamDependencyFactory* dependency_factory_;
158
159 // media_stream_dispatcher_ is a weak reference, owned by RenderView. It's
160 // valid for the lifetime of RenderView.
161 MediaStreamDispatcher* media_stream_dispatcher_;
162
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000163 UserMediaRequests user_media_requests_;
164
165 DISALLOW_COPY_AND_ASSIGN(MediaStreamImpl);
166};
167
168} // namespace content
169
170#endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_IMPL_H_