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

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

Issue 1365663003: Add UMA histograms for more detailed latency tracking on the CRD host. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed tests Created 5 years, 2 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
« no previous file with comments | « remoting/host/client_session.cc ('k') | remoting/host/video_frame_pump.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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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_VIDEO_FRAME_PUMP_H_ 5 #ifndef REMOTING_HOST_VIDEO_FRAME_PUMP_H_
6 #define REMOTING_HOST_VIDEO_FRAME_PUMP_H_ 6 #define REMOTING_HOST_VIDEO_FRAME_PUMP_H_
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/scoped_vector.h"
11 #include "base/threading/thread_checker.h" 12 #include "base/threading/thread_checker.h"
12 #include "base/time/time.h" 13 #include "base/time/time.h"
13 #include "base/timer/timer.h" 14 #include "base/timer/timer.h"
14 #include "remoting/codec/video_encoder.h" 15 #include "remoting/codec/video_encoder.h"
15 #include "remoting/host/capture_scheduler.h" 16 #include "remoting/host/capture_scheduler.h"
16 #include "remoting/proto/video.pb.h" 17 #include "remoting/proto/video.pb.h"
17 #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" 18 #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h"
18 19
19 namespace base { 20 namespace base {
20 class SingleThreadTaskRunner; 21 class SingleThreadTaskRunner;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner, 76 scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner,
76 scoped_ptr<webrtc::DesktopCapturer> capturer, 77 scoped_ptr<webrtc::DesktopCapturer> capturer,
77 scoped_ptr<VideoEncoder> encoder, 78 scoped_ptr<VideoEncoder> encoder,
78 protocol::VideoStub* video_stub); 79 protocol::VideoStub* video_stub);
79 ~VideoFramePump() override; 80 ~VideoFramePump() override;
80 81
81 // Pauses or resumes scheduling of frame captures. Pausing/resuming captures 82 // Pauses or resumes scheduling of frame captures. Pausing/resuming captures
82 // only affects capture scheduling and does not stop/start the capturer. 83 // only affects capture scheduling and does not stop/start the capturer.
83 void Pause(bool pause); 84 void Pause(bool pause);
84 85
85 // Updates event timestamp from the last event received from the client. This 86 // Called whenever input event is received.
86 // value is sent back to the client for roundtrip latency estimates. 87 void OnInputEventReceived(int64_t event_timestamp);
87 void SetLatestEventTimestamp(int64 latest_event_timestamp);
88 88
89 // Sets whether the video encoder should be requested to encode losslessly, 89 // Sets whether the video encoder should be requested to encode losslessly,
90 // or to use a lossless color space (typically requiring higher bandwidth). 90 // or to use a lossless color space (typically requiring higher bandwidth).
91 void SetLosslessEncode(bool want_lossless); 91 void SetLosslessEncode(bool want_lossless);
92 void SetLosslessColor(bool want_lossless); 92 void SetLosslessColor(bool want_lossless);
93 93
94 protocol::VideoFeedbackStub* video_feedback_stub() { 94 protocol::VideoFeedbackStub* video_feedback_stub() {
95 return &capture_scheduler_; 95 return &capture_scheduler_;
96 } 96 }
97 97
98 private: 98 private:
99 struct FrameTimestamps {
100 FrameTimestamps();
101 ~FrameTimestamps();
102
103 // The following two fields are set only for one frame after each incoming
104 // input event. |input_event_client_timestamp| is event timestamp
105 // received from the client. |input_event_received_time| is local time when
106 // the event was received.
107 int64_t input_event_client_timestamp = -1;
108 base::TimeTicks input_event_received_time;
109
110 base::TimeTicks capture_started_time;
111 base::TimeTicks capture_ended_time;
112 base::TimeTicks encode_started_time;
113 base::TimeTicks encode_ended_time;
114 base::TimeTicks can_send_time;
115 };
116
117 struct PacketWithTimestamps {
118 PacketWithTimestamps(scoped_ptr<VideoPacket> packet,
119 scoped_ptr<FrameTimestamps> timestamps);
120 ~PacketWithTimestamps();
121
122 scoped_ptr<VideoPacket> packet;
123 scoped_ptr<FrameTimestamps> timestamps;
124 };
125
99 // webrtc::DesktopCapturer::Callback interface. 126 // webrtc::DesktopCapturer::Callback interface.
100 webrtc::SharedMemory* CreateSharedMemory(size_t size) override; 127 webrtc::SharedMemory* CreateSharedMemory(size_t size) override;
101 void OnCaptureCompleted(webrtc::DesktopFrame* frame) override; 128 void OnCaptureCompleted(webrtc::DesktopFrame* frame) override;
102 129
103 // Callback for CaptureScheduler. 130 // Callback for CaptureScheduler.
104 void CaptureNextFrame(); 131 void CaptureNextFrame();
105 132
106 // Sends encoded frame 133 // Task running on the encoder thread to encode the |frame|.
107 void SendEncodedFrame(int64 latest_event_timestamp, 134 static scoped_ptr<PacketWithTimestamps> EncodeFrame(
108 base::TimeTicks timestamp, 135 VideoEncoder* encoder,
109 scoped_ptr<VideoPacket> packet); 136 scoped_ptr<webrtc::DesktopFrame> frame,
137 scoped_ptr<FrameTimestamps> timestamps);
138
139 // Task called when a frame has finished encoding.
140 void OnFrameEncoded(scoped_ptr<PacketWithTimestamps> packet);
141
142 // Sends |packet| to the client.
143 void SendPacket(scoped_ptr<PacketWithTimestamps> packet);
144
145 // Helper called from SendPacket() to calculate timing fields in the |packet|
146 // before sending it.
147 void UpdateFrameTimers(VideoPacket* packet, FrameTimestamps* timestamps);
110 148
111 // Callback passed to |video_stub_|. 149 // Callback passed to |video_stub_|.
112 void OnVideoPacketSent(); 150 void OnVideoPacketSent();
113 151
114 // Called by |keep_alive_timer_|. 152 // Called by |keep_alive_timer_|.
115 void SendKeepAlivePacket(); 153 void SendKeepAlivePacket();
116 154
117 // Callback for |video_stub_| called after a keep-alive packet is sent. 155 // Callback for |video_stub_| called after a keep-alive packet is sent.
118 void OnKeepAlivePacketSent(); 156 void OnKeepAlivePacketSent();
119 157
(...skipping 10 matching lines...) Expand all
130 protocol::VideoStub* video_stub_; 168 protocol::VideoStub* video_stub_;
131 169
132 // Timer used to ensure that we send empty keep-alive frames to the client 170 // Timer used to ensure that we send empty keep-alive frames to the client
133 // even when the video stream is paused or encoder is busy. 171 // even when the video stream is paused or encoder is busy.
134 base::Timer keep_alive_timer_; 172 base::Timer keep_alive_timer_;
135 173
136 // CaptureScheduler calls CaptureNextFrame() whenever a new frame needs to be 174 // CaptureScheduler calls CaptureNextFrame() whenever a new frame needs to be
137 // captured. 175 // captured.
138 CaptureScheduler capture_scheduler_; 176 CaptureScheduler capture_scheduler_;
139 177
140 // Number updated by the caller to trace performance. 178 // Timestamps for the frame to be captured next.
141 int64 latest_event_timestamp_; 179 scoped_ptr<FrameTimestamps> next_frame_timestamps_;
180
181 // Timestamps for the frame that's being captured.
182 scoped_ptr<FrameTimestamps> captured_frame_timestamps_;
183
184 bool send_pending_ = false;
185
186 ScopedVector<PacketWithTimestamps> pending_packets_;
142 187
143 base::ThreadChecker thread_checker_; 188 base::ThreadChecker thread_checker_;
144 189
145 base::WeakPtrFactory<VideoFramePump> weak_factory_; 190 base::WeakPtrFactory<VideoFramePump> weak_factory_;
146 191
147 DISALLOW_COPY_AND_ASSIGN(VideoFramePump); 192 DISALLOW_COPY_AND_ASSIGN(VideoFramePump);
148 }; 193 };
149 194
150 } // namespace remoting 195 } // namespace remoting
151 196
152 #endif // REMOTING_HOST_VIDEO_FRAME_PUMP_H_ 197 #endif // REMOTING_HOST_VIDEO_FRAME_PUMP_H_
OLDNEW
« no previous file with comments | « remoting/host/client_session.cc ('k') | remoting/host/video_frame_pump.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698