Index: media/base/pipeline.cc |
=================================================================== |
--- media/base/pipeline.cc (revision 182591) |
+++ media/base/pipeline.cc (working copy) |
@@ -523,12 +523,6 @@ |
} |
} |
-// Note that the usage of base::Unretained() with the audio/video renderers |
-// in the following DoXXX() functions is considered safe as they are owned by |
-// |pending_callbacks_| and share the same lifetime. |
-// |
-// That being said, deleting the renderers while keeping |pending_callbacks_| |
-// running on the media thread would result in crashes. |
void Pipeline::DoInitialPreroll(const PipelineStatusCB& done_cb) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
DCHECK(!pending_callbacks_.get()); |
@@ -539,14 +533,12 @@ |
// Preroll renderers. |
if (audio_renderer_) { |
bound_fns.Push(base::Bind( |
- &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()), |
- seek_timestamp)); |
+ &AudioRenderer::Preroll, audio_renderer_, seek_timestamp)); |
} |
if (video_renderer_) { |
bound_fns.Push(base::Bind( |
- &VideoRenderer::Preroll, base::Unretained(video_renderer_.get()), |
- seek_timestamp)); |
+ &VideoRenderer::Preroll, video_renderer_, seek_timestamp)); |
} |
pending_callbacks_ = SerialRunner::Run(bound_fns, done_cb); |
@@ -560,24 +552,16 @@ |
SerialRunner::Queue bound_fns; |
// Pause. |
- if (audio_renderer_) { |
- bound_fns.Push(base::Bind( |
- &AudioRenderer::Pause, base::Unretained(audio_renderer_.get()))); |
- } |
- if (video_renderer_) { |
- bound_fns.Push(base::Bind( |
- &VideoRenderer::Pause, base::Unretained(video_renderer_.get()))); |
- } |
+ if (audio_renderer_) |
+ bound_fns.Push(base::Bind(&AudioRenderer::Pause, audio_renderer_)); |
+ if (video_renderer_) |
+ bound_fns.Push(base::Bind(&VideoRenderer::Pause, video_renderer_)); |
// Flush. |
- if (audio_renderer_) { |
- bound_fns.Push(base::Bind( |
- &AudioRenderer::Flush, base::Unretained(audio_renderer_.get()))); |
- } |
- if (video_renderer_) { |
- bound_fns.Push(base::Bind( |
- &VideoRenderer::Flush, base::Unretained(video_renderer_.get()))); |
- } |
+ if (audio_renderer_) |
+ bound_fns.Push(base::Bind(&AudioRenderer::Flush, audio_renderer_)); |
+ if (video_renderer_) |
+ bound_fns.Push(base::Bind(&VideoRenderer::Flush, video_renderer_)); |
// Seek demuxer. |
bound_fns.Push(base::Bind( |
@@ -586,14 +570,12 @@ |
// Preroll renderers. |
if (audio_renderer_) { |
bound_fns.Push(base::Bind( |
- &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()), |
- seek_timestamp)); |
+ &AudioRenderer::Preroll, audio_renderer_, seek_timestamp)); |
} |
if (video_renderer_) { |
bound_fns.Push(base::Bind( |
- &VideoRenderer::Preroll, base::Unretained(video_renderer_.get()), |
- seek_timestamp)); |
+ &VideoRenderer::Preroll, video_renderer_, seek_timestamp)); |
} |
pending_callbacks_ = SerialRunner::Run(bound_fns, done_cb); |
@@ -607,15 +589,11 @@ |
PlaybackRateChangedTask(GetPlaybackRate()); |
VolumeChangedTask(GetVolume()); |
- if (audio_renderer_) { |
- bound_fns.Push(base::Bind( |
- &AudioRenderer::Play, base::Unretained(audio_renderer_.get()))); |
- } |
+ if (audio_renderer_) |
+ bound_fns.Push(base::Bind(&AudioRenderer::Play, audio_renderer_)); |
- if (video_renderer_) { |
- bound_fns.Push(base::Bind( |
- &VideoRenderer::Play, base::Unretained(video_renderer_.get()))); |
- } |
+ if (video_renderer_) |
+ bound_fns.Push(base::Bind(&VideoRenderer::Play, video_renderer_)); |
pending_callbacks_ = SerialRunner::Run(bound_fns, done_cb); |
} |
@@ -628,15 +606,11 @@ |
if (demuxer_) |
bound_fns.Push(base::Bind(&Demuxer::Stop, demuxer_)); |
- if (audio_renderer_) { |
- bound_fns.Push(base::Bind( |
- &AudioRenderer::Stop, base::Unretained(audio_renderer_.get()))); |
- } |
+ if (audio_renderer_) |
+ bound_fns.Push(base::Bind(&AudioRenderer::Stop, audio_renderer_)); |
- if (video_renderer_) { |
- bound_fns.Push(base::Bind( |
- &VideoRenderer::Stop, base::Unretained(video_renderer_.get()))); |
- } |
+ if (video_renderer_) |
+ bound_fns.Push(base::Bind(&VideoRenderer::Stop, video_renderer_)); |
pending_callbacks_ = SerialRunner::Run(bound_fns, done_cb); |
} |
@@ -652,8 +626,8 @@ |
SetState(kStopped); |
pending_callbacks_.reset(); |
filter_collection_.reset(); |
- audio_renderer_.reset(); |
- video_renderer_.reset(); |
+ audio_renderer_ = NULL; |
+ video_renderer_ = NULL; |
demuxer_ = NULL; |
// If we stop during initialization/seeking we want to run |seek_cb_| |
@@ -910,7 +884,7 @@ |
demuxer_->GetStream(DemuxerStream::AUDIO); |
DCHECK(stream); |
- audio_renderer_ = filter_collection_->GetAudioRenderer(); |
+ filter_collection_->SelectAudioRenderer(&audio_renderer_); |
audio_renderer_->Initialize( |
stream, |
*filter_collection_->GetAudioDecoders(), |
@@ -938,7 +912,7 @@ |
natural_size_ = stream->video_decoder_config().natural_size(); |
} |
- video_renderer_ = filter_collection_->GetVideoRenderer(); |
+ filter_collection_->SelectVideoRenderer(&video_renderer_); |
video_renderer_->Initialize( |
stream, |
*filter_collection_->GetVideoDecoders(), |