| 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_;
|
|
|