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