| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include "base/run_loop.h" |
| 7 #include "content/public/renderer/media_stream_renderer_factory.h" | 8 #include "content/public/renderer/media_stream_renderer_factory.h" |
| 8 #include "content/renderer/media/webmediaplayer_ms.h" | 9 #include "content/renderer/media/webmediaplayer_ms.h" |
| 9 #include "content/renderer/media/webmediaplayer_ms_compositor.h" | 10 #include "content/renderer/media/webmediaplayer_ms_compositor.h" |
| 10 #include "content/renderer/render_frame_impl.h" | 11 #include "content/renderer/render_frame_impl.h" |
| 11 #include "media/base/test_helpers.h" | 12 #include "media/base/test_helpers.h" |
| 12 #include "media/base/video_frame.h" | 13 #include "media/base/video_frame.h" |
| 13 #include "third_party/WebKit/public/platform/WebMediaPlayer.h" | 14 #include "third_party/WebKit/public/platform/WebMediaPlayer.h" |
| 14 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" | 15 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" |
| 15 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h" | 16 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h" |
| 16 | 17 |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 // 7. When WebMediaPlayerMS::play gets called, evething paused in step 6 should | 356 // 7. When WebMediaPlayerMS::play gets called, evething paused in step 6 should |
| 356 // be resumed. | 357 // be resumed. |
| 357 class WebMediaPlayerMSTest | 358 class WebMediaPlayerMSTest |
| 358 : public testing::TestWithParam<testing::tuple<bool, bool>> , | 359 : public testing::TestWithParam<testing::tuple<bool, bool>> , |
| 359 public blink::WebMediaPlayerClient, | 360 public blink::WebMediaPlayerClient, |
| 360 public cc::VideoFrameProvider::Client { | 361 public cc::VideoFrameProvider::Client { |
| 361 public: | 362 public: |
| 362 WebMediaPlayerMSTest() | 363 WebMediaPlayerMSTest() |
| 363 : render_factory_(new MockRenderFactory(message_loop_.task_runner(), | 364 : render_factory_(new MockRenderFactory(message_loop_.task_runner(), |
| 364 &message_loop_controller_)), | 365 &message_loop_controller_)), |
| 365 player_(nullptr, | 366 player_(new WebMediaPlayerMS( |
| 366 this, | 367 nullptr, |
| 367 delegate_.AsWeakPtr(), | 368 this, |
| 368 new media::MediaLog(), | 369 delegate_.AsWeakPtr(), |
| 369 std::unique_ptr<MediaStreamRendererFactory>(render_factory_), | 370 new media::MediaLog(), |
| 370 message_loop_.task_runner(), | 371 std::unique_ptr<MediaStreamRendererFactory>(render_factory_), |
| 371 message_loop_.task_runner(), | 372 message_loop_.task_runner(), |
| 372 message_loop_.task_runner(), | 373 message_loop_.task_runner(), |
| 373 nullptr, | 374 message_loop_.task_runner(), |
| 374 blink::WebString(), | 375 nullptr, |
| 375 blink::WebSecurityOrigin()), | 376 blink::WebString(), |
| 377 blink::WebSecurityOrigin())), |
| 376 rendering_(false), | 378 rendering_(false), |
| 377 background_rendering_(false) {} | 379 background_rendering_(false) {} |
| 378 ~WebMediaPlayerMSTest() override {} | 380 ~WebMediaPlayerMSTest() override { |
| 381 player_.reset(); |
| 382 base::RunLoop().RunUntilIdle(); |
| 383 } |
| 379 | 384 |
| 380 MockMediaStreamVideoRenderer* LoadAndGetFrameProvider(bool algorithm_enabled); | 385 MockMediaStreamVideoRenderer* LoadAndGetFrameProvider(bool algorithm_enabled); |
| 381 | 386 |
| 382 // Implementation of WebMediaPlayerClient | 387 // Implementation of WebMediaPlayerClient |
| 383 void networkStateChanged() override; | 388 void networkStateChanged() override; |
| 384 void readyStateChanged() override; | 389 void readyStateChanged() override; |
| 385 void timeChanged() override {} | 390 void timeChanged() override {} |
| 386 void repaint() override {} | 391 void repaint() override {} |
| 387 void durationChanged() override {} | 392 void durationChanged() override {} |
| 388 void sizeChanged() override; | 393 void sizeChanged() override; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 | 435 |
| 431 MOCK_METHOD1(DoSetWebLayer, void(bool)); | 436 MOCK_METHOD1(DoSetWebLayer, void(bool)); |
| 432 MOCK_METHOD1(DoNetworkStateChanged, | 437 MOCK_METHOD1(DoNetworkStateChanged, |
| 433 void(blink::WebMediaPlayer::NetworkState)); | 438 void(blink::WebMediaPlayer::NetworkState)); |
| 434 MOCK_METHOD1(DoReadyStateChanged, void(blink::WebMediaPlayer::ReadyState)); | 439 MOCK_METHOD1(DoReadyStateChanged, void(blink::WebMediaPlayer::ReadyState)); |
| 435 MOCK_METHOD1(CheckSizeChanged, void(gfx::Size)); | 440 MOCK_METHOD1(CheckSizeChanged, void(gfx::Size)); |
| 436 | 441 |
| 437 base::MessageLoop message_loop_; | 442 base::MessageLoop message_loop_; |
| 438 MockRenderFactory* render_factory_; | 443 MockRenderFactory* render_factory_; |
| 439 FakeWebMediaPlayerDelegate delegate_; | 444 FakeWebMediaPlayerDelegate delegate_; |
| 440 WebMediaPlayerMS player_; | 445 std::unique_ptr<WebMediaPlayerMS> player_; |
| 441 WebMediaPlayerMSCompositor* compositor_; | 446 WebMediaPlayerMSCompositor* compositor_; |
| 442 ReusableMessageLoopEvent message_loop_controller_; | 447 ReusableMessageLoopEvent message_loop_controller_; |
| 443 | 448 |
| 444 private: | 449 private: |
| 445 // Main function trying to ask WebMediaPlayerMS to submit a frame for | 450 // Main function trying to ask WebMediaPlayerMS to submit a frame for |
| 446 // rendering. | 451 // rendering. |
| 447 void RenderFrame(); | 452 void RenderFrame(); |
| 448 | 453 |
| 449 bool rendering_; | 454 bool rendering_; |
| 450 bool background_rendering_; | 455 bool background_rendering_; |
| 451 }; | 456 }; |
| 452 | 457 |
| 453 MockMediaStreamVideoRenderer* WebMediaPlayerMSTest::LoadAndGetFrameProvider( | 458 MockMediaStreamVideoRenderer* WebMediaPlayerMSTest::LoadAndGetFrameProvider( |
| 454 bool algorithm_enabled) { | 459 bool algorithm_enabled) { |
| 455 EXPECT_FALSE(!!render_factory_->provider()) << "There should not be a " | 460 EXPECT_FALSE(!!render_factory_->provider()) << "There should not be a " |
| 456 "FrameProvider yet."; | 461 "FrameProvider yet."; |
| 457 | 462 |
| 458 EXPECT_CALL( | 463 EXPECT_CALL( |
| 459 *this, DoNetworkStateChanged(blink::WebMediaPlayer::NetworkStateLoading)); | 464 *this, DoNetworkStateChanged(blink::WebMediaPlayer::NetworkStateLoading)); |
| 460 EXPECT_CALL( | 465 EXPECT_CALL( |
| 461 *this, DoReadyStateChanged(blink::WebMediaPlayer::ReadyStateHaveNothing)); | 466 *this, DoReadyStateChanged(blink::WebMediaPlayer::ReadyStateHaveNothing)); |
| 462 player_.load(blink::WebMediaPlayer::LoadTypeURL, | 467 player_->load(blink::WebMediaPlayer::LoadTypeURL, |
| 463 blink::WebMediaPlayerSource(), | 468 blink::WebMediaPlayerSource(), |
| 464 blink::WebMediaPlayer::CORSModeUnspecified); | 469 blink::WebMediaPlayer::CORSModeUnspecified); |
| 465 compositor_ = player_.compositor_.get(); | 470 compositor_ = player_->compositor_.get(); |
| 466 EXPECT_TRUE(!!compositor_); | 471 EXPECT_TRUE(!!compositor_); |
| 467 compositor_->SetAlgorithmEnabledForTesting(algorithm_enabled); | 472 compositor_->SetAlgorithmEnabledForTesting(algorithm_enabled); |
| 468 | 473 |
| 469 MockMediaStreamVideoRenderer* const provider = render_factory_->provider(); | 474 MockMediaStreamVideoRenderer* const provider = render_factory_->provider(); |
| 470 EXPECT_TRUE(!!provider); | 475 EXPECT_TRUE(!!provider); |
| 471 EXPECT_TRUE(provider->Started()); | 476 EXPECT_TRUE(provider->Started()); |
| 472 | 477 |
| 473 testing::Mock::VerifyAndClearExpectations(this); | 478 testing::Mock::VerifyAndClearExpectations(this); |
| 474 return provider; | 479 return provider; |
| 475 } | 480 } |
| 476 | 481 |
| 477 void WebMediaPlayerMSTest::networkStateChanged() { | 482 void WebMediaPlayerMSTest::networkStateChanged() { |
| 478 blink::WebMediaPlayer::NetworkState state = player_.getNetworkState(); | 483 blink::WebMediaPlayer::NetworkState state = player_->getNetworkState(); |
| 479 DoNetworkStateChanged(state); | 484 DoNetworkStateChanged(state); |
| 480 if (state == blink::WebMediaPlayer::NetworkState::NetworkStateFormatError || | 485 if (state == blink::WebMediaPlayer::NetworkState::NetworkStateFormatError || |
| 481 state == blink::WebMediaPlayer::NetworkState::NetworkStateDecodeError || | 486 state == blink::WebMediaPlayer::NetworkState::NetworkStateDecodeError || |
| 482 state == blink::WebMediaPlayer::NetworkState::NetworkStateNetworkError) { | 487 state == blink::WebMediaPlayer::NetworkState::NetworkStateNetworkError) { |
| 483 message_loop_controller_.GetPipelineStatusCB().Run( | 488 message_loop_controller_.GetPipelineStatusCB().Run( |
| 484 media::PipelineStatus::PIPELINE_ERROR_NETWORK); | 489 media::PipelineStatus::PIPELINE_ERROR_NETWORK); |
| 485 } | 490 } |
| 486 } | 491 } |
| 487 | 492 |
| 488 void WebMediaPlayerMSTest::readyStateChanged() { | 493 void WebMediaPlayerMSTest::readyStateChanged() { |
| 489 blink::WebMediaPlayer::ReadyState state = player_.getReadyState(); | 494 blink::WebMediaPlayer::ReadyState state = player_->getReadyState(); |
| 490 DoReadyStateChanged(state); | 495 DoReadyStateChanged(state); |
| 491 if (state == blink::WebMediaPlayer::ReadyState::ReadyStateHaveEnoughData) | 496 if (state == blink::WebMediaPlayer::ReadyState::ReadyStateHaveEnoughData) |
| 492 player_.play(); | 497 player_->play(); |
| 493 } | 498 } |
| 494 | 499 |
| 495 void WebMediaPlayerMSTest::setWebLayer(blink::WebLayer* layer) { | 500 void WebMediaPlayerMSTest::setWebLayer(blink::WebLayer* layer) { |
| 496 if (layer) | 501 if (layer) |
| 497 compositor_->SetVideoFrameProviderClient(this); | 502 compositor_->SetVideoFrameProviderClient(this); |
| 498 DoSetWebLayer(!!layer); | 503 DoSetWebLayer(!!layer); |
| 499 } | 504 } |
| 500 | 505 |
| 501 void WebMediaPlayerMSTest::StopUsingProvider() { | 506 void WebMediaPlayerMSTest::StopUsingProvider() { |
| 502 if (rendering_) | 507 if (rendering_) |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 gfx::Size frame_size = | 633 gfx::Size frame_size = |
| 629 gfx::Size(kStandardWidth - (odd_size_frame ? kOddSizeOffset : 0), | 634 gfx::Size(kStandardWidth - (odd_size_frame ? kOddSizeOffset : 0), |
| 630 kStandardHeight - (odd_size_frame ? kOddSizeOffset : 0)); | 635 kStandardHeight - (odd_size_frame ? kOddSizeOffset : 0)); |
| 631 EXPECT_CALL(*this, CheckSizeChanged(frame_size)); | 636 EXPECT_CALL(*this, CheckSizeChanged(frame_size)); |
| 632 message_loop_controller_.RunAndWaitForStatus( | 637 message_loop_controller_.RunAndWaitForStatus( |
| 633 media::PipelineStatus::PIPELINE_OK); | 638 media::PipelineStatus::PIPELINE_OK); |
| 634 testing::Mock::VerifyAndClearExpectations(this); | 639 testing::Mock::VerifyAndClearExpectations(this); |
| 635 | 640 |
| 636 // Here we call pause, and expect a freezing frame. | 641 // Here we call pause, and expect a freezing frame. |
| 637 EXPECT_CALL(*this, DoStopRendering()); | 642 EXPECT_CALL(*this, DoStopRendering()); |
| 638 player_.pause(); | 643 player_->pause(); |
| 639 auto prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); | 644 auto prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); |
| 640 message_loop_controller_.RunAndWaitForStatus( | 645 message_loop_controller_.RunAndWaitForStatus( |
| 641 media::PipelineStatus::PIPELINE_OK); | 646 media::PipelineStatus::PIPELINE_OK); |
| 642 auto after_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); | 647 auto after_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); |
| 643 EXPECT_EQ(prev_frame->timestamp(), after_frame->timestamp()); | 648 EXPECT_EQ(prev_frame->timestamp(), after_frame->timestamp()); |
| 644 testing::Mock::VerifyAndClearExpectations(this); | 649 testing::Mock::VerifyAndClearExpectations(this); |
| 645 | 650 |
| 646 EXPECT_CALL(*this, DoSetWebLayer(false)); | 651 EXPECT_CALL(*this, DoSetWebLayer(false)); |
| 647 } | 652 } |
| 648 | 653 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 669 gfx::Size frame_size = | 674 gfx::Size frame_size = |
| 670 gfx::Size(kStandardWidth - (odd_size_frame ? kOddSizeOffset : 0), | 675 gfx::Size(kStandardWidth - (odd_size_frame ? kOddSizeOffset : 0), |
| 671 kStandardHeight - (odd_size_frame ? kOddSizeOffset : 0)); | 676 kStandardHeight - (odd_size_frame ? kOddSizeOffset : 0)); |
| 672 EXPECT_CALL(*this, CheckSizeChanged(frame_size)); | 677 EXPECT_CALL(*this, CheckSizeChanged(frame_size)); |
| 673 message_loop_controller_.RunAndWaitForStatus( | 678 message_loop_controller_.RunAndWaitForStatus( |
| 674 media::PipelineStatus::PIPELINE_OK); | 679 media::PipelineStatus::PIPELINE_OK); |
| 675 testing::Mock::VerifyAndClearExpectations(this); | 680 testing::Mock::VerifyAndClearExpectations(this); |
| 676 | 681 |
| 677 // Here we call pause, and expect a freezing frame. | 682 // Here we call pause, and expect a freezing frame. |
| 678 EXPECT_CALL(*this, DoStopRendering()); | 683 EXPECT_CALL(*this, DoStopRendering()); |
| 679 player_.pause(); | 684 player_->pause(); |
| 680 auto prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); | 685 auto prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); |
| 681 message_loop_controller_.RunAndWaitForStatus( | 686 message_loop_controller_.RunAndWaitForStatus( |
| 682 media::PipelineStatus::PIPELINE_OK); | 687 media::PipelineStatus::PIPELINE_OK); |
| 683 auto after_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); | 688 auto after_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); |
| 684 EXPECT_EQ(prev_frame->timestamp(), after_frame->timestamp()); | 689 EXPECT_EQ(prev_frame->timestamp(), after_frame->timestamp()); |
| 685 testing::Mock::VerifyAndClearExpectations(this); | 690 testing::Mock::VerifyAndClearExpectations(this); |
| 686 | 691 |
| 687 // We resume the player, and expect rendering can continue. | 692 // We resume the player, and expect rendering can continue. |
| 688 EXPECT_CALL(*this, DoStartRendering()); | 693 EXPECT_CALL(*this, DoStartRendering()); |
| 689 player_.play(); | 694 player_->play(); |
| 690 prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); | 695 prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); |
| 691 message_loop_controller_.RunAndWaitForStatus( | 696 message_loop_controller_.RunAndWaitForStatus( |
| 692 media::PipelineStatus::PIPELINE_OK); | 697 media::PipelineStatus::PIPELINE_OK); |
| 693 after_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); | 698 after_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); |
| 694 EXPECT_NE(prev_frame->timestamp(), after_frame->timestamp()); | 699 EXPECT_NE(prev_frame->timestamp(), after_frame->timestamp()); |
| 695 testing::Mock::VerifyAndClearExpectations(this); | 700 testing::Mock::VerifyAndClearExpectations(this); |
| 696 | 701 |
| 697 EXPECT_CALL(*this, DoSetWebLayer(false)); | 702 EXPECT_CALL(*this, DoSetWebLayer(false)); |
| 698 EXPECT_CALL(*this, DoStopRendering()); | 703 EXPECT_CALL(*this, DoStopRendering()); |
| 699 } | 704 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 EXPECT_CALL(*this, DoSetWebLayer(false)); | 785 EXPECT_CALL(*this, DoSetWebLayer(false)); |
| 781 EXPECT_CALL(*this, DoStopRendering()); | 786 EXPECT_CALL(*this, DoStopRendering()); |
| 782 } | 787 } |
| 783 | 788 |
| 784 #if defined(OS_ANDROID) | 789 #if defined(OS_ANDROID) |
| 785 TEST_F(WebMediaPlayerMSTest, HiddenPlayerTests) { | 790 TEST_F(WebMediaPlayerMSTest, HiddenPlayerTests) { |
| 786 LoadAndGetFrameProvider(true); | 791 LoadAndGetFrameProvider(true); |
| 787 | 792 |
| 788 // Hidden status should not affect playback. | 793 // Hidden status should not affect playback. |
| 789 delegate_.set_hidden(true); | 794 delegate_.set_hidden(true); |
| 790 player_.play(); | 795 player_->play(); |
| 791 EXPECT_FALSE(player_.paused()); | 796 EXPECT_FALSE(player_->paused()); |
| 792 | 797 |
| 793 // A pause delivered via the delegate should not pause the video since these | 798 // A pause delivered via the delegate should not pause the video since these |
| 794 // calls are currently ignored. | 799 // calls are currently ignored. |
| 795 player_.OnPause(); | 800 player_->OnPause(); |
| 796 EXPECT_FALSE(player_.paused()); | 801 EXPECT_FALSE(player_->paused()); |
| 797 | 802 |
| 798 // A hidden player should start still be playing upon shown. | 803 // A hidden player should start still be playing upon shown. |
| 799 delegate_.set_hidden(false); | 804 delegate_.set_hidden(false); |
| 800 player_.OnShown(); | 805 player_->OnShown(); |
| 801 EXPECT_FALSE(player_.paused()); | 806 EXPECT_FALSE(player_->paused()); |
| 802 | 807 |
| 803 // A hidden event should not pause the player. | 808 // A hidden event should not pause the player. |
| 804 delegate_.set_hidden(true); | 809 delegate_.set_hidden(true); |
| 805 player_.OnHidden(); | 810 player_->OnHidden(); |
| 806 EXPECT_FALSE(player_.paused()); | 811 EXPECT_FALSE(player_->paused()); |
| 807 | 812 |
| 808 // A user generated pause() should clear the automatic resumption. | 813 // A user generated pause() should clear the automatic resumption. |
| 809 player_.pause(); | 814 player_->pause(); |
| 810 delegate_.set_hidden(false); | 815 delegate_.set_hidden(false); |
| 811 player_.OnShown(); | 816 player_->OnShown(); |
| 812 EXPECT_TRUE(player_.paused()); | 817 EXPECT_TRUE(player_->paused()); |
| 813 | 818 |
| 814 // A user generated play() should start playback. | 819 // A user generated play() should start playback. |
| 815 player_.play(); | 820 player_->play(); |
| 816 EXPECT_FALSE(player_.paused()); | 821 EXPECT_FALSE(player_->paused()); |
| 817 | 822 |
| 818 // An OnSuspendRequested() without forced suspension should do nothing. | 823 // An OnSuspendRequested() without forced suspension should do nothing. |
| 819 player_.OnSuspendRequested(false); | 824 player_->OnSuspendRequested(false); |
| 820 EXPECT_FALSE(player_.paused()); | 825 EXPECT_FALSE(player_->paused()); |
| 821 | 826 |
| 822 // An OnSuspendRequested() with forced suspension should pause playback. | 827 // An OnSuspendRequested() with forced suspension should pause playback. |
| 823 player_.OnSuspendRequested(true); | 828 player_->OnSuspendRequested(true); |
| 824 EXPECT_TRUE(player_.paused()); | 829 EXPECT_TRUE(player_->paused()); |
| 825 | 830 |
| 826 // OnShown() should restart after a forced suspension. | 831 // OnShown() should restart after a forced suspension. |
| 827 player_.OnShown(); | 832 player_->OnShown(); |
| 828 EXPECT_FALSE(player_.paused()); | 833 EXPECT_FALSE(player_->paused()); |
| 829 EXPECT_CALL(*this, DoSetWebLayer(false)); | 834 EXPECT_CALL(*this, DoSetWebLayer(false)); |
| 830 } | 835 } |
| 831 #endif | 836 #endif |
| 832 | 837 |
| 833 } // namespace content | 838 } // namespace content |
| OLD | NEW |