diff options
author | xhwang <xhwang@chromium.org> | 2014-08-28 18:44:15 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-29 01:45:28 +0000 |
commit | 5980590f8c9a20b07192d9f36d33053b1b3ff8c8 (patch) | |
tree | 3b96696d39630b055e780a211f1b0139870c1b70 /media/base | |
parent | ea12516899b23b38bcd006b9b462eaead73f4cb5 (diff) | |
download | chromium_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.gn | 2 | ||||
-rw-r--r-- | media/base/filter_collection.cc | 41 | ||||
-rw-r--r-- | media/base/filter_collection.h | 46 | ||||
-rw-r--r-- | media/base/media_switches.cc | 3 | ||||
-rw-r--r-- | media/base/media_switches.h | 2 | ||||
-rw-r--r-- | media/base/mock_filters.h | 1 | ||||
-rw-r--r-- | media/base/pipeline.cc | 105 | ||||
-rw-r--r-- | media/base/pipeline.h | 29 | ||||
-rw-r--r-- | media/base/pipeline_unittest.cc | 118 | ||||
-rw-r--r-- | media/base/run_all_unittests.cc | 5 |
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(); |