Chromium Code Reviews| 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); |
| } |