OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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 #include "webkit/renderer/media/webmediaplayer_ms.h" | 5 #include "webkit/renderer/media/webmediaplayer_ms.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 61 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
62 } | 62 } |
63 | 63 |
64 WebMediaPlayerMS::~WebMediaPlayerMS() { | 64 WebMediaPlayerMS::~WebMediaPlayerMS() { |
65 DVLOG(1) << "WebMediaPlayerMS::dtor"; | 65 DVLOG(1) << "WebMediaPlayerMS::dtor"; |
66 DCHECK(thread_checker_.CalledOnValidThread()); | 66 DCHECK(thread_checker_.CalledOnValidThread()); |
67 | 67 |
68 SetVideoFrameProviderClient(NULL); | 68 SetVideoFrameProviderClient(NULL); |
69 GetClient()->setWebLayer(NULL); | 69 GetClient()->setWebLayer(NULL); |
70 | 70 |
71 if (video_frame_provider_) { | 71 if (video_frame_provider_.get()) { |
72 video_frame_provider_->Stop(); | 72 video_frame_provider_->Stop(); |
73 } | 73 } |
74 | 74 |
75 if (audio_renderer_) { | 75 if (audio_renderer_.get()) { |
76 if (audio_renderer_->IsLocalRenderer()) { | 76 if (audio_renderer_->IsLocalRenderer()) { |
77 audio_renderer_->Stop(); | 77 audio_renderer_->Stop(); |
78 } else if (!paused_) { | 78 } else if (!paused_) { |
79 // The |audio_renderer_| can be shared by multiple remote streams, and | 79 // The |audio_renderer_| can be shared by multiple remote streams, and |
80 // it will be stopped when WebRtcAudioDeviceImpl goes away. So we simply | 80 // it will be stopped when WebRtcAudioDeviceImpl goes away. So we simply |
81 // pause the |audio_renderer_| here to avoid re-creating the | 81 // pause the |audio_renderer_| here to avoid re-creating the |
82 // |audio_renderer_|. | 82 // |audio_renderer_|. |
83 audio_renderer_->Pause(); | 83 audio_renderer_->Pause(); |
84 } | 84 } |
85 } | 85 } |
(...skipping 17 matching lines...) Expand all Loading... |
103 media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); | 103 media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); |
104 | 104 |
105 // Check if this url is media stream. | 105 // Check if this url is media stream. |
106 video_frame_provider_ = media_stream_client_->GetVideoFrameProvider( | 106 video_frame_provider_ = media_stream_client_->GetVideoFrameProvider( |
107 url, | 107 url, |
108 base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr()), | 108 base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr()), |
109 base::Bind(&WebMediaPlayerMS::OnFrameAvailable, AsWeakPtr())); | 109 base::Bind(&WebMediaPlayerMS::OnFrameAvailable, AsWeakPtr())); |
110 | 110 |
111 audio_renderer_ = media_stream_client_->GetAudioRenderer(url); | 111 audio_renderer_ = media_stream_client_->GetAudioRenderer(url); |
112 | 112 |
113 if (video_frame_provider_ || audio_renderer_) { | 113 if (video_frame_provider_.get() || audio_renderer_.get()) { |
114 GetClient()->setOpaque(true); | 114 GetClient()->setOpaque(true); |
115 if (audio_renderer_) | 115 if (audio_renderer_.get()) |
116 audio_renderer_->Start(); | 116 audio_renderer_->Start(); |
117 | 117 |
118 if (video_frame_provider_) { | 118 if (video_frame_provider_.get()) { |
119 video_frame_provider_->Start(); | 119 video_frame_provider_->Start(); |
120 } else { | 120 } else { |
121 // This is audio-only mode. | 121 // This is audio-only mode. |
122 DCHECK(audio_renderer_); | 122 DCHECK(audio_renderer_.get()); |
123 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 123 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
124 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 124 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
125 } | 125 } |
126 } else { | 126 } else { |
127 SetNetworkState(WebMediaPlayer::NetworkStateNetworkError); | 127 SetNetworkState(WebMediaPlayer::NetworkStateNetworkError); |
128 } | 128 } |
129 } | 129 } |
130 | 130 |
131 void WebMediaPlayerMS::load(const WebKit::WebURL& url, | 131 void WebMediaPlayerMS::load(const WebKit::WebURL& url, |
132 WebKit::WebMediaSource* media_source, | 132 WebKit::WebMediaSource* media_source, |
133 CORSMode cors_mode) { | 133 CORSMode cors_mode) { |
134 NOTIMPLEMENTED(); | 134 NOTIMPLEMENTED(); |
135 } | 135 } |
136 | 136 |
137 void WebMediaPlayerMS::cancelLoad() { | 137 void WebMediaPlayerMS::cancelLoad() { |
138 DCHECK(thread_checker_.CalledOnValidThread()); | 138 DCHECK(thread_checker_.CalledOnValidThread()); |
139 } | 139 } |
140 | 140 |
141 void WebMediaPlayerMS::play() { | 141 void WebMediaPlayerMS::play() { |
142 DVLOG(1) << "WebMediaPlayerMS::play"; | 142 DVLOG(1) << "WebMediaPlayerMS::play"; |
143 DCHECK(thread_checker_.CalledOnValidThread()); | 143 DCHECK(thread_checker_.CalledOnValidThread()); |
144 | 144 |
145 if (paused_) { | 145 if (paused_) { |
146 if (video_frame_provider_) | 146 if (video_frame_provider_.get()) |
147 video_frame_provider_->Play(); | 147 video_frame_provider_->Play(); |
148 | 148 |
149 if (audio_renderer_) | 149 if (audio_renderer_.get()) |
150 audio_renderer_->Play(); | 150 audio_renderer_->Play(); |
151 | 151 |
152 if (delegate_) | 152 if (delegate_) |
153 delegate_->DidPlay(this); | 153 delegate_->DidPlay(this); |
154 } | 154 } |
155 | 155 |
156 paused_ = false; | 156 paused_ = false; |
157 | 157 |
158 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY)); | 158 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY)); |
159 } | 159 } |
160 | 160 |
161 void WebMediaPlayerMS::pause() { | 161 void WebMediaPlayerMS::pause() { |
162 DVLOG(1) << "WebMediaPlayerMS::pause"; | 162 DVLOG(1) << "WebMediaPlayerMS::pause"; |
163 DCHECK(thread_checker_.CalledOnValidThread()); | 163 DCHECK(thread_checker_.CalledOnValidThread()); |
164 | 164 |
165 if (video_frame_provider_) | 165 if (video_frame_provider_.get()) |
166 video_frame_provider_->Pause(); | 166 video_frame_provider_->Pause(); |
167 | 167 |
168 if (!paused_) { | 168 if (!paused_) { |
169 if (audio_renderer_) | 169 if (audio_renderer_.get()) |
170 audio_renderer_->Pause(); | 170 audio_renderer_->Pause(); |
171 | 171 |
172 if (delegate_) | 172 if (delegate_) |
173 delegate_->DidPause(this); | 173 delegate_->DidPause(this); |
174 } | 174 } |
175 | 175 |
176 paused_ = true; | 176 paused_ = true; |
177 | 177 |
178 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); | 178 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); |
179 } | 179 } |
(...skipping 11 matching lines...) Expand all Loading... |
191 void WebMediaPlayerMS::seek(double seconds) { | 191 void WebMediaPlayerMS::seek(double seconds) { |
192 DCHECK(thread_checker_.CalledOnValidThread()); | 192 DCHECK(thread_checker_.CalledOnValidThread()); |
193 } | 193 } |
194 | 194 |
195 void WebMediaPlayerMS::setRate(double rate) { | 195 void WebMediaPlayerMS::setRate(double rate) { |
196 DCHECK(thread_checker_.CalledOnValidThread()); | 196 DCHECK(thread_checker_.CalledOnValidThread()); |
197 } | 197 } |
198 | 198 |
199 void WebMediaPlayerMS::setVolume(double volume) { | 199 void WebMediaPlayerMS::setVolume(double volume) { |
200 DCHECK(thread_checker_.CalledOnValidThread()); | 200 DCHECK(thread_checker_.CalledOnValidThread()); |
201 if (!audio_renderer_) | 201 if (!audio_renderer_.get()) |
202 return; | 202 return; |
203 DVLOG(1) << "WebMediaPlayerMS::setVolume(volume=" << volume << ")"; | 203 DVLOG(1) << "WebMediaPlayerMS::setVolume(volume=" << volume << ")"; |
204 audio_renderer_->SetVolume(volume); | 204 audio_renderer_->SetVolume(volume); |
205 } | 205 } |
206 | 206 |
207 void WebMediaPlayerMS::setVisible(bool visible) { | 207 void WebMediaPlayerMS::setVisible(bool visible) { |
208 DCHECK(thread_checker_.CalledOnValidThread()); | 208 DCHECK(thread_checker_.CalledOnValidThread()); |
209 } | 209 } |
210 | 210 |
211 void WebMediaPlayerMS::setPreload(WebMediaPlayer::Preload preload) { | 211 void WebMediaPlayerMS::setPreload(WebMediaPlayer::Preload preload) { |
212 DCHECK(thread_checker_.CalledOnValidThread()); | 212 DCHECK(thread_checker_.CalledOnValidThread()); |
213 } | 213 } |
214 | 214 |
215 bool WebMediaPlayerMS::totalBytesKnown() { | 215 bool WebMediaPlayerMS::totalBytesKnown() { |
216 DCHECK(thread_checker_.CalledOnValidThread()); | 216 DCHECK(thread_checker_.CalledOnValidThread()); |
217 return false; | 217 return false; |
218 } | 218 } |
219 | 219 |
220 bool WebMediaPlayerMS::hasVideo() const { | 220 bool WebMediaPlayerMS::hasVideo() const { |
221 DCHECK(thread_checker_.CalledOnValidThread()); | 221 DCHECK(thread_checker_.CalledOnValidThread()); |
222 return (video_frame_provider_ != NULL); | 222 return (video_frame_provider_.get() != NULL); |
223 } | 223 } |
224 | 224 |
225 bool WebMediaPlayerMS::hasAudio() const { | 225 bool WebMediaPlayerMS::hasAudio() const { |
226 DCHECK(thread_checker_.CalledOnValidThread()); | 226 DCHECK(thread_checker_.CalledOnValidThread()); |
227 return (audio_renderer_ != NULL); | 227 return (audio_renderer_.get() != NULL); |
228 } | 228 } |
229 | 229 |
230 WebKit::WebSize WebMediaPlayerMS::naturalSize() const { | 230 WebKit::WebSize WebMediaPlayerMS::naturalSize() const { |
231 DCHECK(thread_checker_.CalledOnValidThread()); | 231 DCHECK(thread_checker_.CalledOnValidThread()); |
232 | 232 |
233 gfx::Size size; | 233 gfx::Size size; |
234 if (current_frame_) | 234 if (current_frame_.get()) |
235 size = current_frame_->natural_size(); | 235 size = current_frame_->natural_size(); |
236 DVLOG(3) << "WebMediaPlayerMS::naturalSize, " << size.ToString(); | 236 DVLOG(3) << "WebMediaPlayerMS::naturalSize, " << size.ToString(); |
237 return WebKit::WebSize(size); | 237 return WebKit::WebSize(size); |
238 } | 238 } |
239 | 239 |
240 bool WebMediaPlayerMS::paused() const { | 240 bool WebMediaPlayerMS::paused() const { |
241 DCHECK(thread_checker_.CalledOnValidThread()); | 241 DCHECK(thread_checker_.CalledOnValidThread()); |
242 return paused_; | 242 return paused_; |
243 } | 243 } |
244 | 244 |
245 bool WebMediaPlayerMS::seeking() const { | 245 bool WebMediaPlayerMS::seeking() const { |
246 DCHECK(thread_checker_.CalledOnValidThread()); | 246 DCHECK(thread_checker_.CalledOnValidThread()); |
247 return false; | 247 return false; |
248 } | 248 } |
249 | 249 |
250 double WebMediaPlayerMS::duration() const { | 250 double WebMediaPlayerMS::duration() const { |
251 DCHECK(thread_checker_.CalledOnValidThread()); | 251 DCHECK(thread_checker_.CalledOnValidThread()); |
252 return std::numeric_limits<double>::infinity(); | 252 return std::numeric_limits<double>::infinity(); |
253 } | 253 } |
254 | 254 |
255 double WebMediaPlayerMS::currentTime() const { | 255 double WebMediaPlayerMS::currentTime() const { |
256 DCHECK(thread_checker_.CalledOnValidThread()); | 256 DCHECK(thread_checker_.CalledOnValidThread()); |
257 if (current_frame_) { | 257 if (current_frame_.get()) { |
258 return current_frame_->GetTimestamp().InSecondsF(); | 258 return current_frame_->GetTimestamp().InSecondsF(); |
259 } else if (audio_renderer_) { | 259 } else if (audio_renderer_.get()) { |
260 return audio_renderer_->GetCurrentRenderTime().InSecondsF(); | 260 return audio_renderer_->GetCurrentRenderTime().InSecondsF(); |
261 } | 261 } |
262 return 0.0; | 262 return 0.0; |
263 } | 263 } |
264 | 264 |
265 int WebMediaPlayerMS::dataRate() const { | 265 int WebMediaPlayerMS::dataRate() const { |
266 DCHECK(thread_checker_.CalledOnValidThread()); | 266 DCHECK(thread_checker_.CalledOnValidThread()); |
267 return 0; | 267 return 0; |
268 } | 268 } |
269 | 269 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 // Don't need to do anything as we use the dimensions passed in via paint(). | 304 // Don't need to do anything as we use the dimensions passed in via paint(). |
305 } | 305 } |
306 | 306 |
307 void WebMediaPlayerMS::paint(WebCanvas* canvas, | 307 void WebMediaPlayerMS::paint(WebCanvas* canvas, |
308 const WebRect& rect, | 308 const WebRect& rect, |
309 unsigned char alpha) { | 309 unsigned char alpha) { |
310 DVLOG(3) << "WebMediaPlayerMS::paint"; | 310 DVLOG(3) << "WebMediaPlayerMS::paint"; |
311 DCHECK(thread_checker_.CalledOnValidThread()); | 311 DCHECK(thread_checker_.CalledOnValidThread()); |
312 | 312 |
313 gfx::RectF dest_rect(rect.x, rect.y, rect.width, rect.height); | 313 gfx::RectF dest_rect(rect.x, rect.y, rect.width, rect.height); |
314 video_renderer_.Paint(current_frame_, canvas, dest_rect, alpha); | 314 video_renderer_.Paint(current_frame_.get(), canvas, dest_rect, alpha); |
315 | 315 |
316 { | 316 { |
317 base::AutoLock auto_lock(current_frame_lock_); | 317 base::AutoLock auto_lock(current_frame_lock_); |
318 if (current_frame_) | 318 if (current_frame_.get()) |
319 current_frame_used_ = true; | 319 current_frame_used_ = true; |
320 } | 320 } |
321 } | 321 } |
322 | 322 |
323 bool WebMediaPlayerMS::hasSingleSecurityOrigin() const { | 323 bool WebMediaPlayerMS::hasSingleSecurityOrigin() const { |
324 DCHECK(thread_checker_.CalledOnValidThread()); | 324 DCHECK(thread_checker_.CalledOnValidThread()); |
325 return true; | 325 return true; |
326 } | 326 } |
327 | 327 |
328 bool WebMediaPlayerMS::didPassCORSAccessCheck() const { | 328 bool WebMediaPlayerMS::didPassCORSAccessCheck() const { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 // thread (when the main thread is blocked). | 369 // thread (when the main thread is blocked). |
370 if (video_frame_provider_client_) | 370 if (video_frame_provider_client_) |
371 video_frame_provider_client_->StopUsingProvider(); | 371 video_frame_provider_client_->StopUsingProvider(); |
372 video_frame_provider_client_ = client; | 372 video_frame_provider_client_ = client; |
373 } | 373 } |
374 | 374 |
375 scoped_refptr<media::VideoFrame> WebMediaPlayerMS::GetCurrentFrame() { | 375 scoped_refptr<media::VideoFrame> WebMediaPlayerMS::GetCurrentFrame() { |
376 DVLOG(3) << "WebMediaPlayerMS::GetCurrentFrame"; | 376 DVLOG(3) << "WebMediaPlayerMS::GetCurrentFrame"; |
377 base::AutoLock auto_lock(current_frame_lock_); | 377 base::AutoLock auto_lock(current_frame_lock_); |
378 DCHECK(!pending_repaint_); | 378 DCHECK(!pending_repaint_); |
379 if (!current_frame_) | 379 if (!current_frame_.get()) |
380 return NULL; | 380 return NULL; |
381 pending_repaint_ = true; | 381 pending_repaint_ = true; |
382 current_frame_used_ = true; | 382 current_frame_used_ = true; |
383 return current_frame_; | 383 return current_frame_; |
384 } | 384 } |
385 | 385 |
386 void WebMediaPlayerMS::PutCurrentFrame( | 386 void WebMediaPlayerMS::PutCurrentFrame( |
387 const scoped_refptr<media::VideoFrame>& frame) { | 387 const scoped_refptr<media::VideoFrame>& frame) { |
388 DVLOG(3) << "WebMediaPlayerMS::PutCurrentFrame"; | 388 DVLOG(3) << "WebMediaPlayerMS::PutCurrentFrame"; |
389 DCHECK(pending_repaint_); | 389 DCHECK(pending_repaint_); |
(...skipping 10 matching lines...) Expand all Loading... |
400 { | 400 { |
401 base::AutoLock auto_lock(current_frame_lock_); | 401 base::AutoLock auto_lock(current_frame_lock_); |
402 DCHECK(!current_frame_used_); | 402 DCHECK(!current_frame_used_); |
403 current_frame_ = | 403 current_frame_ = |
404 media::VideoFrame::CreateBlackFrame(frame->natural_size()); | 404 media::VideoFrame::CreateBlackFrame(frame->natural_size()); |
405 } | 405 } |
406 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 406 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
407 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 407 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
408 GetClient()->sizeChanged(); | 408 GetClient()->sizeChanged(); |
409 | 409 |
410 if (video_frame_provider_ && GetClient()->needsWebLayerForVideo()) { | 410 if (video_frame_provider_.get() && GetClient()->needsWebLayerForVideo()) { |
411 video_weblayer_.reset( | 411 video_weblayer_.reset( |
412 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); | 412 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); |
413 GetClient()->setWebLayer(video_weblayer_.get()); | 413 GetClient()->setWebLayer(video_weblayer_.get()); |
414 } | 414 } |
415 } | 415 } |
416 | 416 |
417 // Do not update |current_frame_| when paused. | 417 // Do not update |current_frame_| when paused. |
418 if (paused_) | 418 if (paused_) |
419 return; | 419 return; |
420 | 420 |
421 if (!sequence_started_) { | 421 if (!sequence_started_) { |
422 sequence_started_ = true; | 422 sequence_started_ = true; |
423 start_time_ = frame->GetTimestamp(); | 423 start_time_ = frame->GetTimestamp(); |
424 } | 424 } |
425 bool size_changed = !current_frame_ || | 425 bool size_changed = !current_frame_.get() || |
426 current_frame_->natural_size() != frame->natural_size(); | 426 current_frame_->natural_size() != frame->natural_size(); |
427 | 427 |
428 { | 428 { |
429 base::AutoLock auto_lock(current_frame_lock_); | 429 base::AutoLock auto_lock(current_frame_lock_); |
430 if (!current_frame_used_ && current_frame_) | 430 if (!current_frame_used_ && current_frame_.get()) |
431 ++dropped_frame_count_; | 431 ++dropped_frame_count_; |
432 current_frame_ = frame; | 432 current_frame_ = frame; |
433 current_frame_->SetTimestamp(frame->GetTimestamp() - start_time_); | 433 current_frame_->SetTimestamp(frame->GetTimestamp() - start_time_); |
434 current_frame_used_ = false; | 434 current_frame_used_ = false; |
435 } | 435 } |
436 | 436 |
437 if (size_changed) | 437 if (size_changed) |
438 GetClient()->sizeChanged(); | 438 GetClient()->sizeChanged(); |
439 | 439 |
440 GetClient()->repaint(); | 440 GetClient()->repaint(); |
(...skipping 26 matching lines...) Expand all Loading... |
467 GetClient()->readyStateChanged(); | 467 GetClient()->readyStateChanged(); |
468 } | 468 } |
469 | 469 |
470 WebKit::WebMediaPlayerClient* WebMediaPlayerMS::GetClient() { | 470 WebKit::WebMediaPlayerClient* WebMediaPlayerMS::GetClient() { |
471 DCHECK(thread_checker_.CalledOnValidThread()); | 471 DCHECK(thread_checker_.CalledOnValidThread()); |
472 DCHECK(client_); | 472 DCHECK(client_); |
473 return client_; | 473 return client_; |
474 } | 474 } |
475 | 475 |
476 } // namespace webkit_media | 476 } // namespace webkit_media |
OLD | NEW |