1ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* 2ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * 4ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * Use of this source code is governed by a BSD-style license 5ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * that can be found in the LICENSE file in the root of the source 6ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * tree. An additional intellectual property rights grant can be found 7ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * in the file PATENTS. All contributing project authors may 8ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * be found in the AUTHORS file in the root of the source tree. 9ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 10ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 11f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#ifndef TEST_ACM_RANDOM_H_ 12f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#define TEST_ACM_RANDOM_H_ 13ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 14923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h" 15ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 16ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "vpx/vpx_integer.h" 17ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 18ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgnamespace libvpx_test { 19ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 20ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgclass ACMRandom { 21ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org public: 22923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org ACMRandom() : random_(DeterministicSeed()) {} 23ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 24923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org explicit ACMRandom(int seed) : random_(seed) {} 25ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 26ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org void Reset(int seed) { 27923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org random_.Reseed(seed); 28ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 298b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org uint16_t Rand16(void) { 308b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org const uint32_t value = 318b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org random_.Generate(testing::internal::Random::kMaxRange); 328b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org return (value >> 16) & 0xffff; 338b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org } 34ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 35ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org uint8_t Rand8(void) { 36923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org const uint32_t value = 37923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org random_.Generate(testing::internal::Random::kMaxRange); 38923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org // There's a bit more entropy in the upper bits of this implementation. 39923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org return (value >> 24) & 0xff; 40ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 41ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 4210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org uint8_t Rand8Extremes(void) { 4310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org // Returns a random value near 0 or near 255, to better exercise 4410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org // saturation behavior. 4510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org const uint8_t r = Rand8(); 4610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org return r < 128 ? r << 4 : r >> 4; 4710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org } 4810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org 49ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int PseudoUniform(int range) { 50923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org return random_.Generate(range); 51ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 52ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 53ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int operator()(int n) { 54ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org return PseudoUniform(n); 55ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 56ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 57ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org static int DeterministicSeed(void) { 58ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org return 0xbaba; 59ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 60923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org 61923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org private: 62923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org testing::internal::Random random_; 63ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}; 64ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 65ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} // namespace libvpx_test 66ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 67f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#endif // TEST_ACM_RANDOM_H_ 68