OLD | NEW |
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 #include "remoting/protocol/video_frame_pump.h" | 5 #include "remoting/protocol/video_frame_pump.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <memory> | 8 #include <memory> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 DCHECK(video_stub_); | 62 DCHECK(video_stub_); |
63 | 63 |
64 capturer_->Start(this); | 64 capturer_->Start(this); |
65 capture_scheduler_.Start(); | 65 capture_scheduler_.Start(); |
66 } | 66 } |
67 | 67 |
68 VideoFramePump::~VideoFramePump() { | 68 VideoFramePump::~VideoFramePump() { |
69 encode_task_runner_->DeleteSoon(FROM_HERE, encoder_.release()); | 69 encode_task_runner_->DeleteSoon(FROM_HERE, encoder_.release()); |
70 } | 70 } |
71 | 71 |
| 72 void VideoFramePump::SetEventTimestampsSource( |
| 73 scoped_refptr<InputEventTimestampsSource> event_timestamps_source) { |
| 74 DCHECK(thread_checker_.CalledOnValidThread()); |
| 75 |
| 76 event_timestamps_source_ = event_timestamps_source; |
| 77 } |
| 78 |
72 void VideoFramePump::Pause(bool pause) { | 79 void VideoFramePump::Pause(bool pause) { |
73 DCHECK(thread_checker_.CalledOnValidThread()); | 80 DCHECK(thread_checker_.CalledOnValidThread()); |
74 | 81 |
75 capture_scheduler_.Pause(pause); | 82 capture_scheduler_.Pause(pause); |
76 } | 83 } |
77 | 84 |
78 void VideoFramePump::OnInputEventReceived(int64_t event_timestamp) { | |
79 DCHECK(thread_checker_.CalledOnValidThread()); | |
80 | |
81 if (!next_frame_timestamps_) | |
82 next_frame_timestamps_.reset(new FrameTimestamps()); | |
83 next_frame_timestamps_->input_event_client_timestamp = event_timestamp; | |
84 next_frame_timestamps_->input_event_received_time = base::TimeTicks::Now(); | |
85 } | |
86 | |
87 void VideoFramePump::SetLosslessEncode(bool want_lossless) { | 85 void VideoFramePump::SetLosslessEncode(bool want_lossless) { |
88 DCHECK(thread_checker_.CalledOnValidThread()); | 86 DCHECK(thread_checker_.CalledOnValidThread()); |
89 | 87 |
90 encode_task_runner_->PostTask( | 88 encode_task_runner_->PostTask( |
91 FROM_HERE, base::Bind(&VideoEncoder::SetLosslessEncode, | 89 FROM_HERE, base::Bind(&VideoEncoder::SetLosslessEncode, |
92 base::Unretained(encoder_.get()), want_lossless)); | 90 base::Unretained(encoder_.get()), want_lossless)); |
93 } | 91 } |
94 | 92 |
95 void VideoFramePump::SetLosslessColor(bool want_lossless) { | 93 void VideoFramePump::SetLosslessColor(bool want_lossless) { |
96 DCHECK(thread_checker_.CalledOnValidThread()); | 94 DCHECK(thread_checker_.CalledOnValidThread()); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 encode_task_runner_.get(), FROM_HERE, | 131 encode_task_runner_.get(), FROM_HERE, |
134 base::Bind(&VideoFramePump::EncodeFrame, encoder_.get(), | 132 base::Bind(&VideoFramePump::EncodeFrame, encoder_.get(), |
135 base::Passed(&frame), | 133 base::Passed(&frame), |
136 base::Passed(&captured_frame_timestamps_)), | 134 base::Passed(&captured_frame_timestamps_)), |
137 base::Bind(&VideoFramePump::OnFrameEncoded, weak_factory_.GetWeakPtr())); | 135 base::Bind(&VideoFramePump::OnFrameEncoded, weak_factory_.GetWeakPtr())); |
138 } | 136 } |
139 | 137 |
140 void VideoFramePump::CaptureNextFrame() { | 138 void VideoFramePump::CaptureNextFrame() { |
141 DCHECK(thread_checker_.CalledOnValidThread()); | 139 DCHECK(thread_checker_.CalledOnValidThread()); |
142 | 140 |
143 // |next_frame_timestamps_| is not set if no input events were received since | 141 captured_frame_timestamps_.reset(new FrameTimestamps()); |
144 // the previous frame. In that case create FrameTimestamps instance without | 142 captured_frame_timestamps_->capture_started_time = base::TimeTicks::Now(); |
145 // setting |input_event_client_timestamp| and |input_event_received_time|. | |
146 if (!next_frame_timestamps_) | |
147 next_frame_timestamps_.reset(new FrameTimestamps()); | |
148 | 143 |
149 captured_frame_timestamps_ = std::move(next_frame_timestamps_); | 144 if (event_timestamps_source_) { |
150 captured_frame_timestamps_->capture_started_time = base::TimeTicks::Now(); | 145 captured_frame_timestamps_->input_event_timestamps = |
| 146 event_timestamps_source_->TakeLastEventTimestamps(); |
| 147 } |
151 | 148 |
152 capturer_->Capture(webrtc::DesktopRegion()); | 149 capturer_->Capture(webrtc::DesktopRegion()); |
153 } | 150 } |
154 | 151 |
155 // static | 152 // static |
156 std::unique_ptr<VideoFramePump::PacketWithTimestamps> | 153 std::unique_ptr<VideoFramePump::PacketWithTimestamps> |
157 VideoFramePump::EncodeFrame(VideoEncoder* encoder, | 154 VideoFramePump::EncodeFrame(VideoEncoder* encoder, |
158 std::unique_ptr<webrtc::DesktopFrame> frame, | 155 std::unique_ptr<webrtc::DesktopFrame> frame, |
159 std::unique_ptr<FrameTimestamps> timestamps) { | 156 std::unique_ptr<FrameTimestamps> timestamps) { |
160 timestamps->encode_started_time = base::TimeTicks::Now(); | 157 timestamps->encode_started_time = base::TimeTicks::Now(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 UpdateFrameTimers(packet->packet.get(), packet->timestamps.get()); | 199 UpdateFrameTimers(packet->packet.get(), packet->timestamps.get()); |
203 | 200 |
204 send_pending_ = true; | 201 send_pending_ = true; |
205 video_stub_->ProcessVideoPacket(std::move(packet->packet), | 202 video_stub_->ProcessVideoPacket(std::move(packet->packet), |
206 base::Bind(&VideoFramePump::OnVideoPacketSent, | 203 base::Bind(&VideoFramePump::OnVideoPacketSent, |
207 weak_factory_.GetWeakPtr())); | 204 weak_factory_.GetWeakPtr())); |
208 } | 205 } |
209 | 206 |
210 void VideoFramePump::UpdateFrameTimers(VideoPacket* packet, | 207 void VideoFramePump::UpdateFrameTimers(VideoPacket* packet, |
211 FrameTimestamps* timestamps) { | 208 FrameTimestamps* timestamps) { |
212 if (!timestamps->input_event_received_time.is_null()) { | 209 if (!timestamps->input_event_timestamps.is_null()) { |
213 packet->set_capture_pending_time_ms((timestamps->capture_started_time - | 210 packet->set_capture_pending_time_ms( |
214 timestamps->input_event_received_time) | 211 (timestamps->capture_started_time - |
215 .InMilliseconds()); | 212 timestamps->input_event_timestamps.host_timestamp) |
| 213 .InMilliseconds()); |
216 packet->set_latest_event_timestamp( | 214 packet->set_latest_event_timestamp( |
217 timestamps->input_event_client_timestamp); | 215 timestamps->input_event_timestamps.client_timestamp.ToInternalValue()); |
218 } | 216 } |
219 | 217 |
220 packet->set_capture_overhead_time_ms( | 218 packet->set_capture_overhead_time_ms( |
221 (timestamps->capture_ended_time - timestamps->capture_started_time) | 219 (timestamps->capture_ended_time - timestamps->capture_started_time) |
222 .InMilliseconds() - | 220 .InMilliseconds() - |
223 packet->capture_time_ms()); | 221 packet->capture_time_ms()); |
224 | 222 |
225 packet->set_encode_pending_time_ms( | 223 packet->set_encode_pending_time_ms( |
226 (timestamps->encode_started_time - timestamps->capture_ended_time) | 224 (timestamps->encode_started_time - timestamps->capture_ended_time) |
227 .InMilliseconds()); | 225 .InMilliseconds()); |
(...skipping 28 matching lines...) Expand all Loading... |
256 } | 254 } |
257 | 255 |
258 void VideoFramePump::OnKeepAlivePacketSent() { | 256 void VideoFramePump::OnKeepAlivePacketSent() { |
259 DCHECK(thread_checker_.CalledOnValidThread()); | 257 DCHECK(thread_checker_.CalledOnValidThread()); |
260 | 258 |
261 keep_alive_timer_.Reset(); | 259 keep_alive_timer_.Reset(); |
262 } | 260 } |
263 | 261 |
264 } // namespace protocol | 262 } // namespace protocol |
265 } // namespace remoting | 263 } // namespace remoting |
OLD | NEW |