Index: content/renderer/media/android/media_source_delegate.cc |
diff --git a/content/renderer/media/android/media_source_delegate.cc b/content/renderer/media/android/media_source_delegate.cc |
index 6b1f206e07a1abdf6893c53ee123a5781bdbbccf..5f2b64bcc7b0c54e14bc8db42da5b719da2b4e85 100644 |
--- a/content/renderer/media/android/media_source_delegate.cc |
+++ b/content/renderer/media/android/media_source_delegate.cc |
@@ -81,13 +81,12 @@ MediaSourceDelegate::~MediaSourceDelegate() { |
DCHECK(!video_stream_); |
} |
-void MediaSourceDelegate::Destroy() { |
+void MediaSourceDelegate::Stop(const base::Closure& stop_cb) { |
DCHECK(main_task_runner_->BelongsToCurrentThread()); |
DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; |
if (!chunk_demuxer_) { |
DCHECK(!demuxer_client_); |
- delete this; |
return; |
} |
@@ -100,12 +99,11 @@ void MediaSourceDelegate::Destroy() { |
chunk_demuxer_->Shutdown(); |
- // |this| will be transferred to the callback StopDemuxer() and |
- // OnDemuxerStopDone(). They own |this| and OnDemuxerStopDone() will delete |
- // it when called, hence using base::Unretained(this) is safe here. |
- media_task_runner_->PostTask(FROM_HERE, |
- base::Bind(&MediaSourceDelegate::StopDemuxer, |
- base::Unretained(this))); |
+ // Continue to stop objects on the media thread. |
+ media_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &MediaSourceDelegate::StopDemuxer, base::Unretained(this), stop_cb)); |
} |
bool MediaSourceDelegate::IsVideoEncrypted() { |
@@ -122,7 +120,8 @@ base::Time MediaSourceDelegate::GetTimelineOffset() const { |
return chunk_demuxer_->GetTimelineOffset(); |
} |
-void MediaSourceDelegate::StopDemuxer() { |
+void MediaSourceDelegate::StopDemuxer(const base::Closure& stop_cb) { |
+ DVLOG(2) << __FUNCTION__; |
DCHECK(media_task_runner_->BelongsToCurrentThread()); |
DCHECK(chunk_demuxer_); |
@@ -142,11 +141,9 @@ void MediaSourceDelegate::StopDemuxer() { |
chunk_demuxer_->Stop(); |
chunk_demuxer_.reset(); |
- // The callback DeleteSelf() owns |this| and will delete it when called. |
- // Hence using base::Unretained(this) is safe here. |
- media_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&MediaSourceDelegate::DeleteSelf, base::Unretained(this))); |
+ // |this| may be destroyed at this point in time as a result of running |
+ // |stop_cb|. |
+ stop_cb.Run(); |
} |
void MediaSourceDelegate::InitializeMediaSource( |
@@ -630,12 +627,6 @@ void MediaSourceDelegate::FinishResettingDecryptingDemuxerStreams() { |
demuxer_client_->DemuxerSeekDone(demuxer_client_id_, browser_seek_time_); |
} |
-void MediaSourceDelegate::DeleteSelf() { |
- DCHECK(main_task_runner_->BelongsToCurrentThread()); |
- DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; |
- delete this; |
-} |
- |
void MediaSourceDelegate::NotifyDemuxerReady() { |
DCHECK(media_task_runner_->BelongsToCurrentThread()); |
DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; |