| Index: webrtc/video/stats_counter.cc
|
| diff --git a/webrtc/video/stats_counter.cc b/webrtc/video/stats_counter.cc
|
| index 86dedd9e4f7709fb0208d14507ba5dfd3f265f35..da7a70690b52c42927be997e321bee80bae9e816 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::ProcessAndPauseForDuration(int64_t min_pause_time_ms) {
|
| + 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();
|
| + Resume();
|
| }
|
|
|
| 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);
|
| + ResumeIfMinTimePassed();
|
| }
|
|
|
| -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);
|
| + ResumeIfMinTimePassed();
|
| +}
|
| +
|
| +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::ResumeIfMinTimePassed() {
|
| + if (paused_ &&
|
| + (clock_->TimeInMilliseconds() - pause_time_ms_) >= min_pause_time_ms_) {
|
| + Resume();
|
| + }
|
| +}
|
| +
|
| +void StatsCounter::Resume() {
|
| + 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))
|
|
|