| Index: media/filters/ffmpeg_demuxer_unittest.cc
|
| diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc
|
| index f5b0e978fe4174b04afd192695c863600fe18938..7c6fcb5b11a77af289907715b71fa152357ae1a1 100644
|
| --- a/media/filters/ffmpeg_demuxer_unittest.cc
|
| +++ b/media/filters/ffmpeg_demuxer_unittest.cc
|
| @@ -83,6 +83,7 @@ class FFmpegDemuxerTest : public testing::Test {
|
|
|
| Demuxer::NeedKeyCB need_key_cb =
|
| base::Bind(&FFmpegDemuxerTest::NeedKeyCB, base::Unretained(this));
|
| +
|
| demuxer_.reset(new FFmpegDemuxer(message_loop_.message_loop_proxy(),
|
| data_source_.get(),
|
| need_key_cb,
|
| @@ -91,13 +92,17 @@ class FFmpegDemuxerTest : public testing::Test {
|
|
|
| MOCK_METHOD1(CheckPoint, void(int v));
|
|
|
| - void InitializeDemuxer() {
|
| + void InitializeDemuxerText(bool enable_text) {
|
| EXPECT_CALL(host_, SetDuration(_));
|
| WaitableMessageLoopEvent event;
|
| - demuxer_->Initialize(&host_, event.GetPipelineStatusCB());
|
| + demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), enable_text);
|
| event.RunAndWaitForStatus(PIPELINE_OK);
|
| }
|
|
|
| + void InitializeDemuxer() {
|
| + InitializeDemuxerText(false);
|
| + }
|
| +
|
| MOCK_METHOD2(OnReadDoneCalled, void(int, int64));
|
|
|
| // Verifies that |buffer| has a specific |size| and |timestamp|.
|
| @@ -199,7 +204,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_OpenFails) {
|
| // Simulate avformat_open_input() failing.
|
| CreateDemuxer("ten_byte_file");
|
| WaitableMessageLoopEvent event;
|
| - demuxer_->Initialize(&host_, event.GetPipelineStatusCB());
|
| + demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), true);
|
| event.RunAndWaitForStatus(DEMUXER_ERROR_COULD_NOT_OPEN);
|
| }
|
|
|
| @@ -217,7 +222,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_NoStreams) {
|
| // Open a file with no streams whatsoever.
|
| CreateDemuxer("no_streams.webm");
|
| WaitableMessageLoopEvent event;
|
| - demuxer_->Initialize(&host_, event.GetPipelineStatusCB());
|
| + demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), true);
|
| event.RunAndWaitForStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
|
| }
|
|
|
| @@ -225,7 +230,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_NoAudioVideo) {
|
| // Open a file containing streams but none of which are audio/video streams.
|
| CreateDemuxer("no_audio_video.webm");
|
| WaitableMessageLoopEvent event;
|
| - demuxer_->Initialize(&host_, event.GetPipelineStatusCB());
|
| + demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), true);
|
| event.RunAndWaitForStatus(DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
|
| }
|
|
|
| @@ -298,6 +303,36 @@ TEST_F(FFmpegDemuxerTest, Initialize_Multitrack) {
|
| EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::UNKNOWN));
|
| }
|
|
|
| +TEST_F(FFmpegDemuxerTest, Initialize_MultitrackText) {
|
| + // Open a file containing the following streams:
|
| + // Stream #0: Video (VP8)
|
| + // Stream #1: Audio (Vorbis)
|
| + // Stream #2: Text (WebVTT)
|
| +
|
| + CreateDemuxer("bear-vp8-webvtt.webm");
|
| + DemuxerStream* text_stream = NULL;
|
| + EXPECT_CALL(host_, AddTextStream(_, _))
|
| + .WillOnce(SaveArg<0>(&text_stream));
|
| + InitializeDemuxerText(true);
|
| + ASSERT_TRUE(text_stream);
|
| + EXPECT_EQ(DemuxerStream::TEXT, text_stream->type());
|
| +
|
| + // Video stream should be VP8.
|
| + DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
|
| + ASSERT_TRUE(stream);
|
| + EXPECT_EQ(DemuxerStream::VIDEO, stream->type());
|
| + EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec());
|
| +
|
| + // Audio stream should be Vorbis.
|
| + stream = demuxer_->GetStream(DemuxerStream::AUDIO);
|
| + ASSERT_TRUE(stream);
|
| + EXPECT_EQ(DemuxerStream::AUDIO, stream->type());
|
| + EXPECT_EQ(kCodecVorbis, stream->audio_decoder_config().codec());
|
| +
|
| + // Unknown stream should never be present.
|
| + EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::UNKNOWN));
|
| +}
|
| +
|
| TEST_F(FFmpegDemuxerTest, Initialize_Encrypted) {
|
| EXPECT_CALL(*this, NeedKeyCBMock(kWebMEncryptInitDataType, NotNull(),
|
| DecryptConfig::kDecryptionKeySize))
|
| @@ -337,6 +372,23 @@ TEST_F(FFmpegDemuxerTest, Read_Video) {
|
| message_loop_.Run();
|
| }
|
|
|
| +TEST_F(FFmpegDemuxerTest, Read_Text) {
|
| + // We test that on a successful text packet read.
|
| + CreateDemuxer("bear-vp8-webvtt.webm");
|
| + DemuxerStream* text_stream = NULL;
|
| + EXPECT_CALL(host_, AddTextStream(_, _))
|
| + .WillOnce(SaveArg<0>(&text_stream));
|
| + InitializeDemuxerText(true);
|
| + ASSERT_TRUE(text_stream);
|
| + EXPECT_EQ(DemuxerStream::TEXT, text_stream->type());
|
| +
|
| + text_stream->Read(NewReadCB(FROM_HERE, 31, 0));
|
| + message_loop_.Run();
|
| +
|
| + text_stream->Read(NewReadCB(FROM_HERE, 19, 500000));
|
| + message_loop_.Run();
|
| +}
|
| +
|
| TEST_F(FFmpegDemuxerTest, Read_VideoNonZeroStart) {
|
| // Test the start time is the first timestamp of the video and audio stream.
|
| CreateDemuxer("nonzero-start-time.webm");
|
| @@ -365,6 +417,26 @@ TEST_F(FFmpegDemuxerTest, Read_EndOfStream) {
|
| ReadUntilEndOfStream();
|
| }
|
|
|
| +TEST_F(FFmpegDemuxerTest, Read_EndOfStreamText) {
|
| + // Verify that end of stream buffers are created.
|
| + CreateDemuxer("bear-vp8-webvtt.webm");
|
| + DemuxerStream* text_stream = NULL;
|
| + EXPECT_CALL(host_, AddTextStream(_, _))
|
| + .WillOnce(SaveArg<0>(&text_stream));
|
| + InitializeDemuxerText(true);
|
| + ASSERT_TRUE(text_stream);
|
| + EXPECT_EQ(DemuxerStream::TEXT, text_stream->type());
|
| +
|
| + bool got_eos_buffer = false;
|
| + const int kMaxBuffers = 10;
|
| + for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) {
|
| + text_stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer));
|
| + message_loop_.Run();
|
| + }
|
| +
|
| + EXPECT_TRUE(got_eos_buffer);
|
| +}
|
| +
|
| TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration) {
|
| // Verify that end of stream buffers are created.
|
| CreateDemuxer("bear-320x240.webm");
|
| @@ -413,6 +485,58 @@ TEST_F(FFmpegDemuxerTest, Seek) {
|
| message_loop_.Run();
|
| }
|
|
|
| +TEST_F(FFmpegDemuxerTest, SeekText) {
|
| + // We're testing that the demuxer frees all queued packets when it receives
|
| + // a Seek().
|
| + CreateDemuxer("bear-vp8-webvtt.webm");
|
| + DemuxerStream* text_stream = NULL;
|
| + EXPECT_CALL(host_, AddTextStream(_, _))
|
| + .WillOnce(SaveArg<0>(&text_stream));
|
| + InitializeDemuxerText(true);
|
| + ASSERT_TRUE(text_stream);
|
| + EXPECT_EQ(DemuxerStream::TEXT, text_stream->type());
|
| +
|
| + // Get our streams.
|
| + DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
|
| + DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
|
| + ASSERT_TRUE(video);
|
| + ASSERT_TRUE(audio);
|
| +
|
| + // Read a text packet and release it.
|
| + text_stream->Read(NewReadCB(FROM_HERE, 31, 0));
|
| + message_loop_.Run();
|
| +
|
| + // Issue a simple forward seek, which should discard queued packets.
|
| + WaitableMessageLoopEvent event;
|
| + demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000),
|
| + event.GetPipelineStatusCB());
|
| + event.RunAndWaitForStatus(PIPELINE_OK);
|
| +
|
| + // Audio read #1.
|
| + audio->Read(NewReadCB(FROM_HERE, 145, 803000));
|
| + message_loop_.Run();
|
| +
|
| + // Audio read #2.
|
| + audio->Read(NewReadCB(FROM_HERE, 148, 826000));
|
| + message_loop_.Run();
|
| +
|
| + // Video read #1.
|
| + video->Read(NewReadCB(FROM_HERE, 5425, 801000));
|
| + message_loop_.Run();
|
| +
|
| + // Video read #2.
|
| + video->Read(NewReadCB(FROM_HERE, 1906, 834000));
|
| + message_loop_.Run();
|
| +
|
| + // Text read #1.
|
| + text_stream->Read(NewReadCB(FROM_HERE, 19, 500000));
|
| + message_loop_.Run();
|
| +
|
| + // Text read #2.
|
| + text_stream->Read(NewReadCB(FROM_HERE, 19, 1000000));
|
| + message_loop_.Run();
|
| +}
|
| +
|
| class MockReadCB {
|
| public:
|
| MockReadCB() {}
|
|
|