| 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 26 matching lines...) Expand all Loading... |
| 37 | 37 |
| 38 // Max number of overuses detected before always applying the rampup delay. | 38 // Max number of overuses detected before always applying the rampup delay. |
| 39 const int kMaxOverusesBeforeApplyRampupDelay = 4; | 39 const int kMaxOverusesBeforeApplyRampupDelay = 4; |
| 40 | 40 |
| 41 // The maximum exponent to use in VCMExpFilter. | 41 // The maximum exponent to use in VCMExpFilter. |
| 42 const float kSampleDiffMs = 33.0f; | 42 const float kSampleDiffMs = 33.0f; |
| 43 const float kMaxExp = 7.0f; | 43 const float kMaxExp = 7.0f; |
| 44 | 44 |
| 45 } // namespace | 45 } // namespace |
| 46 | 46 |
| 47 // Class for calculating the average encode time. | |
| 48 class OveruseFrameDetector::EncodeTimeAvg { | |
| 49 public: | |
| 50 EncodeTimeAvg() | |
| 51 : kWeightFactor(0.5f), | |
| 52 kInitialAvgEncodeTimeMs(5.0f), | |
| 53 filtered_encode_time_ms_(new rtc::ExpFilter(kWeightFactor)) { | |
| 54 filtered_encode_time_ms_->Apply(1.0f, kInitialAvgEncodeTimeMs); | |
| 55 } | |
| 56 ~EncodeTimeAvg() {} | |
| 57 | |
| 58 void AddSample(float encode_time_ms, int64_t diff_last_sample_ms) { | |
| 59 float exp = diff_last_sample_ms / kSampleDiffMs; | |
| 60 exp = std::min(exp, kMaxExp); | |
| 61 filtered_encode_time_ms_->Apply(exp, encode_time_ms); | |
| 62 } | |
| 63 | |
| 64 int Value() const { | |
| 65 return static_cast<int>(filtered_encode_time_ms_->filtered() + 0.5); | |
| 66 } | |
| 67 | |
| 68 private: | |
| 69 const float kWeightFactor; | |
| 70 const float kInitialAvgEncodeTimeMs; | |
| 71 rtc::scoped_ptr<rtc::ExpFilter> filtered_encode_time_ms_; | |
| 72 }; | |
| 73 | |
| 74 // Class for calculating the processing usage on the send-side (the average | 47 // Class for calculating the processing usage on the send-side (the average |
| 75 // processing time of a frame divided by the average time difference between | 48 // processing time of a frame divided by the average time difference between |
| 76 // captured frames). | 49 // captured frames). |
| 77 class OveruseFrameDetector::SendProcessingUsage { | 50 class OveruseFrameDetector::SendProcessingUsage { |
| 78 public: | 51 public: |
| 79 explicit SendProcessingUsage(const CpuOveruseOptions& options) | 52 explicit SendProcessingUsage(const CpuOveruseOptions& options) |
| 80 : kWeightFactorFrameDiff(0.998f), | 53 : kWeightFactorFrameDiff(0.998f), |
| 81 kWeightFactorProcessing(0.995f), | 54 kWeightFactorProcessing(0.995f), |
| 82 kInitialSampleDiffMs(40.0f), | 55 kInitialSampleDiffMs(40.0f), |
| 83 kMaxSampleDiffMs(45.0f), | 56 kMaxSampleDiffMs(45.0f), |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 num_process_times_(0), | 175 num_process_times_(0), |
| 203 last_capture_time_(0), | 176 last_capture_time_(0), |
| 204 num_pixels_(0), | 177 num_pixels_(0), |
| 205 next_process_time_(clock_->TimeInMilliseconds()), | 178 next_process_time_(clock_->TimeInMilliseconds()), |
| 206 last_overuse_time_(0), | 179 last_overuse_time_(0), |
| 207 checks_above_threshold_(0), | 180 checks_above_threshold_(0), |
| 208 num_overuse_detections_(0), | 181 num_overuse_detections_(0), |
| 209 last_rampup_time_(0), | 182 last_rampup_time_(0), |
| 210 in_quick_rampup_(false), | 183 in_quick_rampup_(false), |
| 211 current_rampup_delay_ms_(kStandardRampUpDelayMs), | 184 current_rampup_delay_ms_(kStandardRampUpDelayMs), |
| 212 last_encode_sample_ms_(0), | |
| 213 last_sample_time_ms_(0), | 185 last_sample_time_ms_(0), |
| 214 encode_time_(new EncodeTimeAvg()), | |
| 215 usage_(new SendProcessingUsage(options)), | 186 usage_(new SendProcessingUsage(options)), |
| 216 frame_queue_(new FrameQueue()) { | 187 frame_queue_(new FrameQueue()) { |
| 217 RTC_DCHECK(metrics_observer != nullptr); | 188 RTC_DCHECK(metrics_observer != nullptr); |
| 218 // Make sure stats are initially up-to-date. This simplifies unit testing | 189 // Make sure stats are initially up-to-date. This simplifies unit testing |
| 219 // since we don't have to trigger an update using one of the methods which | 190 // since we don't have to trigger an update using one of the methods which |
| 220 // would also alter the overuse state. | 191 // would also alter the overuse state. |
| 221 UpdateCpuOveruseMetrics(); | 192 UpdateCpuOveruseMetrics(); |
| 222 processing_thread_.DetachFromThread(); | 193 processing_thread_.DetachFromThread(); |
| 223 } | 194 } |
| 224 | 195 |
| 225 OveruseFrameDetector::~OveruseFrameDetector() { | 196 OveruseFrameDetector::~OveruseFrameDetector() { |
| 226 } | 197 } |
| 227 | 198 |
| 228 int OveruseFrameDetector::LastProcessingTimeMs() const { | 199 int OveruseFrameDetector::LastProcessingTimeMs() const { |
| 229 rtc::CritScope cs(&crit_); | 200 rtc::CritScope cs(&crit_); |
| 230 return frame_queue_->last_processing_time_ms(); | 201 return frame_queue_->last_processing_time_ms(); |
| 231 } | 202 } |
| 232 | 203 |
| 233 int OveruseFrameDetector::FramesInQueue() const { | 204 int OveruseFrameDetector::FramesInQueue() const { |
| 234 rtc::CritScope cs(&crit_); | 205 rtc::CritScope cs(&crit_); |
| 235 return frame_queue_->NumFrames(); | 206 return frame_queue_->NumFrames(); |
| 236 } | 207 } |
| 237 | 208 |
| 238 void OveruseFrameDetector::UpdateCpuOveruseMetrics() { | 209 void OveruseFrameDetector::UpdateCpuOveruseMetrics() { |
| 239 metrics_.avg_encode_time_ms = encode_time_->Value(); | |
| 240 metrics_.encode_usage_percent = usage_->Value(); | 210 metrics_.encode_usage_percent = usage_->Value(); |
| 241 | 211 |
| 242 metrics_observer_->CpuOveruseMetricsUpdated(metrics_); | 212 metrics_observer_->CpuOveruseMetricsUpdated(metrics_); |
| 243 } | 213 } |
| 244 | 214 |
| 245 int64_t OveruseFrameDetector::TimeUntilNextProcess() { | 215 int64_t OveruseFrameDetector::TimeUntilNextProcess() { |
| 246 RTC_DCHECK(processing_thread_.CalledOnValidThread()); | 216 RTC_DCHECK(processing_thread_.CalledOnValidThread()); |
| 247 return next_process_time_ - clock_->TimeInMilliseconds(); | 217 return next_process_time_ - clock_->TimeInMilliseconds(); |
| 248 } | 218 } |
| 249 | 219 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 usage_->AddCaptureSample(now - last_capture_time_); | 254 usage_->AddCaptureSample(now - last_capture_time_); |
| 285 | 255 |
| 286 last_capture_time_ = now; | 256 last_capture_time_ = now; |
| 287 | 257 |
| 288 if (options_.enable_extended_processing_usage) { | 258 if (options_.enable_extended_processing_usage) { |
| 289 frame_queue_->Start(capture_time_ms, now); | 259 frame_queue_->Start(capture_time_ms, now); |
| 290 } | 260 } |
| 291 } | 261 } |
| 292 | 262 |
| 293 void OveruseFrameDetector::FrameEncoded(int encode_time_ms) { | 263 void OveruseFrameDetector::FrameEncoded(int encode_time_ms) { |
| 264 if (options_.enable_extended_processing_usage) |
| 265 return; |
| 266 |
| 294 rtc::CritScope cs(&crit_); | 267 rtc::CritScope cs(&crit_); |
| 295 int64_t now = clock_->TimeInMilliseconds(); | 268 AddProcessingTime(encode_time_ms); |
| 296 if (last_encode_sample_ms_ != 0) { | |
| 297 int64_t diff_ms = now - last_encode_sample_ms_; | |
| 298 encode_time_->AddSample(encode_time_ms, diff_ms); | |
| 299 } | |
| 300 last_encode_sample_ms_ = now; | |
| 301 | |
| 302 if (!options_.enable_extended_processing_usage) { | |
| 303 AddProcessingTime(encode_time_ms); | |
| 304 } | |
| 305 UpdateCpuOveruseMetrics(); | |
| 306 } | 269 } |
| 307 | 270 |
| 308 void OveruseFrameDetector::FrameSent(int64_t capture_time_ms) { | 271 void OveruseFrameDetector::FrameSent(int64_t capture_time_ms) { |
| 272 if (!options_.enable_extended_processing_usage) |
| 273 return; |
| 274 |
| 309 rtc::CritScope cs(&crit_); | 275 rtc::CritScope cs(&crit_); |
| 310 if (!options_.enable_extended_processing_usage) { | |
| 311 return; | |
| 312 } | |
| 313 int delay_ms = frame_queue_->End(capture_time_ms, | 276 int delay_ms = frame_queue_->End(capture_time_ms, |
| 314 clock_->TimeInMilliseconds()); | 277 clock_->TimeInMilliseconds()); |
| 315 if (delay_ms > 0) { | 278 if (delay_ms > 0) { |
| 316 AddProcessingTime(delay_ms); | 279 AddProcessingTime(delay_ms); |
| 317 } | 280 } |
| 318 UpdateCpuOveruseMetrics(); | |
| 319 } | 281 } |
| 320 | 282 |
| 321 void OveruseFrameDetector::AddProcessingTime(int elapsed_ms) { | 283 void OveruseFrameDetector::AddProcessingTime(int elapsed_ms) { |
| 322 int64_t now = clock_->TimeInMilliseconds(); | 284 int64_t now = clock_->TimeInMilliseconds(); |
| 323 if (last_sample_time_ms_ != 0) { | 285 if (last_sample_time_ms_ != 0) { |
| 324 int64_t diff_ms = now - last_sample_time_ms_; | 286 int64_t diff_ms = now - last_sample_time_ms_; |
| 325 usage_->AddSample(elapsed_ms, diff_ms); | 287 usage_->AddSample(elapsed_ms, diff_ms); |
| 326 } | 288 } |
| 327 last_sample_time_ms_ = now; | 289 last_sample_time_ms_ = now; |
| 290 UpdateCpuOveruseMetrics(); |
| 328 } | 291 } |
| 329 | 292 |
| 330 int32_t OveruseFrameDetector::Process() { | 293 int32_t OveruseFrameDetector::Process() { |
| 331 RTC_DCHECK(processing_thread_.CalledOnValidThread()); | 294 RTC_DCHECK(processing_thread_.CalledOnValidThread()); |
| 332 | 295 |
| 333 int64_t now = clock_->TimeInMilliseconds(); | 296 int64_t now = clock_->TimeInMilliseconds(); |
| 334 | 297 |
| 335 // Used to protect against Process() being called too often. | 298 // Used to protect against Process() being called too often. |
| 336 if (now < next_process_time_) | 299 if (now < next_process_time_) |
| 337 return 0; | 300 return 0; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 return false; | 376 return false; |
| 414 | 377 |
| 415 bool underusing = false; | 378 bool underusing = false; |
| 416 if (options_.enable_encode_usage_method) { | 379 if (options_.enable_encode_usage_method) { |
| 417 underusing = metrics.encode_usage_percent < | 380 underusing = metrics.encode_usage_percent < |
| 418 options_.low_encode_usage_threshold_percent; | 381 options_.low_encode_usage_threshold_percent; |
| 419 } | 382 } |
| 420 return underusing; | 383 return underusing; |
| 421 } | 384 } |
| 422 } // namespace webrtc | 385 } // namespace webrtc |
| OLD | NEW |