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