| 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 8050e34c2725bad12b3933dfbe42e2096f1cb0c1..9cb2b411b66c13c8d0c354ffc1db88d428167189 100644
|
| --- a/media/base/android/media_source_player_unittest.cc
|
| +++ b/media/base/android/media_source_player_unittest.cc
|
| @@ -479,12 +479,19 @@ class MediaSourcePlayerTest : public testing::Test {
|
|
|
| // Preroll the decoder job to |target_timestamp|. The first access unit
|
| // to decode will have a timestamp equal to |start_timestamp|.
|
| + // |is_clock_manager| indicates whether the decoder serves as the clock
|
| + // manager for the player.
|
| // TODO(qinmin): Add additional test cases for out-of-order decodes.
|
| // See http://crbug.com/331421.
|
| void PrerollDecoderToTime(bool is_audio,
|
| const base::TimeDelta& start_timestamp,
|
| - const base::TimeDelta& target_timestamp) {
|
| - EXPECT_EQ(target_timestamp, player_.GetCurrentTime());
|
| + const base::TimeDelta& target_timestamp,
|
| + bool is_clock_manager) {
|
| + // For streams with both audio and video, it is possible that audio rolls
|
| + // past the |target_timestamp|. As a result, the current time may be larger
|
| + // than the |target_timestamp| for video as it may not be the clock manager.
|
| + EXPECT_TRUE(!is_clock_manager ||
|
| + target_timestamp == player_.GetCurrentTime());
|
| // |start_timestamp| must be smaller than |target_timestamp|.
|
| EXPECT_LE(start_timestamp, target_timestamp);
|
| DemuxerData data = is_audio ? CreateReadFromDemuxerAckForAudio(1) :
|
| @@ -502,7 +509,8 @@ class MediaSourcePlayerTest : public testing::Test {
|
| player_.OnDemuxerDataAvailable(data);
|
| EXPECT_TRUE(GetMediaDecoderJob(is_audio)->is_decoding());
|
| EXPECT_TRUE(GetMediaCodecBridge(is_audio));
|
| - EXPECT_EQ(target_timestamp, player_.GetCurrentTime());
|
| + EXPECT_TRUE(!is_clock_manager ||
|
| + target_timestamp == player_.GetCurrentTime());
|
| current_timestamp += 30;
|
| WaitForDecodeDone(is_audio, !is_audio);
|
| }
|
| @@ -1516,7 +1524,7 @@ TEST_F(MediaSourcePlayerTest, PrerollAudioAfterSeek) {
|
| SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100));
|
| EXPECT_TRUE(IsPrerolling(true));
|
| PrerollDecoderToTime(
|
| - true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
|
| + true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100), true);
|
| }
|
|
|
| TEST_F(MediaSourcePlayerTest, PrerollVideoAfterSeek) {
|
| @@ -1529,7 +1537,7 @@ TEST_F(MediaSourcePlayerTest, PrerollVideoAfterSeek) {
|
| SeekPlayerWithAbort(false, base::TimeDelta::FromMilliseconds(100));
|
| EXPECT_TRUE(IsPrerolling(false));
|
| PrerollDecoderToTime(
|
| - false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
|
| + false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100), true);
|
| }
|
|
|
| TEST_F(MediaSourcePlayerTest, SeekingAfterCompletingPrerollRestartsPreroll) {
|
| @@ -1607,7 +1615,7 @@ TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossReleaseAndStart) {
|
| EXPECT_TRUE(IsPrerolling(true));
|
|
|
| // Send data after the seek position.
|
| - PrerollDecoderToTime(true, target_timestamp, target_timestamp);
|
| + PrerollDecoderToTime(true, target_timestamp, target_timestamp, true);
|
| }
|
|
|
| TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) {
|
| @@ -1628,8 +1636,9 @@ TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) {
|
| DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged(
|
| true, 0, configs);
|
| player_.OnDemuxerDataAvailable(data);
|
| +
|
| PrerollDecoderToTime(
|
| - true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
|
| + true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100), true);
|
| }
|
|
|
| TEST_F(MediaSourcePlayerTest, PrerollContinuesAfterUnchangedConfigs) {
|
| @@ -1651,7 +1660,59 @@ TEST_F(MediaSourcePlayerTest, PrerollContinuesAfterUnchangedConfigs) {
|
| true, 0, configs);
|
| player_.OnDemuxerDataAvailable(data);
|
| PrerollDecoderToTime(
|
| - true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
|
| + true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100), true);
|
| +}
|
| +
|
| +TEST_F(MediaSourcePlayerTest, AudioPrerollFinishesBeforeVideo) {
|
| + SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
|
| +
|
| + // Test that after audio finishes prerolling, it will wait for video to finish
|
| + // prerolling before advancing together.
|
| + CreateNextTextureAndSetVideoSurface();
|
| + Start(CreateAudioVideoDemuxerConfigs());
|
| +
|
| + // Initiate a seek.
|
| + base::TimeDelta seek_position = base::TimeDelta::FromMilliseconds(100);
|
| + player_.SeekTo(seek_position);
|
| + player_.OnDemuxerDataAvailable(CreateAbortedAck(true));
|
| + player_.OnDemuxerDataAvailable(CreateAbortedAck(false));
|
| + WaitForDecodeDone(true, true);
|
| +
|
| + // Verify that the seek is requested.
|
| + EXPECT_EQ(1, demuxer_->num_seek_requests());
|
| + player_.OnDemuxerSeekDone(kNoTimestamp());
|
| + EXPECT_EQ(4, demuxer_->num_data_requests());
|
| + EXPECT_EQ(player_.GetCurrentTime().InMillisecondsF(), 100.0);
|
| + EXPECT_EQ(GetPrerollTimestamp().InMillisecondsF(), 100.0);
|
| +
|
| + // Send both audio and video data to finish prefetching.
|
| + base::TimeDelta seek_ack_position = base::TimeDelta::FromMilliseconds(70);
|
| + DemuxerData audio_data = CreateReadFromDemuxerAckForAudio(0);
|
| + audio_data.access_units[0].timestamp = seek_ack_position;
|
| + DemuxerData video_data = CreateReadFromDemuxerAckForVideo();
|
| + video_data.access_units[0].timestamp = seek_ack_position;
|
| + player_.OnDemuxerDataAvailable(audio_data);
|
| + player_.OnDemuxerDataAvailable(video_data);
|
| + WaitForAudioDecodeDone();
|
| + WaitForVideoDecodeDone();
|
| +
|
| + // Send audio data at and after the seek position. Audio should finish
|
| + // prerolling and stop decoding.
|
| + EXPECT_EQ(6, demuxer_->num_data_requests());
|
| + PrerollDecoderToTime(true, seek_position, seek_position, true);
|
| + EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding());
|
| + EXPECT_FALSE(IsPrerolling(true));
|
| + EXPECT_TRUE(IsPrerolling(false));
|
| +
|
| + // Send video data to let video finish prerolling.
|
| + PrerollDecoderToTime(false, seek_position, seek_position, false);
|
| + EXPECT_FALSE(IsPrerolling(false));
|
| +
|
| + // Both audio and video decoders should start decoding again.
|
| + player_.OnDemuxerDataAvailable(audio_data);
|
| + player_.OnDemuxerDataAvailable(video_data);
|
| + EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
|
| + EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding());
|
| }
|
|
|
| TEST_F(MediaSourcePlayerTest, SimultaneousAudioVideoConfigChange) {
|
| @@ -1777,7 +1838,7 @@ TEST_F(MediaSourcePlayerTest, BrowserSeek_PrerollAfterBrowserSeek) {
|
| EXPECT_EQ(3, demuxer_->num_data_requests());
|
|
|
| PrerollDecoderToTime(
|
| - false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
|
| + false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100), true);
|
| }
|
|
|
| TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) {
|
|
|