xref: /aosp_15_r20/external/libvpx/test/acm_random.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_TEST_ACM_RANDOM_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_TEST_ACM_RANDOM_H_
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include <assert.h>
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include <limits>
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
19*fb1b10abSAndroid Build Coastguard Worker 
20*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
21*fb1b10abSAndroid Build Coastguard Worker 
22*fb1b10abSAndroid Build Coastguard Worker namespace libvpx_test {
23*fb1b10abSAndroid Build Coastguard Worker 
24*fb1b10abSAndroid Build Coastguard Worker class ACMRandom {
25*fb1b10abSAndroid Build Coastguard Worker  public:
ACMRandom()26*fb1b10abSAndroid Build Coastguard Worker   ACMRandom() : random_(DeterministicSeed()) {}
27*fb1b10abSAndroid Build Coastguard Worker 
ACMRandom(int seed)28*fb1b10abSAndroid Build Coastguard Worker   explicit ACMRandom(int seed) : random_(seed) {}
29*fb1b10abSAndroid Build Coastguard Worker 
Reset(int seed)30*fb1b10abSAndroid Build Coastguard Worker   void Reset(int seed) { random_.Reseed(seed); }
Rand16()31*fb1b10abSAndroid Build Coastguard Worker   uint16_t Rand16() {
32*fb1b10abSAndroid Build Coastguard Worker     const uint32_t value =
33*fb1b10abSAndroid Build Coastguard Worker         random_.Generate(testing::internal::Random::kMaxRange);
34*fb1b10abSAndroid Build Coastguard Worker     return (value >> 15) & 0xffff;
35*fb1b10abSAndroid Build Coastguard Worker   }
36*fb1b10abSAndroid Build Coastguard Worker 
Rand20Signed()37*fb1b10abSAndroid Build Coastguard Worker   int32_t Rand20Signed() {
38*fb1b10abSAndroid Build Coastguard Worker     // Use 20 bits: values between 524287 and -524288.
39*fb1b10abSAndroid Build Coastguard Worker     const uint32_t value = random_.Generate(1048576);
40*fb1b10abSAndroid Build Coastguard Worker     return static_cast<int32_t>(value) - 524288;
41*fb1b10abSAndroid Build Coastguard Worker   }
42*fb1b10abSAndroid Build Coastguard Worker 
Rand16Signed()43*fb1b10abSAndroid Build Coastguard Worker   int16_t Rand16Signed() {
44*fb1b10abSAndroid Build Coastguard Worker     // Use 16 bits: values between 32767 and -32768.
45*fb1b10abSAndroid Build Coastguard Worker     return static_cast<int16_t>(random_.Generate(65536));
46*fb1b10abSAndroid Build Coastguard Worker   }
47*fb1b10abSAndroid Build Coastguard Worker 
Rand12()48*fb1b10abSAndroid Build Coastguard Worker   uint16_t Rand12() {
49*fb1b10abSAndroid Build Coastguard Worker     const uint32_t value =
50*fb1b10abSAndroid Build Coastguard Worker         random_.Generate(testing::internal::Random::kMaxRange);
51*fb1b10abSAndroid Build Coastguard Worker     // There's a bit more entropy in the upper bits of this implementation.
52*fb1b10abSAndroid Build Coastguard Worker     return (value >> 19) & 0xfff;
53*fb1b10abSAndroid Build Coastguard Worker   }
54*fb1b10abSAndroid Build Coastguard Worker 
Rand8()55*fb1b10abSAndroid Build Coastguard Worker   uint8_t Rand8() {
56*fb1b10abSAndroid Build Coastguard Worker     const uint32_t value =
57*fb1b10abSAndroid Build Coastguard Worker         random_.Generate(testing::internal::Random::kMaxRange);
58*fb1b10abSAndroid Build Coastguard Worker     // There's a bit more entropy in the upper bits of this implementation.
59*fb1b10abSAndroid Build Coastguard Worker     return (value >> 23) & 0xff;
60*fb1b10abSAndroid Build Coastguard Worker   }
61*fb1b10abSAndroid Build Coastguard Worker 
Rand8Extremes()62*fb1b10abSAndroid Build Coastguard Worker   uint8_t Rand8Extremes() {
63*fb1b10abSAndroid Build Coastguard Worker     // Returns a random value near 0 or near 255, to better exercise
64*fb1b10abSAndroid Build Coastguard Worker     // saturation behavior.
65*fb1b10abSAndroid Build Coastguard Worker     const uint8_t r = Rand8();
66*fb1b10abSAndroid Build Coastguard Worker     return static_cast<uint8_t>((r < 128) ? r << 4 : r >> 4);
67*fb1b10abSAndroid Build Coastguard Worker   }
68*fb1b10abSAndroid Build Coastguard Worker 
RandRange(const uint32_t range)69*fb1b10abSAndroid Build Coastguard Worker   uint32_t RandRange(const uint32_t range) {
70*fb1b10abSAndroid Build Coastguard Worker     // testing::internal::Random::Generate provides values in the range
71*fb1b10abSAndroid Build Coastguard Worker     // testing::internal::Random::kMaxRange.
72*fb1b10abSAndroid Build Coastguard Worker     assert(range <= testing::internal::Random::kMaxRange);
73*fb1b10abSAndroid Build Coastguard Worker     return random_.Generate(range);
74*fb1b10abSAndroid Build Coastguard Worker   }
75*fb1b10abSAndroid Build Coastguard Worker 
PseudoUniform(int range)76*fb1b10abSAndroid Build Coastguard Worker   int PseudoUniform(int range) { return random_.Generate(range); }
77*fb1b10abSAndroid Build Coastguard Worker 
operator()78*fb1b10abSAndroid Build Coastguard Worker   int operator()(int n) { return PseudoUniform(n); }
79*fb1b10abSAndroid Build Coastguard Worker 
DeterministicSeed()80*fb1b10abSAndroid Build Coastguard Worker   static int DeterministicSeed() { return 0xbaba; }
81*fb1b10abSAndroid Build Coastguard Worker 
82*fb1b10abSAndroid Build Coastguard Worker  private:
83*fb1b10abSAndroid Build Coastguard Worker   testing::internal::Random random_;
84*fb1b10abSAndroid Build Coastguard Worker };
85*fb1b10abSAndroid Build Coastguard Worker 
86*fb1b10abSAndroid Build Coastguard Worker }  // namespace libvpx_test
87*fb1b10abSAndroid Build Coastguard Worker 
88*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_TEST_ACM_RANDOM_H_
89