| Index: media/filters/pipeline_integration_test_base.cc
|
| diff --git a/media/filters/pipeline_integration_test_base.cc b/media/filters/pipeline_integration_test_base.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d6fb480ef452747f3bcfa09bd0c3acad5348a871
|
| --- /dev/null
|
| +++ b/media/filters/pipeline_integration_test_base.cc
|
| @@ -0,0 +1,172 @@
|
| +// Copyright (c) 2012 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.
|
| +
|
| +#include "media/filters/pipeline_integration_test_base.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "media/base/media_log.h"
|
| +#include "media/filters/chunk_demuxer_factory.h"
|
| +#include "media/filters/ffmpeg_audio_decoder.h"
|
| +#include "media/filters/ffmpeg_demuxer_factory.h"
|
| +#include "media/filters/ffmpeg_video_decoder.h"
|
| +#include "media/filters/file_data_source.h"
|
| +#include "media/filters/null_audio_renderer.h"
|
| +#include "media/filters/video_renderer_base.h"
|
| +
|
| +using ::testing::AnyNumber;
|
| +
|
| +namespace media {
|
| +
|
| +PipelineIntegrationTestBase::PipelineIntegrationTestBase()
|
| + : message_loop_factory_(new MessageLoopFactoryImpl()),
|
| + pipeline_(new Pipeline(&message_loop_, new MediaLog())),
|
| + ended_(false),
|
| + pipeline_status_(PIPELINE_OK) {
|
| + EXPECT_CALL(*this, OnVideoRendererPaint()).Times(AnyNumber());
|
| + EXPECT_CALL(*this, OnSetOpaque(true)).Times(AnyNumber());
|
| +}
|
| +
|
| +PipelineIntegrationTestBase::~PipelineIntegrationTestBase() {
|
| + if (!pipeline_->IsRunning())
|
| + return;
|
| +
|
| + Stop();
|
| +}
|
| +
|
| +void PipelineIntegrationTestBase::OnStatusCallback(
|
| + PipelineStatus expected_status,
|
| + PipelineStatus status) {
|
| + EXPECT_EQ(status, expected_status);
|
| + pipeline_status_ = status;
|
| + message_loop_.PostTask(FROM_HERE, MessageLoop::QuitClosure());
|
| +}
|
| +
|
| +PipelineStatusCB PipelineIntegrationTestBase::QuitOnStatusCB(
|
| + PipelineStatus expected_status) {
|
| + return base::Bind(&PipelineIntegrationTestBase::OnStatusCallback,
|
| + base::Unretained(this),
|
| + expected_status);
|
| +}
|
| +
|
| +void PipelineIntegrationTestBase::OnEnded(PipelineStatus status) {
|
| + DCHECK_EQ(status, PIPELINE_OK);
|
| + DCHECK(!ended_);
|
| + ended_ = true;
|
| + message_loop_.PostTask(FROM_HERE, MessageLoop::QuitClosure());
|
| +}
|
| +
|
| +bool PipelineIntegrationTestBase::WaitUntilOnEnded() {
|
| + if (ended_)
|
| + return (pipeline_status_ == PIPELINE_OK);
|
| + message_loop_.Run();
|
| + EXPECT_TRUE(ended_);
|
| + return ended_ && (pipeline_status_ == PIPELINE_OK);
|
| +}
|
| +
|
| +void PipelineIntegrationTestBase::OnError(PipelineStatus status) {
|
| + DCHECK_NE(status, PIPELINE_OK);
|
| + pipeline_status_ = status;
|
| + message_loop_.PostTask(FROM_HERE, MessageLoop::QuitClosure());
|
| +}
|
| +
|
| +bool PipelineIntegrationTestBase::Start(const std::string& url,
|
| + PipelineStatus expected_status) {
|
| + pipeline_->Start(
|
| + CreateFilterCollection(url),
|
| + url,
|
| + base::Bind(&PipelineIntegrationTestBase::OnEnded, base::Unretained(this)),
|
| + base::Bind(&PipelineIntegrationTestBase::OnError, base::Unretained(this)),
|
| + NetworkEventCB(),
|
| + QuitOnStatusCB(expected_status));
|
| + message_loop_.Run();
|
| + return (pipeline_status_ == PIPELINE_OK);
|
| +}
|
| +
|
| +void PipelineIntegrationTestBase::Play() {
|
| + pipeline_->SetPlaybackRate(1);
|
| +}
|
| +
|
| +void PipelineIntegrationTestBase::Pause() {
|
| + pipeline_->SetPlaybackRate(0);
|
| +}
|
| +
|
| +bool PipelineIntegrationTestBase::Seek(base::TimeDelta seek_time) {
|
| + ended_ = false;
|
| +
|
| + pipeline_->Seek(seek_time, QuitOnStatusCB(PIPELINE_OK));
|
| + message_loop_.Run();
|
| + return (pipeline_status_ == PIPELINE_OK);
|
| +}
|
| +
|
| +void PipelineIntegrationTestBase::Stop() {
|
| + DCHECK(pipeline_->IsRunning());
|
| + pipeline_->Stop(QuitOnStatusCB(PIPELINE_OK));
|
| + message_loop_.Run();
|
| +}
|
| +
|
| +void PipelineIntegrationTestBase::QuitAfterCurrentTimeTask(
|
| + const base::TimeDelta& quit_time) {
|
| + if (pipeline_->GetCurrentTime() >= quit_time ||
|
| + pipeline_status_ != PIPELINE_OK) {
|
| + message_loop_.Quit();
|
| + return;
|
| + }
|
| +
|
| + message_loop_.PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&PipelineIntegrationTestBase::QuitAfterCurrentTimeTask,
|
| + base::Unretained(this), quit_time),
|
| + 10);
|
| +}
|
| +
|
| +bool PipelineIntegrationTestBase::WaitUntilCurrentTimeIsAfter(
|
| + const base::TimeDelta& wait_time) {
|
| + DCHECK(pipeline_->IsRunning());
|
| + DCHECK_GT(pipeline_->GetPlaybackRate(), 0);
|
| + DCHECK(wait_time <= pipeline_->GetMediaDuration());
|
| +
|
| + message_loop_.PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&PipelineIntegrationTestBase::QuitAfterCurrentTimeTask,
|
| + base::Unretained(this),
|
| + wait_time),
|
| + 10);
|
| + message_loop_.Run();
|
| + return (pipeline_status_ == PIPELINE_OK);
|
| +}
|
| +
|
| +scoped_ptr<FilterCollection>
|
| +PipelineIntegrationTestBase::CreateFilterCollection(const std::string& url) {
|
| + scoped_refptr<FileDataSource> data_source = new FileDataSource();
|
| + CHECK_EQ(PIPELINE_OK, data_source->Initialize(url));
|
| + return CreateFilterCollection(scoped_ptr<DemuxerFactory>(
|
| + new FFmpegDemuxerFactory(data_source, &message_loop_)));
|
| +}
|
| +
|
| +scoped_ptr<FilterCollection>
|
| +PipelineIntegrationTestBase::CreateFilterCollection(
|
| + ChunkDemuxerClient* client) {
|
| + return CreateFilterCollection(scoped_ptr<DemuxerFactory>(
|
| + new ChunkDemuxerFactory(client)));
|
| +}
|
| +
|
| +scoped_ptr<FilterCollection>
|
| +PipelineIntegrationTestBase::CreateFilterCollection(
|
| + scoped_ptr<DemuxerFactory> demuxer_factory) {
|
| + scoped_ptr<FilterCollection> collection(new FilterCollection());
|
| + collection->SetDemuxerFactory(demuxer_factory.Pass());
|
| + collection->AddAudioDecoder(new FFmpegAudioDecoder(
|
| + message_loop_factory_->GetMessageLoop("AudioDecoderThread")));
|
| + collection->AddVideoDecoder(new FFmpegVideoDecoder(
|
| + message_loop_factory_->GetMessageLoop("VideoDecoderThread")));
|
| + collection->AddVideoRenderer(new VideoRendererBase(
|
| + base::Bind(&PipelineIntegrationTestBase::OnVideoRendererPaint,
|
| + base::Unretained(this)),
|
| + base::Bind(&PipelineIntegrationTestBase::OnSetOpaque,
|
| + base::Unretained(this))));
|
| + collection->AddAudioRenderer(new NullAudioRenderer());
|
| + return collection.Pass();
|
| +}
|
| +
|
| +} // namespace media
|
|
|