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 |