summaryrefslogtreecommitdiffstats
path: root/media/filters/video_renderer_base.cc
diff options
context:
space:
mode:
Diffstat (limited to 'media/filters/video_renderer_base.cc')
-rw-r--r--media/filters/video_renderer_base.cc32
1 files changed, 18 insertions, 14 deletions
diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc
index d2c577b..0ae775a 100644
--- a/media/filters/video_renderer_base.cc
+++ b/media/filters/video_renderer_base.cc
@@ -29,6 +29,7 @@ VideoRendererBase::VideoRendererBase(
const SetOpaqueCB& set_opaque_cb,
bool drop_frames)
: message_loop_(message_loop),
+ weak_factory_(this),
set_decryptor_ready_cb_(set_decryptor_ready_cb),
frame_available_(&lock_),
state_(kUninitialized),
@@ -42,6 +43,12 @@ VideoRendererBase::VideoRendererBase(
DCHECK(!paint_cb_.is_null());
}
+VideoRendererBase::~VideoRendererBase() {
+ base::AutoLock auto_lock(lock_);
+ CHECK(state_ == kUninitialized || state_ == kStopped) << state_;
+ CHECK_EQ(thread_, base::kNullThreadHandle);
+}
+
void VideoRendererBase::Play(const base::Closure& callback) {
DCHECK(message_loop_->BelongsToCurrentThread());
base::AutoLock auto_lock(lock_);
@@ -67,17 +74,19 @@ void VideoRendererBase::Flush(const base::Closure& callback) {
if (decrypting_demuxer_stream_) {
decrypting_demuxer_stream_->Reset(base::Bind(
- &VideoRendererBase::ResetDecoder, this));
+ &VideoRendererBase::ResetDecoder, weak_this_));
return;
}
- decoder_->Reset(base::Bind(&VideoRendererBase::OnDecoderResetDone, this));
+ decoder_->Reset(base::Bind(
+ &VideoRendererBase::OnDecoderResetDone, weak_this_));
}
void VideoRendererBase::ResetDecoder() {
DCHECK(message_loop_->BelongsToCurrentThread());
base::AutoLock auto_lock(lock_);
- decoder_->Reset(base::Bind(&VideoRendererBase::OnDecoderResetDone, this));
+ decoder_->Reset(base::Bind(
+ &VideoRendererBase::OnDecoderResetDone, weak_this_));
}
void VideoRendererBase::Stop(const base::Closure& callback) {
@@ -110,7 +119,7 @@ void VideoRendererBase::Stop(const base::Closure& callback) {
if (decrypting_demuxer_stream_) {
decrypting_demuxer_stream_->Reset(base::Bind(
- &VideoRendererBase::StopDecoder, this, callback));
+ &VideoRendererBase::StopDecoder, weak_this_, callback));
return;
}
@@ -168,6 +177,7 @@ void VideoRendererBase::Initialize(const scoped_refptr<DemuxerStream>& stream,
DCHECK(!get_duration_cb.is_null());
DCHECK_EQ(kUninitialized, state_);
+ weak_this_ = weak_factory_.GetWeakPtr();
init_cb_ = init_cb;
statistics_cb_ = statistics_cb;
max_time_cb_ = max_time_cb;
@@ -189,7 +199,7 @@ void VideoRendererBase::Initialize(const scoped_refptr<DemuxerStream>& stream,
decoder_selector_ptr->SelectVideoDecoder(
stream,
statistics_cb,
- base::Bind(&VideoRendererBase::OnDecoderSelected, this,
+ base::Bind(&VideoRendererBase::OnDecoderSelected, weak_this_,
base::Passed(&decoder_selector)));
}
@@ -337,7 +347,7 @@ void VideoRendererBase::PaintNextReadyFrame_Locked() {
paint_cb_.Run(next_frame);
message_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoRendererBase::AttemptRead, this));
+ &VideoRendererBase::AttemptRead, weak_this_));
}
void VideoRendererBase::DropNextReadyFrame_Locked() {
@@ -351,13 +361,7 @@ void VideoRendererBase::DropNextReadyFrame_Locked() {
statistics_cb_.Run(statistics);
message_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoRendererBase::AttemptRead, this));
-}
-
-VideoRendererBase::~VideoRendererBase() {
- base::AutoLock auto_lock(lock_);
- CHECK(state_ == kUninitialized || state_ == kStopped) << state_;
- CHECK_EQ(thread_, base::kNullThreadHandle);
+ &VideoRendererBase::AttemptRead, weak_this_));
}
void VideoRendererBase::FrameReady(VideoDecoder::Status status,
@@ -504,7 +508,7 @@ void VideoRendererBase::AttemptRead_Locked() {
case kPrerolling:
case kPlaying:
pending_read_ = true;
- decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, this));
+ decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, weak_this_));
return;
case kUninitialized: