| 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));
|
|
|