| Index: media/renderers/renderer_impl_unittest.cc
|
| diff --git a/media/renderers/renderer_impl_unittest.cc b/media/renderers/renderer_impl_unittest.cc
|
| index 38748577e8ea97f2fd58e55454751c2bb3d13410..a17a72e7def8447e21d78612aa2bed2d072a06ee 100644
|
| --- a/media/renderers/renderer_impl_unittest.cc
|
| +++ b/media/renderers/renderer_impl_unittest.cc
|
| @@ -30,30 +30,33 @@ namespace media {
|
|
|
| const int64_t kStartPlayingTimeInMs = 100;
|
|
|
| -ACTION_P2(SetBufferingState, cb, buffering_state) {
|
| - cb->Run(buffering_state);
|
| +ACTION_P2(SetBufferingState, renderer_client, buffering_state) {
|
| + (*renderer_client)->OnBufferingStateChange(buffering_state);
|
| }
|
|
|
| -ACTION_P2(AudioError, cb, error) {
|
| - cb->Run(error);
|
| +ACTION_P2(SetError, renderer_client, error) {
|
| + (*renderer_client)->OnError(error);
|
| }
|
|
|
| class RendererImplTest : public ::testing::Test {
|
| public:
|
| // Used for setting expectations on pipeline callbacks. Using a StrictMock
|
| // also lets us test for missing callbacks.
|
| - class CallbackHelper {
|
| + class CallbackHelper : public RendererClient {
|
| public:
|
| CallbackHelper() {}
|
| virtual ~CallbackHelper() {}
|
|
|
| - MOCK_METHOD1(OnInitialize, void(PipelineStatus));
|
| - MOCK_METHOD0(OnFlushed, void());
|
| + // RendererClient implementation.
|
| + MOCK_METHOD1(OnError, void(PipelineStatus status));
|
| MOCK_METHOD0(OnEnded, void());
|
| - MOCK_METHOD1(OnError, void(PipelineStatus));
|
| - MOCK_METHOD1(OnUpdateStatistics, void(const PipelineStatistics&));
|
| + MOCK_METHOD1(OnStatisticsUpdate, void(const PipelineStatistics&));
|
| MOCK_METHOD1(OnBufferingStateChange, void(BufferingState));
|
| MOCK_METHOD0(OnWaitingForDecryptionKey, void());
|
| +
|
| + // Completion callbacks.
|
| + MOCK_METHOD1(OnInitialize, void(PipelineStatus));
|
| + MOCK_METHOD0(OnFlushed, void());
|
| MOCK_METHOD1(OnCdmAttached, void(bool));
|
|
|
| private:
|
| @@ -69,6 +72,8 @@ class RendererImplTest : public ::testing::Test {
|
| std::unique_ptr<AudioRenderer>(audio_renderer_),
|
| std::unique_ptr<VideoRenderer>(video_renderer_))),
|
| cdm_context_(new StrictMock<MockCdmContext>()),
|
| + video_renderer_client_(nullptr),
|
| + audio_renderer_client_(nullptr),
|
| initialization_status_(PIPELINE_OK) {
|
| // SetDemuxerExpectations() adds overriding expectations for expected
|
| // non-NULL streams.
|
| @@ -96,19 +101,16 @@ class RendererImplTest : public ::testing::Test {
|
|
|
| // Sets up expectations to allow the audio renderer to initialize.
|
| void SetAudioRendererInitializeExpectations(PipelineStatus status) {
|
| - EXPECT_CALL(*audio_renderer_,
|
| - Initialize(audio_stream_.get(), _, _, _, _, _, _, _))
|
| - .WillOnce(DoAll(SaveArg<4>(&audio_buffering_state_cb_),
|
| - SaveArg<5>(&audio_ended_cb_),
|
| - SaveArg<6>(&audio_error_cb_), RunCallback<1>(status)));
|
| + EXPECT_CALL(*audio_renderer_, Initialize(audio_stream_.get(), _, _, _))
|
| + .WillOnce(
|
| + DoAll(SaveArg<2>(&audio_renderer_client_), RunCallback<3>(status)));
|
| }
|
|
|
| // Sets up expectations to allow the video renderer to initialize.
|
| void SetVideoRendererInitializeExpectations(PipelineStatus status) {
|
| - EXPECT_CALL(*video_renderer_,
|
| - Initialize(video_stream_.get(), _, _, _, _, _, _, _, _))
|
| - .WillOnce(DoAll(SaveArg<4>(&video_buffering_state_cb_),
|
| - SaveArg<5>(&video_ended_cb_), RunCallback<1>(status)));
|
| + EXPECT_CALL(*video_renderer_, Initialize(video_stream_.get(), _, _, _, _))
|
| + .WillOnce(
|
| + DoAll(SaveArg<2>(&video_renderer_client_), RunCallback<4>(status)));
|
| }
|
|
|
| void InitializeAndExpect(PipelineStatus start_status) {
|
| @@ -123,18 +125,9 @@ class RendererImplTest : public ::testing::Test {
|
| renderer_impl_->set_time_source_for_testing(&time_source_);
|
| }
|
|
|
| - renderer_impl_->Initialize(
|
| - demuxer_.get(),
|
| - base::Bind(&CallbackHelper::OnInitialize,
|
| - base::Unretained(&callbacks_)),
|
| - base::Bind(&CallbackHelper::OnUpdateStatistics,
|
| - base::Unretained(&callbacks_)),
|
| - base::Bind(&CallbackHelper::OnBufferingStateChange,
|
| - base::Unretained(&callbacks_)),
|
| - base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
|
| - base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
|
| - base::Bind(&CallbackHelper::OnWaitingForDecryptionKey,
|
| - base::Unretained(&callbacks_)));
|
| + renderer_impl_->Initialize(demuxer_.get(), &callbacks_,
|
| + base::Bind(&CallbackHelper::OnInitialize,
|
| + base::Unretained(&callbacks_)));
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -192,13 +185,13 @@ class RendererImplTest : public ::testing::Test {
|
|
|
| if (audio_stream_) {
|
| EXPECT_CALL(*audio_renderer_, StartPlaying())
|
| - .WillOnce(SetBufferingState(&audio_buffering_state_cb_,
|
| + .WillOnce(SetBufferingState(&audio_renderer_client_,
|
| BUFFERING_HAVE_ENOUGH));
|
| }
|
|
|
| if (video_stream_) {
|
| EXPECT_CALL(*video_renderer_, StartPlayingFrom(start_time))
|
| - .WillOnce(SetBufferingState(&video_buffering_state_cb_,
|
| + .WillOnce(SetBufferingState(&video_renderer_client_,
|
| BUFFERING_HAVE_ENOUGH));
|
| }
|
|
|
| @@ -212,14 +205,14 @@ class RendererImplTest : public ::testing::Test {
|
|
|
| if (audio_stream_) {
|
| EXPECT_CALL(*audio_renderer_, Flush(_))
|
| - .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_,
|
| + .WillOnce(DoAll(SetBufferingState(&audio_renderer_client_,
|
| BUFFERING_HAVE_NOTHING),
|
| RunClosure<0>()));
|
| }
|
|
|
| if (video_stream_) {
|
| EXPECT_CALL(*video_renderer_, Flush(_))
|
| - .WillOnce(DoAll(SetBufferingState(&video_buffering_state_cb_,
|
| + .WillOnce(DoAll(SetBufferingState(&video_renderer_client_,
|
| BUFFERING_HAVE_NOTHING),
|
| RunClosure<0>()));
|
| }
|
| @@ -282,11 +275,8 @@ class RendererImplTest : public ::testing::Test {
|
| std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_;
|
| std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_;
|
| MockDemuxerStreamVector streams_;
|
| - BufferingStateCB audio_buffering_state_cb_;
|
| - BufferingStateCB video_buffering_state_cb_;
|
| - base::Closure audio_ended_cb_;
|
| - base::Closure video_ended_cb_;
|
| - PipelineStatusCB audio_error_cb_;
|
| + RendererClient* video_renderer_client_;
|
| + RendererClient* audio_renderer_client_;
|
| VideoDecoderConfig video_decoder_config_;
|
| PipelineStatus initialization_status_;
|
|
|
| @@ -303,8 +293,7 @@ TEST_F(RendererImplTest, Destroy_PendingInitialize) {
|
|
|
| SetAudioRendererInitializeExpectations(PIPELINE_OK);
|
| // Not returning the video initialization callback.
|
| - EXPECT_CALL(*video_renderer_,
|
| - Initialize(video_stream_.get(), _, _, _, _, _, _, _, _));
|
| + EXPECT_CALL(*video_renderer_, Initialize(video_stream_.get(), _, _, _, _));
|
|
|
| InitializeAndExpect(PIPELINE_ERROR_ABORT);
|
| EXPECT_EQ(PIPELINE_OK, initialization_status_);
|
| @@ -338,8 +327,7 @@ TEST_F(RendererImplTest, Destroy_PendingInitializeAfterSetCdm) {
|
| SetAudioRendererInitializeExpectations(PIPELINE_OK);
|
| // Not returning the video initialization callback. So initialization will
|
| // be pending.
|
| - EXPECT_CALL(*video_renderer_,
|
| - Initialize(video_stream_.get(), _, _, _, _, _, _, _, _));
|
| + EXPECT_CALL(*video_renderer_, Initialize(video_stream_.get(), _, _, _, _));
|
|
|
| // SetCdm() will trigger the initialization to start. But it will not complete
|
| // because the |video_renderer_| is not returning the initialization callback.
|
| @@ -492,7 +480,7 @@ TEST_F(RendererImplTest, FlushAfterUnderflow) {
|
|
|
| // Simulate underflow.
|
| EXPECT_CALL(time_source_, StopTicking());
|
| - audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| + audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
|
|
| // Flush while underflowed. We shouldn't call StopTicking() again.
|
| Flush(true);
|
| @@ -517,7 +505,7 @@ TEST_F(RendererImplTest, AudioStreamEnded) {
|
| EXPECT_CALL(time_source_, StopTicking());
|
| EXPECT_CALL(callbacks_, OnEnded());
|
|
|
| - audio_ended_cb_.Run();
|
| + audio_renderer_client_->OnEnded();
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -528,7 +516,7 @@ TEST_F(RendererImplTest, VideoStreamEnded) {
|
| EXPECT_CALL(time_source_, StopTicking());
|
| EXPECT_CALL(callbacks_, OnEnded());
|
|
|
| - video_ended_cb_.Run();
|
| + video_renderer_client_->OnEnded();
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -537,20 +525,20 @@ TEST_F(RendererImplTest, AudioVideoStreamsEnded) {
|
| Play();
|
|
|
| // OnEnded() is called only when all streams have finished.
|
| - audio_ended_cb_.Run();
|
| + audio_renderer_client_->OnEnded();
|
| base::RunLoop().RunUntilIdle();
|
|
|
| EXPECT_CALL(time_source_, StopTicking());
|
| EXPECT_CALL(callbacks_, OnEnded());
|
|
|
| - video_ended_cb_.Run();
|
| + video_renderer_client_->OnEnded();
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| TEST_F(RendererImplTest, ErrorAfterInitialize) {
|
| InitializeWithAudio();
|
| EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_DECODE));
|
| - audio_error_cb_.Run(PIPELINE_ERROR_DECODE);
|
| + audio_renderer_client_->OnError(PIPELINE_ERROR_DECODE);
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -559,7 +547,7 @@ TEST_F(RendererImplTest, ErrorDuringPlaying) {
|
| Play();
|
|
|
| EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_DECODE));
|
| - audio_error_cb_.Run(PIPELINE_ERROR_DECODE);
|
| + audio_renderer_client_->OnError(PIPELINE_ERROR_DECODE);
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -569,9 +557,9 @@ TEST_F(RendererImplTest, ErrorDuringFlush) {
|
|
|
| InSequence s;
|
| EXPECT_CALL(time_source_, StopTicking());
|
| - EXPECT_CALL(*audio_renderer_, Flush(_)).WillOnce(DoAll(
|
| - AudioError(&audio_error_cb_, PIPELINE_ERROR_DECODE),
|
| - RunClosure<0>()));
|
| + EXPECT_CALL(*audio_renderer_, Flush(_))
|
| + .WillOnce(DoAll(SetError(&audio_renderer_client_, PIPELINE_ERROR_DECODE),
|
| + RunClosure<0>()));
|
| EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_DECODE));
|
| EXPECT_CALL(callbacks_, OnFlushed());
|
| renderer_impl_->Flush(
|
| @@ -585,7 +573,7 @@ TEST_F(RendererImplTest, ErrorAfterFlush) {
|
| Flush(false);
|
|
|
| EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_DECODE));
|
| - audio_error_cb_.Run(PIPELINE_ERROR_DECODE);
|
| + audio_renderer_client_->OnError(PIPELINE_ERROR_DECODE);
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -594,12 +582,10 @@ TEST_F(RendererImplTest, ErrorDuringInitialize) {
|
| SetAudioRendererInitializeExpectations(PIPELINE_OK);
|
|
|
| // Force an audio error to occur during video renderer initialization.
|
| - EXPECT_CALL(*video_renderer_,
|
| - Initialize(video_stream_.get(), _, _, _, _, _, _, _, _))
|
| - .WillOnce(DoAll(AudioError(&audio_error_cb_, PIPELINE_ERROR_DECODE),
|
| - SaveArg<4>(&video_buffering_state_cb_),
|
| - SaveArg<5>(&video_ended_cb_),
|
| - RunCallback<1>(PIPELINE_OK)));
|
| + EXPECT_CALL(*video_renderer_, Initialize(video_stream_.get(), _, _, _, _))
|
| + .WillOnce(DoAll(SetError(&audio_renderer_client_, PIPELINE_ERROR_DECODE),
|
| + SaveArg<2>(&video_renderer_client_),
|
| + RunCallback<4>(PIPELINE_OK)));
|
|
|
| InitializeAndExpect(PIPELINE_ERROR_DECODE);
|
| }
|
| @@ -610,7 +596,7 @@ TEST_F(RendererImplTest, AudioUnderflow) {
|
|
|
| // Underflow should occur immediately with a single audio track.
|
| EXPECT_CALL(time_source_, StopTicking());
|
| - audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| + audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
| }
|
|
|
| TEST_F(RendererImplTest, AudioUnderflowWithVideo) {
|
| @@ -620,7 +606,7 @@ TEST_F(RendererImplTest, AudioUnderflowWithVideo) {
|
| // Underflow should be immediate when both audio and video are present and
|
| // audio underflows.
|
| EXPECT_CALL(time_source_, StopTicking());
|
| - audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| + audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
| }
|
|
|
| TEST_F(RendererImplTest, VideoUnderflow) {
|
| @@ -629,7 +615,7 @@ TEST_F(RendererImplTest, VideoUnderflow) {
|
|
|
| // Underflow should occur immediately with a single video track.
|
| EXPECT_CALL(time_source_, StopTicking());
|
| - video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| + video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
| }
|
|
|
| TEST_F(RendererImplTest, VideoUnderflowWithAudio) {
|
| @@ -642,7 +628,7 @@ TEST_F(RendererImplTest, VideoUnderflowWithAudio) {
|
|
|
| // Underflow should be delayed when both audio and video are present and video
|
| // underflows.
|
| - video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| + video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
| Mock::VerifyAndClearExpectations(&time_source_);
|
|
|
| EXPECT_CALL(time_source_, StopTicking());
|
| @@ -659,11 +645,11 @@ TEST_F(RendererImplTest, VideoUnderflowWithAudioVideoRecovers) {
|
|
|
| // Underflow should be delayed when both audio and video are present and video
|
| // underflows.
|
| - video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| + video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
| Mock::VerifyAndClearExpectations(&time_source_);
|
|
|
| // If video recovers, the underflow should never occur.
|
| - video_buffering_state_cb_.Run(BUFFERING_HAVE_ENOUGH);
|
| + video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_ENOUGH);
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -677,11 +663,11 @@ TEST_F(RendererImplTest, VideoAndAudioUnderflow) {
|
|
|
| // Underflow should be delayed when both audio and video are present and video
|
| // underflows.
|
| - video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| + video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
| Mock::VerifyAndClearExpectations(&time_source_);
|
|
|
| EXPECT_CALL(time_source_, StopTicking());
|
| - audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| + audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
|
|
| // Nothing else should primed on the message loop.
|
| base::RunLoop().RunUntilIdle();
|
| @@ -697,8 +683,8 @@ TEST_F(RendererImplTest, VideoUnderflowWithAudioFlush) {
|
|
|
| // Simulate the cases where audio underflows and then video underflows.
|
| EXPECT_CALL(time_source_, StopTicking());
|
| - audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| - video_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
|
| + audio_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
| + video_renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
|
| Mock::VerifyAndClearExpectations(&time_source_);
|
|
|
| // Flush the audio and video renderers, both think they're in an underflow
|
| @@ -717,7 +703,7 @@ TEST_F(RendererImplTest, VideoUnderflowWithAudioFlush) {
|
| EXPECT_CALL(time_source_, SetMediaTime(kStartTime));
|
| EXPECT_CALL(*audio_renderer_, StartPlaying())
|
| .WillOnce(
|
| - SetBufferingState(&audio_buffering_state_cb_, BUFFERING_HAVE_ENOUGH));
|
| + SetBufferingState(&audio_renderer_client_, BUFFERING_HAVE_ENOUGH));
|
| EXPECT_CALL(*video_renderer_, StartPlayingFrom(kStartTime));
|
| renderer_impl_->StartPlayingFrom(kStartTime);
|
|
|
|
|