diff options
-rw-r--r-- | media/base/pipeline_impl.cc | 5 | ||||
-rw-r--r-- | media/base/pipeline_impl.h | 3 | ||||
-rw-r--r-- | media/base/pipeline_impl_unittest.cc | 13 |
3 files changed, 20 insertions, 1 deletions
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index 75c522f..bd9e9fe 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc @@ -347,6 +347,7 @@ void PipelineImpl::ResetState() { playback_rate_ = 0.0f; error_ = PIPELINE_OK; waiting_for_clock_update_ = false; + audio_disabled_ = false; clock_.SetTime(kZero); rendered_mime_types_.clear(); } @@ -807,7 +808,7 @@ void PipelineImpl::NotifyEndedTask() { DCHECK(audio_renderer || video_renderer); // Make sure every extant renderer has ended. - if ((audio_renderer && !audio_renderer->HasEnded()) || + if ((audio_renderer && !audio_renderer->HasEnded() && !audio_disabled_) || (video_renderer && !video_renderer->HasEnded())) { return; } @@ -834,6 +835,8 @@ void PipelineImpl::DisableAudioRendererTask() { AutoLock auto_lock(lock_); rendered_mime_types_.erase(mime_type::kMajorTypeAudio); + audio_disabled_ = true; + // Notify all filters of disabled audio renderer. for (FilterVector::iterator iter = filters_.begin(); iter != filters_.end(); diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h index 48db653..b7f4de3 100644 --- a/media/base/pipeline_impl.h +++ b/media/base/pipeline_impl.h @@ -404,6 +404,9 @@ class PipelineImpl : public Pipeline, public FilterHost { // currently reading. int64 current_bytes_; + // Set to true in DisableAudioRendererTask(). + bool audio_disabled_; + // Keep track of the maximum buffered position so the buffering appears // smooth. // TODO(vrk): This is a hack. diff --git a/media/base/pipeline_impl_unittest.cc b/media/base/pipeline_impl_unittest.cc index 181f07d..36869e9 100644 --- a/media/base/pipeline_impl_unittest.cc +++ b/media/base/pipeline_impl_unittest.cc @@ -551,6 +551,10 @@ TEST_F(PipelineImplTest, DisableAudioRenderer) { streams.push_back(audio_stream()); streams.push_back(video_stream()); + pipeline_->SetPipelineEndedCallback( + NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), + &CallbackHelper::OnEnded)); + InitializeDataSource(); InitializeDemuxer(&streams, base::TimeDelta()); InitializeAudioDecoder(audio_stream()); @@ -580,6 +584,15 @@ TEST_F(PipelineImplTest, DisableAudioRenderer) { OnAudioRendererDisabled()); mocks_->audio_renderer()->SetPlaybackRate(1.0f); + + // Verify that ended event is fired when video ends. + EXPECT_CALL(*mocks_->audio_renderer(), HasEnded()) + .WillOnce(Return(false)); + EXPECT_CALL(*mocks_->video_renderer(), HasEnded()) + .WillOnce(Return(true)); + EXPECT_CALL(callbacks_, OnEnded()); + FilterHost* host = pipeline_; + host->NotifyEnded(); } TEST_F(PipelineImplTest, EndedCallback) { |