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 723b733df25d0502dfe8a5ae282f28beac1b8fe2..37480042a8a62a151209699d16a7e3e917548b5f 100644 |
--- a/content/renderer/media/media_stream_video_renderer_sink.cc |
+++ b/content/renderer/media/media_stream_video_renderer_sink.cc |
@@ -4,11 +4,13 @@ |
#include "content/renderer/media/media_stream_video_renderer_sink.h" |
+#include "base/single_thread_task_runner.h" |
#include "base/thread_task_runner_handle.h" |
#include "base/trace_event/trace_event.h" |
#include "media/base/bind_to_current_loop.h" |
#include "media/base/video_frame.h" |
#include "media/base/video_util.h" |
+#include "media/renderers/gpu_video_accelerator_factories.h" |
const int kMinFrameSize = 2; |
@@ -17,14 +19,23 @@ namespace content { |
MediaStreamVideoRendererSink::MediaStreamVideoRendererSink( |
const blink::WebMediaStreamTrack& video_track, |
const base::Closure& error_cb, |
- const RepaintCB& repaint_cb) |
+ const RepaintCB& repaint_cb, |
+ const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, |
Daniele Castagna
2015/10/05 22:00:32
You can get this from gpu_factories if you want.
emircan
2015/10/07 19:45:23
Keeping it as a parameter makes it cleaner, becaus
Daniele Castagna
2015/10/07 19:57:11
SGTM.
|
+ const scoped_refptr<base::TaskRunner>& worker_task_runner, |
+ const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories) |
: error_cb_(error_cb), |
repaint_cb_(repaint_cb), |
task_runner_(base::ThreadTaskRunnerHandle::Get()), |
state_(STOPPED), |
frame_size_(kMinFrameSize, kMinFrameSize), |
video_track_(video_track), |
+ media_task_runner_(media_task_runner), |
weak_factory_(this) { |
+ if (gpu_factories && |
+ gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames()) { |
Daniele Castagna
2015/10/05 22:00:32
This is controlled by --enable-gpu-memory-buffer-v
emircan
2015/10/07 19:45:23
Yes, I tested with the flag.
|
+ gpu_memory_buffer_pool_.reset(new media::GpuMemoryBufferVideoFramePool( |
+ media_task_runner, worker_task_runner, gpu_factories)); |
+ } |
} |
MediaStreamVideoRendererSink::~MediaStreamVideoRendererSink() { |
@@ -83,15 +94,48 @@ void MediaStreamVideoRendererSink::OnVideoFrame( |
const scoped_refptr<media::VideoFrame>& frame, |
base::TimeTicks estimated_capture_time) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
+ DCHECK(frame); |
if (state_ != STARTED) |
return; |
- frame_size_ = frame->natural_size(); |
+ if (!gpu_memory_buffer_pool_) { |
+ FrameReady(frame); |
+ return; |
+ } |
- TRACE_EVENT_INSTANT1("media_stream_video_renderer_sink", |
- "OnVideoFrame", |
- TRACE_EVENT_SCOPE_THREAD, |
- "timestamp", |
+ media_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &MediaStreamVideoRendererSink::MaybeCreateHardwareFrameOnMediaThread, |
Daniele Castagna
2015/10/05 22:00:32
Do you need this method?
Can't you do:
PostTask(
emircan
2015/10/07 19:45:24
Done.
|
+ this, frame)); |
+} |
+ |
+void MediaStreamVideoRendererSink::MaybeCreateHardwareFrameOnMediaThread( |
+ const scoped_refptr<media::VideoFrame>& frame) { |
+ DCHECK(media_task_runner_->BelongsToCurrentThread()); |
+ gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( |
+ frame, base::Bind(&MediaStreamVideoRendererSink:: |
+ MaybeCreateHardwareFrameCompletedOnMediaThread, |
+ this)); |
+} |
+ |
+void MediaStreamVideoRendererSink:: |
+ MaybeCreateHardwareFrameCompletedOnMediaThread( |
+ const scoped_refptr<media::VideoFrame>& frame) { |
+ DCHECK(media_task_runner_->BelongsToCurrentThread()); |
+ DCHECK(frame); |
+ task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&MediaStreamVideoRendererSink::FrameReady, this, frame)); |
+} |
+ |
+void MediaStreamVideoRendererSink::FrameReady( |
+ const scoped_refptr<media::VideoFrame>& frame) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ |
+ frame_size_ = frame->natural_size(); |
+ TRACE_EVENT_INSTANT1("media_stream_video_renderer_sink", "FrameReady", |
+ TRACE_EVENT_SCOPE_THREAD, "timestamp", |
frame->timestamp().InMilliseconds()); |
repaint_cb_.Run(frame); |
} |