Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(997)

Unified Diff: content/renderer/media/webmediaplayer_ms.cc

Issue 2529263004: Move passing of WebRTC rendering frames to IO thread (Closed)
Patch Set: ncarter@ comment. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/media/webmediaplayer_ms.h ('k') | content/renderer/media/webmediaplayer_ms_compositor.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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));
}
« no previous file with comments | « content/renderer/media/webmediaplayer_ms.h ('k') | content/renderer/media/webmediaplayer_ms_compositor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698