Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(579)

Side by Side Diff: remoting/host/screen_recorder.h

Issue 6282006: Add a done task to ScreenRecorder::Stop() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed comments Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « remoting/host/chromoting_host.cc ('k') | remoting/host/screen_recorder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef REMOTING_HOST_SCREEN_RECORDER_H_ 5 #ifndef REMOTING_HOST_SCREEN_RECORDER_H_
6 #define REMOTING_HOST_SCREEN_RECORDER_H_ 6 #define REMOTING_HOST_SCREEN_RECORDER_H_
7 7
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 // | . . 53 // | . .
54 // | . . 54 // | . .
55 // | ............ 55 // | ............
56 // | Time 56 // | Time
57 // v 57 // v
58 // 58 //
59 // ScreenRecorder has the following responsibilities: 59 // ScreenRecorder has the following responsibilities:
60 // 1. Make sure capture and encode occurs no more frequently than |rate|. 60 // 1. Make sure capture and encode occurs no more frequently than |rate|.
61 // 2. Make sure there is at most one outstanding capture not being encoded. 61 // 2. Make sure there is at most one outstanding capture not being encoded.
62 // 3. Distribute tasks on three threads on a timely fashion to minimize latency. 62 // 3. Distribute tasks on three threads on a timely fashion to minimize latency.
63 //
64 // This class has the following state variables:
65 // |is_recording_| - If this is set to false there should be no activity on
66 // the capture thread by this object.
67 // |network_stopped_| - This state is to prevent activity on the network thread
68 // if set to false.
63 class ScreenRecorder : public base::RefCountedThreadSafe<ScreenRecorder> { 69 class ScreenRecorder : public base::RefCountedThreadSafe<ScreenRecorder> {
64 public: 70 public:
65 71
66 // Construct a ScreenRecorder. Message loops and threads are provided. 72 // Construct a ScreenRecorder. Message loops and threads are provided.
67 // This object does not own capturer and encoder. 73 // This object does not own capturer and encoder.
68 ScreenRecorder(MessageLoop* capture_loop, 74 ScreenRecorder(MessageLoop* capture_loop,
69 MessageLoop* encode_loop, 75 MessageLoop* encode_loop,
70 MessageLoop* network_loop, 76 MessageLoop* network_loop,
71 Capturer* capturer, 77 Capturer* capturer,
72 Encoder* encoder); 78 Encoder* encoder);
73 79
74 virtual ~ScreenRecorder(); 80 virtual ~ScreenRecorder();
75 81
76 // Start recording. 82 // Start recording.
77 void Start(); 83 void Start();
78 84
79 // Pause the recording session. 85 // Stop the recording session. |done_task| is executed when recording is fully
80 void Pause(); 86 // stopped. This object cannot be used again after |task| is executed.
87 void Stop(Task* done_task);
81 88
82 // Set the maximum capture rate. This is denoted by number of updates 89 // Set the maximum capture rate. This is denoted by number of updates
83 // in one second. The actual system may run in a slower rate than the maximum 90 // in one second. The actual system may run in a slower rate than the maximum
84 // rate due to various factors, e.g. capture speed, encode speed and network 91 // rate due to various factors, e.g. capture speed, encode speed and network
85 // conditions. 92 // conditions.
86 // This method should be called before Start() is called. 93 // This method should be called before Start() is called.
87 void SetMaxRate(double rate); 94 void SetMaxRate(double rate);
88 95
89 // Add a connection to this recording session. 96 // Add a connection to this recording session.
90 void AddConnection(scoped_refptr<protocol::ConnectionToClient> connection); 97 void AddConnection(scoped_refptr<protocol::ConnectionToClient> connection);
91 98
92 // Remove a connection from receiving screen updates. 99 // Remove a connection from receiving screen updates.
93 void RemoveConnection(scoped_refptr<protocol::ConnectionToClient> connection); 100 void RemoveConnection(scoped_refptr<protocol::ConnectionToClient> connection);
94 101
95 // Remove all connections. 102 // Remove all connections.
96 void RemoveAllConnections(); 103 void RemoveAllConnections();
97 104
98 private: 105 private:
99 // Getters for capturer and encoder. 106 // Getters for capturer and encoder.
100 Capturer* capturer(); 107 Capturer* capturer();
101 Encoder* encoder(); 108 Encoder* encoder();
102 109
103 // Capturer thread ---------------------------------------------------------- 110 // Capturer thread ----------------------------------------------------------
104 111
105 void DoStart(); 112 void DoStart();
106 void DoPause(); 113 void DoStop(Task* done_task);
114 void DoCompleteStop(Task* done_task);
107 115
108 void DoSetMaxRate(double max_rate); 116 void DoSetMaxRate(double max_rate);
109 117
110 // Hepler method to schedule next capture using the current rate. 118 // Hepler method to schedule next capture using the current rate.
111 void StartCaptureTimer(); 119 void StartCaptureTimer();
112 120
113 void DoCapture(); 121 void DoCapture();
114 void CaptureDoneCallback(scoped_refptr<CaptureData> capture_data); 122 void CaptureDoneCallback(scoped_refptr<CaptureData> capture_data);
115 void DoFinishSend(); 123 void DoFinishOneRecording();
116 124
117 // Network thread ----------------------------------------------------------- 125 // Network thread -----------------------------------------------------------
118 126
119 // DoSendVideoPacket takes ownership of the |packet| and is responsible 127 // DoSendVideoPacket takes ownership of the |packet| and is responsible
120 // for deleting it. 128 // for deleting it.
121 void DoSendVideoPacket(VideoPacket* packet); 129 void DoSendVideoPacket(VideoPacket* packet);
122 130
123 void DoSendInit(scoped_refptr<protocol::ConnectionToClient> connection, 131 void DoSendInit(scoped_refptr<protocol::ConnectionToClient> connection,
124 int width, int height); 132 int width, int height);
125 133
126 void DoAddConnection(scoped_refptr<protocol::ConnectionToClient> connection); 134 void DoAddConnection(scoped_refptr<protocol::ConnectionToClient> connection);
127 void DoRemoveClient(scoped_refptr<protocol::ConnectionToClient> connection); 135 void DoRemoveClient(scoped_refptr<protocol::ConnectionToClient> connection);
128 void DoRemoveAllClients(); 136 void DoRemoveAllClients();
129 137
138 // Signal network thread to cease activities.
139 void DoStopOnNetworkThread(Task* done_task);
140
130 // Callback for the last packet in one update. Deletes |packet| and 141 // Callback for the last packet in one update. Deletes |packet| and
131 // schedules next screen capture. 142 // schedules next screen capture.
132 void OnFrameSent(VideoPacket* packet); 143 void FrameSentCallback(VideoPacket* packet);
133 144
134 // Encoder thread ----------------------------------------------------------- 145 // Encoder thread -----------------------------------------------------------
135 146
136 void DoEncode(scoped_refptr<CaptureData> capture_data); 147 void DoEncode(scoped_refptr<CaptureData> capture_data);
137 148
138 // EncodeDataAvailableTask takes ownership of |packet|. 149 // Perform stop operations on encode thread.
139 void EncodeDataAvailableTask(VideoPacket* packet); 150 void DoStopOnEncodeThread(Task* done_task);
151
152 // EncodedDataAvailableCallback takes ownership of |packet|.
153 void EncodedDataAvailableCallback(VideoPacket* packet);
140 void SendVideoPacket(VideoPacket* packet); 154 void SendVideoPacket(VideoPacket* packet);
141 155
142 // Message loops used by this class. 156 // Message loops used by this class.
143 MessageLoop* capture_loop_; 157 MessageLoop* capture_loop_;
144 MessageLoop* encode_loop_; 158 MessageLoop* encode_loop_;
145 MessageLoop* network_loop_; 159 MessageLoop* network_loop_;
146 160
147 // Reference to the capturer. This member is always accessed on the capture 161 // Reference to the capturer. This member is always accessed on the capture
148 // thread. 162 // thread.
149 scoped_ptr<Capturer> capturer_; 163 scoped_ptr<Capturer> capturer_;
150 164
151 // Reference to the encoder. This member is always accessed on the encode 165 // Reference to the encoder. This member is always accessed on the encode
152 // thread. 166 // thread.
153 scoped_ptr<Encoder> encoder_; 167 scoped_ptr<Encoder> encoder_;
154 168
155 // A list of clients connected to this hosts. 169 // A list of clients connected to this hosts.
156 // This member is always accessed on the NETWORK thread. 170 // This member is always accessed on the network thread.
157 // TODO(hclam): Have to scoped_refptr the clients since they have a shorter
158 // lifetime than this object.
159 typedef std::vector<scoped_refptr<protocol::ConnectionToClient> > 171 typedef std::vector<scoped_refptr<protocol::ConnectionToClient> >
160 ConnectionToClientList; 172 ConnectionToClientList;
161 ConnectionToClientList connections_; 173 ConnectionToClientList connections_;
162 174
163 // The following members are accessed on the capture thread. 175 // Flag that indicates recording has been started. This variable should only
164 bool started_; 176 // be used on the capture thread.
177 bool is_recording_;
178
179 // Flag that indicates network is being stopped. This variable should only
180 // be used on the network thread.
181 bool network_stopped_;
165 182
166 // Timer that calls DoCapture. 183 // Timer that calls DoCapture.
167 base::RepeatingTimer<ScreenRecorder> capture_timer_; 184 base::RepeatingTimer<ScreenRecorder> capture_timer_;
168 185
169 // Count the number of recordings (i.e. capture or encode) happening. 186 // Count the number of recordings (i.e. capture or encode) happening.
170 int recordings_; 187 int recordings_;
171 188
172 // Set to true if we've skipped last capture because there are too 189 // Set to true if we've skipped last capture because there are too
173 // many pending frames. 190 // many pending frames.
174 int frame_skipped_; 191 int frame_skipped_;
175 192
176 // Number of captures to perform every second. Written on the capture thread. 193 // Number of captures to perform every second. Written on the capture thread.
177 double max_rate_; 194 double max_rate_;
178 195
179 DISALLOW_COPY_AND_ASSIGN(ScreenRecorder); 196 DISALLOW_COPY_AND_ASSIGN(ScreenRecorder);
180 }; 197 };
181 198
182 } // namespace remoting 199 } // namespace remoting
183 200
184 #endif // REMOTING_HOST_SCREEN_RECORDER_H_ 201 #endif // REMOTING_HOST_SCREEN_RECORDER_H_
OLDNEW
« no previous file with comments | « remoting/host/chromoting_host.cc ('k') | remoting/host/screen_recorder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698