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 WorkerHistogram::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 Workervoid 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 Workersize_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 Workersize_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