Index: content/renderer/media/webmediaplayer_ms.cc |
diff --git a/content/renderer/media/webmediaplayer_ms.cc b/content/renderer/media/webmediaplayer_ms.cc |
index 8be81de1a75bd50917e35a1a4c2e2d218272cad3..a371ea089b8cb4e8b59e2aa149555180d7d01e16 100644 |
--- a/content/renderer/media/webmediaplayer_ms.cc |
+++ b/content/renderer/media/webmediaplayer_ms.cc |
@@ -16,6 +16,7 @@ |
#include "cc/blink/web_layer_impl.h" |
#include "cc/layers/video_frame_provider_client_impl.h" |
#include "cc/layers/video_layer.h" |
+#include "content/child/child_process.h" |
#include "content/common/gpu/client/context_provider_command_buffer.h" |
#include "content/public/renderer/media_stream_audio_renderer.h" |
#include "content/public/renderer/media_stream_renderer_factory.h" |
@@ -39,33 +40,28 @@ |
namespace content { |
// FrameDeliverer is responsible for delivering frames received on |
-// compositor thread by calling of EnqueueFrame() method of |compositor_|. |
+// the IO thread by calling of EnqueueFrame() method of |compositor_|. |
// |
// It is created on the main thread, but methods should be called and class |
-// should be destructed on the compositor thread. |
+// should be destructed on the IO thread. |
class WebMediaPlayerMS::FrameDeliverer { |
public: |
- typedef base::Callback<void(scoped_refptr<media::VideoFrame>)> |
- EnqueueFrameCallback; |
- |
FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player, |
- const EnqueueFrameCallback& enqueue_frame_cb) |
+ const MediaStreamVideoRenderer::RepaintCB& enqueue_frame_cb) |
: last_frame_opaque_(true), |
last_frame_rotation_(media::VIDEO_ROTATION_0), |
received_first_frame_(false), |
main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
player_(player), |
enqueue_frame_cb_(enqueue_frame_cb), |
- weak_factory_for_compositor_(this) { |
- compositor_thread_checker_.DetachFromThread(); |
+ weak_factory_(this) { |
+ io_thread_checker_.DetachFromThread(); |
} |
- ~FrameDeliverer() { |
- DCHECK(compositor_thread_checker_.CalledOnValidThread()); |
- } |
+ ~FrameDeliverer() { DCHECK(io_thread_checker_.CalledOnValidThread()); } |
void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) { |
- DCHECK(compositor_thread_checker_.CalledOnValidThread()); |
+ DCHECK(io_thread_checker_.CalledOnValidThread()); |
#if defined(OS_ANDROID) |
if (render_frame_suspended_) |
@@ -75,10 +71,10 @@ class WebMediaPlayerMS::FrameDeliverer { |
base::TimeTicks render_time; |
if (frame->metadata()->GetTimeTicks( |
media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) { |
- TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable", |
+ TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnVideoFrame", |
"Ideal Render Instant", render_time.ToInternalValue()); |
} else { |
- TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnFrameAvailable"); |
+ TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnVideoFrame"); |
} |
const bool is_opaque = media::IsOpaque(frame->format()); |
@@ -113,14 +109,14 @@ class WebMediaPlayerMS::FrameDeliverer { |
#if defined(OS_ANDROID) |
void SetRenderFrameSuspended(bool render_frame_suspended) { |
- DCHECK(compositor_thread_checker_.CalledOnValidThread()); |
+ DCHECK(io_thread_checker_.CalledOnValidThread()); |
render_frame_suspended_ = render_frame_suspended; |
} |
#endif // defined(OS_ANDROID) |
MediaStreamVideoRenderer::RepaintCB GetRepaintCallback() { |
return base::Bind(&FrameDeliverer::OnVideoFrame, |
- weak_factory_for_compositor_.GetWeakPtr()); |
+ weak_factory_.GetWeakPtr()); |
} |
private: |
@@ -134,13 +130,12 @@ class WebMediaPlayerMS::FrameDeliverer { |
const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; |
const base::WeakPtr<WebMediaPlayerMS> player_; |
- const EnqueueFrameCallback enqueue_frame_cb_; |
+ const MediaStreamVideoRenderer::RepaintCB enqueue_frame_cb_; |
- // Used for DCHECKs to ensure method calls executed on the correct thread, |
- // i.e. compositor thread. |
- base::ThreadChecker compositor_thread_checker_; |
+ // Used for DCHECKs to ensure method calls are executed on the correct thread. |
+ base::ThreadChecker io_thread_checker_; |
- base::WeakPtrFactory<FrameDeliverer> weak_factory_for_compositor_; |
+ base::WeakPtrFactory<FrameDeliverer> weak_factory_; |
DISALLOW_COPY_AND_ASSIGN(FrameDeliverer); |
}; |
@@ -151,9 +146,10 @@ WebMediaPlayerMS::WebMediaPlayerMS( |
base::WeakPtr<media::WebMediaPlayerDelegate> delegate, |
media::MediaLog* media_log, |
std::unique_ptr<MediaStreamRendererFactory> factory, |
- const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, |
- const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, |
- const scoped_refptr<base::TaskRunner>& worker_task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> media_task_runner, |
+ scoped_refptr<base::TaskRunner> worker_task_runner, |
media::GpuVideoAcceleratorFactories* gpu_factories, |
const blink::WebString& sink_id, |
const blink::WebSecurityOrigin& security_origin) |
@@ -168,10 +164,11 @@ WebMediaPlayerMS::WebMediaPlayerMS( |
video_rotation_(media::VIDEO_ROTATION_0), |
media_log_(media_log), |
renderer_factory_(std::move(factory)), |
+ io_task_runner_(io_task_runner), |
+ compositor_task_runner_(compositor_task_runner), |
media_task_runner_(media_task_runner), |
worker_task_runner_(worker_task_runner), |
gpu_factories_(gpu_factories), |
- compositor_task_runner_(compositor_task_runner), |
initial_audio_output_device_id_(sink_id.utf8()), |
initial_security_origin_(security_origin.isNull() |
? url::Origin() |
@@ -198,10 +195,10 @@ WebMediaPlayerMS::~WebMediaPlayerMS() { |
static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); |
if (frame_deliverer_) |
- compositor_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release()); |
+ io_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release()); |
if (compositor_) |
- compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release()); |
+ compositor_->StopUsingProvider(); |
if (video_frame_provider_) |
video_frame_provider_->Stop(); |
@@ -230,8 +227,8 @@ void WebMediaPlayerMS::load(LoadType load_type, |
blink::WebMediaStream web_stream = |
GetWebMediaStreamFromWebMediaPlayerSource(source); |
- compositor_.reset(new WebMediaPlayerMSCompositor(compositor_task_runner_, |
- web_stream, AsWeakPtr())); |
+ compositor_ = new WebMediaPlayerMSCompositor(compositor_task_runner_, |
+ web_stream, AsWeakPtr()); |
SetNetworkState(WebMediaPlayer::NetworkStateLoading); |
SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); |
@@ -239,15 +236,13 @@ void WebMediaPlayerMS::load(LoadType load_type, |
web_stream.isNull() ? std::string() : web_stream.id().utf8(); |
media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id)); |
- // base::Unretained usage is safe here because |compositor_| is destroyed |
- // after |frame_deliverer_|. |
frame_deliverer_.reset(new WebMediaPlayerMS::FrameDeliverer( |
- AsWeakPtr(), base::Bind(&WebMediaPlayerMSCompositor::EnqueueFrame, |
- base::Unretained(compositor_.get())))); |
+ AsWeakPtr(), |
+ base::Bind(&WebMediaPlayerMSCompositor::EnqueueFrame, compositor_))); |
video_frame_provider_ = renderer_factory_->GetVideoRenderer( |
web_stream, media::BindToCurrentLoop(base::Bind( |
&WebMediaPlayerMS::OnSourceError, AsWeakPtr())), |
- frame_deliverer_->GetRepaintCallback(), compositor_task_runner_, |
+ frame_deliverer_->GetRepaintCallback(), io_task_runner_, |
media_task_runner_, worker_task_runner_, gpu_factories_); |
RenderFrame* const frame = RenderFrame::FromWebFrame(frame_); |
@@ -519,7 +514,7 @@ void WebMediaPlayerMS::OnHidden() { |
// During undoable tab closures OnHidden() may be called back to back, so we |
// can't rely on |render_frame_suspended_| being false here. |
if (frame_deliverer_) { |
- compositor_task_runner_->PostTask( |
+ io_task_runner_->PostTask( |
FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, |
base::Unretained(frame_deliverer_.get()), true)); |
} |
@@ -534,7 +529,7 @@ void WebMediaPlayerMS::OnShown() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
if (frame_deliverer_) { |
- compositor_task_runner_->PostTask( |
+ io_task_runner_->PostTask( |
FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, |
base::Unretained(frame_deliverer_.get()), false)); |
} |
@@ -559,7 +554,7 @@ bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) { |
delegate_->PlayerGone(delegate_id_); |
if (frame_deliverer_) { |
- compositor_task_runner_->PostTask( |
+ io_task_runner_->PostTask( |
FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, |
base::Unretained(frame_deliverer_.get()), true)); |
} |