OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/webrtc_frame_scheduler.h" | 5 #include "remoting/protocol/webrtc_frame_scheduler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "base/location.h" | 10 #include "base/location.h" |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 target_bitrate_kbps_ = target_bitrate_kbps; | 111 target_bitrate_kbps_ = target_bitrate_kbps; |
112 } | 112 } |
113 | 113 |
114 bool WebrtcFrameScheduler::ClearAndGetKeyFrameRequest() { | 114 bool WebrtcFrameScheduler::ClearAndGetKeyFrameRequest() { |
115 base::AutoLock lock(lock_); | 115 base::AutoLock lock(lock_); |
116 bool key_frame_request = key_frame_request_; | 116 bool key_frame_request = key_frame_request_; |
117 key_frame_request_ = false; | 117 key_frame_request_ = false; |
118 return key_frame_request; | 118 return key_frame_request; |
119 } | 119 } |
120 | 120 |
121 void WebrtcFrameScheduler::OnCaptureCompleted(webrtc::DesktopFrame* frame) { | 121 void WebrtcFrameScheduler::OnCaptureResult( |
| 122 webrtc::DesktopCapturer::Result result, |
| 123 std::unique_ptr<webrtc::DesktopFrame> frame) { |
122 DCHECK(thread_checker_.CalledOnValidThread()); | 124 DCHECK(thread_checker_.CalledOnValidThread()); |
123 | 125 |
124 base::TimeTicks captured_ticks = base::TimeTicks::Now(); | 126 base::TimeTicks captured_ticks = base::TimeTicks::Now(); |
125 int64_t capture_timestamp_ms = | 127 int64_t capture_timestamp_ms = |
126 (captured_ticks - base::TimeTicks()).InMilliseconds(); | 128 (captured_ticks - base::TimeTicks()).InMilliseconds(); |
127 capture_pending_ = false; | 129 capture_pending_ = false; |
128 | 130 |
129 std::unique_ptr<webrtc::DesktopFrame> owned_frame(frame); | 131 // TODO(sergeyu): Handle ERROR_PERMANENT result here. |
130 | 132 |
131 if (encode_pending_) { | 133 if (encode_pending_) { |
132 // TODO(isheriff): consider queuing here | 134 // TODO(isheriff): consider queuing here |
133 VLOG(1) << "Dropping captured frame since encoder is still busy"; | 135 VLOG(1) << "Dropping captured frame since encoder is still busy"; |
134 return; | 136 return; |
135 } | 137 } |
136 | 138 |
137 last_capture_completed_ticks_ = captured_ticks; | 139 last_capture_completed_ticks_ = captured_ticks; |
138 | 140 |
139 webrtc::DesktopVector dpi = | 141 webrtc::DesktopVector dpi = |
140 frame->dpi().is_zero() ? webrtc::DesktopVector(kDefaultDpi, kDefaultDpi) | 142 frame->dpi().is_zero() ? webrtc::DesktopVector(kDefaultDpi, kDefaultDpi) |
141 : frame->dpi(); | 143 : frame->dpi(); |
142 | 144 |
143 if (!frame_size_.equals(frame->size()) || !frame_dpi_.equals(dpi)) { | 145 if (!frame_size_.equals(frame->size()) || !frame_dpi_.equals(dpi)) { |
144 frame_size_ = frame->size(); | 146 frame_size_ = frame->size(); |
145 frame_dpi_ = dpi; | 147 frame_dpi_ = dpi; |
146 if (!size_callback_.is_null()) | 148 if (!size_callback_.is_null()) |
147 size_callback_.Run(frame_size_, frame_dpi_); | 149 size_callback_.Run(frame_size_, frame_dpi_); |
148 } | 150 } |
149 encode_pending_ = true; | 151 encode_pending_ = true; |
150 task_tracker_.PostTaskAndReplyWithResult( | 152 task_tracker_.PostTaskAndReplyWithResult( |
151 encode_task_runner_.get(), FROM_HERE, | 153 encode_task_runner_.get(), FROM_HERE, |
152 base::Bind(&WebrtcFrameScheduler::EncodeFrame, encoder_.get(), | 154 base::Bind(&WebrtcFrameScheduler::EncodeFrame, encoder_.get(), |
153 base::Passed(std::move(owned_frame)), target_bitrate_kbps_, | 155 base::Passed(&frame), target_bitrate_kbps_, |
154 ClearAndGetKeyFrameRequest(), capture_timestamp_ms), | 156 ClearAndGetKeyFrameRequest(), capture_timestamp_ms), |
155 base::Bind(&WebrtcFrameScheduler::OnFrameEncoded, | 157 base::Bind(&WebrtcFrameScheduler::OnFrameEncoded, |
156 weak_factory_.GetWeakPtr())); | 158 weak_factory_.GetWeakPtr())); |
157 } | 159 } |
158 | 160 |
159 void WebrtcFrameScheduler::CaptureNextFrame() { | 161 void WebrtcFrameScheduler::CaptureNextFrame() { |
160 DCHECK(thread_checker_.CalledOnValidThread()); | 162 DCHECK(thread_checker_.CalledOnValidThread()); |
161 | 163 |
162 if (capture_pending_ || encode_pending_) { | 164 if (capture_pending_ || encode_pending_) { |
163 VLOG(1) << "Capture/encode still pending.."; | 165 VLOG(1) << "Capture/encode still pending.."; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 } else { | 220 } else { |
219 LOG(ERROR) << "SendEncodedFrame() failed"; | 221 LOG(ERROR) << "SendEncodedFrame() failed"; |
220 } | 222 } |
221 capture_timer_->Start(FROM_HERE, | 223 capture_timer_->Start(FROM_HERE, |
222 base::TimeDelta::FromMilliseconds(next_sched_ms), this, | 224 base::TimeDelta::FromMilliseconds(next_sched_ms), this, |
223 &WebrtcFrameScheduler::CaptureNextFrame); | 225 &WebrtcFrameScheduler::CaptureNextFrame); |
224 } | 226 } |
225 | 227 |
226 } // namespace protocol | 228 } // namespace protocol |
227 } // namespace remoting | 229 } // namespace remoting |
OLD | NEW |