| Index: media/filters/ffmpeg_demuxer.cc
|
| diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
|
| index fec580a09a8d9253fcde340c674d3c78f8fb5cfc..00e5e687b294b07981791492d021c123bb68721b 100644
|
| --- a/media/filters/ffmpeg_demuxer.cc
|
| +++ b/media/filters/ffmpeg_demuxer.cc
|
| @@ -42,7 +42,6 @@ FFmpegDemuxerStream::FFmpegDemuxerStream(
|
| message_loop_(base::MessageLoopProxy::current()),
|
| stream_(stream),
|
| type_(UNKNOWN),
|
| - stopped_(false),
|
| end_of_stream_(false),
|
| last_packet_timestamp_(kNoTimestamp()),
|
| bitstream_converter_enabled_(false) {
|
| @@ -97,7 +96,7 @@ FFmpegDemuxerStream::FFmpegDemuxerStream(
|
| void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
|
|
| - if (stopped_ || end_of_stream_) {
|
| + if (!demuxer_ || end_of_stream_) {
|
| NOTREACHED() << "Attempted to enqueue packet on a stopped stream";
|
| return;
|
| }
|
| @@ -162,7 +161,8 @@ void FFmpegDemuxerStream::Stop() {
|
| base::ResetAndReturn(&read_cb_).Run(
|
| DemuxerStream::kOk, DecoderBuffer::CreateEOSBuffer());
|
| }
|
| - stopped_ = true;
|
| + demuxer_ = NULL;
|
| + stream_ = NULL;
|
| end_of_stream_ = true;
|
| }
|
|
|
| @@ -184,7 +184,7 @@ void FFmpegDemuxerStream::Read(const ReadCB& read_cb) {
|
| // The |demuxer_| may have been destroyed in the pipeline thread.
|
| //
|
| // TODO(scherkus): it would be cleaner to reply with an error message.
|
| - if (stopped_) {
|
| + if (!demuxer_) {
|
| base::ResetAndReturn(&read_cb_).Run(
|
| DemuxerStream::kOk, DecoderBuffer::CreateEOSBuffer());
|
| return;
|
| @@ -212,7 +212,7 @@ const VideoDecoderConfig& FFmpegDemuxerStream::video_decoder_config() {
|
| }
|
|
|
| FFmpegDemuxerStream::~FFmpegDemuxerStream() {
|
| - DCHECK(stopped_);
|
| + DCHECK(!demuxer_);
|
| DCHECK(read_cb_.is_null());
|
| DCHECK(buffer_queue_.IsEmpty());
|
| }
|
| @@ -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();
|
|
|
| // TODO(scherkus): DataSource should have a host by this point,
|
| // see http://crbug.com/122071
|
| @@ -356,7 +359,7 @@ 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(
|
| @@ -435,7 +438,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,
|
| @@ -586,7 +589,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) {
|
|
|