Line data Source code
1 : /*
2 : * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 : *
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
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : */
10 :
11 : #include "webrtc/modules/video_coding/histogram.h"
12 :
13 : #include <algorithm>
14 :
15 : #include "webrtc/modules/video_coding/sequence_number_util.h"
16 :
17 : namespace webrtc {
18 : namespace video_coding {
19 0 : Histogram::Histogram(size_t num_buckets, size_t max_num_values) {
20 0 : RTC_DCHECK_GT(num_buckets, 0);
21 0 : RTC_DCHECK_GT(max_num_values, 0);
22 0 : buckets_.resize(num_buckets);
23 0 : values_.reserve(max_num_values);
24 0 : index_ = 0;
25 0 : }
26 :
27 0 : void Histogram::Add(size_t value) {
28 0 : value = std::min<size_t>(value, buckets_.size() - 1);
29 0 : if (index_ < values_.size()) {
30 0 : --buckets_[values_[index_]];
31 0 : RTC_DCHECK_LT(values_[index_], buckets_.size());
32 0 : values_[index_] = value;
33 : } else {
34 0 : values_.emplace_back(value);
35 : }
36 :
37 0 : ++buckets_[value];
38 0 : index_ = (index_ + 1) % values_.capacity();
39 0 : }
40 :
41 0 : size_t Histogram::InverseCdf(float probability) const {
42 0 : RTC_DCHECK_GE(probability, 0.f);
43 0 : RTC_DCHECK_LE(probability, 1.f);
44 0 : RTC_DCHECK_GT(values_.size(), 0ul);
45 :
46 0 : size_t bucket = 0;
47 0 : float accumulated_probability = 0;
48 0 : while (accumulated_probability < probability && bucket < buckets_.size()) {
49 0 : accumulated_probability +=
50 0 : static_cast<float>(buckets_[bucket]) / values_.size();
51 0 : ++bucket;
52 : }
53 0 : return bucket;
54 : }
55 :
56 0 : size_t Histogram::NumValues() const {
57 0 : return values_.size();
58 : }
59 :
60 : } // namespace video_coding
61 : } // namespace webrtc
|