Index: media/filters/ffmpeg_demuxer_unittest.cc |
diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc |
index 4225530af56ace84f41d510283508a68498d263f..f1e4a26ac51bee8da879463387dd92933c450e60 100644 |
--- a/media/filters/ffmpeg_demuxer_unittest.cc |
+++ b/media/filters/ffmpeg_demuxer_unittest.cc |
@@ -532,15 +532,22 @@ TEST_F(FFmpegDemuxerTest, Seeking_PreferredStreamSelection) { |
// prefer the video stream for seeking. |
EXPECT_EQ(video, preferred_seeking_stream(video_start_time)); |
- // A disabled stream should not be preferred for seeking. |
+ // A disabled stream should be preferred only when there's no other viable |
+ // option among enabled streams. |
audio->set_enabled(false, base::TimeDelta()); |
- EXPECT_EQ(video, preferred_seeking_stream(base::TimeDelta())); |
- EXPECT_EQ(video, preferred_seeking_stream(audio_start_time)); |
EXPECT_EQ(video, preferred_seeking_stream(video_start_time)); |
+ // Audio stream is preferred, even though it is disabled, since video stream |
+ // start time is higher than the seek target == audio_start_time in this case. |
+ EXPECT_EQ(audio, preferred_seeking_stream(audio_start_time)); |
audio->set_enabled(true, base::TimeDelta()); |
video->set_enabled(false, base::TimeDelta()); |
- EXPECT_EQ(audio, preferred_seeking_stream(base::TimeDelta())); |
+ EXPECT_EQ(audio, preferred_seeking_stream(audio_start_time)); |
+ EXPECT_EQ(audio, preferred_seeking_stream(video_start_time)); |
+ |
+ // When both audio and video streams are disabled and there's no enabled |
+ // streams, then audio is preferred since it has lower start time. |
+ audio->set_enabled(false, base::TimeDelta()); |
EXPECT_EQ(audio, preferred_seeking_stream(audio_start_time)); |
EXPECT_EQ(audio, preferred_seeking_stream(video_start_time)); |
} |
@@ -1471,4 +1478,38 @@ TEST_F(FFmpegDemuxerTest, Read_Flac) { |
EXPECT_EQ(kSampleFormatS32, audio_config.sample_format()); |
} |
+// Verify that FFmpeg demuxer falls back to choosing disabled streams for |
+// seeking if there's no suitable enabled stream found. |
+TEST_F(FFmpegDemuxerTest, Seek_FallbackToDisabledVideoStream) { |
+ // Input has only video stream, no audio. |
+ CreateDemuxer("bear-320x240-video-only.webm"); |
+ InitializeDemuxer(); |
+ EXPECT_EQ(nullptr, demuxer_->GetStream(DemuxerStream::AUDIO)); |
+ DemuxerStream* vstream = demuxer_->GetStream(DemuxerStream::VIDEO); |
+ EXPECT_NE(nullptr, vstream); |
+ EXPECT_EQ(vstream, preferred_seeking_stream(base::TimeDelta())); |
+ |
+ // Now pretend that video stream got disabled, e.g. due to current tab going |
+ // into background. |
+ vstream->set_enabled(false, base::TimeDelta()); |
+ // Since there's no other enabled streams, the preferred seeking stream should |
+ // still be the video stream. |
+ EXPECT_EQ(vstream, preferred_seeking_stream(base::TimeDelta())); |
+} |
+ |
+TEST_F(FFmpegDemuxerTest, Seek_FallbackToDisabledAudioStream) { |
+ CreateDemuxer("bear-320x240-audio-only.webm"); |
+ InitializeDemuxer(); |
+ DemuxerStream* astream = demuxer_->GetStream(DemuxerStream::AUDIO); |
+ EXPECT_NE(nullptr, astream); |
+ EXPECT_EQ(nullptr, demuxer_->GetStream(DemuxerStream::VIDEO)); |
+ EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); |
+ |
+ // Now pretend that audio stream got disabled. |
+ astream->set_enabled(false, base::TimeDelta()); |
+ // Since there's no other enabled streams, the preferred seeking stream should |
+ // still be the audio stream. |
+ EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); |
+} |
+ |
} // namespace media |