summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-09 17:53:55 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-09 17:53:55 +0000
commit362ead07a213eb5cacf553ffa19e05c57cea7760 (patch)
treef1b69ff29874f78bd4c6edc510008c340abf2b82 /media
parent06aaa4ee8dfa6e3538fb6343f03d7263ab26655f (diff)
downloadchromium_src-362ead07a213eb5cacf553ffa19e05c57cea7760.zip
chromium_src-362ead07a213eb5cacf553ffa19e05c57cea7760.tar.gz
chromium_src-362ead07a213eb5cacf553ffa19e05c57cea7760.tar.bz2
Remove support for audio renderers to disable themselves at run time.
UMA data tells us this code path is rarely hit (~0.01% on stable). It also complicates a lot of media pipeline/demuxer logic. Replace all of it with an error callback. BUG=234708 Review URL: https://codereview.chromium.org/270223002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@269368 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/base/audio_renderer.h5
-rw-r--r--media/base/demuxer.h8
-rw-r--r--media/base/media_log.cc2
-rw-r--r--media/base/media_log_event.h4
-rw-r--r--media/base/mock_filters.h3
-rw-r--r--media/base/pipeline.cc35
-rw-r--r--media/base/pipeline.h11
-rw-r--r--media/base/pipeline_unittest.cc88
-rw-r--r--media/filters/audio_renderer_impl.cc9
-rw-r--r--media/filters/audio_renderer_impl.h2
-rw-r--r--media/filters/audio_renderer_impl_unittest.cc12
-rw-r--r--media/filters/chunk_demuxer.cc6
-rw-r--r--media/filters/chunk_demuxer.h4
-rw-r--r--media/filters/chunk_demuxer_unittest.cc20
-rw-r--r--media/filters/ffmpeg_demuxer.cc24
-rw-r--r--media/filters/ffmpeg_demuxer.h5
-rw-r--r--media/filters/ffmpeg_demuxer_unittest.cc34
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) {