| 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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 target_bitrate_kbps_ = target_bitrate_kbps; | 118 target_bitrate_kbps_ = target_bitrate_kbps; |
| 119 } | 119 } |
| 120 | 120 |
| 121 bool WebRtcFrameScheduler::ClearAndGetKeyFrameRequest() { | 121 bool WebRtcFrameScheduler::ClearAndGetKeyFrameRequest() { |
| 122 base::AutoLock lock(lock_); | 122 base::AutoLock lock(lock_); |
| 123 bool key_frame_request = key_frame_request_; | 123 bool key_frame_request = key_frame_request_; |
| 124 key_frame_request_ = false; | 124 key_frame_request_ = false; |
| 125 return key_frame_request; | 125 return key_frame_request; |
| 126 } | 126 } |
| 127 | 127 |
| 128 void WebRtcFrameScheduler::OnCaptureCompleted(webrtc::DesktopFrame* frame) { | 128 void WebRtcFrameScheduler::OnCaptureResult( |
| 129 webrtc::DesktopCapturer::Result result, |
| 130 std::unique_ptr<webrtc::DesktopFrame> frame) { |
| 129 DCHECK(thread_checker_.CalledOnValidThread()); | 131 DCHECK(thread_checker_.CalledOnValidThread()); |
| 130 | 132 |
| 131 base::TimeTicks captured_ticks = base::TimeTicks::Now(); | 133 base::TimeTicks captured_ticks = base::TimeTicks::Now(); |
| 132 int64_t capture_timestamp_ms = | 134 int64_t capture_timestamp_ms = |
| 133 (captured_ticks - base::TimeTicks()).InMilliseconds(); | 135 (captured_ticks - base::TimeTicks()).InMilliseconds(); |
| 134 capture_pending_ = false; | 136 capture_pending_ = false; |
| 135 | 137 |
| 136 std::unique_ptr<webrtc::DesktopFrame> owned_frame(frame); | 138 // TODO(sergeyu): Handle ERROR_PERMANENT result here. |
| 137 | 139 |
| 138 if (encode_pending_) { | 140 if (encode_pending_) { |
| 139 // TODO(isheriff): consider queuing here | 141 // TODO(isheriff): consider queuing here |
| 140 VLOG(1) << "Dropping captured frame since encoder is still busy"; | 142 VLOG(1) << "Dropping captured frame since encoder is still busy"; |
| 141 return; | 143 return; |
| 142 } | 144 } |
| 143 | 145 |
| 144 // If unchanged and does not need top-off, return. | 146 // If unchanged and does not need top-off, return. |
| 145 if (!frame || (frame->updated_region().is_empty() && | 147 if (!frame || (frame->updated_region().is_empty() && |
| 146 last_quantizer_ <= kTargetQuantizerForTopOff)) { | 148 last_quantizer_ <= kTargetQuantizerForTopOff)) { |
| 147 return; | 149 return; |
| 148 } | 150 } |
| 149 | 151 |
| 150 last_capture_completed_ticks_ = captured_ticks; | 152 last_capture_completed_ticks_ = captured_ticks; |
| 151 | 153 |
| 152 webrtc::DesktopVector dpi = | 154 webrtc::DesktopVector dpi = |
| 153 frame->dpi().is_zero() ? webrtc::DesktopVector(kDefaultDpi, kDefaultDpi) | 155 frame->dpi().is_zero() ? webrtc::DesktopVector(kDefaultDpi, kDefaultDpi) |
| 154 : frame->dpi(); | 156 : frame->dpi(); |
| 155 | 157 |
| 156 if (!frame_size_.equals(frame->size()) || !frame_dpi_.equals(dpi)) { | 158 if (!frame_size_.equals(frame->size()) || !frame_dpi_.equals(dpi)) { |
| 157 frame_size_ = frame->size(); | 159 frame_size_ = frame->size(); |
| 158 frame_dpi_ = dpi; | 160 frame_dpi_ = dpi; |
| 159 if (!size_callback_.is_null()) | 161 if (!size_callback_.is_null()) |
| 160 size_callback_.Run(frame_size_, frame_dpi_); | 162 size_callback_.Run(frame_size_, frame_dpi_); |
| 161 } | 163 } |
| 162 encode_pending_ = true; | 164 encode_pending_ = true; |
| 163 task_tracker_.PostTaskAndReplyWithResult( | 165 task_tracker_.PostTaskAndReplyWithResult( |
| 164 encode_task_runner_.get(), FROM_HERE, | 166 encode_task_runner_.get(), FROM_HERE, |
| 165 base::Bind(&WebRtcFrameScheduler::EncodeFrame, encoder_.get(), | 167 base::Bind(&WebRtcFrameScheduler::EncodeFrame, encoder_.get(), |
| 166 base::Passed(std::move(owned_frame)), target_bitrate_kbps_, | 168 base::Passed(&frame), target_bitrate_kbps_, |
| 167 ClearAndGetKeyFrameRequest(), capture_timestamp_ms), | 169 ClearAndGetKeyFrameRequest(), capture_timestamp_ms), |
| 168 base::Bind(&WebRtcFrameScheduler::OnFrameEncoded, | 170 base::Bind(&WebRtcFrameScheduler::OnFrameEncoded, |
| 169 weak_factory_.GetWeakPtr())); | 171 weak_factory_.GetWeakPtr())); |
| 170 } | 172 } |
| 171 | 173 |
| 172 void WebRtcFrameScheduler::CaptureNextFrame() { | 174 void WebRtcFrameScheduler::CaptureNextFrame() { |
| 173 DCHECK(thread_checker_.CalledOnValidThread()); | 175 DCHECK(thread_checker_.CalledOnValidThread()); |
| 174 | 176 |
| 175 if (capture_pending_ || encode_pending_) { | 177 if (capture_pending_ || encode_pending_) { |
| 176 VLOG(1) << "Capture/encode still pending.."; | 178 VLOG(1) << "Capture/encode still pending.."; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 } else { | 235 } else { |
| 234 LOG(ERROR) << "SendEncodedFrame() failed"; | 236 LOG(ERROR) << "SendEncodedFrame() failed"; |
| 235 } | 237 } |
| 236 capture_timer_->Start(FROM_HERE, | 238 capture_timer_->Start(FROM_HERE, |
| 237 base::TimeDelta::FromMilliseconds(next_sched_ms), this, | 239 base::TimeDelta::FromMilliseconds(next_sched_ms), this, |
| 238 &WebRtcFrameScheduler::CaptureNextFrame); | 240 &WebRtcFrameScheduler::CaptureNextFrame); |
| 239 } | 241 } |
| 240 | 242 |
| 241 } // namespace protocol | 243 } // namespace protocol |
| 242 } // namespace remoting | 244 } // namespace remoting |
| OLD | NEW |