| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This class is an implementation of the ChromotingView for Pepper. It is | 5 // This class is an implementation of the ChromotingView for Pepper. It is |
| 6 // callable only on the Pepper thread. | 6 // callable only on the Pepper thread. |
| 7 | 7 |
| 8 #ifndef REMOTING_CLIENT_PLUGIN_PEPPER_VIEW_H_ | 8 #ifndef REMOTING_CLIENT_PLUGIN_PEPPER_VIEW_H_ |
| 9 #define REMOTING_CLIENT_PLUGIN_PEPPER_VIEW_H_ | 9 #define REMOTING_CLIENT_PLUGIN_PEPPER_VIEW_H_ |
| 10 | 10 |
| 11 #include <list> | 11 #include <list> |
| 12 | 12 |
| 13 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
| 14 #include "ppapi/cpp/graphics_2d.h" | 14 #include "ppapi/cpp/graphics_2d.h" |
| 15 #include "ppapi/cpp/view.h" | 15 #include "ppapi/cpp/view.h" |
| 16 #include "ppapi/cpp/point.h" | 16 #include "ppapi/cpp/point.h" |
| 17 #include "ppapi/utility/completion_callback_factory.h" | 17 #include "ppapi/utility/completion_callback_factory.h" |
| 18 #include "remoting/client/frame_consumer.h" | 18 #include "remoting/client/frame_consumer.h" |
| 19 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" |
| 20 #include "third_party/webrtc/modules/desktop_capture/desktop_region.h" |
| 19 | 21 |
| 20 namespace base { | 22 namespace base { |
| 21 class Time; | 23 class Time; |
| 22 } // namespace base | 24 } // namespace base |
| 23 | 25 |
| 24 namespace webrtc { | 26 namespace webrtc { |
| 25 class DesktopFrame; | 27 class DesktopFrame; |
| 26 } // namespace webrtc | 28 } // namespace webrtc |
| 27 | 29 |
| 28 namespace remoting { | 30 namespace remoting { |
| 29 | 31 |
| 30 class ChromotingInstance; | 32 class ChromotingInstance; |
| 31 class ClientContext; | 33 class ClientContext; |
| 32 class FrameProducer; | 34 class FrameProducer; |
| 33 | 35 |
| 34 class PepperView : public FrameConsumer { | 36 class PepperView : public FrameConsumer { |
| 35 public: | 37 public: |
| 36 // Constructs a PepperView for the |instance|. The |instance|, |context| | 38 // Constructs a PepperView for the |instance|. The |instance|, |context| |
| 37 // and |producer| must outlive this class. | 39 // and |producer| must outlive this class. |
| 38 PepperView(ChromotingInstance* instance, | 40 PepperView(ChromotingInstance* instance, |
| 39 ClientContext* context, | 41 ClientContext* context, |
| 40 FrameProducer* producer); | 42 FrameProducer* producer); |
| 41 virtual ~PepperView(); | 43 virtual ~PepperView(); |
| 42 | 44 |
| 43 // FrameConsumer implementation. | 45 // FrameConsumer implementation. |
| 44 virtual void ApplyBuffer(const SkISize& view_size, | 46 virtual void ApplyBuffer(const webrtc::DesktopSize& view_size, |
| 45 const SkIRect& clip_area, | 47 const webrtc::DesktopRect& clip_area, |
| 46 webrtc::DesktopFrame* buffer, | 48 webrtc::DesktopFrame* buffer, |
| 47 const SkRegion& region) OVERRIDE; | 49 const webrtc::DesktopRegion& region) OVERRIDE; |
| 48 virtual void ReturnBuffer(webrtc::DesktopFrame* buffer) OVERRIDE; | 50 virtual void ReturnBuffer(webrtc::DesktopFrame* buffer) OVERRIDE; |
| 49 virtual void SetSourceSize(const SkISize& source_size, | 51 virtual void SetSourceSize(const webrtc::DesktopSize& source_size, |
| 50 const SkIPoint& dpi) OVERRIDE; | 52 const webrtc::DesktopVector& dpi) OVERRIDE; |
| 51 | 53 |
| 52 // Updates the PepperView's size & clipping area, taking into account the | 54 // Updates the PepperView's size & clipping area, taking into account the |
| 53 // DIP-to-device scale factor. | 55 // DIP-to-device scale factor. |
| 54 void SetView(const pp::View& view); | 56 void SetView(const pp::View& view); |
| 55 | 57 |
| 56 // Returns the dimensions of the most recently displayed frame, in pixels. | 58 // Returns the dimensions of the most recently displayed frame, in pixels. |
| 57 const SkISize& get_source_size() const { | 59 const webrtc::DesktopSize& get_source_size() const { |
| 58 return source_size_; | 60 return source_size_; |
| 59 } | 61 } |
| 60 | 62 |
| 61 // Return the dimensions of the view in Density Independent Pixels (DIPs). | 63 // Return the dimensions of the view in Density Independent Pixels (DIPs). |
| 62 // Note that there may be multiple device pixels per DIP. | 64 // Note that there may be multiple device pixels per DIP. |
| 63 const SkISize& get_view_size_dips() const { | 65 const webrtc::DesktopSize& get_view_size_dips() const { |
| 64 return dips_size_; | 66 return dips_size_; |
| 65 } | 67 } |
| 66 | 68 |
| 67 private: | 69 private: |
| 68 // Allocates a new frame buffer to supply to the FrameProducer to render into. | 70 // Allocates a new frame buffer to supply to the FrameProducer to render into. |
| 69 // Returns NULL if the maximum number of buffers has already been allocated. | 71 // Returns NULL if the maximum number of buffers has already been allocated. |
| 70 webrtc::DesktopFrame* AllocateBuffer(); | 72 webrtc::DesktopFrame* AllocateBuffer(); |
| 71 | 73 |
| 72 // Frees a frame buffer previously allocated by AllocateBuffer. | 74 // Frees a frame buffer previously allocated by AllocateBuffer. |
| 73 void FreeBuffer(webrtc::DesktopFrame* buffer); | 75 void FreeBuffer(webrtc::DesktopFrame* buffer); |
| 74 | 76 |
| 75 // Allocates buffers and passes them to the FrameProducer to render into until | 77 // Allocates buffers and passes them to the FrameProducer to render into until |
| 76 // the maximum number of buffers are in-flight. | 78 // the maximum number of buffers are in-flight. |
| 77 void InitiateDrawing(); | 79 void InitiateDrawing(); |
| 78 | 80 |
| 79 // Renders the parts of |buffer| identified by |region| to the view. If the | 81 // Renders the parts of |buffer| identified by |region| to the view. If the |
| 80 // clip area of the view has changed since the buffer was generated then | 82 // clip area of the view has changed since the buffer was generated then |
| 81 // FrameProducer is supplied the missed parts of |region|. The FrameProducer | 83 // FrameProducer is supplied the missed parts of |region|. The FrameProducer |
| 82 // will be supplied a new buffer when FlushBuffer() completes. | 84 // will be supplied a new buffer when FlushBuffer() completes. |
| 83 void FlushBuffer(const SkIRect& clip_area, | 85 void FlushBuffer(const webrtc::DesktopRect& clip_area, |
| 84 webrtc::DesktopFrame* buffer, | 86 webrtc::DesktopFrame* buffer, |
| 85 const SkRegion& region); | 87 const webrtc::DesktopRegion& region); |
| 86 | 88 |
| 87 // Handles completion of FlushBuffer(), triggering a new buffer to be | 89 // Handles completion of FlushBuffer(), triggering a new buffer to be |
| 88 // returned to FrameProducer for rendering. | 90 // returned to FrameProducer for rendering. |
| 89 void OnFlushDone(int result, | 91 void OnFlushDone(int result, |
| 90 const base::Time& paint_start, | 92 const base::Time& paint_start, |
| 91 webrtc::DesktopFrame* buffer); | 93 webrtc::DesktopFrame* buffer); |
| 92 | 94 |
| 93 // Reference to the creating plugin instance. Needed for interacting with | 95 // Reference to the creating plugin instance. Needed for interacting with |
| 94 // pepper. Marking explicitly as const since it must be initialized at | 96 // pepper. Marking explicitly as const since it must be initialized at |
| 95 // object creation, and never change. | 97 // object creation, and never change. |
| 96 ChromotingInstance* const instance_; | 98 ChromotingInstance* const instance_; |
| 97 | 99 |
| 98 // Context should be constant for the lifetime of the plugin. | 100 // Context should be constant for the lifetime of the plugin. |
| 99 ClientContext* const context_; | 101 ClientContext* const context_; |
| 100 | 102 |
| 101 pp::Graphics2D graphics2d_; | 103 pp::Graphics2D graphics2d_; |
| 102 | 104 |
| 103 FrameProducer* producer_; | 105 FrameProducer* producer_; |
| 104 | 106 |
| 105 // List of allocated image buffers. | 107 // List of allocated image buffers. |
| 106 std::list<webrtc::DesktopFrame*> buffers_; | 108 std::list<webrtc::DesktopFrame*> buffers_; |
| 107 | 109 |
| 108 // Queued buffer to paint, with clip area and dirty region in device pixels. | 110 // Queued buffer to paint, with clip area and dirty region in device pixels. |
| 109 webrtc::DesktopFrame* merge_buffer_; | 111 webrtc::DesktopFrame* merge_buffer_; |
| 110 SkIRect merge_clip_area_; | 112 webrtc::DesktopRect merge_clip_area_; |
| 111 SkRegion merge_region_; | 113 webrtc::DesktopRegion merge_region_; |
| 112 | 114 |
| 113 // View size in Density Independent Pixels (DIPs). | 115 // View size in Density Independent Pixels (DIPs). |
| 114 SkISize dips_size_; | 116 webrtc::DesktopSize dips_size_; |
| 115 | 117 |
| 116 // Scale factor from DIPs to device pixels. | 118 // Scale factor from DIPs to device pixels. |
| 117 float dips_to_device_scale_; | 119 float dips_to_device_scale_; |
| 118 | 120 |
| 119 // View size in output pixels. This is the size at which FrameProducer must | 121 // View size in output pixels. This is the size at which FrameProducer must |
| 120 // render frames. It usually matches the DIPs size of the view, but may match | 122 // render frames. It usually matches the DIPs size of the view, but may match |
| 121 // the size in device pixels when scaling is in effect, to reduce artefacts. | 123 // the size in device pixels when scaling is in effect, to reduce artefacts. |
| 122 SkISize view_size_; | 124 webrtc::DesktopSize view_size_; |
| 123 | 125 |
| 124 // Scale factor from output pixels to device pixels. | 126 // Scale factor from output pixels to device pixels. |
| 125 float dips_to_view_scale_; | 127 float dips_to_view_scale_; |
| 126 | 128 |
| 127 // Visible area of the view, in output pixels. | 129 // Visible area of the view, in output pixels. |
| 128 SkIRect clip_area_; | 130 webrtc::DesktopRect clip_area_; |
| 129 | 131 |
| 130 // Size of the most recent source frame in pixels. | 132 // Size of the most recent source frame in pixels. |
| 131 SkISize source_size_; | 133 webrtc::DesktopSize source_size_; |
| 132 | 134 |
| 133 // Resolution of the most recent source frame dots-per-inch. | 135 // Resolution of the most recent source frame dots-per-inch. |
| 134 SkIPoint source_dpi_; | 136 webrtc::DesktopVector source_dpi_; |
| 135 | 137 |
| 136 // True if there is already a Flush() pending on the Graphics2D context. | 138 // True if there is already a Flush() pending on the Graphics2D context. |
| 137 bool flush_pending_; | 139 bool flush_pending_; |
| 138 | 140 |
| 139 // True after Initialize() has been called, until TearDown(). | 141 // True after Initialize() has been called, until TearDown(). |
| 140 bool is_initialized_; | 142 bool is_initialized_; |
| 141 | 143 |
| 142 // True after the first call to ApplyBuffer(). | 144 // True after the first call to ApplyBuffer(). |
| 143 bool frame_received_; | 145 bool frame_received_; |
| 144 | 146 |
| 145 pp::CompletionCallbackFactory<PepperView> callback_factory_; | 147 pp::CompletionCallbackFactory<PepperView> callback_factory_; |
| 146 | 148 |
| 147 DISALLOW_COPY_AND_ASSIGN(PepperView); | 149 DISALLOW_COPY_AND_ASSIGN(PepperView); |
| 148 }; | 150 }; |
| 149 | 151 |
| 150 } // namespace remoting | 152 } // namespace remoting |
| 151 | 153 |
| 152 #endif // REMOTING_CLIENT_PLUGIN_PEPPER_VIEW_H_ | 154 #endif // REMOTING_CLIENT_PLUGIN_PEPPER_VIEW_H_ |
| OLD | NEW |