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

Side by Side Diff: remoting/protocol/webrtc_frame_scheduler.cc

Issue 2050353002: Update webrtc::DesktopCapturer clients to implement OnCaptureResult(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698