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)#ifndef REMOTING_HOST_VIDEO_SCHEDULER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_HOST_VIDEO_SCHEDULER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/codec/video_encoder.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/capture_scheduler.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/video.pb.h"
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h"
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/mouse_cursor_monitor.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SingleThreadTaskRunner;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media {
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class DesktopCapturer;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace media
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CursorShapeInfo;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CursorShapeInfo;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CursorShapeStub;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoStub;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protocol
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Class responsible for scheduling frame captures from a
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// webrtc::DesktopCapturer, delivering them to a VideoEncoder to encode, and
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// finally passing the encoded video packets to the specified VideoStub to send
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// on the network.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THREADING
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is supplied TaskRunners to use for capture, encode and network
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// operations.  Capture, encode and network transmission tasks are interleaved
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as illustrated below:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |       CAPTURE       ENCODE     NETWORK
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |    .............
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |    .  Capture  .
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |    .............
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |                  ............
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |                  .          .
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |    ............. .          .
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |    .  Capture  . .  Encode  .
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |    ............. .          .
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |                  .          .
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |                  ............
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |    ............. ............ ..........
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |    .  Capture  . .          . .  Send  .
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |    ............. .          . ..........
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |                  .  Encode  .
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |                  .          .
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |                  .          .
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |                  ............
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | Time
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// v
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VideoScheduler would ideally schedule captures so as to saturate the slowest
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the capture, encode and network processes.  However, it also needs to
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rate-limit captures to avoid overloading the host system, either by consuming
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// too much CPU, or hogging the host's graphics subsystem.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoScheduler : public base::RefCountedThreadSafe<VideoScheduler>,
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       public webrtc::DesktopCapturer::Callback,
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       public webrtc::MouseCursorMonitor::Callback {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Enables timestamps for generated frames. Used for testing.
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void EnableTimestampsForTests();
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a VideoScheduler running capture, encode and network tasks on the
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // supplied TaskRunners.  Video and cursor shape updates will be pumped to
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |video_stub| and |client_stub|, which must remain valid until Stop() is
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // called. |capturer| is used to capture frames.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VideoScheduler(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      scoped_ptr<webrtc::DesktopCapturer> capturer,
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      scoped_ptr<webrtc::MouseCursorMonitor> mouse_cursor_monitor,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<VideoEncoder> encoder,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      protocol::CursorShapeStub* cursor_stub,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      protocol::VideoStub* video_stub);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // webrtc::DesktopCapturer::Callback implementation.
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual webrtc::SharedMemory* CreateSharedMemory(size_t size) OVERRIDE;
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnCaptureCompleted(webrtc::DesktopFrame* frame) OVERRIDE;
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // webrtc::MouseCursorMonitor::Callback implementation.
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnMouseCursor(
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      webrtc::MouseCursor* mouse_cursor) OVERRIDE;
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnMouseCursorPosition(
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      webrtc::MouseCursorMonitor::CursorState state,
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const webrtc::DesktopVector& position) OVERRIDE;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Starts scheduling frame captures.
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Start();
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stop scheduling frame captures. This object cannot be re-used once
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it has been stopped.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Stop();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pauses or resumes scheduling of frame captures.  Pausing/resuming captures
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only affects capture scheduling and does not stop/start the capturer.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Pause(bool pause);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the sequence number embedded in VideoPackets.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sequence numbers are used for performance measurements.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateSequenceNumber(int64 sequence_number);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Sets whether the video encoder should be requested to encode losslessly,
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // or to use a lossless color space (typically requiring higher bandwidth).
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetLosslessEncode(bool want_lossless);
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetLosslessColor(bool want_lossless);
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<VideoScheduler>;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~VideoScheduler();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Capturer thread ----------------------------------------------------------
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the capturer on the capture thread.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartOnCaptureThread();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Stops scheduling frame captures on the capture thread.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopOnCaptureThread();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedules the next call to CaptureNextFrame.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleNextCapture();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the next frame capture, unless there are already too many pending.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CaptureNextFrame();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a frame capture has been encoded & sent to the client.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FrameCaptureCompleted();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Network thread -----------------------------------------------------------
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send |packet| to the client, unless we are in the process of stopping.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendVideoPacket(scoped_ptr<VideoPacket> packet);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback passed to |video_stub_| for the last packet in each frame, to
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // rate-limit frame captures to network throughput.
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnVideoPacketSent();
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Called by |keep_alive_timer_|.
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SendKeepAlivePacket();
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Callback for |video_stub_| called after a keep-alive packet is sent.
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnKeepAlivePacketSent();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send updated cursor shape to client.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendCursorShape(scoped_ptr<protocol::CursorShapeInfo> cursor_shape);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Encoder thread -----------------------------------------------------------
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Encode a frame, passing generated VideoPackets to SendVideoPacket().
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void EncodeFrame(scoped_ptr<webrtc::DesktopFrame> frame,
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   int64 sequence_number,
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   base::TimeTicks timestamp);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void EncodedDataAvailableCallback(int64 sequence_number,
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                    scoped_ptr<VideoPacket> packet);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Task runners used by this class.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to capture frames. Always accessed on the capture thread.
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<webrtc::DesktopCapturer> capturer_;
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Used to capture mouse cursor shapes. Always accessed on the capture thread.
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<webrtc::MouseCursorMonitor> mouse_cursor_monitor_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to encode captured frames. Always accessed on the encode thread.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<VideoEncoder> encoder_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Interfaces through which video frames and cursor shapes are passed to the
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // client. These members are always accessed on the network thread.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  protocol::CursorShapeStub* cursor_stub_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protocol::VideoStub* video_stub_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Timer used to schedule CaptureNextFrame().
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::OneShotTimer<VideoScheduler> > capture_timer_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Timer used to ensure that we send empty keep-alive frames to the client
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // even when the video stream is paused or encoder is busy.
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::DelayTimer<VideoScheduler> > keep_alive_timer_;
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The number of frames being processed, i.e. frames that we are currently
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // capturing, encoding or sending. The value is capped at 2 to minimize
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // latency.
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int pending_frames_;
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Set when the capturer is capturing a frame.
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool capture_pending_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the previous scheduled capture was skipped.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_skip_frame_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if capture of video frames is paused.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_paused_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Number updated by the caller to trace performance.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 sequence_number_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An object to schedule capturing.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CaptureScheduler scheduler_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VideoScheduler);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // REMOTING_HOST_VIDEO_SCHEDULER_H_
229