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 "content/renderer/media/webmediaplayer_ms.h" | 5 #include "content/renderer/media/webmediaplayer_ms.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <limits> | 8 #include <limits> |
9 #include <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 | 288 |
289 compositor_->StartRendering(); | 289 compositor_->StartRendering(); |
290 | 290 |
291 if (audio_renderer_) | 291 if (audio_renderer_) |
292 audio_renderer_->Play(); | 292 audio_renderer_->Play(); |
293 | 293 |
294 if (delegate_) { | 294 if (delegate_) { |
295 // TODO(perkj, magjed): We use OneShot focus type here so that it takes | 295 // TODO(perkj, magjed): We use OneShot focus type here so that it takes |
296 // audio focus once it starts, and then will not respond to further audio | 296 // audio focus once it starts, and then will not respond to further audio |
297 // focus changes. See http://crbug.com/596516 for more details. | 297 // focus changes. See http://crbug.com/596516 for more details. |
298 delegate_->DidPlay(delegate_id_, hasVideo(), hasAudio(), false, | 298 delegate_->DidPlay(delegate_id_, hasVideo(), hasAudio(), |
299 media::MediaContentType::OneShot); | 299 media::MediaContentType::OneShot); |
| 300 delegate_->SetIdle(delegate_id_, false); |
300 } | 301 } |
301 | 302 |
302 paused_ = false; | 303 paused_ = false; |
303 } | 304 } |
304 | 305 |
305 void WebMediaPlayerMS::pause() { | 306 void WebMediaPlayerMS::pause() { |
306 DVLOG(1) << __func__; | 307 DVLOG(1) << __func__; |
307 DCHECK(thread_checker_.CalledOnValidThread()); | 308 DCHECK(thread_checker_.CalledOnValidThread()); |
308 | 309 |
309 should_play_upon_shown_ = false; | 310 should_play_upon_shown_ = false; |
310 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); | 311 media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); |
311 if (paused_) | 312 if (paused_) |
312 return; | 313 return; |
313 | 314 |
314 if (video_frame_provider_) | 315 if (video_frame_provider_) |
315 video_frame_provider_->Pause(); | 316 video_frame_provider_->Pause(); |
316 | 317 |
317 compositor_->StopRendering(); | 318 compositor_->StopRendering(); |
318 compositor_->ReplaceCurrentFrameWithACopy(); | 319 compositor_->ReplaceCurrentFrameWithACopy(); |
319 | 320 |
320 if (audio_renderer_) | 321 if (audio_renderer_) |
321 audio_renderer_->Pause(); | 322 audio_renderer_->Pause(); |
322 | 323 |
323 if (delegate_) | 324 if (delegate_) { |
324 delegate_->DidPause(delegate_id_, false); | 325 delegate_->DidPause(delegate_id_); |
| 326 delegate_->SetIdle(delegate_id_, true); |
| 327 } |
325 | 328 |
326 paused_ = true; | 329 paused_ = true; |
327 } | 330 } |
328 | 331 |
329 bool WebMediaPlayerMS::supportsSave() const { | 332 bool WebMediaPlayerMS::supportsSave() const { |
330 DCHECK(thread_checker_.CalledOnValidThread()); | 333 DCHECK(thread_checker_.CalledOnValidThread()); |
331 return false; | 334 return false; |
332 } | 335 } |
333 | 336 |
334 void WebMediaPlayerMS::seek(double seconds) { | 337 void WebMediaPlayerMS::seek(double seconds) { |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 NOTIMPLEMENTED(); | 499 NOTIMPLEMENTED(); |
497 return 0; | 500 return 0; |
498 } | 501 } |
499 | 502 |
500 size_t WebMediaPlayerMS::videoDecodedByteCount() const { | 503 size_t WebMediaPlayerMS::videoDecodedByteCount() const { |
501 DCHECK(thread_checker_.CalledOnValidThread()); | 504 DCHECK(thread_checker_.CalledOnValidThread()); |
502 NOTIMPLEMENTED(); | 505 NOTIMPLEMENTED(); |
503 return 0; | 506 return 0; |
504 } | 507 } |
505 | 508 |
506 void WebMediaPlayerMS::OnHidden() { | 509 void WebMediaPlayerMS::OnFrameHidden() { |
507 #if defined(OS_ANDROID) | 510 #if defined(OS_ANDROID) |
508 DCHECK(thread_checker_.CalledOnValidThread()); | 511 DCHECK(thread_checker_.CalledOnValidThread()); |
509 | 512 |
510 // Method called when the RenderFrame is sent to background and suspended | 513 // Method called when the RenderFrame is sent to background and suspended |
511 // (android). Substitute the displayed VideoFrame with a copy to avoid | 514 // (android). Substitute the displayed VideoFrame with a copy to avoid |
512 // holding on to it unnecessarily. | 515 // holding on to it unnecessarily. |
513 // | 516 // |
514 // During undoable tab closures OnHidden() may be called back to back, so we | 517 // During undoable tab closures OnHidden() may be called back to back, so we |
515 // can't rely on |render_frame_suspended_| being false here. | 518 // can't rely on |render_frame_suspended_| being false here. |
516 if (frame_deliverer_) { | 519 if (frame_deliverer_) { |
517 io_task_runner_->PostTask( | 520 io_task_runner_->PostTask( |
518 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, | 521 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, |
519 base::Unretained(frame_deliverer_.get()), true)); | 522 base::Unretained(frame_deliverer_.get()), true)); |
520 } | 523 } |
521 | 524 |
522 if (!paused_) | 525 if (!paused_) |
523 compositor_->ReplaceCurrentFrameWithACopy(); | 526 compositor_->ReplaceCurrentFrameWithACopy(); |
524 #endif // defined(OS_ANDROID) | 527 #endif // defined(OS_ANDROID) |
525 } | 528 } |
526 | 529 |
527 void WebMediaPlayerMS::OnShown() { | 530 void WebMediaPlayerMS::OnFrameClosed() { |
| 531 #if defined(OS_ANDROID) |
| 532 if (!paused_) { |
| 533 pause(); |
| 534 should_play_upon_shown_ = true; |
| 535 } |
| 536 |
| 537 if (delegate_) |
| 538 delegate_->PlayerGone(delegate_id_); |
| 539 |
| 540 if (frame_deliverer_) { |
| 541 io_task_runner_->PostTask( |
| 542 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, |
| 543 base::Unretained(frame_deliverer_.get()), true)); |
| 544 } |
| 545 #endif // defined(OS_ANDROID) |
| 546 } |
| 547 |
| 548 void WebMediaPlayerMS::OnFrameShown() { |
528 #if defined(OS_ANDROID) | 549 #if defined(OS_ANDROID) |
529 DCHECK(thread_checker_.CalledOnValidThread()); | 550 DCHECK(thread_checker_.CalledOnValidThread()); |
530 | 551 |
531 if (frame_deliverer_) { | 552 if (frame_deliverer_) { |
532 io_task_runner_->PostTask( | 553 io_task_runner_->PostTask( |
533 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, | 554 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, |
534 base::Unretained(frame_deliverer_.get()), false)); | 555 base::Unretained(frame_deliverer_.get()), false)); |
535 } | 556 } |
536 | 557 |
537 // Resume playback on visibility. play() clears |should_play_upon_shown_|. | 558 // Resume playback on visibility. play() clears |should_play_upon_shown_|. |
538 if (should_play_upon_shown_) | 559 if (should_play_upon_shown_) |
539 play(); | 560 play(); |
540 #endif // defined(OS_ANDROID) | 561 #endif // defined(OS_ANDROID) |
541 } | 562 } |
542 | 563 |
543 bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) { | 564 void WebMediaPlayerMS::OnIdleTimeout() {} |
544 #if defined(OS_ANDROID) | |
545 if (!must_suspend) | |
546 return false; | |
547 | |
548 if (!paused_) { | |
549 pause(); | |
550 should_play_upon_shown_ = true; | |
551 } | |
552 | |
553 if (delegate_) | |
554 delegate_->PlayerGone(delegate_id_); | |
555 | |
556 if (frame_deliverer_) { | |
557 io_task_runner_->PostTask( | |
558 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, | |
559 base::Unretained(frame_deliverer_.get()), true)); | |
560 } | |
561 #endif // defined(OS_ANDROID) | |
562 return true; | |
563 } | |
564 | 565 |
565 void WebMediaPlayerMS::OnPlay() { | 566 void WebMediaPlayerMS::OnPlay() { |
566 // TODO(perkj, magjed): It's not clear how WebRTC should work with an | 567 // TODO(perkj, magjed): It's not clear how WebRTC should work with an |
567 // MediaSession, until these issues are resolved, disable session controls. | 568 // MediaSession, until these issues are resolved, disable session controls. |
568 // http://crbug.com/595297. | 569 // http://crbug.com/595297. |
569 } | 570 } |
570 | 571 |
571 void WebMediaPlayerMS::OnPause() { | 572 void WebMediaPlayerMS::OnPause() { |
572 // TODO(perkj, magjed): See TODO in OnPlay(). | 573 // TODO(perkj, magjed): See TODO in OnPlay(). |
573 } | 574 } |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 void WebMediaPlayerMS::ResetCanvasCache() { | 703 void WebMediaPlayerMS::ResetCanvasCache() { |
703 DCHECK(thread_checker_.CalledOnValidThread()); | 704 DCHECK(thread_checker_.CalledOnValidThread()); |
704 video_renderer_.ResetCache(); | 705 video_renderer_.ResetCache(); |
705 } | 706 } |
706 | 707 |
707 void WebMediaPlayerMS::TriggerResize() { | 708 void WebMediaPlayerMS::TriggerResize() { |
708 get_client()->sizeChanged(); | 709 get_client()->sizeChanged(); |
709 } | 710 } |
710 | 711 |
711 } // namespace content | 712 } // namespace content |
OLD | NEW |