Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(227)

Unified Diff: remoting/client/shared_frame_video_renderer.cc

Issue 2156713002: [Chromoting] Implement DualBufferFrameConsumer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698