| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 return false; | 198 return false; |
| 199 } | 199 } |
| 200 rtc::SequencedTaskChecker task_checker_; | 200 rtc::SequencedTaskChecker task_checker_; |
| 201 OveruseFrameDetector* overuse_detector_; | 201 OveruseFrameDetector* overuse_detector_; |
| 202 }; | 202 }; |
| 203 | 203 |
| 204 OveruseFrameDetector::OveruseFrameDetector( | 204 OveruseFrameDetector::OveruseFrameDetector( |
| 205 Clock* clock, | 205 Clock* clock, |
| 206 const CpuOveruseOptions& options, | 206 const CpuOveruseOptions& options, |
| 207 CpuOveruseObserver* observer, | 207 CpuOveruseObserver* observer, |
| 208 EncodedFrameObserver* encoder_timing, | |
| 209 CpuOveruseMetricsObserver* metrics_observer) | 208 CpuOveruseMetricsObserver* metrics_observer) |
| 210 : check_overuse_task_(nullptr), | 209 : check_overuse_task_(nullptr), |
| 211 options_(options), | 210 options_(options), |
| 212 observer_(observer), | 211 observer_(observer), |
| 213 encoder_timing_(encoder_timing), | |
| 214 metrics_observer_(metrics_observer), | 212 metrics_observer_(metrics_observer), |
| 215 clock_(clock), | 213 clock_(clock), |
| 216 num_process_times_(0), | 214 num_process_times_(0), |
| 217 last_capture_time_ms_(-1), | 215 last_capture_time_ms_(-1), |
| 218 last_processed_capture_time_ms_(-1), | 216 last_processed_capture_time_ms_(-1), |
| 219 num_pixels_(0), | 217 num_pixels_(0), |
| 220 last_overuse_time_ms_(-1), | 218 last_overuse_time_ms_(-1), |
| 221 checks_above_threshold_(0), | 219 checks_above_threshold_(0), |
| 222 num_overuse_detections_(0), | 220 num_overuse_detections_(0), |
| 223 last_rampup_time_ms_(-1), | 221 last_rampup_time_ms_(-1), |
| 224 in_quick_rampup_(false), | 222 in_quick_rampup_(false), |
| 225 current_rampup_delay_ms_(kStandardRampUpDelayMs), | 223 current_rampup_delay_ms_(kStandardRampUpDelayMs), |
| 226 usage_(new SendProcessingUsage(options)) { | 224 usage_(new SendProcessingUsage(options)) { |
| 227 task_checker_.Detach(); | 225 task_checker_.Detach(); |
| 228 } | 226 } |
| 229 | 227 |
| 230 OveruseFrameDetector::~OveruseFrameDetector() { | 228 OveruseFrameDetector::~OveruseFrameDetector() { |
| 231 RTC_DCHECK(!check_overuse_task_) << "StopCheckForOverUse must be called."; | 229 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); |
| 230 if (check_overuse_task_) { |
| 231 check_overuse_task_->Stop(); |
| 232 } |
| 232 } | 233 } |
| 233 | 234 |
| 234 void OveruseFrameDetector::StartCheckForOveruse() { | 235 void OveruseFrameDetector::StartCheckForOveruse() { |
| 235 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); | 236 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); |
| 236 RTC_DCHECK(!check_overuse_task_); | 237 RTC_DCHECK(!check_overuse_task_); |
| 237 check_overuse_task_ = new CheckOveruseTask(this); | 238 check_overuse_task_ = new CheckOveruseTask(this); |
| 238 } | 239 } |
| 239 void OveruseFrameDetector::StopCheckForOveruse() { | |
| 240 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); | |
| 241 check_overuse_task_->Stop(); | |
| 242 check_overuse_task_ = nullptr; | |
| 243 } | |
| 244 | 240 |
| 245 void OveruseFrameDetector::EncodedFrameTimeMeasured(int encode_duration_ms) { | 241 void OveruseFrameDetector::EncodedFrameTimeMeasured(int encode_duration_ms) { |
| 246 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); | 242 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); |
| 247 if (!metrics_) | 243 if (!metrics_) |
| 248 metrics_ = rtc::Optional<CpuOveruseMetrics>(CpuOveruseMetrics()); | 244 metrics_ = rtc::Optional<CpuOveruseMetrics>(CpuOveruseMetrics()); |
| 249 metrics_->encode_usage_percent = usage_->Value(); | 245 metrics_->encode_usage_percent = usage_->Value(); |
| 250 | 246 |
| 251 metrics_observer_->OnEncodedFrameTimeMeasured(encode_duration_ms, *metrics_); | 247 metrics_observer_->OnEncodedFrameTimeMeasured(encode_duration_ms, *metrics_); |
| 252 } | 248 } |
| 253 | 249 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 273 frame_timing_.clear(); | 269 frame_timing_.clear(); |
| 274 last_capture_time_ms_ = -1; | 270 last_capture_time_ms_ = -1; |
| 275 last_processed_capture_time_ms_ = -1; | 271 last_processed_capture_time_ms_ = -1; |
| 276 num_process_times_ = 0; | 272 num_process_times_ = 0; |
| 277 metrics_ = rtc::Optional<CpuOveruseMetrics>(); | 273 metrics_ = rtc::Optional<CpuOveruseMetrics>(); |
| 278 } | 274 } |
| 279 | 275 |
| 280 void OveruseFrameDetector::FrameCaptured(const VideoFrame& frame, | 276 void OveruseFrameDetector::FrameCaptured(const VideoFrame& frame, |
| 281 int64_t time_when_first_seen_ms) { | 277 int64_t time_when_first_seen_ms) { |
| 282 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); | 278 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); |
| 283 | |
| 284 if (FrameSizeChanged(frame.width() * frame.height()) || | 279 if (FrameSizeChanged(frame.width() * frame.height()) || |
| 285 FrameTimeoutDetected(time_when_first_seen_ms)) { | 280 FrameTimeoutDetected(time_when_first_seen_ms)) { |
| 286 ResetAll(frame.width() * frame.height()); | 281 ResetAll(frame.width() * frame.height()); |
| 287 } | 282 } |
| 288 | 283 |
| 289 if (last_capture_time_ms_ != -1) | 284 if (last_capture_time_ms_ != -1) |
| 290 usage_->AddCaptureSample(time_when_first_seen_ms - last_capture_time_ms_); | 285 usage_->AddCaptureSample(time_when_first_seen_ms - last_capture_time_ms_); |
| 291 | 286 |
| 292 last_capture_time_ms_ = time_when_first_seen_ms; | 287 last_capture_time_ms_ = time_when_first_seen_ms; |
| 293 | 288 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 316 // This is currently the case for all frames on ChromeOS, so logging them | 311 // This is currently the case for all frames on ChromeOS, so logging them |
| 317 // would be spammy, and triggering overuse would be wrong. | 312 // would be spammy, and triggering overuse would be wrong. |
| 318 // https://crbug.com/350106 | 313 // https://crbug.com/350106 |
| 319 while (!frame_timing_.empty()) { | 314 while (!frame_timing_.empty()) { |
| 320 FrameTiming timing = frame_timing_.front(); | 315 FrameTiming timing = frame_timing_.front(); |
| 321 if (time_sent_in_ms - timing.capture_ms < kEncodingTimeMeasureWindowMs) | 316 if (time_sent_in_ms - timing.capture_ms < kEncodingTimeMeasureWindowMs) |
| 322 break; | 317 break; |
| 323 if (timing.last_send_ms != -1) { | 318 if (timing.last_send_ms != -1) { |
| 324 int encode_duration_ms = | 319 int encode_duration_ms = |
| 325 static_cast<int>(timing.last_send_ms - timing.capture_ms); | 320 static_cast<int>(timing.last_send_ms - timing.capture_ms); |
| 326 if (encoder_timing_) { | |
| 327 encoder_timing_->OnEncodeTiming(timing.capture_ntp_ms, | |
| 328 encode_duration_ms); | |
| 329 } | |
| 330 if (last_processed_capture_time_ms_ != -1) { | 321 if (last_processed_capture_time_ms_ != -1) { |
| 331 int64_t diff_ms = timing.capture_ms - last_processed_capture_time_ms_; | 322 int64_t diff_ms = timing.capture_ms - last_processed_capture_time_ms_; |
| 332 usage_->AddSample(encode_duration_ms, diff_ms); | 323 usage_->AddSample(encode_duration_ms, diff_ms); |
| 333 } | 324 } |
| 334 last_processed_capture_time_ms_ = timing.capture_ms; | 325 last_processed_capture_time_ms_ = timing.capture_ms; |
| 335 EncodedFrameTimeMeasured(encode_duration_ms); | 326 EncodedFrameTimeMeasured(encode_duration_ms); |
| 336 } | 327 } |
| 337 frame_timing_.pop_front(); | 328 frame_timing_.pop_front(); |
| 338 } | 329 } |
| 339 } | 330 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 int64_t time_now) { | 394 int64_t time_now) { |
| 404 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); | 395 RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_); |
| 405 int delay = in_quick_rampup_ ? kQuickRampUpDelayMs : current_rampup_delay_ms_; | 396 int delay = in_quick_rampup_ ? kQuickRampUpDelayMs : current_rampup_delay_ms_; |
| 406 if (time_now < last_rampup_time_ms_ + delay) | 397 if (time_now < last_rampup_time_ms_ + delay) |
| 407 return false; | 398 return false; |
| 408 | 399 |
| 409 return metrics.encode_usage_percent < | 400 return metrics.encode_usage_percent < |
| 410 options_.low_encode_usage_threshold_percent; | 401 options_.low_encode_usage_threshold_percent; |
| 411 } | 402 } |
| 412 } // namespace webrtc | 403 } // namespace webrtc |
| OLD | NEW |