Index: media/filters/ffmpeg_demuxer_unittest.cc |
diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc |
index 520b59bf1bd349fc1520613998e7b58f0efb9ea3..c75f34fd7131da3bf4ce8279dcdcf3742b28fd17 100644 |
--- a/media/filters/ffmpeg_demuxer_unittest.cc |
+++ b/media/filters/ffmpeg_demuxer_unittest.cc |
@@ -5,6 +5,7 @@ |
#include <deque> |
#include "base/file_path.h" |
+#include "base/file_util.h" |
#include "base/path_service.h" |
#include "base/threading/thread.h" |
#include "media/base/filters.h" |
@@ -72,16 +73,13 @@ class FFmpegDemuxerTest : public testing::Test { |
// Create an FFmpegDemuxer with local data source. |
demuxer_ = new FFmpegDemuxer(&message_loop_, data_source_, true); |
demuxer_->disable_first_seek_hack_for_testing(); |
- |
- // Inject a filter host and message loop and prepare a data source. |
- demuxer_->set_host(&host_); |
} |
MOCK_METHOD1(CheckPoint, void(int v)); |
void InitializeDemuxer() { |
EXPECT_CALL(host_, SetDuration(_)); |
- demuxer_->Initialize(NewExpectedStatusCB(PIPELINE_OK)); |
+ demuxer_->Initialize(&host_, NewExpectedStatusCB(PIPELINE_OK)); |
message_loop_.RunAllPending(); |
} |
@@ -149,7 +147,8 @@ TEST_F(FFmpegDemuxerTest, Initialize_OpenFails) { |
// Simulate avformat_open_input() failing. |
CreateDemuxer("ten_byte_file"), |
EXPECT_CALL(host_, SetCurrentReadPosition(_)); |
- demuxer_->Initialize(NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); |
+ demuxer_->Initialize( |
+ &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); |
message_loop_.RunAllPending(); |
} |
@@ -160,7 +159,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_OpenFails) { |
//TEST_F(FFmpegDemuxerTest, Initialize_ParseFails) { |
// CreateDemuxer("find_stream_info_fail.webm"); |
// demuxer_->Initialize( |
-// NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_PARSE)); |
+// &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_PARSE)); |
// message_loop_.RunAllPending(); |
//} |
@@ -169,7 +168,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_NoStreams) { |
CreateDemuxer("no_streams.webm"); |
EXPECT_CALL(host_, SetCurrentReadPosition(_)); |
demuxer_->Initialize( |
- NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); |
+ &host_, NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); |
message_loop_.RunAllPending(); |
} |
@@ -177,7 +176,7 @@ TEST_F(FFmpegDemuxerTest, Initialize_NoAudioVideo) { |
// Open a file containing streams but none of which are audio/video streams. |
CreateDemuxer("no_audio_video.webm"); |
demuxer_->Initialize( |
- NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); |
+ &host_, NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); |
message_loop_.RunAllPending(); |
} |
@@ -558,82 +557,49 @@ TEST_F(FFmpegDemuxerTest, DisableAudioStream) { |
EXPECT_TRUE(reader->buffer()->IsEndOfStream()); |
} |
-class MockFFmpegDemuxer : public FFmpegDemuxer { |
- public: |
- MockFFmpegDemuxer(MessageLoop* message_loop, |
- const scoped_refptr<DataSource>& data_source) |
- : FFmpegDemuxer(message_loop, data_source, true) { |
- } |
- virtual ~MockFFmpegDemuxer() {} |
- |
- MOCK_METHOD0(WaitForRead, int()); |
- MOCK_METHOD1(SignalReadCompleted, void(int size)); |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(MockFFmpegDemuxer); |
-}; |
- |
-// A gmock helper method to execute the callback and deletes it. |
-void RunCallback(int size, const DataSource::ReadCB& callback) { |
- DCHECK(!callback.is_null()); |
- callback.Run(size); |
-} |
- |
TEST_F(FFmpegDemuxerTest, ProtocolRead) { |
- scoped_refptr<StrictMock<MockDataSource> > data_source = |
- new StrictMock<MockDataSource>(); |
+ CreateDemuxer("bear-320x240.webm"); |
+ InitializeDemuxer(); |
- EXPECT_CALL(*data_source, Stop(_)) |
- .WillRepeatedly(Invoke(&RunStopFilterCallback)); |
+ // Set read head to zero as Initialize() will have parsed a bit of the file. |
+ int64 position = 0; |
+ EXPECT_TRUE(demuxer_->SetPosition(0)); |
+ EXPECT_TRUE(demuxer_->GetPosition(&position)); |
+ EXPECT_EQ(0, position); |
- // Creates a demuxer. |
- scoped_refptr<MockFFmpegDemuxer> demuxer( |
- new MockFFmpegDemuxer(&message_loop_, data_source)); |
- demuxer->set_host(&host_); |
+ // Read 32 bytes from offset zero and verify position. |
+ uint8 buffer[32]; |
+ EXPECT_EQ(32u, demuxer_->Read(32, buffer)); |
+ EXPECT_EQ(32, current_read_position_); |
+ EXPECT_TRUE(demuxer_->GetPosition(&position)); |
+ EXPECT_EQ(32, position); |
- uint8 kBuffer[1]; |
- InSequence s; |
- // Actions taken in the first read. |
- EXPECT_CALL(*data_source, GetSize(_)) |
- .WillOnce(DoAll(SetArgPointee<0>(1024), Return(true))); |
- EXPECT_CALL(*data_source, Read(0, 512, kBuffer, _)) |
- .WillOnce(WithArgs<1, 3>(Invoke(&RunCallback))); |
- EXPECT_CALL(*demuxer, SignalReadCompleted(512)); |
- EXPECT_CALL(*demuxer, WaitForRead()) |
- .WillOnce(Return(512)); |
- EXPECT_CALL(host_, SetCurrentReadPosition(512)); |
- |
- // Second read. |
- EXPECT_CALL(*data_source, GetSize(_)) |
- .WillOnce(DoAll(SetArgPointee<0>(1024), Return(true))); |
- EXPECT_CALL(*data_source, Read(512, 512, kBuffer, _)) |
- .WillOnce(WithArgs<1, 3>(Invoke(&RunCallback))); |
- EXPECT_CALL(*demuxer, SignalReadCompleted(512)); |
- EXPECT_CALL(*demuxer, WaitForRead()) |
- .WillOnce(Return(512)); |
- EXPECT_CALL(host_, SetCurrentReadPosition(1024)); |
- |
- // Third read will fail because it exceeds the file size. |
- EXPECT_CALL(*data_source, GetSize(_)) |
- .WillOnce(DoAll(SetArgPointee<0>(1024), Return(true))); |
- |
- // First read. |
- EXPECT_EQ(512u, demuxer->Read(512, kBuffer)); |
- int64 position; |
- EXPECT_TRUE(demuxer->GetPosition(&position)); |
- EXPECT_EQ(512, position); |
+ // Read an additional 32 bytes and verify position. |
+ EXPECT_EQ(32u, demuxer_->Read(32, buffer)); |
+ EXPECT_EQ(64, current_read_position_); |
+ EXPECT_TRUE(demuxer_->GetPosition(&position)); |
+ EXPECT_EQ(64, position); |
- // Second read. |
- EXPECT_EQ(512u, demuxer->Read(512, kBuffer)); |
- EXPECT_TRUE(demuxer->GetPosition(&position)); |
- EXPECT_EQ(1024, position); |
+ // Seek to end and read until EOF. |
+ int64 size = 0; |
+ EXPECT_TRUE(demuxer_->GetSize(&size)); |
+ EXPECT_TRUE(demuxer_->SetPosition(size - 48)); |
+ EXPECT_EQ(32u, demuxer_->Read(32, buffer)); |
+ EXPECT_EQ(size - 16, current_read_position_); |
+ EXPECT_TRUE(demuxer_->GetPosition(&position)); |
+ EXPECT_EQ(size - 16, position); |
+ |
+ EXPECT_EQ(16u, demuxer_->Read(32, buffer)); |
+ EXPECT_EQ(size, current_read_position_); |
+ EXPECT_TRUE(demuxer_->GetPosition(&position)); |
+ EXPECT_EQ(size, position); |
- // Third read will get an end-of-file error, which is represented as zero. |
- EXPECT_EQ(0u, demuxer->Read(512, kBuffer)); |
+ EXPECT_EQ(0u, demuxer_->Read(32, buffer)); |
+ EXPECT_EQ(size, current_read_position_); |
+ EXPECT_TRUE(demuxer_->GetPosition(&position)); |
+ EXPECT_EQ(size, position); |
- // This read complete signal is generated when demuxer is stopped. |
- EXPECT_CALL(*demuxer, SignalReadCompleted(DataSource::kReadError)); |
- demuxer->Stop(NewExpectedClosure()); |
+ demuxer_->Stop(NewExpectedClosure()); |
message_loop_.RunAllPending(); |
} |