Chromium Code Reviews| Index: remoting/client/shared_frame_video_renderer.cc | 
| diff --git a/remoting/client/shared_frame_video_renderer.cc b/remoting/client/shared_frame_video_renderer.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..0b18754995778e4eabbcdfd1a3589ec25e1a7804 | 
| --- /dev/null | 
| +++ b/remoting/client/shared_frame_video_renderer.cc | 
| @@ -0,0 +1,102 @@ | 
| +// Copyright 2016 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "remoting/client/shared_frame_video_renderer.h" | 
| + | 
| +#include "base/bind.h" | 
| +#include "base/bind_helpers.h" | 
| +#include "base/location.h" | 
| +#include "base/memory/ptr_util.h" | 
| +#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" | 
| +#include "third_party/webrtc/modules/desktop_capture/shared_desktop_frame.h" | 
| + | 
| +namespace remoting { | 
| + | 
| +SharedFrameVideoRenderer::SharedFrameVideoRenderer( | 
| + base::Callback<void(std::unique_ptr<webrtc::DesktopFrame>)> callback, | 
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 
| + protocol::FrameConsumer::PixelFormat format) | 
| + : callback_(callback), | 
| + task_runner_(task_runner), | 
| + pixel_format_(format), | 
| + weak_factory_(this) { | 
| + thread_checker_.DetachFromThread(); | 
| +} | 
| + | 
| +SharedFrameVideoRenderer::~SharedFrameVideoRenderer() { | 
| + DCHECK(thread_checker_.CalledOnValidThread()); | 
| +} | 
| + | 
| + | 
| +void SharedFrameVideoRenderer::SetUnderlyingVideoRenderer( | 
| + std::unique_ptr<protocol::VideoRenderer> renderer) { | 
| + underlying_video_renderer_ = std::move(renderer); | 
| +} | 
| + | 
| +bool SharedFrameVideoRenderer::Initialize( | 
| + const ClientContext& client_context, | 
| + protocol::FrameStatsConsumer* perf_tracker) { | 
| + DCHECK(thread_checker_.CalledOnValidThread()); | 
| + return underlying_video_renderer_->Initialize(client_context, perf_tracker); | 
| +} | 
| + | 
| +void SharedFrameVideoRenderer::OnSessionConfig( | 
| + const protocol::SessionConfig& config) { | 
| + DCHECK(thread_checker_.CalledOnValidThread()); | 
| + underlying_video_renderer_->OnSessionConfig(config); | 
| +} | 
| + | 
| +protocol::VideoStub* SharedFrameVideoRenderer::GetVideoStub() { | 
| + DCHECK(thread_checker_.CalledOnValidThread()); | 
| + return underlying_video_renderer_->GetVideoStub(); | 
| +} | 
| + | 
| +protocol::FrameConsumer* SharedFrameVideoRenderer::GetFrameConsumer() { | 
| + DCHECK(thread_checker_.CalledOnValidThread()); | 
| + return underlying_video_renderer_->GetFrameConsumer(); | 
| +} | 
| + | 
| +protocol::FrameStatsConsumer* | 
| +SharedFrameVideoRenderer::GetFrameStatsConsumer() { | 
| + DCHECK(thread_checker_.CalledOnValidThread()); | 
| + return underlying_video_renderer_->GetFrameStatsConsumer(); | 
| 
 
Sergey Ulanov
2016/07/15 22:14:47
How will this class get any frames, if you return
 
Yuwei
2016/07/15 22:55:32
I think you are talking about GetFrameConsumer. I'
 
Yuwei
2016/07/18 18:53:47
Obsolete.
 
Sergey Ulanov
2016/07/20 18:39:26
I see. Then this class needs to be just a FrameCon
 
Yuwei
2016/07/20 19:12:43
Yes. It has been renamed...
 
 | 
| +} | 
| + | 
| +std::unique_ptr<webrtc::DesktopFrame> SharedFrameVideoRenderer::AllocateFrame( | 
| + const webrtc::DesktopSize& size) { | 
| + DCHECK(thread_checker_.CalledOnValidThread()); | 
| + if (!shared_frame_ || !shared_frame_->size().equals(size)) { | 
| + shared_frame_ = webrtc::SharedDesktopFrame::Wrap( | 
| + base::WrapUnique(new webrtc::BasicDesktopFrame(size))); | 
| + } | 
| + return shared_frame_->Share(); | 
| +} | 
| + | 
| +void SharedFrameVideoRenderer::DrawFrame( | 
| + std::unique_ptr<webrtc::DesktopFrame> frame, | 
| + const base::Closure& done) { | 
| + DCHECK(thread_checker_.CalledOnValidThread()); | 
| + if (!task_runner_) { | 
| + callback_.Run(std::move(frame)); | 
| + return; | 
| + } | 
| + task_runner_->PostTaskAndReply( | 
| + FROM_HERE, base::Bind(callback_, base::Passed(&frame)), | 
| + base::Bind(&SharedFrameVideoRenderer::OnFrameRendered, | 
| + weak_factory_.GetWeakPtr(), done)); | 
| +} | 
| + | 
| +protocol::FrameConsumer::PixelFormat | 
| +SharedFrameVideoRenderer::GetPixelFormat() { | 
| + return pixel_format_; | 
| +} | 
| + | 
| +void SharedFrameVideoRenderer::OnFrameRendered(const base::Closure& done) { | 
| + DCHECK(thread_checker_.CalledOnValidThread()); | 
| + if (done) { | 
| + done.Run(); | 
| + } | 
| +} | 
| + | 
| +} // namespace remoting |