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)// This class is an implementation of the ChromotingView for Pepper. It is 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callable only on the Pepper thread. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_CLIENT_PLUGIN_PEPPER_VIEW_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_CLIENT_PLUGIN_PEPPER_VIEW_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/compiler_specific.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/graphics_2d.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/view.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/point.h" 17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ppapi/utility/completion_callback_factory.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/client/frame_consumer.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/desktop_region.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Time; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace webrtc { 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DesktopFrame; 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace webrtc 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromotingInstance; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientContext; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FrameProducer; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class PepperView : public FrameConsumer { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Constructs a PepperView for the |instance|. The |instance| and |context| 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // must outlive this class. 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PepperView(ChromotingInstance* instance, ClientContext* context); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PepperView(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Allocates buffers and passes them to the FrameProducer to render into until 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // the maximum number of buffers are in-flight. 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void Initialize(FrameProducer* producer); 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FrameConsumer implementation. 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void ApplyBuffer(const webrtc::DesktopSize& view_size, 49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const webrtc::DesktopRect& clip_area, 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch webrtc::DesktopFrame* buffer, 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const webrtc::DesktopRegion& region, 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const webrtc::DesktopRegion& shape) OVERRIDE; 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ReturnBuffer(webrtc::DesktopFrame* buffer) OVERRIDE; 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void SetSourceSize(const webrtc::DesktopSize& source_size, 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const webrtc::DesktopVector& dpi) OVERRIDE; 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual PixelFormat GetPixelFormat() OVERRIDE; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates the PepperView's size & clipping area, taking into account the 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DIP-to-device scale factor. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetView(const pp::View& view); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the dimensions of the most recently displayed frame, in pixels. 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const webrtc::DesktopSize& get_source_size() const { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return source_size_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allocates a new frame buffer to supply to the FrameProducer to render into. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns NULL if the maximum number of buffers has already been allocated. 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch webrtc::DesktopFrame* AllocateBuffer(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Frees a frame buffer previously allocated by AllocateBuffer. 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void FreeBuffer(webrtc::DesktopFrame* buffer); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Renders the parts of |buffer| identified by |region| to the view. If the 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // clip area of the view has changed since the buffer was generated then 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FrameProducer is supplied the missed parts of |region|. The FrameProducer 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will be supplied a new buffer when FlushBuffer() completes. 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void FlushBuffer(const webrtc::DesktopRect& clip_area, 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch webrtc::DesktopFrame* buffer, 81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const webrtc::DesktopRegion& region); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handles completion of FlushBuffer(), triggering a new buffer to be 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // returned to FrameProducer for rendering. 85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void OnFlushDone(int result, 86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::Time& paint_start, 87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) webrtc::DesktopFrame* buffer); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reference to the creating plugin instance. Needed for interacting with 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pepper. Marking explicitly as const since it must be initialized at 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // object creation, and never change. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromotingInstance* const instance_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Context should be constant for the lifetime of the plugin. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientContext* const context_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Graphics2D graphics2d_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FrameProducer* producer_; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List of allocated image buffers. 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::list<webrtc::DesktopFrame*> buffers_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queued buffer to paint, with clip area and dirty region in device pixels. 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch webrtc::DesktopFrame* merge_buffer_; 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webrtc::DesktopRect merge_clip_area_; 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webrtc::DesktopRegion merge_region_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // View size in Density Independent Pixels (DIPs). 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webrtc::DesktopSize dips_size_; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Scale factor from DIPs to device pixels. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float dips_to_device_scale_; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // View size in output pixels. This is the size at which FrameProducer must 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // render frames. It usually matches the DIPs size of the view, but may match 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the size in device pixels when scaling is in effect, to reduce artefacts. 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webrtc::DesktopSize view_size_; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Scale factor from output pixels to device pixels. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float dips_to_view_scale_; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Visible area of the view, in output pixels. 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webrtc::DesktopRect clip_area_; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Size of the most recent source frame in pixels. 127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webrtc::DesktopSize source_size_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resolution of the most recent source frame dots-per-inch. 130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) webrtc::DesktopVector source_dpi_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if there is already a Flush() pending on the Graphics2D context. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flush_pending_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True after Initialize() has been called, until TearDown(). 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_initialized_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True after the first call to ApplyBuffer(). 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool frame_received_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) pp::CompletionCallbackFactory<PepperView> callback_factory_; 142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PepperView); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // REMOTING_CLIENT_PLUGIN_PEPPER_VIEW_H_ 149