Chromium Code Reviews| Index: media/filters/ffmpeg_demuxer.cc |
| diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
| index fec580a09a8d9253fcde340c674d3c78f8fb5cfc..98826422f7d1d39dee304a304be5ac7cbc34f678 100644 |
| --- a/media/filters/ffmpeg_demuxer.cc |
| +++ b/media/filters/ffmpeg_demuxer.cc |
| @@ -272,6 +272,7 @@ FFmpegDemuxer::FFmpegDemuxer( |
| const FFmpegNeedKeyCB& need_key_cb) |
| : host_(NULL), |
| message_loop_(message_loop), |
| + weak_factory_(this), |
| blocking_thread_("FFmpegDemuxer"), |
| pending_read_(false), |
| pending_seek_(false), |
| @@ -293,7 +294,8 @@ void FFmpegDemuxer::Stop(const base::Closure& callback) { |
| DCHECK(message_loop_->BelongsToCurrentThread()); |
| url_protocol_.Abort(); |
| data_source_->Stop(BindToCurrentLoop(base::Bind( |
| - &FFmpegDemuxer::OnDataSourceStopped, this, BindToCurrentLoop(callback)))); |
| + &FFmpegDemuxer::OnDataSourceStopped, weak_this_, |
| + BindToCurrentLoop(callback)))); |
| } |
| void FFmpegDemuxer::Seek(base::TimeDelta time, const PipelineStatusCB& cb) { |
| @@ -315,7 +317,7 @@ void FFmpegDemuxer::Seek(base::TimeDelta time, const PipelineStatusCB& cb) { |
| blocking_thread_.message_loop_proxy(), FROM_HERE, |
| base::Bind(&av_seek_frame, glue_->format_context(), -1, |
| time.InMicroseconds(), flags), |
| - base::Bind(&FFmpegDemuxer::OnSeekFrameDone, this, cb)); |
| + base::Bind(&FFmpegDemuxer::OnSeekFrameDone, weak_this_, cb)); |
| } |
| void FFmpegDemuxer::SetPlaybackRate(float playback_rate) { |
| @@ -338,6 +340,7 @@ void FFmpegDemuxer::Initialize(DemuxerHost* host, |
| const PipelineStatusCB& status_cb) { |
| DCHECK(message_loop_->BelongsToCurrentThread()); |
| host_ = host; |
| + weak_this_ = weak_factory_.GetWeakPtr(); |
|
acolwell GONE FROM CHROMIUM
2013/04/17 20:24:53
nit: Why is this deferred until here? Why not do t
scherkus (not reviewing)
2013/04/19 01:07:22
WeakPtr binds to thread it's created on.
Since we
|
| // TODO(scherkus): DataSource should have a host by this point, |
| // see http://crbug.com/122071 |
| @@ -356,16 +359,15 @@ void FFmpegDemuxer::Initialize(DemuxerHost* host, |
| base::PostTaskAndReplyWithResult( |
| blocking_thread_.message_loop_proxy(), FROM_HERE, |
| base::Bind(&FFmpegGlue::OpenContext, base::Unretained(glue_.get())), |
| - base::Bind(&FFmpegDemuxer::OnOpenContextDone, this, status_cb)); |
| + base::Bind(&FFmpegDemuxer::OnOpenContextDone, weak_this_, status_cb)); |
| } |
| -scoped_refptr<DemuxerStream> FFmpegDemuxer::GetStream( |
| - DemuxerStream::Type type) { |
| +DemuxerStream* FFmpegDemuxer::GetStream(DemuxerStream::Type type) { |
| DCHECK(message_loop_->BelongsToCurrentThread()); |
| return GetFFmpegStream(type); |
| } |
| -scoped_refptr<FFmpegDemuxerStream> FFmpegDemuxer::GetFFmpegStream( |
| +FFmpegDemuxerStream* FFmpegDemuxer::GetFFmpegStream( |
| DemuxerStream::Type type) const { |
| StreamVector::const_iterator iter; |
| for (iter = streams_.begin(); iter != streams_.end(); ++iter) { |
| @@ -435,7 +437,7 @@ void FFmpegDemuxer::OnOpenContextDone(const PipelineStatusCB& status_cb, |
| blocking_thread_.message_loop_proxy(), FROM_HERE, |
| base::Bind(&avformat_find_stream_info, glue_->format_context(), |
| static_cast<AVDictionary**>(NULL)), |
| - base::Bind(&FFmpegDemuxer::OnFindStreamInfoDone, this, status_cb)); |
| + base::Bind(&FFmpegDemuxer::OnFindStreamInfoDone, weak_this_, status_cb)); |
| } |
| void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb, |
| @@ -481,11 +483,8 @@ void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb, |
| } |
| AVStream* stream = format_context->streams[i]; |
| - scoped_refptr<FFmpegDemuxerStream> demuxer_stream( |
| - new FFmpegDemuxerStream(this, stream)); |
| - |
| - streams_[i] = demuxer_stream; |
| - max_duration = std::max(max_duration, demuxer_stream->duration()); |
| + streams_[i] = new FFmpegDemuxerStream(this, stream); |
| + max_duration = std::max(max_duration, streams_[i]->duration()); |
| if (stream->first_dts != static_cast<int64_t>(AV_NOPTS_VALUE)) { |
| const base::TimeDelta first_dts = ConvertFromTimeBase( |
| @@ -586,7 +585,8 @@ void FFmpegDemuxer::ReadFrameIfNeeded() { |
| base::PostTaskAndReplyWithResult( |
| blocking_thread_.message_loop_proxy(), FROM_HERE, |
| base::Bind(&av_read_frame, glue_->format_context(), packet_ptr), |
| - base::Bind(&FFmpegDemuxer::OnReadFrameDone, this, base::Passed(&packet))); |
| + base::Bind(&FFmpegDemuxer::OnReadFrameDone, weak_this_, |
| + base::Passed(&packet))); |
| } |
| void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) { |
| @@ -716,10 +716,9 @@ void FFmpegDemuxer::NotifyCapacityAvailable() { |
| void FFmpegDemuxer::NotifyBufferingChanged() { |
| DCHECK(message_loop_->BelongsToCurrentThread()); |
| Ranges<base::TimeDelta> buffered; |
| - scoped_refptr<FFmpegDemuxerStream> audio = |
| + FFmpegDemuxerStream* audio = |
| audio_disabled_ ? NULL : GetFFmpegStream(DemuxerStream::AUDIO); |
| - scoped_refptr<FFmpegDemuxerStream> video = |
| - GetFFmpegStream(DemuxerStream::VIDEO); |
| + FFmpegDemuxerStream* video = GetFFmpegStream(DemuxerStream::VIDEO); |
| if (audio && video) { |
| buffered = audio->GetBufferedRanges().IntersectionWith( |
| video->GetBufferedRanges()); |