15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/client/frame_consumer_proxy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/single_thread_task_runner.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/desktop_region.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FrameConsumerProxy::FrameConsumerProxy(
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const base::WeakPtr<FrameConsumer>& frame_consumer)
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : frame_consumer_(frame_consumer),
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      task_runner_(task_runner) {
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  pixel_format_ = frame_consumer_->GetPixelFormat();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void FrameConsumerProxy::ApplyBuffer(const webrtc::DesktopSize& view_size,
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                     const webrtc::DesktopRect& clip_area,
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                     webrtc::DesktopFrame* buffer,
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     const webrtc::DesktopRegion& region,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     const webrtc::DesktopRegion& shape) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!task_runner_->BelongsToCurrentThread()) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_runner_->PostTask(FROM_HERE, base::Bind(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &FrameConsumerProxy::ApplyBuffer, this,
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        view_size, clip_area, buffer, region, shape));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (frame_consumer_.get())
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frame_consumer_->ApplyBuffer(view_size, clip_area, buffer, region, shape);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid FrameConsumerProxy::ReturnBuffer(webrtc::DesktopFrame* buffer) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!task_runner_->BelongsToCurrentThread()) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_runner_->PostTask(FROM_HERE, base::Bind(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &FrameConsumerProxy::ReturnBuffer, this, buffer));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (frame_consumer_.get())
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame_consumer_->ReturnBuffer(buffer);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void FrameConsumerProxy::SetSourceSize(
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const webrtc::DesktopSize& source_size,
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const webrtc::DesktopVector& source_dpi) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!task_runner_->BelongsToCurrentThread()) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    task_runner_->PostTask(FROM_HERE, base::Bind(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &FrameConsumerProxy::SetSourceSize, this, source_size, source_dpi));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (frame_consumer_.get())
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame_consumer_->SetSourceSize(source_size, source_dpi);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FrameConsumer::PixelFormat FrameConsumerProxy::GetPixelFormat() {
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return pixel_format_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FrameConsumerProxy::~FrameConsumerProxy() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
72