diff options
author | Torne (Richard Coles) <torne@google.com> | 2013-11-28 11:55:43 +0000 |
---|---|---|
committer | Torne (Richard Coles) <torne@google.com> | 2013-11-28 11:55:43 +0000 |
commit | f2477e01787aa58f445919b809d89e252beef54f (patch) | |
tree | 2db962b4af39f0db3a5f83b314373d0530c484b8 /media/filters/ffmpeg_demuxer_unittest.cc | |
parent | 7daea1dd5ff7e419322de831b642d81af3247912 (diff) | |
download | chromium_org-f2477e01787aa58f445919b809d89e252beef54f.tar.gz |
Merge from Chromium at DEPS revision 237746
This commit was generated by merge_to_master.py.
Change-Id: I8997af4cddfeb09a7c26f7e8e672c712cab461ea
Diffstat (limited to 'media/filters/ffmpeg_demuxer_unittest.cc')
-rw-r--r-- | media/filters/ffmpeg_demuxer_unittest.cc | 134 |
1 files changed, 129 insertions, 5 deletions
diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index f5b0e978fe..7c6fcb5b11 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() {} |