Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Side by Side Diff: webkit/media/webmediaplayer_ms.cc

Issue 10918052: create a separate WebMediaPlayer for URL derived from media stream (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: code review Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/media/webmediaplayer_ms.h ('k') | webkit/support/test_media_stream_client.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "webkit/media/webmediaplayer_ms.h"
6
7 #include <limits>
8
9 #include "base/bind.h"
10 #include "base/callback.h"
11 #include "base/message_loop.h"
12 #include "base/metrics/histogram.h"
13 #include "media/base/media_log.h"
14 #include "media/base/video_frame.h"
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient. h"
17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebVideoFrame.h"
18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebRect.h"
20 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSize.h"
21 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURL.h"
22 #include "webkit/media/media_stream_client.h"
23 #include "webkit/media/video_frame_provider.h"
24 #include "webkit/media/webmediaplayer_delegate.h"
25 #include "webkit/media/webmediaplayer_util.h"
26 #include "webkit/media/webvideoframe_impl.h"
27
28 using WebKit::WebCanvas;
29 using WebKit::WebMediaPlayer;
30 using WebKit::WebRect;
31 using WebKit::WebSize;
32
33 namespace webkit_media {
34
35 WebMediaPlayerMS::WebMediaPlayerMS(
36 WebKit::WebFrame* frame,
37 WebKit::WebMediaPlayerClient* client,
38 base::WeakPtr<WebMediaPlayerDelegate> delegate,
39 MediaStreamClient* media_stream_client,
40 media::MediaLog* media_log)
41 : frame_(frame),
42 network_state_(WebMediaPlayer::NetworkStateEmpty),
43 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
44 buffered_(static_cast<size_t>(1)),
45 client_(client),
46 delegate_(delegate),
47 media_stream_client_(media_stream_client),
48 video_frame_provider_started_(false),
49 paused_(true),
50 pending_repaint_(false),
51 got_first_frame_(false),
52 total_frame_count_(0),
53 dropped_frame_count_(0),
54 media_log_(media_log) {
55 DVLOG(1) << "WebMediaPlayerMS::ctor";
56 DCHECK(media_stream_client);
57 media_log_->AddEvent(
58 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED));
59 }
60
61 WebMediaPlayerMS::~WebMediaPlayerMS() {
62 DVLOG(1) << "WebMediaPlayerMS::dtor";
63 DCHECK(thread_checker_.CalledOnValidThread());
64 if (video_frame_provider_) {
65 video_frame_provider_->Stop();
66 }
67
68 media_log_->AddEvent(
69 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED));
70
71 if (delegate_)
72 delegate_->PlayerGone(this);
73 }
74
75 void WebMediaPlayerMS::load(const WebKit::WebURL& url, CORSMode cors_mode) {
76 DVLOG(1) << "WebMediaPlayerMS::load";
77 DCHECK(thread_checker_.CalledOnValidThread());
78
79 GURL gurl(url);
80
81 setVolume(GetClient()->volume());
82 SetNetworkState(WebMediaPlayer::NetworkStateLoading);
83 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing);
84 media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec()));
85
86 // Check if this url is media stream.
87 video_frame_provider_ = media_stream_client_->GetVideoFrameProvider(
88 url,
89 base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr()),
90 base::Bind(&WebMediaPlayerMS::OnFrameAvailable, AsWeakPtr()));
91 if (video_frame_provider_) {
92 SetNetworkState(WebMediaPlayer::NetworkStateLoaded);
93 GetClient()->sourceOpened();
94 GetClient()->setOpaque(true);
95 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
96 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
97 RepaintInternal();
98 } else {
99 SetNetworkState(WebMediaPlayer::NetworkStateNetworkError);
100 }
101 }
102
103 void WebMediaPlayerMS::cancelLoad() {
104 DCHECK(thread_checker_.CalledOnValidThread());
105 }
106
107 void WebMediaPlayerMS::play() {
108 DVLOG(1) << "WebMediaPlayerMS::play";
109 DCHECK(thread_checker_.CalledOnValidThread());
110
111 paused_ = false;
112 if (video_frame_provider_) {
113 if (video_frame_provider_started_) {
114 video_frame_provider_->Play();
115 } else {
116 video_frame_provider_started_ = true;
117 video_frame_provider_->Start();
118 }
119 }
120 // TODO(wjia): add audio. See crbug.com/142988.
121
122 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY));
123
124 if (delegate_)
125 delegate_->DidPlay(this);
126 }
127
128 void WebMediaPlayerMS::pause() {
129 DVLOG(1) << "WebMediaPlayerMS::pause";
130 DCHECK(thread_checker_.CalledOnValidThread());
131
132 if (video_frame_provider_)
133 video_frame_provider_->Pause();
134 // TODO(wjia): add audio. See crbug.com/142988.
135 paused_ = true;
136
137 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE));
138
139 if (delegate_)
140 delegate_->DidPause(this);
141 }
142
143 bool WebMediaPlayerMS::supportsFullscreen() const {
144 DCHECK(thread_checker_.CalledOnValidThread());
145 return true;
146 }
147
148 bool WebMediaPlayerMS::supportsSave() const {
149 DCHECK(thread_checker_.CalledOnValidThread());
150 return false;
151 }
152
153 void WebMediaPlayerMS::seek(float seconds) {
154 DCHECK(thread_checker_.CalledOnValidThread());
155 }
156
157 void WebMediaPlayerMS::setEndTime(float seconds) {
158 DCHECK(thread_checker_.CalledOnValidThread());
159 }
160
161 void WebMediaPlayerMS::setRate(float rate) {
162 DCHECK(thread_checker_.CalledOnValidThread());
163 }
164
165 void WebMediaPlayerMS::setVolume(float volume) {
166 DCHECK(thread_checker_.CalledOnValidThread());
167 // TODO(wjia): set audio volume. See crbug.com/142988.
168 NOTIMPLEMENTED();
169 }
170
171 void WebMediaPlayerMS::setVisible(bool visible) {
172 DCHECK(thread_checker_.CalledOnValidThread());
173 }
174
175 void WebMediaPlayerMS::setPreload(WebMediaPlayer::Preload preload) {
176 DCHECK(thread_checker_.CalledOnValidThread());
177 }
178
179 bool WebMediaPlayerMS::totalBytesKnown() {
180 DCHECK(thread_checker_.CalledOnValidThread());
181 return false;
182 }
183
184 bool WebMediaPlayerMS::hasVideo() const {
185 DCHECK(thread_checker_.CalledOnValidThread());
186 return (video_frame_provider_ != NULL);
187 }
188
189 bool WebMediaPlayerMS::hasAudio() const {
190 DCHECK(thread_checker_.CalledOnValidThread());
191 // TODO(wjia): add audio support. See crbug.com/142988.
192 return false;
193 }
194
195 WebKit::WebSize WebMediaPlayerMS::naturalSize() const {
196 DCHECK(thread_checker_.CalledOnValidThread());
197
198 gfx::Size size;
199 if (current_frame_)
200 size = current_frame_->natural_size();
201 DVLOG(1) << "WebMediaPlayerMS::naturalSize, " << size.ToString();
202 return WebKit::WebSize(size);
203 }
204
205 bool WebMediaPlayerMS::paused() const {
206 DCHECK(thread_checker_.CalledOnValidThread());
207 return paused_;
208 }
209
210 bool WebMediaPlayerMS::seeking() const {
211 DCHECK(thread_checker_.CalledOnValidThread());
212 return false;
213 }
214
215 float WebMediaPlayerMS::duration() const {
216 DCHECK(thread_checker_.CalledOnValidThread());
217 return std::numeric_limits<float>::infinity();
218 }
219
220 float WebMediaPlayerMS::currentTime() const {
221 DCHECK(thread_checker_.CalledOnValidThread());
222 if (current_frame_.get()) {
223 return current_frame_->GetTimestamp().InSecondsF();
224 }
225 return 0.0f;
226 }
227
228 int WebMediaPlayerMS::dataRate() const {
229 DCHECK(thread_checker_.CalledOnValidThread());
230 return 0;
231 }
232
233 WebMediaPlayer::NetworkState WebMediaPlayerMS::networkState() const {
234 DCHECK(thread_checker_.CalledOnValidThread());
235 DVLOG(1) << "WebMediaPlayerMS::networkState, state:" << network_state_;
236 return network_state_;
237 }
238
239 WebMediaPlayer::ReadyState WebMediaPlayerMS::readyState() const {
240 DCHECK(thread_checker_.CalledOnValidThread());
241 DVLOG(1) << "WebMediaPlayerMS::readyState, state:" << ready_state_;
242 return ready_state_;
243 }
244
245 const WebKit::WebTimeRanges& WebMediaPlayerMS::buffered() {
246 DCHECK(thread_checker_.CalledOnValidThread());
247 return buffered_;
248 }
249
250 float WebMediaPlayerMS::maxTimeSeekable() const {
251 DCHECK(thread_checker_.CalledOnValidThread());
252 return 0.0f;
253 }
254
255 bool WebMediaPlayerMS::didLoadingProgress() const {
256 DCHECK(thread_checker_.CalledOnValidThread());
257 return false;
258 }
259
260 unsigned long long WebMediaPlayerMS::totalBytes() const {
261 DCHECK(thread_checker_.CalledOnValidThread());
262 return 0;
263 }
264
265 void WebMediaPlayerMS::setSize(const WebSize& size) {
266 DCHECK(thread_checker_.CalledOnValidThread());
267 // Don't need to do anything as we use the dimensions passed in via paint().
268 }
269
270 void WebMediaPlayerMS::paint(WebCanvas* canvas,
271 const WebRect& rect,
272 uint8_t alpha) {
273 DVLOG(1) << "WebMediaPlayerMS::paint";
274 DCHECK(thread_checker_.CalledOnValidThread());
275
276 video_renderer_.Paint(current_frame_, canvas, rect, alpha);
277 }
278
279 bool WebMediaPlayerMS::hasSingleSecurityOrigin() const {
280 DCHECK(thread_checker_.CalledOnValidThread());
281 return true;
282 }
283
284 bool WebMediaPlayerMS::didPassCORSAccessCheck() const {
285 DCHECK(thread_checker_.CalledOnValidThread());
286 return true;
287 }
288
289 WebMediaPlayer::MovieLoadType WebMediaPlayerMS::movieLoadType() const {
290 DCHECK(thread_checker_.CalledOnValidThread());
291 return WebMediaPlayer::MovieLoadTypeUnknown;
292 }
293
294 float WebMediaPlayerMS::mediaTimeForTimeValue(float timeValue) const {
295 return ConvertSecondsToTimestamp(timeValue).InSecondsF();
296 }
297
298 unsigned WebMediaPlayerMS::decodedFrameCount() const {
299 DCHECK(thread_checker_.CalledOnValidThread());
300 DVLOG(1) << "WebMediaPlayerMS::decodedFrameCount, " << total_frame_count_;
301 return total_frame_count_;
302 }
303
304 unsigned WebMediaPlayerMS::droppedFrameCount() const {
305 DCHECK(thread_checker_.CalledOnValidThread());
306 DVLOG(1) << "WebMediaPlayerMS::droppedFrameCount, " << dropped_frame_count_;
307 return dropped_frame_count_;
308 }
309
310 unsigned WebMediaPlayerMS::audioDecodedByteCount() const {
311 DCHECK(thread_checker_.CalledOnValidThread());
312 NOTIMPLEMENTED();
313 return 0;
314 }
315
316 unsigned WebMediaPlayerMS::videoDecodedByteCount() const {
317 DCHECK(thread_checker_.CalledOnValidThread());
318 NOTIMPLEMENTED();
319 return 0;
320 }
321
322 WebKit::WebVideoFrame* WebMediaPlayerMS::getCurrentFrame() {
323 DVLOG(1) << "WebMediaPlayerMS::getCurrentFrame";
324 DCHECK(thread_checker_.CalledOnValidThread());
325 DCHECK(!pending_repaint_);
326 pending_repaint_ = true;
327 if (current_frame_.get())
328 return new webkit_media::WebVideoFrameImpl(current_frame_);
329 return NULL;
330 }
331
332 void WebMediaPlayerMS::putCurrentFrame(
333 WebKit::WebVideoFrame* web_video_frame) {
334 DVLOG(1) << "WebMediaPlayerMS::putCurrentFrame";
335 DCHECK(thread_checker_.CalledOnValidThread());
336 DCHECK(pending_repaint_);
337 pending_repaint_ = false;
338 if (web_video_frame) {
339 delete web_video_frame;
340 }
341 }
342
343 void WebMediaPlayerMS::OnFrameAvailable(
344 const scoped_refptr<media::VideoFrame>& frame) {
345 DVLOG(1) << "WebMediaPlayerMS::OnFrameAvailable";
346 DCHECK(thread_checker_.CalledOnValidThread());
347 ++total_frame_count_;
348 if (!got_first_frame_) {
349 got_first_frame_ = true;
350 start_time_ = frame->GetTimestamp();
351 }
352 current_frame_ = frame;
353 current_frame_->SetTimestamp(frame->GetTimestamp() - start_time_);
354 if (pending_repaint_) {
355 // TODO(wjia): Figure out how to calculate dropped frame count for
356 // both S/W and H/W compositing.
357 // ++dropped_frame_count_;
358 } else {
359 GetClient()->repaint();
360 }
361 }
362
363 void WebMediaPlayerMS::RepaintInternal() {
364 DVLOG(1) << "WebMediaPlayerMS::RepaintInternal";
365 DCHECK(thread_checker_.CalledOnValidThread());
366 if (!pending_repaint_) {
367 GetClient()->repaint();
368 }
369 }
370
371 void WebMediaPlayerMS::OnSourceError() {
372 DVLOG(1) << "WebMediaPlayerMS::OnSourceError";
373 DCHECK(thread_checker_.CalledOnValidThread());
374 SetNetworkState(WebMediaPlayer::NetworkStateFormatError);
375 RepaintInternal();
376 }
377
378 void WebMediaPlayerMS::SetNetworkState(WebMediaPlayer::NetworkState state) {
379 DCHECK(thread_checker_.CalledOnValidThread());
380 network_state_ = state;
381 // Always notify to ensure client has the latest value.
382 GetClient()->networkStateChanged();
383 }
384
385 void WebMediaPlayerMS::SetReadyState(WebMediaPlayer::ReadyState state) {
386 DCHECK(thread_checker_.CalledOnValidThread());
387 ready_state_ = state;
388 // Always notify to ensure client has the latest value.
389 GetClient()->readyStateChanged();
390 }
391
392 WebKit::WebMediaPlayerClient* WebMediaPlayerMS::GetClient() {
393 DCHECK(thread_checker_.CalledOnValidThread());
394 DCHECK(client_);
395 return client_;
396 }
397
398 } // namespace webkit_media
OLDNEW
« no previous file with comments | « webkit/media/webmediaplayer_ms.h ('k') | webkit/support/test_media_stream_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698