Index: remoting/client/plugin/pepper_video_renderer_2d.h |
diff --git a/remoting/client/plugin/pepper_video_renderer_2d.h b/remoting/client/plugin/pepper_video_renderer_2d.h |
index 21ac4ec229b97f0fb8fa86c4dbfa15c5fc50477d..6f8d35d392f2ab21d05ea2ec821ed0c0d0a27edb 100644 |
--- a/remoting/client/plugin/pepper_video_renderer_2d.h |
+++ b/remoting/client/plugin/pepper_video_renderer_2d.h |
@@ -9,9 +9,11 @@ |
#include "base/compiler_specific.h" |
#include "base/memory/ref_counted.h" |
+#include "base/memory/scoped_vector.h" |
#include "base/memory/weak_ptr.h" |
-#include "base/threading/non_thread_safe.h" |
+#include "base/threading/thread_checker.h" |
#include "ppapi/cpp/graphics_2d.h" |
+#include "ppapi/cpp/image_data.h" |
#include "ppapi/cpp/point.h" |
#include "ppapi/cpp/view.h" |
#include "ppapi/utility/completion_callback_factory.h" |
@@ -21,11 +23,12 @@ |
#include "third_party/webrtc/modules/desktop_capture/desktop_region.h" |
namespace base { |
-class Time; |
+class ScopedClosureRunner; |
} // namespace base |
namespace webrtc { |
class DesktopFrame; |
+class SharedDesktopFrame; |
} // namespace webrtc |
namespace remoting { |
@@ -35,16 +38,15 @@ class SoftwareVideoRenderer; |
// Video renderer that wraps SoftwareVideoRenderer and displays it using Pepper |
// 2D graphics API. |
class PepperVideoRenderer2D : public PepperVideoRenderer, |
- public FrameConsumer, |
- public base::NonThreadSafe { |
+ public FrameConsumer { |
public: |
PepperVideoRenderer2D(); |
~PepperVideoRenderer2D() override; |
// PepperVideoRenderer interface. |
bool Initialize(pp::Instance* instance, |
- const ClientContext& context, |
- EventHandler* event_handler) override; |
+ const ClientContext& context, |
+ EventHandler* event_handler) override; |
void OnViewChanged(const pp::View& view) override; |
void EnableDebugDirtyRegion(bool enable) override; |
@@ -55,69 +57,27 @@ class PepperVideoRenderer2D : public PepperVideoRenderer, |
private: |
// FrameConsumer implementation. |
- void ApplyBuffer(const webrtc::DesktopSize& view_size, |
- const webrtc::DesktopRect& clip_area, |
- webrtc::DesktopFrame* buffer, |
- const webrtc::DesktopRegion& region, |
- const webrtc::DesktopRegion* shape) override; |
- void ReturnBuffer(webrtc::DesktopFrame* buffer) override; |
- void SetSourceSize(const webrtc::DesktopSize& source_size, |
- const webrtc::DesktopVector& dpi) override; |
+ scoped_ptr<webrtc::DesktopFrame> AllocateFrame( |
+ const webrtc::DesktopSize& size) override; |
+ void DrawFrame(scoped_ptr<webrtc::DesktopFrame> frame, |
+ const base::Closure& done) override; |
PixelFormat GetPixelFormat() override; |
- // Helper to allocate buffers for the decoder. |
- void AllocateBuffers(); |
- // Frees a frame buffer previously allocated by AllocateBuffer. |
- void FreeBuffer(webrtc::DesktopFrame* buffer); |
- |
- // Renders the parts of |buffer| identified by |region| to the view. If the |
- // clip area of the view has changed since the buffer was generated then |
- // FrameProducer is supplied the missed parts of |region|. The FrameProducer |
- // will be supplied a new buffer when FlushBuffer() completes. |
- void FlushBuffer(const webrtc::DesktopRect& clip_area, |
- webrtc::DesktopFrame* buffer, |
- const webrtc::DesktopRegion& region); |
- |
- // Handles completion of FlushBuffer(), triggering a new buffer to be |
- // returned to FrameProducer for rendering. |
- void OnFlushDone(int result, |
- const base::Time& paint_start, |
- webrtc::DesktopFrame* buffer); |
+ void Flush(); |
+ void OnFlushDone(int result); |
// Parameters passed to Initialize(). |
- pp::Instance* instance_; |
- EventHandler* event_handler_; |
+ pp::Instance* instance_ = nullptr; |
+ EventHandler* event_handler_ = nullptr; |
pp::Graphics2D graphics2d_; |
scoped_ptr<SoftwareVideoRenderer> software_video_renderer_; |
- // List of allocated image buffers. |
- std::list<webrtc::DesktopFrame*> buffers_; |
- |
- // Queued buffer to paint, with clip area and dirty region in device pixels. |
- webrtc::DesktopFrame* merge_buffer_; |
- webrtc::DesktopRect merge_clip_area_; |
- webrtc::DesktopRegion merge_region_; |
- |
- // View size in Density Independent Pixels (DIPs). |
- webrtc::DesktopSize dips_size_; |
- |
- // Scale factor from DIPs to device pixels. |
- float dips_to_device_scale_; |
- |
- // View size in output pixels. This is the size at which FrameProducer must |
- // render frames. It usually matches the DIPs size of the view, but may match |
- // the size in device pixels when scaling is in effect, to reduce artefacts. |
+ // View size in output pixels. |
webrtc::DesktopSize view_size_; |
- // Scale factor from output pixels to device pixels. |
- float dips_to_view_scale_; |
- |
- // Visible area of the view, in output pixels. |
- webrtc::DesktopRect clip_area_; |
- |
// Size of the most recent source frame in pixels. |
webrtc::DesktopSize source_size_; |
@@ -127,14 +87,25 @@ class PepperVideoRenderer2D : public PepperVideoRenderer, |
// Shape of the most recent source frame. |
scoped_ptr<webrtc::DesktopRegion> source_shape_; |
+ // Done callbacks for the frames that have been painted but not flushed. |
+ ScopedVector<base::ScopedClosureRunner> pending_frames_done_callbacks_; |
+ |
+ // Done callbacks for the frames that are currently being flushed. |
+ ScopedVector<base::ScopedClosureRunner> flushing_frames_done_callbacks_; |
+ |
+ // True if there paint operations that need to be flushed. |
+ bool need_flush_ = false; |
+ |
// True if there is already a Flush() pending on the Graphics2D context. |
- bool flush_pending_; |
+ bool flush_pending_ = false; |
- // True after the first call to ApplyBuffer(). |
- bool frame_received_; |
+ // True after the first call to DrawFrame(). |
+ bool frame_received_ = false; |
// True if dirty regions are to be sent to |event_handler_| for debugging. |
- bool debug_dirty_region_; |
+ bool debug_dirty_region_ = false; |
+ |
+ base::ThreadChecker thread_checker_; |
pp::CompletionCallbackFactory<PepperVideoRenderer2D> callback_factory_; |
base::WeakPtrFactory<PepperVideoRenderer2D> weak_factory_; |