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