| 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..68f51b014d124f9a4aee9a64764d085f946a28c6 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,
|
| + 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()) {
|
| + gpu_memory_buffer_pool_.reset(new media::GpuMemoryBufferVideoFramePool(
|
| + media_task_runner, worker_task_runner, gpu_factories));
|
| + }
|
| }
|
|
|
| MediaStreamVideoRendererSink::~MediaStreamVideoRendererSink() {
|
| @@ -72,6 +83,11 @@ void MediaStreamVideoRendererSink::Pause() {
|
| state_ = PAUSED;
|
| }
|
|
|
| +void MediaStreamVideoRendererSink::SetGpuMemoryBufferVideoForTesting(
|
| + scoped_ptr<media::GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool) {
|
| + gpu_memory_buffer_pool_.swap(gpu_memory_buffer_pool);
|
| +}
|
| +
|
| void MediaStreamVideoRendererSink::OnReadyStateChanged(
|
| blink::WebMediaStreamSource::ReadyState state) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| @@ -83,15 +99,32 @@ 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(
|
| + &media::GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame,
|
| + base::Unretained(gpu_memory_buffer_pool_.get()), frame,
|
| + media::BindToCurrentLoop(
|
| + base::Bind(&MediaStreamVideoRendererSink::FrameReady, this))));
|
| +}
|
| +
|
| +void MediaStreamVideoRendererSink::FrameReady(
|
| + const scoped_refptr<media::VideoFrame>& frame) {
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| + DCHECK(frame);
|
| +
|
| + 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);
|
| }
|
|
|