Chromium Code Reviews| Index: webrtc/video/stats_counter.cc |
| diff --git a/webrtc/video/stats_counter.cc b/webrtc/video/stats_counter.cc |
| index 86dedd9e4f7709fb0208d14507ba5dfd3f265f35..9efaa2bc955c94c910c01712726e919b59dab4ed 100644 |
| --- a/webrtc/video/stats_counter.cc |
| +++ b/webrtc/video/stats_counter.cc |
| @@ -88,10 +88,14 @@ class Samples { |
| samples_[stream_id].Add(sample); |
| ++total_count_; |
| } |
| - void Set(int sample, uint32_t stream_id) { |
| + void Set(int64_t sample, uint32_t stream_id) { |
| samples_[stream_id].Set(sample); |
| ++total_count_; |
| } |
| + void SetLast(int64_t sample, uint32_t stream_id) { |
| + samples_[stream_id].SetLast(sample); |
| + } |
| + int64_t GetLast(uint32_t stream_id) { return samples_[stream_id].GetLast(); } |
| int64_t Count() const { return total_count_; } |
| bool Empty() const { return total_count_ == 0; } |
| @@ -138,10 +142,12 @@ class Samples { |
| ++count_; |
| max_ = std::max(sample, max_); |
| } |
| - void Set(int sample) { |
| + void Set(int64_t sample) { |
| sum_ = sample; |
| ++count_; |
| } |
| + void SetLast(int64_t sample) { last_sum_ = sample; } |
| + int64_t GetLast() const { return last_sum_; } |
| void Reset() { |
| if (count_ > 0) |
| last_sum_ = sum_; |
| @@ -172,7 +178,9 @@ StatsCounter::StatsCounter(Clock* clock, |
| clock_(clock), |
| observer_(observer), |
| last_process_time_ms_(-1), |
| - paused_(false) { |
| + paused_(false), |
| + pause_time_ms_(-1), |
| + min_pause_time_ms_(0) { |
| RTC_DCHECK_GT(process_intervals_ms_, 0); |
| } |
| @@ -188,10 +196,22 @@ AggregatedStats StatsCounter::ProcessAndGetStats() { |
| return aggregated_counter_->ComputeStats(); |
| } |
| +void StatsCounter::ProcessAndPauseWithMin(int64_t min_pause_time_ms) { |
|
stefan-webrtc
2017/01/10 09:16:23
Can we have a better name for this? Maybe somethin
åsapersson
2017/01/13 13:02:57
Right, stats will be paused for at least min_pause
|
| + ProcessAndPause(); |
| + min_pause_time_ms_ = min_pause_time_ms; |
| +} |
| + |
| void StatsCounter::ProcessAndPause() { |
| if (HasSample()) |
| TryProcess(); |
| paused_ = true; |
| + pause_time_ms_ = clock_->TimeInMilliseconds(); |
| +} |
| + |
| +void StatsCounter::ProcessAndStopPause() { |
| + if (HasSample()) |
| + TryProcess(); |
| + ResetPause(); |
| } |
| bool StatsCounter::HasSample() const { |
| @@ -215,16 +235,25 @@ bool StatsCounter::TimeToProcess(int* elapsed_intervals) { |
| return true; |
| } |
| -void StatsCounter::Set(int sample, uint32_t stream_id) { |
| +void StatsCounter::Add(int sample) { |
| TryProcess(); |
| - samples_->Set(sample, stream_id); |
| - paused_ = false; |
| + samples_->Add(sample, kStreamId0); |
| + ResetPauseIfMinTimePassed(); |
| } |
| -void StatsCounter::Add(int sample) { |
| +void StatsCounter::Set(int64_t sample, uint32_t stream_id) { |
| + if (paused_ && sample == samples_->GetLast(stream_id)) { |
| + // Do not add same sample while paused (will reset pause). |
| + return; |
| + } |
| TryProcess(); |
| - samples_->Add(sample, kStreamId0); |
| - paused_ = false; |
| + samples_->Set(sample, stream_id); |
| + ResetPauseIfMinTimePassed(); |
| +} |
| + |
| +void StatsCounter::SetLast(int64_t sample, uint32_t stream_id) { |
| + RTC_DCHECK(!HasSample()) << "Should be set before first sample is added."; |
| + samples_->SetLast(sample, stream_id); |
| } |
| // Reports periodically computed metric. |
| @@ -265,6 +294,17 @@ void StatsCounter::TryProcess() { |
| bool StatsCounter::IncludeEmptyIntervals() const { |
| return include_empty_intervals_ && !paused_ && !aggregated_counter_->Empty(); |
| } |
| +void StatsCounter::ResetPauseIfMinTimePassed() { |
|
stefan-webrtc
2017/01/10 09:16:23
ResumeIfMinTimePassed
åsapersson
2017/01/13 13:02:57
Done.
|
| + if (paused_ && |
| + (clock_->TimeInMilliseconds() - pause_time_ms_) >= min_pause_time_ms_) { |
| + ResetPause(); |
| + } |
| +} |
| + |
| +void StatsCounter::ResetPause() { |
|
stefan-webrtc
2017/01/10 09:16:23
Should this be called Resume()
åsapersson
2017/01/13 13:02:57
Done.
|
| + paused_ = false; |
| + min_pause_time_ms_ = 0; |
| +} |
| // StatsCounter sub-classes. |
| AvgCounter::AvgCounter(Clock* clock, |
| @@ -398,10 +438,14 @@ RateAccCounter::RateAccCounter(Clock* clock, |
| include_empty_intervals, |
| observer) {} |
| -void RateAccCounter::Set(int sample, uint32_t stream_id) { |
| +void RateAccCounter::Set(int64_t sample, uint32_t stream_id) { |
| StatsCounter::Set(sample, stream_id); |
| } |
| +void RateAccCounter::SetLast(int64_t sample, uint32_t stream_id) { |
| + StatsCounter::SetLast(sample, stream_id); |
| +} |
| + |
| bool RateAccCounter::GetMetric(int* metric) const { |
| int64_t diff = samples_->Diff(); |
| if (diff < 0 || (!include_empty_intervals_ && diff == 0)) |