Chromium Code Reviews| Index: media/base/android/media_source_player_unittest.cc |
| diff --git a/media/base/android/media_source_player_unittest.cc b/media/base/android/media_source_player_unittest.cc |
| index c730c84792b3c4d056f5a6becd2854b0841b57c2..a9c3572efa2a26f996a0d9eaa2218a0a365a86d9 100644 |
| --- a/media/base/android/media_source_player_unittest.cc |
| +++ b/media/base/android/media_source_player_unittest.cc |
| @@ -135,14 +135,10 @@ class MockDemuxerAndroid : public DemuxerAndroid { |
| : message_loop_(message_loop), |
| num_data_requests_(0), |
| num_seek_requests_(0), |
| - num_browser_seek_requests_(0), |
| - num_config_requests_(0) {} |
| + num_browser_seek_requests_(0) {} |
| virtual ~MockDemuxerAndroid() {} |
| virtual void Initialize(DemuxerAndroidClient* client) OVERRIDE {} |
| - virtual void RequestDemuxerConfigs() OVERRIDE { |
| - num_config_requests_++; |
| - } |
| virtual void RequestDemuxerData(DemuxerStream::Type type) OVERRIDE { |
| num_data_requests_++; |
| if (message_loop_->is_running()) |
| @@ -158,7 +154,6 @@ class MockDemuxerAndroid : public DemuxerAndroid { |
| int num_data_requests() const { return num_data_requests_; } |
| int num_seek_requests() const { return num_seek_requests_; } |
| int num_browser_seek_requests() const { return num_browser_seek_requests_; } |
| - int num_config_requests() const { return num_config_requests_; } |
| private: |
| base::MessageLoop* message_loop_; |
| @@ -172,9 +167,6 @@ class MockDemuxerAndroid : public DemuxerAndroid { |
| // The number of browser seek requests this object has seen. |
| int num_browser_seek_requests_; |
| - // The number of demuxer config requests this object has seen. |
| - int num_config_requests_; |
| - |
| DISALLOW_COPY_AND_ASSIGN(MockDemuxerAndroid); |
| }; |
| @@ -529,6 +521,8 @@ class MediaSourcePlayerTest : public testing::Test { |
| data.access_units[i] = CreateAccessUnitWithData(is_audio, i); |
| data.access_units[config_unit_index].status = DemuxerStream::kConfigChanged; |
| + data.demuxer_configs.resize(1); |
| + data.demuxer_configs[0] = CreateDemuxerConfigs(is_audio, !is_audio); |
| return data; |
| } |
| @@ -603,8 +597,6 @@ class MediaSourcePlayerTest : public testing::Test { |
| void StartConfigChange(bool is_audio, |
| bool config_unit_in_prefetch, |
| int config_unit_index) { |
| - int expected_num_config_requests = demuxer_->num_config_requests(); |
| - |
| EXPECT_FALSE(GetMediaDecoderJob(is_audio)); |
| if (is_audio) { |
| StartAudioDecoderJob(true); |
| @@ -629,19 +621,15 @@ class MediaSourcePlayerTest : public testing::Test { |
| EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
| } |
| - EXPECT_EQ(expected_num_config_requests, demuxer_->num_config_requests()); |
| - |
| // Feed and decode access units with data for any units prior to |
| // |config_unit_index|, and a |kConfigChanged| unit at that index. |
| // Player should prepare to reconfigure the decoder job, and should request |
| // new demuxer configs. |
| player_.OnDemuxerDataAvailable( |
| CreateReadFromDemuxerAckWithConfigChanged(is_audio, config_unit_index)); |
| - WaitForDecodeDone(is_audio, !is_audio); |
| - |
| - expected_num_config_requests++; |
| - EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
| - EXPECT_EQ(expected_num_config_requests, demuxer_->num_config_requests()); |
| + // Run until decoder starts to request new data. |
| + while (demuxer_->num_data_requests() == expected_num_data_requests) |
| + message_loop_.RunUntilIdle(); |
| } |
| void CreateNextTextureAndSetVideoSurface() { |
| @@ -1199,15 +1187,11 @@ TEST_F(MediaSourcePlayerTest, AV_PlaybackCompletionAcrossConfigChange) { |
| Start(CreateAudioVideoDemuxerConfigs(), true); |
| player_.OnDemuxerDataAvailable(CreateEOSAck(true)); // Audio EOS |
| - EXPECT_EQ(0, demuxer_->num_config_requests()); |
| player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged( |
| false, 0)); // Video |kConfigChanged| as first unit. |
| WaitForAudioVideoDecodeDone(); |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| - EXPECT_EQ(2, demuxer_->num_data_requests()); |
| - player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs()); |
| EXPECT_EQ(3, demuxer_->num_data_requests()); |
| // At no time after completing audio EOS decode, above, should the |
| @@ -1227,17 +1211,11 @@ TEST_F(MediaSourcePlayerTest, VA_PlaybackCompletionAcrossConfigChange) { |
| Start(CreateAudioVideoDemuxerConfigs(), true); |
| player_.OnDemuxerDataAvailable(CreateEOSAck(false)); // Video EOS |
| - EXPECT_EQ(0, demuxer_->num_config_requests()); |
| player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged( |
| true, 0)); // Audio |kConfigChanged| as first unit. |
| WaitForAudioVideoDecodeDone(); |
| - // TODO(wolenetz/qinmin): Prevent redundant demuxer config request and change |
| - // expectation to 1 here. See http://crbug.com/325528. |
| - EXPECT_EQ(2, demuxer_->num_config_requests()); |
| - EXPECT_EQ(2, demuxer_->num_data_requests()); |
| - player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs()); |
| EXPECT_EQ(3, demuxer_->num_data_requests()); |
| // At no time after completing video EOS decode, above, should the |
| @@ -1592,9 +1570,7 @@ TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) { |
| // sending an AU with |kConfigChanged|. Player should prepare to reconfigure |
| // the audio decoder job, and should request new demuxer configs. |
| DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged(true, 0); |
| - EXPECT_EQ(0, demuxer_->num_config_requests()); |
| player_.OnDemuxerDataAvailable(data); |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| // Simulate arrival of new configs. |
| player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis)); |
| @@ -1617,28 +1593,16 @@ TEST_F(MediaSourcePlayerTest, SimultaneousAudioVideoConfigChange) { |
| // Simulate audio |kConfigChanged| prefetched as standalone access unit. |
| player_.OnDemuxerDataAvailable( |
| CreateReadFromDemuxerAckWithConfigChanged(true, 0)); |
| - EXPECT_EQ(0, demuxer_->num_config_requests()); // No OnPrefetchDone() yet. |
| // Simulate video |kConfigChanged| prefetched as standalone access unit. |
| player_.OnDemuxerDataAvailable( |
| CreateReadFromDemuxerAckWithConfigChanged(false, 0)); |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); // OnPrefetchDone() occurred. |
| - EXPECT_EQ(2, demuxer_->num_data_requests()); // No more data requested yet. |
| + EXPECT_EQ(4, demuxer_->num_data_requests()); // No more data requested yet. |
|
wolenetz
2014/05/02 22:25:30
nit: remove the incorrect(?) comment
qinmin
2014/05/05 20:52:19
Done.
|
| // No job re-creation should occur until the requested configs arrive. |
|
wolenetz
2014/05/02 22:25:30
nit: adjust the wording of comment: Both jobs shou
qinmin
2014/05/05 20:52:19
Done.
|
| - EXPECT_EQ(first_audio_job, GetMediaDecoderJob(true)); |
| - EXPECT_EQ(first_video_job, GetMediaDecoderJob(false)); |
| - |
| - player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs()); |
| - EXPECT_EQ(4, demuxer_->num_data_requests()); |
| - MediaDecoderJob* second_audio_job = GetMediaDecoderJob(true); |
| - MediaDecoderJob* second_video_job = GetMediaDecoderJob(false); |
| - EXPECT_NE(first_audio_job, second_audio_job); |
| - EXPECT_NE(first_video_job, second_video_job); |
| - EXPECT_TRUE(second_audio_job && second_video_job); |
| - |
| - // Confirm no further demuxer configs requested. |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| + EXPECT_NE(first_audio_job, GetMediaDecoderJob(true)); |
|
wolenetz
2014/05/02 22:25:30
nit: these pointer checks can be flaky. I think we
qinmin
2014/05/05 20:52:19
Done.
|
| + EXPECT_NE(first_video_job, GetMediaDecoderJob(false)); |
| + EXPECT_TRUE(GetMediaDecoderJob(true) && GetMediaDecoderJob(false)); |
| } |
| TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit0) { |
| @@ -1703,90 +1667,27 @@ TEST_F(MediaSourcePlayerTest, BrowserSeek_PrerollAfterBrowserSeek) { |
| TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) { |
| SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| - // Test that video config change notification results in request for demuxer |
| - // configuration, and that a video decoder job results without any browser |
| - // seek necessary once the new demuxer config arrives. |
| + // Test that video config change notification results in creating a new |
| + // video decoder job results without any browser seek. |
| StartConfigChange(false, true, 1); |
| - MediaDecoderJob* first_job = GetMediaDecoderJob(false); |
| - EXPECT_TRUE(first_job); |
| - EXPECT_EQ(1, demuxer_->num_data_requests()); |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| - |
| - // Simulate arrival of new configs. |
| - player_.OnDemuxerConfigsAvailable(CreateVideoDemuxerConfigs()); |
| - |
| - // New video decoder job should have been created and configured, without any |
| - // browser seek. |
| - MediaDecoderJob* second_job = GetMediaDecoderJob(false); |
| - EXPECT_TRUE(second_job); |
| - EXPECT_NE(first_job, second_job); |
| + EXPECT_TRUE(GetMediaDecoderJob(false)); |
| EXPECT_EQ(2, demuxer_->num_data_requests()); |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| EXPECT_EQ(0, demuxer_->num_seek_requests()); |
| } |
| -TEST_F(MediaSourcePlayerTest, VideoConfigChangeContinuesAcrossSeek) { |
| +TEST_F(MediaSourcePlayerTest, NewSurfaceAfterChangingConfigs) { |
| SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| - // Test if a demuxer config request is pending (due to previously receiving |
| - // |kConfigChanged|), and a seek request arrives prior to demuxer configs, |
| - // then seek is processed first, followed by the decoder config change. |
| - // This assumes the demuxer sends |kConfigChanged| read response prior to |
| - // canceling any reads pending seek; no |kAborted| is involved in this test. |
| + // Test that no seek results from a SetVideoSurface() that occurs after |
| + // the player processes new demuxer configs. This test may be good to keep |
| + // beyond browser seek hack. |
| StartConfigChange(false, false, 1); |
| - MediaDecoderJob* first_job = GetMediaDecoderJob(false); |
| - EXPECT_TRUE(first_job); |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| - EXPECT_EQ(2, demuxer_->num_data_requests()); |
| - EXPECT_EQ(0, demuxer_->num_seek_requests()); |
| - |
| - player_.SeekTo(base::TimeDelta::FromMilliseconds(100)); |
| - |
| - // Verify that the seek is requested immediately. |
| - EXPECT_EQ(1, demuxer_->num_seek_requests()); |
| - |
| - // Simulate unlikely delayed arrival of the demuxer configs, completing the |
| - // config change. |
| - // TODO(wolenetz): Is it even possible for requested demuxer configs to be |
| - // delayed until after a SeekTo request arrives? |
| - player_.OnDemuxerConfigsAvailable(CreateVideoDemuxerConfigs()); |
| - |
| - MediaDecoderJob* second_job = GetMediaDecoderJob(false); |
| - EXPECT_NE(first_job, second_job); |
| - EXPECT_TRUE(second_job); |
| - |
| - // Send back the seek done notification. This should finish the seek and |
| - // trigger the player to request more data. |
| - EXPECT_EQ(2, demuxer_->num_data_requests()); |
| - player_.OnDemuxerSeekDone(kNoTimestamp()); |
| + EXPECT_TRUE(GetMediaDecoderJob(false)); |
| EXPECT_EQ(3, demuxer_->num_data_requests()); |
| -} |
| - |
| -TEST_F(MediaSourcePlayerTest, NewSurfaceWhileChangingConfigs) { |
| - SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| - |
| - // Test that no seek or duplicated demuxer config request results from a |
| - // SetVideoSurface() that occurs while the player is expecting new demuxer |
| - // configs. This test may be good to keep beyond browser seek hack. |
| - StartConfigChange(false, false, 1); |
| - MediaDecoderJob* first_job = GetMediaDecoderJob(false); |
| - EXPECT_TRUE(first_job); |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| - EXPECT_EQ(2, demuxer_->num_data_requests()); |
| CreateNextTextureAndSetVideoSurface(); |
| - |
| - // Surface change processing (including decoder job re-creation) should |
| - // not occur until the pending video config change is completed. |
| - EXPECT_EQ(first_job, GetMediaDecoderJob(false)); |
| - |
| - player_.OnDemuxerConfigsAvailable(CreateVideoDemuxerConfigs()); |
| - MediaDecoderJob* second_job = GetMediaDecoderJob(false); |
| - EXPECT_NE(first_job, second_job); |
| - EXPECT_TRUE(second_job); |
| - |
| + EXPECT_TRUE(GetMediaDecoderJob(false)); |
| EXPECT_EQ(3, demuxer_->num_data_requests()); |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| EXPECT_EQ(0, demuxer_->num_seek_requests()); |
| } |
| @@ -1975,19 +1876,15 @@ TEST_F(MediaSourcePlayerTest, ConfigChangedThenReleaseThenConfigsAvailable) { |
| StartConfigChange(true, true, 0); |
| ReleasePlayer(); |
| - player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis)); |
| EXPECT_FALSE(GetMediaDecoderJob(true)); |
| EXPECT_FALSE(player_.IsPlaying()); |
| - EXPECT_EQ(1, demuxer_->num_data_requests()); |
| + EXPECT_EQ(2, demuxer_->num_data_requests()); |
| // Player should resume upon Start(), even without further configs supplied. |
| player_.Start(); |
| EXPECT_TRUE(GetMediaDecoderJob(true)); |
| EXPECT_TRUE(player_.IsPlaying()); |
| EXPECT_EQ(2, demuxer_->num_data_requests()); |
| - |
| - // No further config request should have occurred since StartConfigChange(). |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| } |
| TEST_F(MediaSourcePlayerTest, ConfigChangedThenReleaseThenStart) { |
|
wolenetz
2014/05/02 22:25:30
This test is now entirely a subset of the previous
qinmin
2014/05/05 20:52:19
merged with the above one
On 2014/05/02 22:25:30,
|
| @@ -2001,15 +1898,8 @@ TEST_F(MediaSourcePlayerTest, ConfigChangedThenReleaseThenStart) { |
| player_.Start(); |
| EXPECT_TRUE(player_.IsPlaying()); |
| - EXPECT_FALSE(GetMediaDecoderJob(true)); |
| - EXPECT_EQ(1, demuxer_->num_data_requests()); |
| - |
| - player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis)); |
| EXPECT_TRUE(GetMediaDecoderJob(true)); |
| EXPECT_EQ(2, demuxer_->num_data_requests()); |
| - |
| - // No further config request should have occurred since StartConfigChange(). |
| - EXPECT_EQ(1, demuxer_->num_config_requests()); |
| } |
| TEST_F(MediaSourcePlayerTest, BrowserSeek_ThenReleaseThenDemuxerSeekDone) { |
| @@ -2116,9 +2006,6 @@ TEST_F(MediaSourcePlayerTest, CurrentTimeKeepsIncreasingAfterConfigChange) { |
| DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged(true, 0); |
| player_.OnDemuxerDataAvailable(data); |
| WaitForAudioDecodeDone(); |
| - |
| - // Simulate arrival of new configs. |
| - player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis)); |
| DecodeAudioDataUntilOutputBecomesAvailable(); |
| } |