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 3 // found in the LICENSE file. 4 5 #ifndef REMOTING_CLIENT_RECTANGLE_UPDATE_DECODER_H_ 6 #define REMOTING_CLIENT_RECTANGLE_UPDATE_DECODER_H_ 7 8 #include <list> 9 10 #include "base/callback_forward.h" 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "remoting/codec/video_decoder.h" 14 #include "remoting/client/chromoting_stats.h" 15 #include "remoting/client/frame_consumer_proxy.h" 16 #include "remoting/client/frame_producer.h" 17 #include "remoting/protocol/video_stub.h" 18 19 namespace base { 20 class SingleThreadTaskRunner; 21 } // namespace base 22 23 namespace remoting { 24 25 class ChromotingStats; 26 27 namespace protocol { 28 class SessionConfig; 29 } // namespace protocol 30 31 // TODO(ajwong): Re-examine this API, especially with regards to how error 32 // conditions on each step are reported. Should they be CHECKs? Logs? Other? 33 // TODO(sergeyu): Rename this class. 34 class RectangleUpdateDecoder 35 : public base::RefCountedThreadSafe<RectangleUpdateDecoder>, 36 public FrameProducer, 37 public protocol::VideoStub { 38 public: 39 // Creates an update decoder on |main_task_runner_| and |decode_task_runner_|, 40 // outputting to |consumer|. The |main_task_runner_| is responsible for 41 // receiving and queueing packets. The |decode_task_runner_| is responsible 42 // for decoding the video packets. 43 // TODO(wez): Replace the ref-counted proxy with an owned FrameConsumer. 44 RectangleUpdateDecoder( 45 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 46 scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner, 47 scoped_refptr<FrameConsumerProxy> consumer); 48 49 // Initializes decoder with the information from the protocol config. 50 void Initialize(const protocol::SessionConfig& config); 51 52 // FrameProducer implementation. These methods may be called before we are 53 // Initialize()d, or we know the source screen size. 54 virtual void DrawBuffer(webrtc::DesktopFrame* buffer) OVERRIDE; 55 virtual void InvalidateRegion(const SkRegion& region) OVERRIDE; 56 virtual void RequestReturnBuffers(const base::Closure& done) OVERRIDE; 57 virtual void SetOutputSizeAndClip(const SkISize& view_size, 58 const SkIRect& clip_area) OVERRIDE; 59 virtual const SkRegion* GetBufferShape() OVERRIDE; 60 61 // VideoStub implementation. 62 virtual void ProcessVideoPacket(scoped_ptr<VideoPacket> packet, 63 const base::Closure& done) OVERRIDE; 64 65 // Return the stats recorded by this client. 66 ChromotingStats* GetStats(); 67 68 private: 69 friend class base::RefCountedThreadSafe<RectangleUpdateDecoder>; 70 virtual ~RectangleUpdateDecoder(); 71 72 // Paints the invalidated region to the next available buffer and returns it 73 // to the consumer. 74 void SchedulePaint(); 75 void DoPaint(); 76 77 // Decodes the contents of |packet|. DecodePacket may keep a reference to 78 // |packet| so the |packet| must remain alive and valid until |done| is 79 // executed. 80 void DecodePacket(scoped_ptr<VideoPacket> packet, const base::Closure& done); 81 82 // Callback method when a VideoPacket is processed. 83 // If |last_packet| is true then |decode_start| contains the timestamp when 84 // the packet will start to be processed. 85 void OnPacketDone(bool last_packet, 86 base::Time decode_start, 87 const base::Closure& done); 88 89 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; 90 scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner_; 91 scoped_refptr<FrameConsumerProxy> consumer_; 92 scoped_ptr<VideoDecoder> decoder_; 93 94 // Remote screen size in pixels. 95 SkISize source_size_; 96 97 // Vertical and horizontal DPI of the remote screen. 98 SkIPoint source_dpi_; 99 100 // The current dimensions of the frame consumer view. 101 SkISize view_size_; 102 SkIRect clip_area_; 103 104 // The drawing buffers supplied by the frame consumer. 105 std::list<webrtc::DesktopFrame*> buffers_; 106 107 // Flag used to coalesce runs of SchedulePaint()s into a single DoPaint(). 108 bool paint_scheduled_; 109 110 ChromotingStats stats_; 111 112 // Keep track of the most recent sequence number bounced back from the host. 113 int64 latest_sequence_number_; 114 }; 115 116 } // namespace remoting 117 118 #endif // REMOTING_CLIENT_RECTANGLE_UPDATE_DECODER_H_ 119