frame_consumer_proxy.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/client/frame_consumer_proxy.h"
6
7#include "base/bind.h"
8#include "base/location.h"
9#include "base/single_thread_task_runner.h"
10#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
11#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
12#include "third_party/webrtc/modules/desktop_capture/desktop_region.h"
13
14namespace remoting {
15
16FrameConsumerProxy::FrameConsumerProxy(
17    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
18    : task_runner_(task_runner) {
19}
20
21void FrameConsumerProxy::ApplyBuffer(const webrtc::DesktopSize& view_size,
22                                     const webrtc::DesktopRect& clip_area,
23                                     webrtc::DesktopFrame* buffer,
24                                     const webrtc::DesktopRegion& region) {
25  if (!task_runner_->BelongsToCurrentThread()) {
26    task_runner_->PostTask(FROM_HERE, base::Bind(
27        &FrameConsumerProxy::ApplyBuffer, this,
28        view_size, clip_area, buffer, region));
29    return;
30  }
31
32  if (frame_consumer_.get())
33    frame_consumer_->ApplyBuffer(view_size, clip_area, buffer, region);
34}
35
36void FrameConsumerProxy::ReturnBuffer(webrtc::DesktopFrame* buffer) {
37  if (!task_runner_->BelongsToCurrentThread()) {
38    task_runner_->PostTask(FROM_HERE, base::Bind(
39        &FrameConsumerProxy::ReturnBuffer, this, buffer));
40    return;
41  }
42
43  if (frame_consumer_.get())
44    frame_consumer_->ReturnBuffer(buffer);
45}
46
47void FrameConsumerProxy::SetSourceSize(
48    const webrtc::DesktopSize& source_size,
49    const webrtc::DesktopVector& source_dpi) {
50  if (!task_runner_->BelongsToCurrentThread()) {
51    task_runner_->PostTask(FROM_HERE, base::Bind(
52        &FrameConsumerProxy::SetSourceSize, this, source_size, source_dpi));
53    return;
54  }
55
56  if (frame_consumer_.get())
57    frame_consumer_->SetSourceSize(source_size, source_dpi);
58}
59
60void FrameConsumerProxy::Attach(
61    const base::WeakPtr<FrameConsumer>& frame_consumer) {
62  DCHECK(task_runner_->BelongsToCurrentThread());
63  DCHECK(frame_consumer_.get() == NULL);
64  frame_consumer_ = frame_consumer;
65}
66
67FrameConsumerProxy::~FrameConsumerProxy() {
68}
69
70}  // namespace remoting
71