OLD | NEW |
| (Empty) |
1 // Copyright 2013 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 WEBKIT_RENDERER_MEDIA_WEBMEDIAPLAYER_MS_H_ | |
6 #define WEBKIT_RENDERER_MEDIA_WEBMEDIAPLAYER_MS_H_ | |
7 | |
8 #include "base/memory/ref_counted.h" | |
9 #include "base/memory/scoped_ptr.h" | |
10 #include "base/memory/weak_ptr.h" | |
11 #include "base/synchronization/lock.h" | |
12 #include "cc/layers/video_frame_provider.h" | |
13 #include "googleurl/src/gurl.h" | |
14 #include "media/filters/skcanvas_video_renderer.h" | |
15 #include "skia/ext/platform_canvas.h" | |
16 #include "third_party/WebKit/public/web/WebMediaPlayer.h" | |
17 | |
18 namespace WebKit { | |
19 class WebFrame; | |
20 class WebMediaPlayerClient; | |
21 } | |
22 | |
23 namespace media { | |
24 class MediaLog; | |
25 } | |
26 | |
27 namespace webkit { | |
28 class WebLayerImpl; | |
29 } | |
30 | |
31 namespace webkit_media { | |
32 | |
33 class MediaStreamAudioRenderer; | |
34 class MediaStreamClient; | |
35 class VideoFrameProvider; | |
36 class WebMediaPlayerDelegate; | |
37 | |
38 // WebMediaPlayerMS delegates calls from WebCore::MediaPlayerPrivate to | |
39 // Chrome's media player when "src" is from media stream. | |
40 // | |
41 // WebMediaPlayerMS works with multiple objects, the most important ones are: | |
42 // | |
43 // VideoFrameProvider | |
44 // provides video frames for rendering. | |
45 // | |
46 // TODO(wjia): add AudioPlayer. | |
47 // AudioPlayer | |
48 // plays audio streams. | |
49 // | |
50 // WebKit::WebMediaPlayerClient | |
51 // WebKit client of this media player object. | |
52 class WebMediaPlayerMS | |
53 : public WebKit::WebMediaPlayer, | |
54 public cc::VideoFrameProvider, | |
55 public base::SupportsWeakPtr<WebMediaPlayerMS> { | |
56 public: | |
57 // Construct a WebMediaPlayerMS with reference to the client, and | |
58 // a MediaStreamClient which provides VideoFrameProvider. | |
59 WebMediaPlayerMS(WebKit::WebFrame* frame, | |
60 WebKit::WebMediaPlayerClient* client, | |
61 base::WeakPtr<WebMediaPlayerDelegate> delegate, | |
62 MediaStreamClient* media_stream_client, | |
63 media::MediaLog* media_log); | |
64 virtual ~WebMediaPlayerMS(); | |
65 | |
66 virtual void load(const WebKit::WebURL& url, CORSMode cors_mode) OVERRIDE; | |
67 virtual void load(const WebKit::WebURL& url, | |
68 WebKit::WebMediaSource* media_source, | |
69 CORSMode cors_mode) OVERRIDE; | |
70 | |
71 // Playback controls. | |
72 virtual void play() OVERRIDE; | |
73 virtual void pause() OVERRIDE; | |
74 virtual bool supportsFullscreen() const OVERRIDE; | |
75 virtual bool supportsSave() const OVERRIDE; | |
76 virtual void seek(double seconds); | |
77 virtual void setRate(double rate); | |
78 virtual void setVolume(double volume); | |
79 virtual void setPreload(WebKit::WebMediaPlayer::Preload preload) OVERRIDE; | |
80 virtual const WebKit::WebTimeRanges& buffered() OVERRIDE; | |
81 virtual double maxTimeSeekable() const; | |
82 | |
83 // Methods for painting. | |
84 virtual void paint(WebKit::WebCanvas* canvas, | |
85 const WebKit::WebRect& rect, | |
86 unsigned char alpha) OVERRIDE; | |
87 | |
88 // True if the loaded media has a playable video/audio track. | |
89 virtual bool hasVideo() const OVERRIDE; | |
90 virtual bool hasAudio() const OVERRIDE; | |
91 | |
92 // Dimensions of the video. | |
93 virtual WebKit::WebSize naturalSize() const OVERRIDE; | |
94 | |
95 // Getters of playback state. | |
96 virtual bool paused() const OVERRIDE; | |
97 virtual bool seeking() const OVERRIDE; | |
98 virtual double duration() const; | |
99 virtual double currentTime() const; | |
100 | |
101 // Internal states of loading and network. | |
102 virtual WebKit::WebMediaPlayer::NetworkState networkState() const OVERRIDE; | |
103 virtual WebKit::WebMediaPlayer::ReadyState readyState() const OVERRIDE; | |
104 | |
105 virtual bool didLoadingProgress() const OVERRIDE; | |
106 | |
107 virtual bool hasSingleSecurityOrigin() const OVERRIDE; | |
108 virtual bool didPassCORSAccessCheck() const OVERRIDE; | |
109 | |
110 virtual double mediaTimeForTimeValue(double timeValue) const; | |
111 | |
112 virtual unsigned decodedFrameCount() const OVERRIDE; | |
113 virtual unsigned droppedFrameCount() const OVERRIDE; | |
114 virtual unsigned audioDecodedByteCount() const OVERRIDE; | |
115 virtual unsigned videoDecodedByteCount() const OVERRIDE; | |
116 | |
117 // VideoFrameProvider implementation. | |
118 virtual void SetVideoFrameProviderClient( | |
119 cc::VideoFrameProvider::Client* client) OVERRIDE; | |
120 virtual scoped_refptr<media::VideoFrame> GetCurrentFrame() OVERRIDE; | |
121 virtual void PutCurrentFrame(const scoped_refptr<media::VideoFrame>& frame) | |
122 OVERRIDE; | |
123 | |
124 private: | |
125 // The callback for VideoFrameProvider to signal a new frame is available. | |
126 void OnFrameAvailable(const scoped_refptr<media::VideoFrame>& frame); | |
127 // Need repaint due to state change. | |
128 void RepaintInternal(); | |
129 | |
130 // The callback for source to report error. | |
131 void OnSourceError(); | |
132 | |
133 // Helpers that set the network/ready state and notifies the client if | |
134 // they've changed. | |
135 void SetNetworkState(WebKit::WebMediaPlayer::NetworkState state); | |
136 void SetReadyState(WebKit::WebMediaPlayer::ReadyState state); | |
137 | |
138 // Getter method to |client_|. | |
139 WebKit::WebMediaPlayerClient* GetClient(); | |
140 | |
141 WebKit::WebFrame* frame_; | |
142 | |
143 WebKit::WebMediaPlayer::NetworkState network_state_; | |
144 WebKit::WebMediaPlayer::ReadyState ready_state_; | |
145 | |
146 WebKit::WebTimeRanges buffered_; | |
147 | |
148 // Used for DCHECKs to ensure methods calls executed in the correct thread. | |
149 base::ThreadChecker thread_checker_; | |
150 | |
151 WebKit::WebMediaPlayerClient* client_; | |
152 | |
153 base::WeakPtr<WebMediaPlayerDelegate> delegate_; | |
154 | |
155 MediaStreamClient* media_stream_client_; | |
156 scoped_refptr<webkit_media::VideoFrameProvider> video_frame_provider_; | |
157 bool paused_; | |
158 | |
159 // |current_frame_| is updated only on main thread. The object it holds | |
160 // can be freed on the compositor thread if it is the last to hold a | |
161 // reference but media::VideoFrame is a thread-safe ref-pointer. | |
162 scoped_refptr<media::VideoFrame> current_frame_; | |
163 // |current_frame_used_| is updated on both main and compositing thread. | |
164 // It's used to track whether |current_frame_| was painted for detecting | |
165 // when to increase |dropped_frame_count_|. | |
166 bool current_frame_used_; | |
167 base::Lock current_frame_lock_; | |
168 bool pending_repaint_; | |
169 | |
170 scoped_ptr<webkit::WebLayerImpl> video_weblayer_; | |
171 | |
172 // A pointer back to the compositor to inform it about state changes. This is | |
173 // not NULL while the compositor is actively using this webmediaplayer. | |
174 cc::VideoFrameProvider::Client* video_frame_provider_client_; | |
175 | |
176 bool received_first_frame_; | |
177 bool sequence_started_; | |
178 base::TimeDelta start_time_; | |
179 unsigned total_frame_count_; | |
180 unsigned dropped_frame_count_; | |
181 media::SkCanvasVideoRenderer video_renderer_; | |
182 | |
183 scoped_refptr<MediaStreamAudioRenderer> audio_renderer_; | |
184 | |
185 scoped_refptr<media::MediaLog> media_log_; | |
186 | |
187 DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerMS); | |
188 }; | |
189 | |
190 } // namespace webkit_media | |
191 | |
192 #endif // WEBKIT_RENDERER_MEDIA_WEBMEDIAPLAYER_MS_H_ | |
OLD | NEW |