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