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..a4b4f3d489c1249ddac92ab3d561d8d014aba501 100644 |
--- a/content/renderer/media/media_stream_video_renderer_sink.cc |
+++ b/content/renderer/media/media_stream_video_renderer_sink.cc |
@@ -17,14 +17,24 @@ 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, |
+ 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) { |
+ DCHECK(gpu_factories); |
+ if (gpu_factories && |
mcasas
2015/10/02 19:30:46
For debugging is fine, but DCHECK(bla) + if(bla) i
emircan
2015/10/03 00:11:26
Ok. Removing DCHECK.
|
+ gpu_factories->ShouldUseGpuMemoryBuffersForVideoFrames()) { |
+ gpu_memory_buffer_pool_.reset(new media::GpuMemoryBufferVideoFramePool( |
+ media_task_runner, worker_task_runner, gpu_factories)); |
+ } |
} |
MediaStreamVideoRendererSink::~MediaStreamVideoRendererSink() { |
@@ -86,12 +96,43 @@ void MediaStreamVideoRendererSink::OnVideoFrame( |
if (state_ != STARTED) |
return; |
- frame_size_ = frame->natural_size(); |
+ DCHECK(frame); |
mcasas
2015/10/02 19:30:46
nit: Preconditions in the beginning of the method.
emircan
2015/10/03 00:11:26
Done.
|
+ if (gpu_memory_buffer_pool_) { |
mcasas
2015/10/02 19:30:46
if (!gpu_memory_buffer_pool_) {
FrameReady(fra
emircan
2015/10/03 00:11:26
Done.
|
+ media_task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&MediaStreamVideoRendererSink:: |
+ MaybeCreateHardwareFrameOnMediaThread, |
+ this, frame)); |
mcasas
2015/10/02 19:30:46
I think you can remove the two trampoline methods
emircan
2015/10/03 00:11:26
Done.
mcasas
2015/10/05 17:49:45
How so? I still see the two methods.
|
+ } else { |
+ FrameReady(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)); |
+} |
- TRACE_EVENT_INSTANT1("media_stream_video_renderer_sink", |
- "OnVideoFrame", |
- TRACE_EVENT_SCOPE_THREAD, |
- "timestamp", |
+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); |
} |