diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/base/mock_reader.h | 91 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer_unittest.cc | 68 | ||||
-rw-r--r-- | media/media.gyp | 1 |
3 files changed, 100 insertions, 60 deletions
diff --git a/media/base/mock_reader.h b/media/base/mock_reader.h new file mode 100644 index 0000000..ad8db88 --- /dev/null +++ b/media/base/mock_reader.h @@ -0,0 +1,91 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this +// source code is governed by a BSD-style license that can be found in the +// LICENSE file. + +#ifndef MEDIA_BASE_MOCK_READER_H_ +#define MEDIA_BASE_MOCK_READER_H_ + +#include <string> + +#include "base/ref_counted.h" +#include "base/waitable_event.h" +#include "media/base/filters.h" + +namespace media { + +// Ref counted object so we can create callbacks for asynchronous Read() +// methods for any filter type. +template <class FilterType, class BufferType> +class MockReader : + public base::RefCountedThreadSafe<MockReader<FilterType, BufferType> > { + public: + MockReader() + : called_(false), + expecting_call_(false), + wait_for_read_(false, false) { + } + + virtual ~MockReader() { + } + + // Prepares this object for another read. + void Reset() { + DCHECK(!expecting_call_); + expecting_call_ = false; + called_ = false; + buffer_ = NULL; + wait_for_read_.Reset(); + } + + // Executes an asynchronous read on the given filter. + void Read(FilterType* filter) { + DCHECK(!expecting_call_); + called_ = false; + expecting_call_ = true; + filter->Read(NewCallback(this, &MockReader::OnReadComplete)); + } + + // Waits 500ms for the read callback to be completed. Returns true if the + // read was completed, false otherwise. + bool WaitForRead() { + return wait_for_read_.TimedWait(base::TimeDelta::FromMilliseconds(500)); + } + + // Mock accessors. + BufferType* buffer() { return buffer_; } + bool called() { return called_; } + bool expecting_call() { return expecting_call_; } + + private: + void OnReadComplete(BufferType* buffer) { + DCHECK(!called_); + DCHECK(expecting_call_); + expecting_call_ = false; + called_ = true; + buffer_ = buffer; + wait_for_read_.Signal(); + } + + // Reference to the buffer provided in the callback. + scoped_refptr<BufferType> buffer_; + + // Whether or not the callback was executed. + bool called_; + + // Whether or not this reader was expecting a callback. + bool expecting_call_; + + // Used by tests to wait for the callback to be executed. + base::WaitableEvent wait_for_read_; + + DISALLOW_COPY_AND_ASSIGN(MockReader); +}; + +// Commonly used reader types. +typedef MockReader<DemuxerStream, Buffer> DemuxerStreamReader; +typedef MockReader<AudioDecoder, Buffer> AudioDecoderReader; +typedef MockReader<VideoDecoder, VideoFrame> VideoDecoderReader; + +} // namespace media + +#endif // MEDIA_BASE_MOCK_READER_H_ diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index 002f6d5..b689616 100644 --- a/media/filters/ffmpeg_demuxer_unittest.cc +++ b/media/filters/ffmpeg_demuxer_unittest.cc @@ -10,6 +10,7 @@ #include "media/base/filters.h" #include "media/base/mock_filter_host.h" #include "media/base/mock_media_filters.h" +#include "media/base/mock_reader.h" #include "media/filters/ffmpeg_common.h" #include "media/filters/ffmpeg_demuxer.h" #include "testing/gtest/include/gtest/gtest.h" @@ -192,60 +193,7 @@ int av_seek_frame(AVFormatContext *format, int stream_index, int64_t timestamp, } // extern "C" -using namespace media; - -namespace { - -// Ref counted object so we can create callbacks to call DemuxerStream::Read(). -class TestReader : public base::RefCountedThreadSafe<TestReader> { - public: - TestReader() - : called_(false), - expecting_call_(false), - wait_for_read_(false, false) { - } - - virtual ~TestReader() {} - - void Reset() { - EXPECT_FALSE(expecting_call_); - expecting_call_ = false; - called_ = false; - buffer_ = NULL; - wait_for_read_.Reset(); - } - - void Read(DemuxerStream* stream) { - EXPECT_FALSE(expecting_call_); - called_ = false; - expecting_call_ = true; - stream->Read(NewCallback(this, &TestReader::ReadComplete)); - } - - void ReadComplete(Buffer* buffer) { - EXPECT_FALSE(called_); - EXPECT_TRUE(expecting_call_); - expecting_call_ = false; - called_ = true; - buffer_ = buffer; - wait_for_read_.Signal(); - } - - bool WaitForRead() { - return wait_for_read_.TimedWait(base::TimeDelta::FromMilliseconds(500)); - } - - // Mock getters/setters. - Buffer* buffer() { return buffer_; } - bool called() { return called_; } - bool expecting_call() { return expecting_call_; } - - private: - scoped_refptr<Buffer> buffer_; - bool called_; - bool expecting_call_; - base::WaitableEvent wait_for_read_; -}; +namespace media { // Fixture class to facilitate writing tests. Takes care of setting up the // FFmpeg, pipeline and filter host mocks. @@ -476,7 +424,7 @@ TEST_F(FFmpegDemuxerTest, ReadAndSeek) { PacketQueue::get()->Enqueue(kPacketAudio, kDataSize, audio_data); // Attempt a read from the audio stream and run the message loop until done. - scoped_refptr<TestReader> reader(new TestReader()); + scoped_refptr<DemuxerStreamReader> reader(new DemuxerStreamReader()); reader->Read(audio_stream); pipeline_->RunAllTasks(); EXPECT_TRUE(reader->WaitForRead()); @@ -523,7 +471,7 @@ TEST_F(FFmpegDemuxerTest, ReadAndSeek) { PacketQueue::get()->Enqueue(kPacketAudio, kDataSize, audio_data); // Audio read #1, should be discontinuous. - reader = new TestReader(); + reader = new DemuxerStreamReader(); reader->Read(audio_stream); pipeline_->RunAllTasks(); EXPECT_TRUE(reader->WaitForRead()); @@ -583,7 +531,7 @@ TEST_F(FFmpegDemuxerTest, ReadAndSeek) { // Attempt a read from video stream, which will force the demuxer to queue // the audio packets preceding the video packet. - reader = new TestReader(); + reader = new DemuxerStreamReader(); reader->Read(video_stream); pipeline_->RunAllTasks(); EXPECT_TRUE(reader->WaitForRead()); @@ -617,7 +565,7 @@ TEST_F(FFmpegDemuxerTest, ReadAndSeek) { g_av_read_frame = AVERROR_IO; // Attempt a read from the audio stream and run the message loop until done. - reader = new TestReader(); + reader = new DemuxerStreamReader(); reader->Read(audio_stream); pipeline_->RunAllTasks(); EXPECT_TRUE(reader->WaitForRead()); @@ -665,7 +613,7 @@ TEST_F(FFmpegDemuxerTest, DISABLED_MP3Hack) { // Audio read should perform a deep copy on the packet and instantly release // the original packet. The data pointers should not be the same, but the // contents should match. - scoped_refptr<TestReader> reader = new TestReader(); + scoped_refptr<DemuxerStreamReader> reader = new DemuxerStreamReader(); reader->Read(audio_stream); pipeline_->RunAllTasks(); EXPECT_TRUE(reader->WaitForRead()); @@ -686,4 +634,4 @@ TEST_F(FFmpegDemuxerTest, DISABLED_MP3Hack) { EXPECT_EQ(0, g_outstanding_packets_av_new_frame); } -} // namespace +} // namespace media diff --git a/media/media.gyp b/media/media.gyp index b6c895b..e3f3b3a 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -152,6 +152,7 @@ 'base/mock_filter_host.h', 'base/mock_media_filters.h', 'base/mock_pipeline.h', + 'base/mock_reader.h', 'base/pipeline_impl_unittest.cc', 'base/run_all_unittests.cc', 'base/seekable_buffer_unittest.cc', |