summaryrefslogtreecommitdiffstats
path: root/media/base
diff options
context:
space:
mode:
authorxhwang <xhwang@chromium.org>2014-08-28 18:44:15 -0700
committerCommit bot <commit-bot@chromium.org>2014-08-29 01:45:28 +0000
commit5980590f8c9a20b07192d9f36d33053b1b3ff8c8 (patch)
tree3b96696d39630b055e780a211f1b0139870c1b70 /media/base
parentea12516899b23b38bcd006b9b462eaead73f4cb5 (diff)
downloadchromium_src-5980590f8c9a20b07192d9f36d33053b1b3ff8c8.zip
chromium_src-5980590f8c9a20b07192d9f36d33053b1b3ff8c8.tar.gz
chromium_src-5980590f8c9a20b07192d9f36d33053b1b3ff8c8.tar.bz2
media: Remove FilterCollection.
Now we pass Demuxer and Renderer directly into Pipeline, and create TextRenderer directly in Pipeline. As a result, we don't need FilterCollection anymore. BUG=408602 TEST=All existing tests pass. Review URL: https://codereview.chromium.org/511323003 Cr-Commit-Position: refs/heads/master@{#292542}
Diffstat (limited to 'media/base')
-rw-r--r--media/base/BUILD.gn2
-rw-r--r--media/base/filter_collection.cc41
-rw-r--r--media/base/filter_collection.h46
-rw-r--r--media/base/media_switches.cc3
-rw-r--r--media/base/media_switches.h2
-rw-r--r--media/base/mock_filters.h1
-rw-r--r--media/base/pipeline.cc105
-rw-r--r--media/base/pipeline.h29
-rw-r--r--media/base/pipeline_unittest.cc118
-rw-r--r--media/base/run_all_unittests.cc5
10 files changed, 133 insertions, 219 deletions
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index ef87c32..1fdc8bf 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -79,8 +79,6 @@ source_set("base") {
"demuxer_stream.h",
"djb2.cc",
"djb2.h",
- "filter_collection.cc",
- "filter_collection.h",
"media.cc",
"media.h",
"media_keys.cc",
diff --git a/media/base/filter_collection.cc b/media/base/filter_collection.cc
deleted file mode 100644
index 4535a2f..0000000
--- a/media/base/filter_collection.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// 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/base/filter_collection.h"
-
-#include "media/base/demuxer.h"
-#include "media/base/renderer.h"
-#include "media/base/text_renderer.h"
-
-namespace media {
-
-FilterCollection::FilterCollection() : demuxer_(NULL) {}
-
-FilterCollection::~FilterCollection() {}
-
-void FilterCollection::SetDemuxer(Demuxer* demuxer) {
- demuxer_ = demuxer;
-}
-
-Demuxer* FilterCollection::GetDemuxer() {
- return demuxer_;
-}
-
-void FilterCollection::SetRenderer(scoped_ptr<Renderer> renderer) {
- renderer_ = renderer.Pass();
-}
-
-scoped_ptr<Renderer> FilterCollection::GetRenderer() {
- return renderer_.Pass();
-}
-
-void FilterCollection::SetTextRenderer(scoped_ptr<TextRenderer> text_renderer) {
- text_renderer_ = text_renderer.Pass();
-}
-
-scoped_ptr<TextRenderer> FilterCollection::GetTextRenderer() {
- return text_renderer_.Pass();
-}
-
-} // namespace media
diff --git a/media/base/filter_collection.h b/media/base/filter_collection.h
deleted file mode 100644
index 33c53ba..0000000
--- a/media/base/filter_collection.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// 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.
-
-#ifndef MEDIA_BASE_FILTER_COLLECTION_H_
-#define MEDIA_BASE_FILTER_COLLECTION_H_
-
-#include "base/memory/scoped_ptr.h"
-#include "media/base/media_export.h"
-
-namespace media {
-
-class Demuxer;
-class Renderer;
-class TextRenderer;
-
-// Represents a set of uninitialized demuxer and renderers. Used to start a
-// Pipeline object for media playback.
-//
-// TODO(xhwang): Create TextRenderer in Pipeline, pass Demuxer and Renderer to
-// Pipeline, and remove FilterCollection, see http://crbug.com/110800
-class MEDIA_EXPORT FilterCollection {
- public:
- FilterCollection();
- ~FilterCollection();
-
- void SetDemuxer(Demuxer* demuxer);
- Demuxer* GetDemuxer();
-
- void SetRenderer(scoped_ptr<Renderer> renderer);
- scoped_ptr<Renderer> GetRenderer();
-
- void SetTextRenderer(scoped_ptr<TextRenderer> text_renderer);
- scoped_ptr<TextRenderer> GetTextRenderer();
-
- private:
- Demuxer* demuxer_;
- scoped_ptr<Renderer> renderer_;
- scoped_ptr<TextRenderer> text_renderer_;
-
- DISALLOW_COPY_AND_ASSIGN(FilterCollection);
-};
-
-} // namespace media
-
-#endif // MEDIA_BASE_FILTER_COLLECTION_H_
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 1bb5e98..ad7a7ea 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -94,4 +94,7 @@ const char kUseFakeDeviceForMediaStream[] = "use-fake-device-for-media-stream";
// Use a raw video file as fake video capture device.
const char kUseFileForFakeVideoCapture[] = "use-file-for-fake-video-capture";
+// Enables support for inband text tracks in media content.
+const char kEnableInbandTextTracks[] = "enable-inband-text-tracks";
+
} // namespace switches
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index df621a0..74ba098 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -50,6 +50,8 @@ MEDIA_EXPORT extern const char kUseCras[];
MEDIA_EXPORT extern const char kUseFakeDeviceForMediaStream[];
MEDIA_EXPORT extern const char kUseFileForFakeVideoCapture[];
+MEDIA_EXPORT extern const char kEnableInbandTextTracks[];
+
} // namespace switches
#endif // MEDIA_BASE_MEDIA_SWITCHES_H_
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 1950dcf..fef6050 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -14,7 +14,6 @@
#include "media/base/decoder_buffer.h"
#include "media/base/decryptor.h"
#include "media/base/demuxer.h"
-#include "media/base/filter_collection.h"
#include "media/base/pipeline_status.h"
#include "media/base/renderer.h"
#include "media/base/text_track.h"
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc
index bbdc95f..70aa2a4 100644
--- a/media/base/pipeline.cc
+++ b/media/base/pipeline.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/callback_helpers.h"
+#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/location.h"
#include "base/metrics/histogram.h"
@@ -17,8 +18,8 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/synchronization/condition_variable.h"
-#include "media/base/filter_collection.h"
#include "media/base/media_log.h"
+#include "media/base/media_switches.h"
#include "media/base/renderer.h"
#include "media/base/text_renderer.h"
#include "media/base/text_track_config.h"
@@ -60,13 +61,15 @@ Pipeline::~Pipeline() {
media_log_->CreateEvent(MediaLogEvent::PIPELINE_DESTROYED));
}
-void Pipeline::Start(scoped_ptr<FilterCollection> collection,
+void Pipeline::Start(Demuxer* demuxer,
+ scoped_ptr<Renderer> renderer,
const base::Closure& ended_cb,
const PipelineStatusCB& error_cb,
const PipelineStatusCB& seek_cb,
const PipelineMetadataCB& metadata_cb,
const BufferingStateCB& buffering_state_cb,
- const base::Closure& duration_change_cb) {
+ const base::Closure& duration_change_cb,
+ const AddTextTrackCB& add_text_track_cb) {
DCHECK(!ended_cb.is_null());
DCHECK(!error_cb.is_null());
DCHECK(!seek_cb.is_null());
@@ -77,13 +80,15 @@ void Pipeline::Start(scoped_ptr<FilterCollection> collection,
CHECK(!running_) << "Media pipeline is already running";
running_ = true;
- filter_collection_ = collection.Pass();
+ demuxer_ = demuxer;
+ renderer_ = renderer.Pass();
ended_cb_ = ended_cb;
error_cb_ = error_cb;
seek_cb_ = seek_cb;
metadata_cb_ = metadata_cb;
buffering_state_cb_ = buffering_state_cb;
duration_change_cb_ = duration_change_cb;
+ add_text_track_cb_ = add_text_track_cb;
task_runner_->PostTask(
FROM_HERE, base::Bind(&Pipeline::StartTask, weak_factory_.GetWeakPtr()));
@@ -230,11 +235,7 @@ Pipeline::State Pipeline::GetNextState() const {
return kInitDemuxer;
case kInitDemuxer:
- if (demuxer_->GetStream(DemuxerStream::AUDIO) ||
- demuxer_->GetStream(DemuxerStream::VIDEO)) {
- return kInitRenderer;
- }
- return kPlaying;
+ return kInitRenderer;
case kInitRenderer:
case kSeeking:
@@ -339,29 +340,10 @@ void Pipeline::StateTransitionTask(PipelineStatus status) {
return InitializeRenderer(done_cb);
case kPlaying:
- // Finish initial start sequence the first time we enter the playing
- // state.
+ // Report metadata the first time we enter the playing state.
if (!is_initialized_) {
- if (!renderer_) {
- ErrorChangedTask(PIPELINE_ERROR_COULD_NOT_RENDER);
- return;
- }
-
is_initialized_ = true;
-
- {
- PipelineMetadata metadata;
- metadata.has_audio = renderer_->HasAudio();
- metadata.has_video = renderer_->HasVideo();
- metadata.timeline_offset = demuxer_->GetTimelineOffset();
- DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
- if (stream) {
- metadata.natural_size =
- stream->video_decoder_config().natural_size();
- metadata.video_rotation = stream->video_rotation();
- }
- metadata_cb_.Run(metadata);
- }
+ ReportMetadata();
}
base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
@@ -448,7 +430,6 @@ void Pipeline::OnStopCompleted(PipelineStatus status) {
}
SetState(kStopped);
- filter_collection_.reset();
demuxer_ = NULL;
// If we stop during initialization/seeking we want to run |seek_cb_|
@@ -498,8 +479,7 @@ void Pipeline::StartTask() {
CHECK_EQ(kCreated, state_)
<< "Media pipeline cannot be started more than once";
- text_renderer_ = filter_collection_->GetTextRenderer();
-
+ text_renderer_ = CreateTextRenderer();
if (text_renderer_) {
text_renderer_->Initialize(
base::Bind(&Pipeline::OnTextRendererEnded, weak_factory_.GetWeakPtr()));
@@ -530,9 +510,14 @@ void Pipeline::StopTask(const base::Closure& stop_cb) {
if (state_ == kStopping)
return;
- PipelineStatistics stats = GetStatistics();
- if (renderer_ && renderer_->HasVideo() && stats.video_frames_decoded > 0)
- UMA_HISTOGRAM_COUNTS("Media.DroppedFrameCount", stats.video_frames_dropped);
+ // Do not report statistics if the pipeline is not fully initialized.
+ if (state_ == kSeeking || state_ == kPlaying) {
+ PipelineStatistics stats = GetStatistics();
+ if (renderer_->HasVideo() && stats.video_frames_decoded > 0) {
+ UMA_HISTOGRAM_COUNTS("Media.DroppedFrameCount",
+ stats.video_frames_dropped);
+ }
+ }
SetState(kStopping);
pending_callbacks_.reset();
@@ -642,30 +627,54 @@ void Pipeline::RunEndedCallbackIfNeeded() {
ended_cb_.Run();
}
+scoped_ptr<TextRenderer> Pipeline::CreateTextRenderer() {
+ DCHECK(task_runner_->BelongsToCurrentThread());
+
+ const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
+ if (!cmd_line->HasSwitch(switches::kEnableInbandTextTracks))
+ return scoped_ptr<media::TextRenderer>();
+
+ return scoped_ptr<media::TextRenderer>(new media::TextRenderer(
+ task_runner_,
+ base::Bind(&Pipeline::OnAddTextTrack, weak_factory_.GetWeakPtr())));
+}
+
void Pipeline::AddTextStreamTask(DemuxerStream* text_stream,
const TextTrackConfig& config) {
DCHECK(task_runner_->BelongsToCurrentThread());
// TODO(matthewjheaney): fix up text_ended_ when text stream
// is added (http://crbug.com/321446).
- text_renderer_->AddTextStream(text_stream, config);
+ if (text_renderer_)
+ text_renderer_->AddTextStream(text_stream, config);
}
void Pipeline::RemoveTextStreamTask(DemuxerStream* text_stream) {
DCHECK(task_runner_->BelongsToCurrentThread());
- text_renderer_->RemoveTextStream(text_stream);
+ if (text_renderer_)
+ text_renderer_->RemoveTextStream(text_stream);
}
-void Pipeline::InitializeDemuxer(const PipelineStatusCB& done_cb) {
+void Pipeline::OnAddTextTrack(const TextTrackConfig& config,
+ const AddTextTrackDoneCB& done_cb) {
DCHECK(task_runner_->BelongsToCurrentThread());
+ add_text_track_cb_.Run(config, done_cb);
+}
- demuxer_ = filter_collection_->GetDemuxer();
+void Pipeline::InitializeDemuxer(const PipelineStatusCB& done_cb) {
+ DCHECK(task_runner_->BelongsToCurrentThread());
demuxer_->Initialize(this, done_cb, text_renderer_);
}
void Pipeline::InitializeRenderer(const PipelineStatusCB& done_cb) {
DCHECK(task_runner_->BelongsToCurrentThread());
- renderer_ = filter_collection_->GetRenderer();
+ if (!demuxer_->GetStream(DemuxerStream::AUDIO) &&
+ !demuxer_->GetStream(DemuxerStream::VIDEO)) {
+ renderer_.reset();
+ task_runner_->PostTask(
+ FROM_HERE, base::Bind(done_cb, PIPELINE_ERROR_COULD_NOT_RENDER));
+ return;
+ }
base::WeakPtr<Pipeline> weak_this = weak_factory_.GetWeakPtr();
renderer_->Initialize(
@@ -677,6 +686,20 @@ void Pipeline::InitializeRenderer(const PipelineStatusCB& done_cb) {
base::Bind(&Pipeline::GetMediaDuration, base::Unretained(this)));
}
+void Pipeline::ReportMetadata() {
+ DCHECK(task_runner_->BelongsToCurrentThread());
+ PipelineMetadata metadata;
+ metadata.has_audio = renderer_->HasAudio();
+ metadata.has_video = renderer_->HasVideo();
+ metadata.timeline_offset = demuxer_->GetTimelineOffset();
+ DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
+ if (stream) {
+ metadata.natural_size = stream->video_decoder_config().natural_size();
+ metadata.video_rotation = stream->video_rotation();
+ }
+ metadata_cb_.Run(metadata);
+}
+
void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) {
DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") ";
DCHECK(task_runner_->BelongsToCurrentThread());
diff --git a/media/base/pipeline.h b/media/base/pipeline.h
index fed95a3..37d6684 100644
--- a/media/base/pipeline.h
+++ b/media/base/pipeline.h
@@ -16,6 +16,7 @@
#include "media/base/pipeline_status.h"
#include "media/base/ranges.h"
#include "media/base/serial_runner.h"
+#include "media/base/text_track.h"
#include "media/base/video_rotation.h"
#include "ui/gfx/size.h"
@@ -26,7 +27,6 @@ class TimeDelta;
namespace media {
-class FilterCollection;
class MediaLog;
class Renderer;
class TextRenderer;
@@ -81,12 +81,8 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost {
MediaLog* media_log);
virtual ~Pipeline();
- // Build a pipeline to using the given filter collection to construct a filter
- // chain, executing |seek_cb| when the initial seek has completed.
- //
- // |filter_collection| must be a complete collection containing a demuxer,
- // audio/video decoders, and audio/video renderers. Failing to do so will
- // result in a crash.
+ // Build a pipeline to using the given |demuxer| and |renderer| to construct
+ // a filter chain, executing |seek_cb| when the initial seek has completed.
//
// The following permanent callbacks will be executed as follows up until
// Stop() has completed:
@@ -100,14 +96,17 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost {
// overall buffering state of the pipeline.
// |duration_change_cb| optional callback that will be executed whenever the
// presentation duration changes.
+ // |add_text_track_cb| will be executed whenever a text track is added.
// It is an error to call this method after the pipeline has already started.
- void Start(scoped_ptr<FilterCollection> filter_collection,
+ void Start(Demuxer* demuxer,
+ scoped_ptr<Renderer> renderer,
const base::Closure& ended_cb,
const PipelineStatusCB& error_cb,
const PipelineStatusCB& seek_cb,
const PipelineMetadataCB& metadata_cb,
const BufferingStateCB& buffering_state_cb,
- const base::Closure& duration_change_cb);
+ const base::Closure& duration_change_cb,
+ const AddTextTrackCB& add_text_track_cb);
// Asynchronously stops the pipeline, executing |stop_cb| when the pipeline
// teardown has completed.
@@ -245,6 +244,8 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost {
void OnTextRendererEnded();
void RunEndedCallbackIfNeeded();
+ scoped_ptr<TextRenderer> CreateTextRenderer();
+
// Carries out adding a new text stream to the text renderer.
void AddTextStreamTask(DemuxerStream* text_stream,
const TextTrackConfig& config);
@@ -252,6 +253,10 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost {
// Carries out removing a text stream from the text renderer.
void RemoveTextStreamTask(DemuxerStream* text_stream);
+ // Callbacks executed when a text track is added.
+ void OnAddTextTrack(const TextTrackConfig& config,
+ const AddTextTrackDoneCB& done_cb);
+
// Kicks off initialization for each media object, executing |done_cb| with
// the result when completed.
void InitializeDemuxer(const PipelineStatusCB& done_cb);
@@ -269,6 +274,8 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost {
void DoStop(const PipelineStatusCB& done_cb);
void OnStopCompleted(PipelineStatus status);
+ void ReportMetadata();
+
void BufferingStateChanged(BufferingState new_buffering_state);
// Task runner used to execute pipeline tasks.
@@ -336,9 +343,7 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost {
PipelineMetadataCB metadata_cb_;
BufferingStateCB buffering_state_cb_;
base::Closure duration_change_cb_;
-
- // Contains the demuxer and renderers to use when initializing.
- scoped_ptr<FilterCollection> filter_collection_;
+ AddTextTrackCB add_text_track_cb_;
// Holds the initialized demuxer. Used for seeking. Owned by client.
Demuxer* demuxer_;
diff --git a/media/base/pipeline_unittest.cc b/media/base/pipeline_unittest.cc
index c064df4..fe5df60 100644
--- a/media/base/pipeline_unittest.cc
+++ b/media/base/pipeline_unittest.cc
@@ -86,21 +86,9 @@ class PipelineTest : public ::testing::Test {
PipelineTest()
: pipeline_(new Pipeline(message_loop_.message_loop_proxy(),
new MediaLog())),
- filter_collection_(new FilterCollection()),
- demuxer_(new StrictMock<MockDemuxer>()) {
- filter_collection_->SetDemuxer(demuxer_.get());
-
- renderer_ = new StrictMock<MockRenderer>();
- scoped_ptr<Renderer> renderer(renderer_);
- filter_collection_->SetRenderer(renderer.Pass());
-
- text_renderer_ = new TextRenderer(
- message_loop_.message_loop_proxy(),
- base::Bind(&PipelineTest::OnAddTextTrack,
- base::Unretained(this)));
- scoped_ptr<TextRenderer> text_renderer(text_renderer_);
- filter_collection_->SetTextRenderer(text_renderer.Pass());
-
+ demuxer_(new StrictMock<MockDemuxer>()),
+ scoped_renderer_(new StrictMock<MockRenderer>()),
+ renderer_(scoped_renderer_.get()) {
// SetDemuxerExpectations() adds overriding expectations for expected
// non-NULL streams.
DemuxerStream* null_pointer = NULL;
@@ -191,9 +179,24 @@ class PipelineTest : public ::testing::Test {
message_loop_.RunUntilIdle();
}
+ void StartPipeline() {
+ pipeline_->Start(
+ demuxer_.get(),
+ scoped_renderer_.PassAs<Renderer>(),
+ base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
+ base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
+ base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)),
+ base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)),
+ base::Bind(&CallbackHelper::OnBufferingStateChange,
+ base::Unretained(&callbacks_)),
+ base::Bind(&CallbackHelper::OnDurationChange,
+ base::Unretained(&callbacks_)),
+ base::Bind(&PipelineTest::OnAddTextTrack, base::Unretained(this)));
+ }
+
// Sets up expectations on the callback and initializes the pipeline. Called
// after tests have set expectations any filters they wish to use.
- void StartPipeline(PipelineStatus start_status) {
+ void StartPipelineAndExpect(PipelineStatus start_status) {
EXPECT_CALL(callbacks_, OnStart(start_status));
if (start_status == PIPELINE_OK) {
@@ -206,16 +209,7 @@ class PipelineTest : public ::testing::Test {
EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
}
- pipeline_->Start(
- filter_collection_.Pass(),
- base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnBufferingStateChange,
- base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnDurationChange,
- base::Unretained(&callbacks_)));
+ StartPipeline();
message_loop_.RunUntilIdle();
}
@@ -307,8 +301,8 @@ class PipelineTest : public ::testing::Test {
base::MessageLoop message_loop_;
scoped_ptr<Pipeline> pipeline_;
- scoped_ptr<FilterCollection> filter_collection_;
scoped_ptr<StrictMock<MockDemuxer> > demuxer_;
+ scoped_ptr<StrictMock<MockRenderer> > scoped_renderer_;
StrictMock<MockRenderer>* renderer_;
StrictMock<CallbackHelper> text_renderer_callbacks_;
TextRenderer* text_renderer_;
@@ -357,16 +351,7 @@ TEST_F(PipelineTest, NeverInitializes) {
// This test hangs during initialization by never calling
// InitializationComplete(). StrictMock<> will ensure that the callback is
// never executed.
- pipeline_->Start(
- filter_collection_.Pass(),
- base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnBufferingStateChange,
- base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnDurationChange,
- base::Unretained(&callbacks_)));
+ StartPipeline();
message_loop_.RunUntilIdle();
// Because our callback will get executed when the test tears down, we'll
@@ -390,17 +375,7 @@ TEST_F(PipelineTest, StartThenStopImmediately) {
.WillOnce(RunClosure<0>());
EXPECT_CALL(callbacks_, OnStart(_));
-
- pipeline_->Start(
- filter_collection_.Pass(),
- base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnBufferingStateChange,
- base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnDurationChange,
- base::Unretained(&callbacks_)));
+ StartPipeline();
// Expect a stop callback if we were started.
ExpectPipelineStopAndDestroyPipeline();
@@ -417,7 +392,7 @@ TEST_F(PipelineTest, DemuxerErrorDuringStop) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
EXPECT_CALL(*demuxer_, Stop(_))
.WillOnce(DoAll(InvokeWithoutArgs(this, &PipelineTest::OnDemuxerError),
@@ -435,7 +410,7 @@ TEST_F(PipelineTest, URLNotFound) {
EXPECT_CALL(*demuxer_, Stop(_))
.WillOnce(RunClosure<0>());
- StartPipeline(PIPELINE_ERROR_URL_NOT_FOUND);
+ StartPipelineAndExpect(PIPELINE_ERROR_URL_NOT_FOUND);
}
TEST_F(PipelineTest, NoStreams) {
@@ -444,7 +419,7 @@ TEST_F(PipelineTest, NoStreams) {
EXPECT_CALL(*demuxer_, Stop(_))
.WillOnce(RunClosure<0>());
- StartPipeline(PIPELINE_ERROR_COULD_NOT_RENDER);
+ StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER);
}
TEST_F(PipelineTest, AudioStream) {
@@ -455,7 +430,7 @@ TEST_F(PipelineTest, AudioStream) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
EXPECT_TRUE(metadata_.has_audio);
EXPECT_FALSE(metadata_.has_video);
}
@@ -468,7 +443,7 @@ TEST_F(PipelineTest, VideoStream) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
EXPECT_FALSE(metadata_.has_audio);
EXPECT_TRUE(metadata_.has_video);
}
@@ -483,7 +458,7 @@ TEST_F(PipelineTest, AudioVideoStream) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
EXPECT_TRUE(metadata_.has_audio);
EXPECT_TRUE(metadata_.has_video);
}
@@ -497,7 +472,7 @@ TEST_F(PipelineTest, VideoTextStream) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
EXPECT_FALSE(metadata_.has_audio);
EXPECT_TRUE(metadata_.has_video);
@@ -515,7 +490,7 @@ TEST_F(PipelineTest, VideoAudioTextStream) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
EXPECT_TRUE(metadata_.has_audio);
EXPECT_TRUE(metadata_.has_video);
@@ -534,7 +509,7 @@ TEST_F(PipelineTest, Seek) {
SetRendererExpectations();
// Initialize then seek!
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
// Every filter should receive a call to Seek().
base::TimeDelta expected = base::TimeDelta::FromSeconds(2000);
@@ -551,7 +526,7 @@ TEST_F(PipelineTest, SeekAfterError) {
SetRendererExpectations();
// Initialize then seek!
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
EXPECT_CALL(*demuxer_, Stop(_))
.WillOnce(RunClosure<0>());
@@ -580,7 +555,7 @@ TEST_F(PipelineTest, SetVolume) {
EXPECT_CALL(*renderer_, SetVolume(expected));
// Initialize then set volume!
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
pipeline_->SetVolume(expected);
}
@@ -593,7 +568,7 @@ TEST_F(PipelineTest, Properties) {
SetDemuxerExpectations(&streams, kDuration);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
EXPECT_EQ(kDuration.ToInternalValue(),
pipeline_->GetMediaDuration().ToInternalValue());
EXPECT_FALSE(pipeline_->DidLoadingProgress());
@@ -608,7 +583,7 @@ TEST_F(PipelineTest, GetBufferedTimeRanges) {
SetDemuxerExpectations(&streams, kDuration);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size());
@@ -637,7 +612,7 @@ TEST_F(PipelineTest, EndedCallback) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
AddTextStream();
@@ -657,7 +632,7 @@ TEST_F(PipelineTest, ErrorDuringSeek) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
float playback_rate = 1.0f;
EXPECT_CALL(*renderer_, SetPlaybackRate(playback_rate));
@@ -709,7 +684,7 @@ TEST_F(PipelineTest, NoMessageDuringTearDownFromError) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
// Trigger additional requests on the pipeline during tear down from error.
base::Callback<void(PipelineStatus)> cb = base::Bind(
@@ -743,7 +718,7 @@ TEST_F(PipelineTest, DestroyAfterStop) {
streams.push_back(audio_stream());
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
ExpectDemuxerStop();
@@ -762,7 +737,7 @@ TEST_F(PipelineTest, Underflow) {
SetDemuxerExpectations(&streams);
SetRendererExpectations();
- StartPipeline(PIPELINE_OK);
+ StartPipelineAndExpect(PIPELINE_OK);
// Simulate underflow.
EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
@@ -822,16 +797,7 @@ class PipelineTeardownTest : public PipelineTest {
SetInitializeExpectations(state, stop_or_error);
EXPECT_CALL(callbacks_, OnStart(expected_status));
- pipeline_->Start(
- filter_collection_.Pass(),
- base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnBufferingStateChange,
- base::Unretained(&callbacks_)),
- base::Bind(&CallbackHelper::OnDurationChange,
- base::Unretained(&callbacks_)));
+ StartPipeline();
message_loop_.RunUntilIdle();
}
diff --git a/media/base/run_all_unittests.cc b/media/base/run_all_unittests.cc
index 985a46e..450da76 100644
--- a/media/base/run_all_unittests.cc
+++ b/media/base/run_all_unittests.cc
@@ -3,10 +3,12 @@
// found in the LICENSE file.
#include "base/bind.h"
+#include "base/command_line.h"
#include "base/test/launcher/unit_test_launcher.h"
#include "base/test/test_suite.h"
#include "build/build_config.h"
#include "media/base/media.h"
+#include "media/base/media_switches.h"
#if defined(OS_ANDROID)
#include "base/android/jni_android.h"
@@ -26,6 +28,9 @@ void TestSuiteNoAtExit::Initialize() {
// Run TestSuite::Initialize first so that logging is initialized.
base::TestSuite::Initialize();
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ command_line->AppendSwitch(switches::kEnableInbandTextTracks);
+
#if defined(OS_ANDROID)
// Register JNI bindings for android.
JNIEnv* env = base::android::AttachCurrentThread();