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

Unified Diff: content/renderer/media/media_stream_video_renderer_sink.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
Index: content/renderer/media/media_stream_video_renderer_sink.cc
diff --git a/content/renderer/media/media_stream_video_renderer_sink.cc b/content/renderer/media/media_stream_video_renderer_sink.cc
index c7341aa8442590502307ce2bf7082c7c9a4f8a07..2d4f634199e869d1b4c050445e21f27417fe548e 100644
--- a/content/renderer/media/media_stream_video_renderer_sink.cc
+++ b/content/renderer/media/media_stream_video_renderer_sink.cc
@@ -6,6 +6,7 @@
#include "base/feature_list.h"
#include "base/memory/weak_ptr.h"
+#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
@@ -24,10 +25,10 @@ const int kMinFrameSize = 2;
namespace content {
// FrameDeliverer is responsible for delivering frames received on
-// OnVideoFrame() to |repaint_cb_| on compositor thread.
+// OnVideoFrame() to |repaint_cb_| on the IO thread.
//
// 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 MediaStreamVideoRendererSink::FrameDeliverer {
public:
FrameDeliverer(const RepaintCB& repaint_cb,
@@ -39,8 +40,7 @@ class MediaStreamVideoRendererSink::FrameDeliverer {
frame_size_(kMinFrameSize, kMinFrameSize),
media_task_runner_(media_task_runner),
weak_factory_(this) {
- compositor_thread_checker_.DetachFromThread();
- weak_this_ = weak_factory_.GetWeakPtr();
+ io_thread_checker_.DetachFromThread();
if (gpu_factories &&
gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames() &&
base::FeatureList::IsEnabled(
@@ -51,7 +51,7 @@ class MediaStreamVideoRendererSink::FrameDeliverer {
}
~FrameDeliverer() {
- DCHECK(compositor_thread_checker_.CalledOnValidThread());
+ DCHECK(io_thread_checker_.CalledOnValidThread());
DCHECK(state_ == STARTED || state_ == PAUSED) << state_;
if (gpu_memory_buffer_pool_) {
@@ -62,7 +62,7 @@ class MediaStreamVideoRendererSink::FrameDeliverer {
void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame,
base::TimeTicks /*current_time*/) {
- DCHECK(compositor_thread_checker_.CalledOnValidThread());
+ DCHECK(io_thread_checker_.CalledOnValidThread());
DCHECK(frame);
TRACE_EVENT_INSTANT1("webrtc",
"MediaStreamVideoRendererSink::"
@@ -77,7 +77,6 @@ class MediaStreamVideoRendererSink::FrameDeliverer {
FrameReady(frame);
return;
}
-
// |gpu_memory_buffer_pool_| deletion is going to be posted to
// |media_task_runner_|. base::Unretained() usage is fine since
// |gpu_memory_buffer_pool_| outlives the task.
@@ -86,12 +85,12 @@ class MediaStreamVideoRendererSink::FrameDeliverer {
base::Bind(
&media::GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame,
base::Unretained(gpu_memory_buffer_pool_.get()), frame,
- media::BindToCurrentLoop(
- base::Bind(&FrameDeliverer::FrameReady, weak_this_))));
+ media::BindToCurrentLoop(base::Bind(&FrameDeliverer::FrameReady,
+ weak_factory_.GetWeakPtr()))));
}
void FrameReady(const scoped_refptr<media::VideoFrame>& frame) {
- DCHECK(compositor_thread_checker_.CalledOnValidThread());
+ DCHECK(io_thread_checker_.CalledOnValidThread());
DCHECK(frame);
TRACE_EVENT_INSTANT1(
"webrtc", "MediaStreamVideoRendererSink::FrameDeliverer::FrameReady",
@@ -103,7 +102,7 @@ class MediaStreamVideoRendererSink::FrameDeliverer {
}
void RenderEndOfStream() {
- DCHECK(compositor_thread_checker_.CalledOnValidThread());
+ DCHECK(io_thread_checker_.CalledOnValidThread());
// This is necessary to make sure audio can play if the video tag src is a
// MediaStream video track that has been rejected or ended. It also ensure
// that the renderer doesn't hold a reference to a real video frame if no
@@ -121,33 +120,29 @@ class MediaStreamVideoRendererSink::FrameDeliverer {
}
void Start() {
- DCHECK(compositor_thread_checker_.CalledOnValidThread());
+ DCHECK(io_thread_checker_.CalledOnValidThread());
DCHECK_EQ(state_, STOPPED);
state_ = STARTED;
}
void Resume() {
- DCHECK(compositor_thread_checker_.CalledOnValidThread());
+ DCHECK(io_thread_checker_.CalledOnValidThread());
if (state_ == PAUSED)
state_ = STARTED;
}
void Pause() {
- DCHECK(compositor_thread_checker_.CalledOnValidThread());
+ DCHECK(io_thread_checker_.CalledOnValidThread());
if (state_ == STARTED)
state_ = PAUSED;
}
- VideoCaptureDeliverFrameCB GetDeliverFrameCallback() {
- return base::Bind(&FrameDeliverer::OnVideoFrame, weak_this_);
- }
-
private:
friend class MediaStreamVideoRendererSink;
void SetGpuMemoryBufferVideoForTesting(
media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) {
- DCHECK(compositor_thread_checker_.CalledOnValidThread());
+ DCHECK(io_thread_checker_.CalledOnValidThread());
gpu_memory_buffer_pool_.reset(gpu_memory_buffer_pool);
}
@@ -160,60 +155,25 @@ class MediaStreamVideoRendererSink::FrameDeliverer {
const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
// Used for DCHECKs to ensure method calls are executed on the correct thread.
- base::ThreadChecker compositor_thread_checker_;
+ base::ThreadChecker io_thread_checker_;
- base::WeakPtr<FrameDeliverer> weak_this_;
base::WeakPtrFactory<FrameDeliverer> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(FrameDeliverer);
};
-// FrameReceiver is responsible for trampolining frames from IO thread to
-// the compositor thread by posting a task on |deliver_frame_cb_|.
-//
-// It is created on main thread, but methods should be called and class should
-// be destructed on the IO thread.
-class MediaStreamVideoRendererSink::FrameReceiver {
- public:
- FrameReceiver(
- const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
- const VideoCaptureDeliverFrameCB& deliver_frame_cb)
- : compositor_task_runner_(compositor_task_runner),
- deliver_frame_cb_(deliver_frame_cb) {
- io_thread_checker_.DetachFromThread();
- }
-
- ~FrameReceiver() { DCHECK(io_thread_checker_.CalledOnValidThread()); }
-
- void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame,
- base::TimeTicks current_time) {
- DCHECK(io_thread_checker_.CalledOnValidThread());
- compositor_task_runner_->PostTask(
- FROM_HERE, base::Bind(deliver_frame_cb_, frame, current_time));
- }
-
- private:
- const scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
- const VideoCaptureDeliverFrameCB deliver_frame_cb_;
-
- // Used for DCHECKs to ensure method calls executed in the correct thread.
- base::ThreadChecker io_thread_checker_;
-
- DISALLOW_COPY_AND_ASSIGN(FrameReceiver);
-};
-
MediaStreamVideoRendererSink::MediaStreamVideoRendererSink(
const blink::WebMediaStreamTrack& video_track,
const base::Closure& error_cb,
const RepaintCB& repaint_cb,
- const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
const scoped_refptr<base::TaskRunner>& worker_task_runner,
media::GpuVideoAcceleratorFactories* gpu_factories)
: error_cb_(error_cb),
repaint_cb_(repaint_cb),
video_track_(video_track),
- compositor_task_runner_(compositor_task_runner),
+ io_task_runner_(io_task_runner),
media_task_runner_(media_task_runner),
worker_task_runner_(worker_task_runner),
gpu_factories_(gpu_factories) {}
@@ -225,26 +185,24 @@ void MediaStreamVideoRendererSink::Start() {
frame_deliverer_.reset(new MediaStreamVideoRendererSink::FrameDeliverer(
repaint_cb_, media_task_runner_, worker_task_runner_, gpu_factories_));
- compositor_task_runner_->PostTask(
+ io_task_runner_->PostTask(
FROM_HERE, base::Bind(&FrameDeliverer::Start,
base::Unretained(frame_deliverer_.get())));
- frame_receiver_.reset(new MediaStreamVideoRendererSink::FrameReceiver(
- compositor_task_runner_, frame_deliverer_->GetDeliverFrameCallback()));
MediaStreamVideoSink::ConnectToTrack(
video_track_,
// This callback is run on IO thread. It is safe to use base::Unretained
- // here because |frame_receiver_| will be destroyed after sink is
- // disconnected from track.
- base::Bind(&FrameReceiver::OnVideoFrame,
- base::Unretained(frame_receiver_.get())),
+ // here because |frame_receiver_| will be destroyed on IO thread after
+ // sink is disconnected from track.
+ base::Bind(&FrameDeliverer::OnVideoFrame,
+ base::Unretained(frame_deliverer_.get())),
// Local display video rendering is considered a secure link.
true);
if (video_track_.source().getReadyState() ==
blink::WebMediaStreamSource::ReadyStateEnded ||
!video_track_.isEnabled()) {
- compositor_task_runner_->PostTask(
+ io_task_runner_->PostTask(
FROM_HERE, base::Bind(&FrameDeliverer::RenderEndOfStream,
base::Unretained(frame_deliverer_.get())));
}
@@ -254,12 +212,8 @@ void MediaStreamVideoRendererSink::Stop() {
DCHECK(main_thread_checker_.CalledOnValidThread());
MediaStreamVideoSink::DisconnectFromTrack();
- if (frame_receiver_) {
- ChildProcess::current()->io_task_runner()->DeleteSoon(
- FROM_HERE, frame_receiver_.release());
- }
if (frame_deliverer_)
- compositor_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release());
+ io_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release());
}
void MediaStreamVideoRendererSink::Resume() {
@@ -267,7 +221,7 @@ void MediaStreamVideoRendererSink::Resume() {
if (!frame_deliverer_)
return;
- compositor_task_runner_->PostTask(
+ io_task_runner_->PostTask(
FROM_HERE, base::Bind(&FrameDeliverer::Resume,
base::Unretained(frame_deliverer_.get())));
}
@@ -277,7 +231,7 @@ void MediaStreamVideoRendererSink::Pause() {
if (!frame_deliverer_)
return;
- compositor_task_runner_->PostTask(
+ io_task_runner_->PostTask(
FROM_HERE, base::Bind(&FrameDeliverer::Pause,
base::Unretained(frame_deliverer_.get())));
}
@@ -287,7 +241,7 @@ void MediaStreamVideoRendererSink::OnReadyStateChanged(
DCHECK(main_thread_checker_.CalledOnValidThread());
if (state == blink::WebMediaStreamSource::ReadyStateEnded &&
frame_deliverer_) {
- compositor_task_runner_->PostTask(
+ io_task_runner_->PostTask(
FROM_HERE, base::Bind(&FrameDeliverer::RenderEndOfStream,
base::Unretained(frame_deliverer_.get())));
}
@@ -305,7 +259,7 @@ void MediaStreamVideoRendererSink::SetGpuMemoryBufferVideoForTesting(
media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool) {
DCHECK(main_thread_checker_.CalledOnValidThread());
CHECK(frame_deliverer_);
- compositor_task_runner_->PostTask(
+ io_task_runner_->PostTask(
FROM_HERE, base::Bind(&FrameDeliverer::SetGpuMemoryBufferVideoForTesting,
base::Unretained(frame_deliverer_.get()),
gpu_memory_buffer_pool));

Powered by Google App Engine
This is Rietveld 408576698