Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1216)

Unified Diff: media/filters/ffmpeg_demuxer.cc

Issue 13813016: Remove reference counting from media::Demuxer and friends. (Closed) Base URL: http://git.chromium.org/chromium/src.git@vd_scoped
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());

Powered by Google App Engine
This is Rietveld 408576698