| 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_simple.h" | 5 #include "remoting/protocol/webrtc_frame_scheduler_simple.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "remoting/protocol/frame_stats.h" | 9 #include "remoting/protocol/frame_stats.h" |
| 10 #include "remoting/protocol/webrtc_dummy_video_encoder.h" | 10 #include "remoting/protocol/webrtc_dummy_video_encoder.h" |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 WebrtcFrameSchedulerSimple::WebrtcFrameSchedulerSimple() | 125 WebrtcFrameSchedulerSimple::WebrtcFrameSchedulerSimple() |
| 126 : pacing_bucket_(LeakyBucket::kUnlimitedDepth, 0), | 126 : pacing_bucket_(LeakyBucket::kUnlimitedDepth, 0), |
| 127 frame_processing_delay_us_(kStatsWindow), | 127 frame_processing_delay_us_(kStatsWindow), |
| 128 updated_region_area_(kStatsWindow), | 128 updated_region_area_(kStatsWindow), |
| 129 weak_factory_(this) {} | 129 weak_factory_(this) {} |
| 130 | 130 |
| 131 WebrtcFrameSchedulerSimple::~WebrtcFrameSchedulerSimple() {} | 131 WebrtcFrameSchedulerSimple::~WebrtcFrameSchedulerSimple() {} |
| 132 | 132 |
| 133 void WebrtcFrameSchedulerSimple::OnKeyFrameRequested() { | 133 void WebrtcFrameSchedulerSimple::OnKeyFrameRequested() { |
| 134 DCHECK(thread_checker_.CalledOnValidThread()); | 134 DCHECK(thread_checker_.CalledOnValidThread()); |
| 135 encoder_ready_ = true; |
| 135 key_frame_request_ = true; | 136 key_frame_request_ = true; |
| 136 ScheduleNextFrame(base::TimeTicks::Now()); | 137 ScheduleNextFrame(base::TimeTicks::Now()); |
| 137 } | 138 } |
| 138 | 139 |
| 139 void WebrtcFrameSchedulerSimple::OnChannelParameters(int packet_loss, | 140 void WebrtcFrameSchedulerSimple::OnChannelParameters(int packet_loss, |
| 140 base::TimeDelta rtt) { | 141 base::TimeDelta rtt) { |
| 141 DCHECK(thread_checker_.CalledOnValidThread()); | 142 DCHECK(thread_checker_.CalledOnValidThread()); |
| 142 | 143 |
| 143 rtt_estimate_ = rtt; | 144 rtt_estimate_ = rtt; |
| 144 } | 145 } |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 | 268 |
| 268 if (frame_stats) { | 269 if (frame_stats) { |
| 269 frame_stats->rtt_estimate = rtt_estimate_; | 270 frame_stats->rtt_estimate = rtt_estimate_; |
| 270 frame_stats->bandwidth_estimate_kbps = pacing_bucket_.rate() * 8 / 1000; | 271 frame_stats->bandwidth_estimate_kbps = pacing_bucket_.rate() * 8 / 1000; |
| 271 } | 272 } |
| 272 } | 273 } |
| 273 | 274 |
| 274 void WebrtcFrameSchedulerSimple::ScheduleNextFrame(base::TimeTicks now) { | 275 void WebrtcFrameSchedulerSimple::ScheduleNextFrame(base::TimeTicks now) { |
| 275 DCHECK(thread_checker_.CalledOnValidThread()); | 276 DCHECK(thread_checker_.CalledOnValidThread()); |
| 276 | 277 |
| 277 if (paused_ || pacing_bucket_.rate() == 0 || capture_callback_.is_null() || | 278 if (!encoder_ready_ || paused_ || pacing_bucket_.rate() == 0 || |
| 278 frame_pending_) { | 279 capture_callback_.is_null() || frame_pending_) { |
| 279 return; | 280 return; |
| 280 } | 281 } |
| 281 | 282 |
| 282 // If this is not the first frame then capture next frame after the previous | 283 // If this is not the first frame then capture next frame after the previous |
| 283 // one has finished sending. | 284 // one has finished sending. |
| 284 base::TimeDelta expected_processing_time = | 285 base::TimeDelta expected_processing_time = |
| 285 base::TimeDelta::FromMicroseconds(frame_processing_delay_us_.Max()); | 286 base::TimeDelta::FromMicroseconds(frame_processing_delay_us_.Max()); |
| 286 base::TimeTicks target_capture_time = | 287 base::TimeTicks target_capture_time = |
| 287 pacing_bucket_.GetEmptyTime() - expected_processing_time; | 288 pacing_bucket_.GetEmptyTime() - expected_processing_time; |
| 288 | 289 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 304 void WebrtcFrameSchedulerSimple::CaptureNextFrame() { | 305 void WebrtcFrameSchedulerSimple::CaptureNextFrame() { |
| 305 DCHECK(thread_checker_.CalledOnValidThread()); | 306 DCHECK(thread_checker_.CalledOnValidThread()); |
| 306 DCHECK(!frame_pending_); | 307 DCHECK(!frame_pending_); |
| 307 last_capture_started_time_ = base::TimeTicks::Now(); | 308 last_capture_started_time_ = base::TimeTicks::Now(); |
| 308 frame_pending_ = true; | 309 frame_pending_ = true; |
| 309 capture_callback_.Run(); | 310 capture_callback_.Run(); |
| 310 } | 311 } |
| 311 | 312 |
| 312 } // namespace protocol | 313 } // namespace protocol |
| 313 } // namespace remoting | 314 } // namespace remoting |
| OLD | NEW |