diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/base/audio_renderer.h | 5 | ||||
-rw-r--r-- | media/base/demuxer.h | 8 | ||||
-rw-r--r-- | media/base/media_log.cc | 2 | ||||
-rw-r--r-- | media/base/media_log_event.h | 4 | ||||
-rw-r--r-- | media/base/mock_filters.h | 3 | ||||
-rw-r--r-- | media/base/pipeline.cc | 35 | ||||
-rw-r--r-- | media/base/pipeline.h | 11 | ||||
-rw-r--r-- | media/base/pipeline_unittest.cc | 88 | ||||
-rw-r--r-- | media/filters/audio_renderer_impl.cc | 9 | ||||
-rw-r--r-- | media/filters/audio_renderer_impl.h | 2 | ||||
-rw-r--r-- | media/filters/audio_renderer_impl_unittest.cc | 12 | ||||
-rw-r--r-- | media/filters/chunk_demuxer.cc | 6 | ||||
-rw-r--r-- | media/filters/chunk_demuxer.h | 4 | ||||
-rw-r--r-- | media/filters/chunk_demuxer_unittest.cc | 20 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.cc | 24 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.h | 5 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer_unittest.cc | 34 |
17 files changed, 40 insertions, 232 deletions
diff --git a/media/base/audio_renderer.h b/media/base/audio_renderer.h index bcc06b1..2896857 100644 --- a/media/base/audio_renderer.h +++ b/media/base/audio_renderer.h @@ -38,10 +38,6 @@ class MEDIA_EXPORT AudioRenderer { // // |ended_cb| is executed when audio rendering has reached the end of stream. // - // |disabled_cb| is executed when audio rendering has been disabled due to - // external factors (i.e., device was removed). |time_cb| will no longer be - // executed. TODO(scherkus): this might not be needed http://crbug.com/234708 - // // |error_cb| is executed if an error was encountered. virtual void Initialize(DemuxerStream* stream, const PipelineStatusCB& init_cb, @@ -49,7 +45,6 @@ class MEDIA_EXPORT AudioRenderer { const base::Closure& underflow_cb, const TimeCB& time_cb, const base::Closure& ended_cb, - const base::Closure& disabled_cb, const PipelineStatusCB& error_cb) = 0; // Start audio decoding and rendering at the current playback rate, executing diff --git a/media/base/demuxer.h b/media/base/demuxer.h index 24ea281..c9c851c 100644 --- a/media/base/demuxer.h +++ b/media/base/demuxer.h @@ -78,14 +78,6 @@ class MEDIA_EXPORT Demuxer { // call any method (including Stop()) after a demuxer has stopped. virtual void Stop(const base::Closure& callback) = 0; - // This method is called from the pipeline when the audio renderer - // is disabled. Demuxers can ignore the notification if they do not - // need to react to this event. - // - // TODO(acolwell): Change to generic DisableStream(DemuxerStream::Type). - // TODO(scherkus): this might not be needed http://crbug.com/234708 - virtual void OnAudioRendererDisabled() = 0; - // Returns the first stream of the given stream type (which is not allowed // to be DemuxerStream::TEXT), or NULL if that type of stream is not present. virtual DemuxerStream* GetStream(DemuxerStream::Type type) = 0; diff --git a/media/base/media_log.cc b/media/base/media_log.cc index c689d7a..5e1ed76 100644 --- a/media/base/media_log.cc +++ b/media/base/media_log.cc @@ -52,8 +52,6 @@ const char* MediaLog::EventTypeToString(MediaLogEvent::Type type) { return "VIDEO_ENDED"; case MediaLogEvent::TEXT_ENDED: return "TEXT_ENDED"; - case MediaLogEvent::AUDIO_RENDERER_DISABLED: - return "AUDIO_RENDERER_DISABLED"; case MediaLogEvent::BUFFERED_EXTENTS_CHANGED: return "BUFFERED_EXTENTS_CHANGED"; case MediaLogEvent::MEDIA_SOURCE_ERROR: diff --git a/media/base/media_log_event.h b/media/base/media_log_event.h index 3052d41..fe3da97 100644 --- a/media/base/media_log_event.h +++ b/media/base/media_log_event.h @@ -75,10 +75,6 @@ struct MediaLogEvent { VIDEO_ENDED, TEXT_ENDED, - // The audio renderer has been disabled. - // params: none. - AUDIO_RENDERER_DISABLED, - // The extents of the sliding buffer have changed. // params: "buffer_start": <first buffered byte>. // "buffer_current": <current offset>. diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h index c7b7321..95c91d2 100644 --- a/media/base/mock_filters.h +++ b/media/base/mock_filters.h @@ -139,13 +139,12 @@ class MockAudioRenderer : public AudioRenderer { virtual ~MockAudioRenderer(); // AudioRenderer implementation. - MOCK_METHOD8(Initialize, void(DemuxerStream* stream, + MOCK_METHOD7(Initialize, void(DemuxerStream* stream, const PipelineStatusCB& init_cb, const StatisticsCB& statistics_cb, const base::Closure& underflow_cb, const TimeCB& time_cb, const base::Closure& ended_cb, - const base::Closure& disabled_cb, const PipelineStatusCB& error_cb)); MOCK_METHOD1(Play, void(const base::Closure& callback)); MOCK_METHOD1(Pause, void(const base::Closure& callback)); diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc index 89097a9..385db3a 100644 --- a/media/base/pipeline.cc +++ b/media/base/pipeline.cc @@ -48,7 +48,6 @@ Pipeline::Pipeline( audio_ended_(false), video_ended_(false), text_ended_(false), - audio_disabled_(false), demuxer_(NULL), creation_time_(default_tick_clock_.NowTicks()) { media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); @@ -295,22 +294,11 @@ void Pipeline::SetError(PipelineStatus error) { media_log_->AddEvent(media_log_->CreatePipelineErrorEvent(error)); } -void Pipeline::OnAudioDisabled() { - DCHECK(IsRunning()); - task_runner_->PostTask(FROM_HERE, base::Bind( - &Pipeline::AudioDisabledTask, base::Unretained(this))); - media_log_->AddEvent( - media_log_->CreateEvent(MediaLogEvent::AUDIO_RENDERER_DISABLED)); -} - void Pipeline::OnAudioTimeUpdate(TimeDelta time, TimeDelta max_time) { DCHECK_LE(time.InMicroseconds(), max_time.InMicroseconds()); DCHECK(IsRunning()); base::AutoLock auto_lock(lock_); - if (audio_disabled_) - return; - if (waiting_for_clock_update_ && time < clock_->Elapsed()) return; @@ -327,7 +315,7 @@ void Pipeline::OnVideoTimeUpdate(TimeDelta max_time) { DCHECK(IsRunning()); base::AutoLock auto_lock(lock_); - if (audio_renderer_ && !audio_disabled_) + if (audio_renderer_) return; // TODO(scherkus): |state_| should only be accessed on pipeline thread, see @@ -433,7 +421,7 @@ void Pipeline::StateTransitionTask(PipelineStatus status) { // We use audio stream to update the clock. So if there is such a // stream, we pause the clock until we receive a valid timestamp. waiting_for_clock_update_ = true; - if (!audio_renderer_ || audio_disabled_) { + if (!audio_renderer_) { clock_->SetMaxTime(clock_->Duration()); StartClockIfWaitingForTimeUpdate_Locked(); } @@ -793,7 +781,7 @@ void Pipeline::DoAudioRendererEnded() { audio_ended_ = true; // Start clock since there is no more audio to trigger clock updates. - if (!audio_disabled_) { + { base::AutoLock auto_lock(lock_); clock_->SetMaxTime(clock_->Duration()); StartClockIfWaitingForTimeUpdate_Locked(); @@ -829,7 +817,7 @@ void Pipeline::DoTextRendererEnded() { void Pipeline::RunEndedCallbackIfNeeded() { DCHECK(task_runner_->BelongsToCurrentThread()); - if (audio_renderer_ && !audio_ended_ && !audio_disabled_) + if (audio_renderer_ && !audio_ended_) return; if (video_renderer_ && !video_ended_) @@ -847,20 +835,6 @@ void Pipeline::RunEndedCallbackIfNeeded() { ended_cb_.Run(); } -void Pipeline::AudioDisabledTask() { - DCHECK(task_runner_->BelongsToCurrentThread()); - - base::AutoLock auto_lock(lock_); - audio_disabled_ = true; - - // Notify our demuxer that we're no longer rendering audio. - demuxer_->OnAudioRendererDisabled(); - - // Start clock since there is no more audio to trigger clock updates. - clock_->SetMaxTime(clock_->Duration()); - StartClockIfWaitingForTimeUpdate_Locked(); -} - void Pipeline::AddTextStreamTask(DemuxerStream* text_stream, const TextTrackConfig& config) { DCHECK(task_runner_->BelongsToCurrentThread()); @@ -892,7 +866,6 @@ void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) { base::Bind(&Pipeline::OnAudioUnderflow, base::Unretained(this)), base::Bind(&Pipeline::OnAudioTimeUpdate, base::Unretained(this)), base::Bind(&Pipeline::OnAudioRendererEnded, base::Unretained(this)), - base::Bind(&Pipeline::OnAudioDisabled, base::Unretained(this)), base::Bind(&Pipeline::SetError, base::Unretained(this))); } diff --git a/media/base/pipeline.h b/media/base/pipeline.h index f19bcd1..c4de1ce 100644 --- a/media/base/pipeline.h +++ b/media/base/pipeline.h @@ -182,8 +182,6 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost { private: FRIEND_TEST_ALL_PREFIXES(PipelineTest, GetBufferedTimeRanges); - FRIEND_TEST_ALL_PREFIXES(PipelineTest, DisableAudioRenderer); - FRIEND_TEST_ALL_PREFIXES(PipelineTest, DisableAudioRendererDuringInit); FRIEND_TEST_ALL_PREFIXES(PipelineTest, EndedCallback); FRIEND_TEST_ALL_PREFIXES(PipelineTest, AudioStreamShorterThanVideo); friend class MediaLog; @@ -234,9 +232,6 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost { // Callback executed by filters to update statistics. void OnUpdateStatistics(const PipelineStatistics& stats); - // Callback executed by audio renderer when it has been disabled. - void OnAudioDisabled(); - // Callback executed by audio renderer to update clock time. void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time); @@ -270,9 +265,6 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost { void DoTextRendererEnded(); void RunEndedCallbackIfNeeded(); - // Carries out disabling the audio renderer. - void AudioDisabledTask(); - // Carries out adding a new text stream to the text renderer. void AddTextStreamTask(DemuxerStream* text_stream, const TextTrackConfig& config); @@ -385,9 +377,6 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost { bool video_ended_; bool text_ended_; - // Set to true in DisableAudioRendererTask(). - bool audio_disabled_; - // Temporary callback used for Start() and Seek(). PipelineStatusCB seek_cb_; diff --git a/media/base/pipeline_unittest.cc b/media/base/pipeline_unittest.cc index fddb057..56ad2ac 100644 --- a/media/base/pipeline_unittest.cc +++ b/media/base/pipeline_unittest.cc @@ -180,17 +180,10 @@ class PipelineTest : public ::testing::Test { } // Sets up expectations to allow the audio renderer to initialize. - void InitializeAudioRenderer(DemuxerStream* stream, - bool disable_after_init_cb) { - if (disable_after_init_cb) { - EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) - .WillOnce(DoAll(RunCallback<1>(PIPELINE_OK), - WithArg<6>(RunClosure<0>()))); // |disabled_cb|. - } else { - EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) - .WillOnce(DoAll(SaveArg<4>(&audio_time_cb_), - RunCallback<1>(PIPELINE_OK))); - } + void InitializeAudioRenderer(DemuxerStream* stream) { + EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _)) + .WillOnce(DoAll(SaveArg<4>(&audio_time_cb_), + RunCallback<1>(PIPELINE_OK))); } void AddTextStream() { @@ -427,7 +420,7 @@ TEST_F(PipelineTest, AudioStream) { streams.push_back(audio_stream()); InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializePipeline(PIPELINE_OK); EXPECT_TRUE(metadata_.has_audio); @@ -455,7 +448,7 @@ TEST_F(PipelineTest, AudioVideoStream) { streams.push_back(video_stream()); InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializeVideoRenderer(video_stream()); InitializePipeline(PIPELINE_OK); @@ -490,7 +483,7 @@ TEST_F(PipelineTest, VideoAudioTextStream) { InitializeDemuxer(&streams); InitializeVideoRenderer(video_stream()); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializePipeline(PIPELINE_OK); EXPECT_TRUE(metadata_.has_audio); @@ -509,7 +502,7 @@ TEST_F(PipelineTest, Seek) { streams.push_back(video_stream()); InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializeVideoRenderer(video_stream()); // Initialize then seek! @@ -530,7 +523,7 @@ TEST_F(PipelineTest, SetVolume) { streams.push_back(audio_stream()); InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); // The audio renderer should receive a call to SetVolume(). float expected = 0.5f; @@ -584,51 +577,6 @@ TEST_F(PipelineTest, GetBufferedTimeRanges) { EXPECT_FALSE(pipeline_->DidLoadingProgress()); } -TEST_F(PipelineTest, DisableAudioRenderer) { - CreateAudioStream(); - CreateVideoStream(); - MockDemuxerStreamVector streams; - streams.push_back(audio_stream()); - streams.push_back(video_stream()); - - InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), false); - InitializeVideoRenderer(video_stream()); - - InitializePipeline(PIPELINE_OK); - EXPECT_TRUE(metadata_.has_audio); - EXPECT_TRUE(metadata_.has_video); - - EXPECT_CALL(*demuxer_, OnAudioRendererDisabled()); - pipeline_->OnAudioDisabled(); - - // Verify that ended event is fired when video ends. - EXPECT_CALL(callbacks_, OnEnded()); - pipeline_->OnVideoRendererEnded(); -} - -TEST_F(PipelineTest, DisableAudioRendererDuringInit) { - CreateAudioStream(); - CreateVideoStream(); - MockDemuxerStreamVector streams; - streams.push_back(audio_stream()); - streams.push_back(video_stream()); - - InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), true); - InitializeVideoRenderer(video_stream()); - - EXPECT_CALL(*demuxer_, OnAudioRendererDisabled()); - - InitializePipeline(PIPELINE_OK); - EXPECT_TRUE(metadata_.has_audio); - EXPECT_TRUE(metadata_.has_video); - - // Verify that ended event is fired when video ends. - EXPECT_CALL(callbacks_, OnEnded()); - pipeline_->OnVideoRendererEnded(); -} - TEST_F(PipelineTest, EndedCallback) { CreateAudioStream(); CreateVideoStream(); @@ -638,7 +586,7 @@ TEST_F(PipelineTest, EndedCallback) { streams.push_back(video_stream()); InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializeVideoRenderer(video_stream()); InitializePipeline(PIPELINE_OK); @@ -670,7 +618,7 @@ TEST_F(PipelineTest, AudioStreamShorterThanVideo) { pipeline_->SetClockForTesting(new Clock(&test_tick_clock_)); InitializeDemuxer(&streams, duration); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializeVideoRenderer(video_stream()); InitializePipeline(PIPELINE_OK); @@ -710,7 +658,7 @@ TEST_F(PipelineTest, ErrorDuringSeek) { streams.push_back(audio_stream()); InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializePipeline(PIPELINE_OK); float playback_rate = 1.0f; @@ -764,7 +712,7 @@ TEST_F(PipelineTest, NoMessageDuringTearDownFromError) { streams.push_back(audio_stream()); InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializePipeline(PIPELINE_OK); // Trigger additional requests on the pipeline during tear down from error. @@ -844,7 +792,7 @@ TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) { streams.push_back(audio_stream()); InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializePipeline(PIPELINE_OK); float playback_rate = 1.0f; @@ -901,7 +849,7 @@ TEST_F(PipelineTest, DeleteAfterStop) { MockDemuxerStreamVector streams; streams.push_back(audio_stream()); InitializeDemuxer(&streams); - InitializeAudioRenderer(audio_stream(), false); + InitializeAudioRenderer(audio_stream()); InitializePipeline(PIPELINE_OK); ExpectStop(); @@ -1011,13 +959,13 @@ class PipelineTeardownTest : public PipelineTest { if (state == kInitAudioRenderer) { if (stop_or_error == kStop) { - EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _, _)) + EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _)) .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), RunCallback<1>(PIPELINE_OK))); EXPECT_CALL(callbacks_, OnStop()); } else { status = PIPELINE_ERROR_INITIALIZATION_FAILED; - EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _, _)) + EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _)) .WillOnce(RunCallback<1>(status)); } @@ -1026,7 +974,7 @@ class PipelineTeardownTest : public PipelineTest { return status; } - EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _, _)) + EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _)) .WillOnce(RunCallback<1>(PIPELINE_OK)); if (state == kInitVideoRenderer) { diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc index 2b82162..faec58e 100644 --- a/media/filters/audio_renderer_impl.cc +++ b/media/filters/audio_renderer_impl.cc @@ -235,7 +235,6 @@ void AudioRendererImpl::Initialize(DemuxerStream* stream, const base::Closure& underflow_cb, const TimeCB& time_cb, const base::Closure& ended_cb, - const base::Closure& disabled_cb, const PipelineStatusCB& error_cb) { DCHECK(task_runner_->BelongsToCurrentThread()); DCHECK(stream); @@ -245,7 +244,6 @@ void AudioRendererImpl::Initialize(DemuxerStream* stream, DCHECK(!underflow_cb.is_null()); DCHECK(!time_cb.is_null()); DCHECK(!ended_cb.is_null()); - DCHECK(!disabled_cb.is_null()); DCHECK(!error_cb.is_null()); DCHECK_EQ(kUninitialized, state_); DCHECK(sink_); @@ -256,7 +254,6 @@ void AudioRendererImpl::Initialize(DemuxerStream* stream, underflow_cb_ = underflow_cb; time_cb_ = time_cb; ended_cb_ = ended_cb; - disabled_cb_ = disabled_cb; error_cb_ = error_cb; expecting_config_changes_ = stream->SupportsConfigChanges(); @@ -682,8 +679,12 @@ void AudioRendererImpl::UpdateEarliestEndTime_Locked( } void AudioRendererImpl::OnRenderError() { + // UMA data tells us this happens ~0.01% of the time. Trigger an error instead + // of trying to gracefully fall back to a fake sink. It's very likely + // OnRenderError() should be removed and the audio stack handle errors without + // notifying clients. See http://crbug.com/234708 for details. HistogramRendererEvent(RENDER_ERROR); - disabled_cb_.Run(); + error_cb_.Run(PIPELINE_ERROR_DECODE); } void AudioRendererImpl::DisableUnderflowForTesting() { diff --git a/media/filters/audio_renderer_impl.h b/media/filters/audio_renderer_impl.h index 4e8ad01..cf5a58a 100644 --- a/media/filters/audio_renderer_impl.h +++ b/media/filters/audio_renderer_impl.h @@ -71,7 +71,6 @@ class MEDIA_EXPORT AudioRendererImpl const base::Closure& underflow_cb, const TimeCB& time_cb, const base::Closure& ended_cb, - const base::Closure& disabled_cb, const PipelineStatusCB& error_cb) OVERRIDE; virtual void Play(const base::Closure& callback) OVERRIDE; virtual void Pause(const base::Closure& callback) OVERRIDE; @@ -215,7 +214,6 @@ class MEDIA_EXPORT AudioRendererImpl base::Closure underflow_cb_; TimeCB time_cb_; base::Closure ended_cb_; - base::Closure disabled_cb_; PipelineStatusCB error_cb_; // Callback provided to Flush(). diff --git a/media/filters/audio_renderer_impl_unittest.cc b/media/filters/audio_renderer_impl_unittest.cc index 8a9af82..7556fc7 100644 --- a/media/filters/audio_renderer_impl_unittest.cc +++ b/media/filters/audio_renderer_impl_unittest.cc @@ -118,7 +118,6 @@ class AudioRendererImplTest : public ::testing::Test { MOCK_METHOD1(OnStatistics, void(const PipelineStatistics&)); MOCK_METHOD0(OnUnderflow, void()); - MOCK_METHOD0(OnDisabled, void()); MOCK_METHOD1(OnError, void(PipelineStatus)); void OnAudioTimeCallback(TimeDelta current_time, TimeDelta max_time) { @@ -137,8 +136,6 @@ class AudioRendererImplTest : public ::testing::Test { base::Bind(&AudioRendererImplTest::OnAudioTimeCallback, base::Unretained(this)), ended_event_.GetClosure(), - base::Bind(&AudioRendererImplTest::OnDisabled, - base::Unretained(this)), base::Bind(&AudioRendererImplTest::OnError, base::Unretained(this))); } @@ -997,4 +994,13 @@ TEST_F(AudioRendererImplTest, ImmediateEndOfStream) { WaitForEnded(); } +TEST_F(AudioRendererImplTest, OnRenderErrorCausesDecodeError) { + Initialize(); + Preroll(); + Play(); + + EXPECT_CALL(*this, OnError(PIPELINE_ERROR_DECODE)); + sink_->OnRenderError(); +} + } // namespace media diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index 7503b22..43aca4f 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc @@ -1065,12 +1065,6 @@ void ChunkDemuxer::Seek(TimeDelta time, const PipelineStatusCB& cb) { base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); } -void ChunkDemuxer::OnAudioRendererDisabled() { - base::AutoLock auto_lock(lock_); - audio_->Shutdown(); - disabled_audio_ = audio_.Pass(); -} - // Demuxer implementation. DemuxerStream* ChunkDemuxer::GetStream(DemuxerStream::Type type) { DCHECK_NE(type, DemuxerStream::TEXT); diff --git a/media/filters/chunk_demuxer.h b/media/filters/chunk_demuxer.h index 6586746..6324d79 100644 --- a/media/filters/chunk_demuxer.h +++ b/media/filters/chunk_demuxer.h @@ -160,7 +160,6 @@ class MEDIA_EXPORT ChunkDemuxer : public Demuxer { bool enable_text_tracks) OVERRIDE; virtual void Stop(const base::Closure& callback) OVERRIDE; virtual void Seek(base::TimeDelta time, const PipelineStatusCB& cb) OVERRIDE; - virtual void OnAudioRendererDisabled() OVERRIDE; virtual DemuxerStream* GetStream(DemuxerStream::Type type) OVERRIDE; virtual base::TimeDelta GetStartTime() const OVERRIDE; virtual base::Time GetTimelineOffset() const OVERRIDE; @@ -364,9 +363,6 @@ class MEDIA_EXPORT ChunkDemuxer : public Demuxer { scoped_ptr<ChunkDemuxerStream> audio_; scoped_ptr<ChunkDemuxerStream> video_; - // Keeps |audio_| alive when audio has been disabled. - scoped_ptr<ChunkDemuxerStream> disabled_audio_; - base::TimeDelta duration_; // The duration passed to the last SetDuration(). If diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc index 3bca45f..6eb4eab 100644 --- a/media/filters/chunk_demuxer_unittest.cc +++ b/media/filters/chunk_demuxer_unittest.cc @@ -2902,26 +2902,6 @@ TEST_P(ChunkDemuxerTest, Shutdown_BeforeInitialize) { message_loop_.RunUntilIdle(); } -TEST_P(ChunkDemuxerTest, ReadAfterAudioDisabled) { - ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); - AppendCluster(kDefaultFirstCluster()); - - DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); - ASSERT_TRUE(stream); - - // The stream should no longer be present. - demuxer_->OnAudioRendererDisabled(); - ASSERT_FALSE(demuxer_->GetStream(DemuxerStream::AUDIO)); - - // Normally this would return an audio buffer at timestamp zero, but - // all reads should return EOS buffers when disabled. - bool audio_read_done = false; - stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); - message_loop_.RunUntilIdle(); - - EXPECT_TRUE(audio_read_done); -} - // Verifies that signaling end of stream while stalled at a gap // boundary does not trigger end of stream buffers to be returned. TEST_P(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index dd41410..061d631 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc @@ -417,7 +417,6 @@ FFmpegDemuxer::FFmpegDemuxer( bitrate_(0), start_time_(kNoTimestamp()), liveness_(LIVENESS_UNKNOWN), - audio_disabled_(false), text_enabled_(false), duration_known_(false), need_key_cb_(need_key_cb), @@ -465,17 +464,6 @@ void FFmpegDemuxer::Seek(base::TimeDelta time, const PipelineStatusCB& cb) { &FFmpegDemuxer::OnSeekFrameDone, weak_factory_.GetWeakPtr(), cb)); } -void FFmpegDemuxer::OnAudioRendererDisabled() { - DCHECK(task_runner_->BelongsToCurrentThread()); - audio_disabled_ = true; - StreamVector::iterator iter; - for (iter = streams_.begin(); iter != streams_.end(); ++iter) { - if (*iter && (*iter)->type() == DemuxerStream::AUDIO) { - (*iter)->Stop(); - } - } -} - void FFmpegDemuxer::Initialize(DemuxerHost* host, const PipelineStatusCB& status_cb, bool enable_text_tracks) { @@ -906,10 +894,7 @@ void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) { // Defend against ffmpeg giving us a bad stream index. if (packet->stream_index >= 0 && packet->stream_index < static_cast<int>(streams_.size()) && - streams_[packet->stream_index] && - (!audio_disabled_ || - streams_[packet->stream_index]->type() != DemuxerStream::AUDIO)) { - + streams_[packet->stream_index]) { // TODO(scherkus): Fix demuxing upstream to never return packets w/o data // when av_read_frame() returns success code. See bug comment for ideas: // @@ -1002,10 +987,8 @@ void FFmpegDemuxer::StreamHasEnded() { DCHECK(task_runner_->BelongsToCurrentThread()); StreamVector::iterator iter; for (iter = streams_.begin(); iter != streams_.end(); ++iter) { - if (!*iter || - (audio_disabled_ && (*iter)->type() == DemuxerStream::AUDIO)) { + if (!*iter) continue; - } (*iter)->SetEndOfStream(); } } @@ -1025,8 +1008,7 @@ void FFmpegDemuxer::NotifyCapacityAvailable() { void FFmpegDemuxer::NotifyBufferingChanged() { DCHECK(task_runner_->BelongsToCurrentThread()); Ranges<base::TimeDelta> buffered; - FFmpegDemuxerStream* audio = - audio_disabled_ ? NULL : GetFFmpegStream(DemuxerStream::AUDIO); + FFmpegDemuxerStream* audio = GetFFmpegStream(DemuxerStream::AUDIO); FFmpegDemuxerStream* video = GetFFmpegStream(DemuxerStream::VIDEO); if (audio && video) { buffered = audio->GetBufferedRanges().IntersectionWith( diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h index 778ab5a..02682bb 100644 --- a/media/filters/ffmpeg_demuxer.h +++ b/media/filters/ffmpeg_demuxer.h @@ -154,7 +154,6 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer { bool enable_text_tracks) OVERRIDE; virtual void Stop(const base::Closure& callback) OVERRIDE; virtual void Seek(base::TimeDelta time, const PipelineStatusCB& cb) OVERRIDE; - virtual void OnAudioRendererDisabled() OVERRIDE; virtual DemuxerStream* GetStream(DemuxerStream::Type type) OVERRIDE; virtual base::TimeDelta GetStartTime() const OVERRIDE; virtual base::Time GetTimelineOffset() const OVERRIDE; @@ -258,10 +257,6 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer { // Liveness of the stream. Liveness liveness_; - // Whether audio has been disabled for this demuxer (in which case this class - // drops packets destined for AUDIO demuxer streams on the floor). - bool audio_disabled_; - // Whether text streams have been enabled for this demuxer. bool text_enabled_; diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index cab5963..a1614a4 100644 --- a/media/filters/ffmpeg_demuxer_unittest.cc +++ b/media/filters/ffmpeg_demuxer_unittest.cc @@ -600,40 +600,6 @@ TEST_F(FFmpegDemuxerTest, Stop) { demuxer_.reset(); } -TEST_F(FFmpegDemuxerTest, DisableAudioStream) { - // We are doing the following things here: - // 1. Initialize the demuxer with audio and video stream. - // 2. Send a "disable audio stream" message to the demuxer. - // 3. Demuxer will free audio packets even if audio stream was initialized. - CreateDemuxer("bear-320x240.webm"); - InitializeDemuxer(); - - // Submit a "disable audio stream" message to the demuxer. - demuxer_->OnAudioRendererDisabled(); - message_loop_.RunUntilIdle(); - - // Get our streams. - DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); - DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); - ASSERT_TRUE(video); - ASSERT_TRUE(audio); - - // The audio stream should have been prematurely stopped. - EXPECT_FALSE(IsStreamStopped(DemuxerStream::VIDEO)); - EXPECT_TRUE(IsStreamStopped(DemuxerStream::AUDIO)); - - // Attempt a read from the video stream: it should return valid data. - video->Read(NewReadCB(FROM_HERE, 22084, 0)); - message_loop_.Run(); - - // Attempt a read from the audio stream: it should immediately return end of - // stream without requiring the message loop to read data. - bool got_eos_buffer = false; - audio->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); - message_loop_.RunUntilIdle(); - EXPECT_TRUE(got_eos_buffer); -} - // Verify that seek works properly when the WebM cues data is at the start of // the file instead of at the end. TEST_F(FFmpegDemuxerTest, SeekWithCuesBeforeFirstCluster) { |