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()); |