| Index: media/filters/ffmpeg_demuxer_unittest.cc
|
| diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc
|
| index 636b75735469e55e16ce6b63f88be85273c23cc1..df66f3f650529db923f3cb4899aaebafa96d86ab 100644
|
| --- a/media/filters/ffmpeg_demuxer_unittest.cc
|
| +++ b/media/filters/ffmpeg_demuxer_unittest.cc
|
| @@ -193,6 +193,10 @@ class FFmpegDemuxerTest : public testing::Test {
|
| return demuxer_->glue_->format_context();
|
| }
|
|
|
| + int preferred_seeking_stream_index() const {
|
| + return demuxer_->preferred_stream_for_seeking_.first;
|
| + }
|
| +
|
| void ReadUntilEndOfStream(DemuxerStream* stream) {
|
| bool got_eos_buffer = false;
|
| const int kMaxBuffers = 170;
|
| @@ -412,6 +416,12 @@ TEST_F(FFmpegDemuxerTest, Read_Text) {
|
| message_loop_.Run();
|
| }
|
|
|
| +TEST_F(FFmpegDemuxerTest, SeekInitialized_NoVideoStartTime) {
|
| + CreateDemuxer("audio-start-time-only.webm");
|
| + InitializeDemuxer();
|
| + EXPECT_EQ(0, preferred_seeking_stream_index());
|
| +}
|
| +
|
| TEST_F(FFmpegDemuxerTest, Read_VideoPositiveStartTime) {
|
| const int64 kTimelineOffsetMs = 1352550896000LL;
|
|
|
| @@ -479,30 +489,82 @@ TEST_F(FFmpegDemuxerTest, Read_AudioNoStartTime) {
|
| }
|
| }
|
|
|
| -TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOggDiscard) {
|
| +TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOggDiscard_Bear) {
|
| // Many ogg files have negative starting timestamps, so ensure demuxing and
|
| // seeking work correctly with a negative start time.
|
| CreateDemuxer("bear.ogv");
|
| InitializeDemuxer();
|
|
|
| + // Attempt a read from the video stream and run the message loop until done.
|
| + DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
|
| + DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
|
| +
|
| // Run the test twice with a seek in between.
|
| for (int i = 0; i < 2; ++i) {
|
| - demuxer_->GetStream(DemuxerStream::AUDIO)->Read(
|
| + audio->Read(
|
| NewReadCBWithCheckedDiscard(FROM_HERE, 40, 0, kInfiniteDuration()));
|
| message_loop_.Run();
|
| - demuxer_->GetStream(DemuxerStream::AUDIO)->Read(
|
| + audio->Read(
|
| NewReadCBWithCheckedDiscard(FROM_HERE, 41, 2903, kInfiniteDuration()));
|
| message_loop_.Run();
|
| - demuxer_->GetStream(DemuxerStream::AUDIO)->Read(NewReadCBWithCheckedDiscard(
|
| + audio->Read(NewReadCBWithCheckedDiscard(
|
| FROM_HERE, 173, 5805, base::TimeDelta::FromMicroseconds(10159)));
|
| message_loop_.Run();
|
|
|
| - demuxer_->GetStream(DemuxerStream::AUDIO)
|
| - ->Read(NewReadCB(FROM_HERE, 148, 18866));
|
| + audio->Read(NewReadCB(FROM_HERE, 148, 18866));
|
| message_loop_.Run();
|
| EXPECT_EQ(base::TimeDelta::FromMicroseconds(-15964),
|
| demuxer_->start_time());
|
|
|
| + video->Read(NewReadCB(FROM_HERE, 5751, 0));
|
| + message_loop_.Run();
|
| +
|
| + video->Read(NewReadCB(FROM_HERE, 846, 33367));
|
| + message_loop_.Run();
|
| +
|
| + video->Read(NewReadCB(FROM_HERE, 1255, 66733));
|
| + message_loop_.Run();
|
| +
|
| + // Seek back to the beginning and repeat the test.
|
| + WaitableMessageLoopEvent event;
|
| + demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB());
|
| + event.RunAndWaitForStatus(PIPELINE_OK);
|
| + }
|
| +}
|
| +
|
| +// Same test above, but using sync2.ogv which has video stream muxed before the
|
| +// audio stream, so seeking based only on start time will fail since ffmpeg is
|
| +// essentially just seeking based on file position.
|
| +TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOggDiscard_Sync) {
|
| + // Many ogg files have negative starting timestamps, so ensure demuxing and
|
| + // seeking work correctly with a negative start time.
|
| + CreateDemuxer("sync2.ogv");
|
| + InitializeDemuxer();
|
| +
|
| + // Attempt a read from the video stream and run the message loop until done.
|
| + DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
|
| + DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
|
| +
|
| + // Run the test twice with a seek in between.
|
| + for (int i = 0; i < 2; ++i) {
|
| + audio->Read(NewReadCBWithCheckedDiscard(
|
| + FROM_HERE, 1, 0, base::TimeDelta::FromMicroseconds(2902)));
|
| + message_loop_.Run();
|
| +
|
| + audio->Read(NewReadCB(FROM_HERE, 1, 2902));
|
| + message_loop_.Run();
|
| + EXPECT_EQ(base::TimeDelta::FromMicroseconds(-2902),
|
| + demuxer_->start_time());
|
| +
|
| + video->Read(NewReadCB(FROM_HERE, 9997, 0));
|
| + message_loop_.Run();
|
| +
|
| + video->Read(NewReadCB(FROM_HERE, 16, 33241));
|
| + message_loop_.Run();
|
| +
|
| + video->Read(NewReadCB(FROM_HERE, 631, 66482));
|
| + message_loop_.Run();
|
| +
|
| // Seek back to the beginning and repeat the test.
|
| WaitableMessageLoopEvent event;
|
| demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB());
|
|
|