| Index: remoting/host/session_manager.h
|
| ===================================================================
|
| --- remoting/host/session_manager.h (revision 0)
|
| +++ remoting/host/session_manager.h (revision 0)
|
| @@ -0,0 +1,190 @@
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef REMOTING_HOST_RECORD_SESSION_H_
|
| +#define REMOTING_HOST_RECORD_SESSION_H_
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/message_loop.h"
|
| +#include "base/ref_counted.h"
|
| +#include "base/scoped_ptr.h"
|
| +#include "base/time.h"
|
| +#include "remoting/base/protocol/chromotocol.pb.h"
|
| +#include "remoting/host/capturer.h"
|
| +
|
| +namespace media {
|
| +
|
| +class DataBuffer;
|
| +
|
| +} // namespace media
|
| +
|
| +namespace remoting {
|
| +
|
| +class Encoder;
|
| +class ClientConnection;
|
| +
|
| +// A class for controlling and coordinate Capturer, Encoder
|
| +// and NetworkChannel in a record session.
|
| +//
|
| +// THREADING
|
| +//
|
| +// This class works on three threads, namely capture, encode and network
|
| +// thread. The main function of this class is to coordinate and schedule
|
| +// capture, encode and transmission of data on different threads.
|
| +//
|
| +// The following is an example of timeline for operations scheduled.
|
| +//
|
| +// | CAPTURE ENCODE NETWORK
|
| +// | .............
|
| +// | . Capture .
|
| +// | .............
|
| +// | ............
|
| +// | . .
|
| +// | ............. . .
|
| +// | . Capture . . Encode .
|
| +// | ............. . .
|
| +// | . .
|
| +// | ............
|
| +// | ............. ............ ..........
|
| +// | . Capture . . . . Send .
|
| +// | ............. . . ..........
|
| +// | . Encode .
|
| +// | . .
|
| +// | . .
|
| +// | ............
|
| +// | Time
|
| +// v
|
| +//
|
| +// SessionManager has the following responsibilities:
|
| +// 1. Make sure capture and encode occurs no more frequently than |rate|.
|
| +// 2. Make sure there is at most one outstanding capture not being encoded.
|
| +// 3. Distribute tasks on three threads on a timely fashion to minimize latency.
|
| +class SessionManager : public base::RefCountedThreadSafe<SessionManager> {
|
| + public:
|
| +
|
| + // Construct a SessionManager. Message loops and threads are provided.
|
| + // Ownership of Capturer and Encoder are given to this object.
|
| + SessionManager(MessageLoop* capture_loop,
|
| + MessageLoop* encode_loop,
|
| + MessageLoop* network_loop,
|
| + Capturer* capturer,
|
| + Encoder* encoder);
|
| +
|
| + virtual ~SessionManager();
|
| +
|
| + // Start recording.
|
| + void Start();
|
| +
|
| + // Pause the recording session.
|
| + void Pause();
|
| +
|
| + // Set the maximum capture rate. This is denoted by number of updates
|
| + // in one second. The actual system may run in a slower rate than the maximum
|
| + // rate due to various factors, e.g. capture speed, encode speed and network
|
| + // conditions.
|
| + // This method should be called before Start() is called.
|
| + void SetMaxRate(double rate);
|
| +
|
| + // Add a client to this recording session.
|
| + void AddClient(scoped_refptr<ClientConnection> client);
|
| +
|
| + // Remove a client from receiving screen updates.
|
| + void RemoveClient(scoped_refptr<ClientConnection> client);
|
| +
|
| + private:
|
| + void DoStart();
|
| + void DoPause();
|
| + void DoStartRateControl();
|
| + void DoPauseRateControl();
|
| +
|
| + void DoCapture();
|
| + void DoFinishEncode();
|
| + void DoEncode();
|
| + void DoSendUpdate(
|
| + chromotocol_pb::UpdateStreamPacketHeader* header,
|
| + scoped_refptr<media::DataBuffer> encoded_data,
|
| + bool begin_update,
|
| + bool end_update);
|
| + void DoSendInit(scoped_refptr<ClientConnection> client,
|
| + int width, int height);
|
| + void DoGetInitInfo(scoped_refptr<ClientConnection> client);
|
| + void DoSetRate(double rate);
|
| + void DoSetMaxRate(double max_rate);
|
| + void DoAddClient(scoped_refptr<ClientConnection> client);
|
| + void DoRemoveClient(scoped_refptr<ClientConnection> client);
|
| + void DoRateControl();
|
| +
|
| + // Hepler method to schedule next capture using the current rate.
|
| + void ScheduleNextCapture();
|
| +
|
| + // Helper method to schedule next rate regulation task.
|
| + void ScheduleNextRateControl();
|
| +
|
| + void CaptureDoneTask();
|
| + void EncodeDataAvailableTask();
|
| +
|
| + // Message loops used by this class.
|
| + MessageLoop* capture_loop_;
|
| + MessageLoop* encode_loop_;
|
| + MessageLoop* network_loop_;
|
| +
|
| + // Reference to the capturer. This member is always accessed on the capture
|
| + // thread.
|
| + scoped_ptr<Capturer> capturer_;
|
| +
|
| + // Reference to the encoder. This member is always accessed on the encode
|
| + // thread.
|
| + scoped_ptr<Encoder> encoder_;
|
| +
|
| + // A list of clients connected to this hosts.
|
| + // This member is always accessed on the NETWORK thread.
|
| + // TODO(hclam): Have to scoped_refptr the clients since they have a shorter
|
| + // lifetime than this object.
|
| + typedef std::vector<scoped_refptr<ClientConnection> > ClientConnectionList;
|
| + ClientConnectionList clients_;
|
| +
|
| + // The following members are accessed on the capture thread.
|
| + double rate_; // Number of captures to perform every second.
|
| + bool started_;
|
| + base::Time last_capture_time_; // Saves the time last capture started.
|
| + int recordings_; // Count the number of recordings
|
| + // (i.e. capture or encode) happening.
|
| +
|
| + // The maximum rate is written on the capture thread and read on the network
|
| + // thread.
|
| + double max_rate_; // Number of captures to perform every second.
|
| +
|
| + // The following member is accessed on the network thread.
|
| + bool rate_control_started_;
|
| +
|
| + // Stores the data and information of the last capture done.
|
| + // These members are written on capture thread and read on encode thread.
|
| + // It is guranteed the read happens after the write.
|
| + DirtyRects capture_dirty_rects_;
|
| + const uint8* capture_data_[3];
|
| + int capture_data_strides_[3];
|
| + int capture_width_;
|
| + int capture_height_;
|
| + chromotocol_pb::PixelFormat capture_pixel_format_;
|
| +
|
| + // The following members are accessed on the encode thread.
|
| + // Output parameter written by Encoder to carry encoded data.
|
| + chromotocol_pb::UpdateStreamPacketHeader encoded_data_header_;
|
| + scoped_refptr<media::DataBuffer> encoded_data_;
|
| +
|
| + // True if we have started receiving encoded data from the Encoder.
|
| + bool encode_stream_started_;
|
| +
|
| + // Output parameter written by Encoder to notify the end of encoded data
|
| + // stream.
|
| + bool encode_done_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SessionManager);
|
| +};
|
| +
|
| +} // namespace remoting
|
| +
|
| +#endif // REMOTING_HOST_RECORD_SESSION_H_
|
|
|
| Property changes on: remoting/host/session_manager.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|