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