Index: content/renderer/media/webmediaplayer_ms_compositor.cc |
diff --git a/content/renderer/media/webmediaplayer_ms_compositor.cc b/content/renderer/media/webmediaplayer_ms_compositor.cc |
index 4a7dd8ca91b2ee73db1376fffd57362fc716266b..3f9147cd6185e5034ef1c9d8a4a113bd8e1069dd 100644 |
--- a/content/renderer/media/webmediaplayer_ms_compositor.cc |
+++ b/content/renderer/media/webmediaplayer_ms_compositor.cc |
@@ -134,9 +134,9 @@ WebMediaPlayerMSCompositor::WebMediaPlayerMSCompositor( |
last_render_length_(base::TimeDelta::FromSecondsD(1.0 / 60.0)), |
total_frame_count_(0), |
dropped_frame_count_(0), |
- stopped_(true), |
- weak_ptr_factory_(this) { |
+ stopped_(true) { |
main_message_loop_ = base::MessageLoop::current(); |
+ io_thread_checker_.DetachFromThread(); |
blink::WebVector<blink::WebMediaStreamTrack> video_tracks; |
if (!web_stream.isNull()) |
@@ -162,9 +162,8 @@ WebMediaPlayerMSCompositor::WebMediaPlayerMSCompositor( |
} |
WebMediaPlayerMSCompositor::~WebMediaPlayerMSCompositor() { |
- DCHECK(compositor_task_runner_->BelongsToCurrentThread()); |
- if (video_frame_provider_client_) |
- video_frame_provider_client_->StopUsingProvider(); |
+ DCHECK(!video_frame_provider_client_) |
+ << "Must call StopUsingProvider() before dtor!"; |
} |
gfx::Size WebMediaPlayerMSCompositor::GetCurrentSize() { |
@@ -204,7 +203,7 @@ void WebMediaPlayerMSCompositor::SetVideoFrameProviderClient( |
void WebMediaPlayerMSCompositor::EnqueueFrame( |
scoped_refptr<media::VideoFrame> frame) { |
- DCHECK(compositor_task_runner_->BelongsToCurrentThread()); |
+ DCHECK(io_thread_checker_.CalledOnValidThread()); |
base::AutoLock auto_lock(current_frame_lock_); |
++total_frame_count_; |
@@ -317,41 +316,15 @@ WebMediaPlayerMSCompositor::GetCurrentFrameWithoutUpdatingStatistics() { |
void WebMediaPlayerMSCompositor::StartRendering() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
compositor_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&WebMediaPlayerMSCompositor::StartRenderingInternal, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
-void WebMediaPlayerMSCompositor::StartRenderingInternal() { |
- DCHECK(compositor_task_runner_->BelongsToCurrentThread()); |
- stopped_ = false; |
- |
- if (video_frame_provider_client_) |
- video_frame_provider_client_->StartRendering(); |
+ FROM_HERE, |
+ base::Bind(&WebMediaPlayerMSCompositor::StartRenderingInternal, this)); |
} |
void WebMediaPlayerMSCompositor::StopRendering() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
compositor_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&WebMediaPlayerMSCompositor::StopRenderingInternal, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
-void WebMediaPlayerMSCompositor::StopRenderingInternal() { |
- DCHECK(compositor_task_runner_->BelongsToCurrentThread()); |
- stopped_ = true; |
- |
- // It is possible that the video gets paused and then resumed. We need to |
- // reset VideoRendererAlgorithm, otherwise, VideoRendererAlgorithm will think |
- // there is a very long frame in the queue and then make totally wrong |
- // frame selection. |
- { |
- base::AutoLock auto_lock(current_frame_lock_); |
- if (rendering_frame_buffer_) |
- rendering_frame_buffer_->Reset(); |
- } |
- |
- if (video_frame_provider_client_) |
- video_frame_provider_client_->StopRendering(); |
+ FROM_HERE, |
+ base::Bind(&WebMediaPlayerMSCompositor::StopRenderingInternal, this)); |
} |
void WebMediaPlayerMSCompositor::ReplaceCurrentFrameWithACopy() { |
@@ -368,11 +341,19 @@ void WebMediaPlayerMSCompositor::ReplaceCurrentFrameWithACopy() { |
CopyFrame(current_frame_, player_->GetSkCanvasVideoRenderer()); |
} |
+void WebMediaPlayerMSCompositor::StopUsingProvider() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ compositor_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&WebMediaPlayerMSCompositor::StopUsingProviderInternal, this)); |
+} |
+ |
bool WebMediaPlayerMSCompositor::MapTimestampsToRenderTimeTicks( |
const std::vector<base::TimeDelta>& timestamps, |
std::vector<base::TimeTicks>* wall_clock_times) { |
DCHECK(compositor_task_runner_->BelongsToCurrentThread() || |
- thread_checker_.CalledOnValidThread()); |
+ thread_checker_.CalledOnValidThread() || |
+ io_thread_checker_.CalledOnValidThread()); |
for (const base::TimeDelta& timestamp : timestamps) { |
DCHECK(timestamps_to_clock_times_.count(timestamp)); |
wall_clock_times->push_back(timestamps_to_clock_times_[timestamp]); |
@@ -430,6 +411,39 @@ void WebMediaPlayerMSCompositor::SetCurrentFrame( |
FROM_HERE, base::Bind(&WebMediaPlayerMS::ResetCanvasCache, player_)); |
} |
+void WebMediaPlayerMSCompositor::StartRenderingInternal() { |
+ DCHECK(compositor_task_runner_->BelongsToCurrentThread()); |
+ stopped_ = false; |
+ |
+ if (video_frame_provider_client_) |
+ video_frame_provider_client_->StartRendering(); |
+} |
+ |
+void WebMediaPlayerMSCompositor::StopRenderingInternal() { |
+ DCHECK(compositor_task_runner_->BelongsToCurrentThread()); |
+ stopped_ = true; |
+ |
+ // It is possible that the video gets paused and then resumed. We need to |
+ // reset VideoRendererAlgorithm, otherwise, VideoRendererAlgorithm will think |
+ // there is a very long frame in the queue and then make totally wrong |
+ // frame selection. |
+ { |
+ base::AutoLock auto_lock(current_frame_lock_); |
+ if (rendering_frame_buffer_) |
+ rendering_frame_buffer_->Reset(); |
+ } |
+ |
+ if (video_frame_provider_client_) |
+ video_frame_provider_client_->StopRendering(); |
+} |
+ |
+void WebMediaPlayerMSCompositor::StopUsingProviderInternal() { |
+ DCHECK(compositor_task_runner_->BelongsToCurrentThread()); |
+ if (video_frame_provider_client_) |
+ video_frame_provider_client_->StopUsingProvider(); |
+ video_frame_provider_client_ = nullptr; |
+} |
+ |
void WebMediaPlayerMSCompositor::SetAlgorithmEnabledForTesting( |
bool algorithm_enabled) { |
if (!algorithm_enabled) { |