1*77c1e3ccSAndroid Build Coastguard Worker /* 2*77c1e3ccSAndroid Build Coastguard Worker * Copyright (c) 2001-2016, Alliance for Open Media. All rights reserved. 3*77c1e3ccSAndroid Build Coastguard Worker * 4*77c1e3ccSAndroid Build Coastguard Worker * This source code is subject to the terms of the BSD 2 Clause License and 5*77c1e3ccSAndroid Build Coastguard Worker * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6*77c1e3ccSAndroid Build Coastguard Worker * was not distributed with this source code in the LICENSE file, you can 7*77c1e3ccSAndroid Build Coastguard Worker * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8*77c1e3ccSAndroid Build Coastguard Worker * Media Patent License 1.0 was not distributed with this source code in the 9*77c1e3ccSAndroid Build Coastguard Worker * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10*77c1e3ccSAndroid Build Coastguard Worker */ 11*77c1e3ccSAndroid Build Coastguard Worker 12*77c1e3ccSAndroid Build Coastguard Worker /* clang-format off */ 13*77c1e3ccSAndroid Build Coastguard Worker 14*77c1e3ccSAndroid Build Coastguard Worker #ifndef AOM_AOM_DSP_ODINTRIN_H_ 15*77c1e3ccSAndroid Build Coastguard Worker #define AOM_AOM_DSP_ODINTRIN_H_ 16*77c1e3ccSAndroid Build Coastguard Worker 17*77c1e3ccSAndroid Build Coastguard Worker #include <stdlib.h> 18*77c1e3ccSAndroid Build Coastguard Worker #include <string.h> 19*77c1e3ccSAndroid Build Coastguard Worker 20*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_integer.h" 21*77c1e3ccSAndroid Build Coastguard Worker #include "aom_dsp/aom_dsp_common.h" 22*77c1e3ccSAndroid Build Coastguard Worker #include "aom_ports/bitops.h" 23*77c1e3ccSAndroid Build Coastguard Worker 24*77c1e3ccSAndroid Build Coastguard Worker #ifdef __cplusplus 25*77c1e3ccSAndroid Build Coastguard Worker extern "C" { 26*77c1e3ccSAndroid Build Coastguard Worker #endif 27*77c1e3ccSAndroid Build Coastguard Worker 28*77c1e3ccSAndroid Build Coastguard Worker typedef int od_coeff; 29*77c1e3ccSAndroid Build Coastguard Worker 30*77c1e3ccSAndroid Build Coastguard Worker #define OD_DIVU_DMAX (1024) 31*77c1e3ccSAndroid Build Coastguard Worker 32*77c1e3ccSAndroid Build Coastguard Worker extern uint32_t OD_DIVU_SMALL_CONSTS[OD_DIVU_DMAX][2]; 33*77c1e3ccSAndroid Build Coastguard Worker 34*77c1e3ccSAndroid Build Coastguard Worker /*Translate unsigned division by small divisors into multiplications.*/ 35*77c1e3ccSAndroid Build Coastguard Worker #define OD_DIVU_SMALL(_x, _d) \ 36*77c1e3ccSAndroid Build Coastguard Worker ((uint32_t)((OD_DIVU_SMALL_CONSTS[(_d)-1][0] * (uint64_t)(_x) + \ 37*77c1e3ccSAndroid Build Coastguard Worker OD_DIVU_SMALL_CONSTS[(_d)-1][1]) >> \ 38*77c1e3ccSAndroid Build Coastguard Worker 32) >> \ 39*77c1e3ccSAndroid Build Coastguard Worker (OD_ILOG_NZ(_d) - 1)) 40*77c1e3ccSAndroid Build Coastguard Worker 41*77c1e3ccSAndroid Build Coastguard Worker #define OD_DIVU(_x, _d) \ 42*77c1e3ccSAndroid Build Coastguard Worker (((_d) < OD_DIVU_DMAX) ? (OD_DIVU_SMALL((_x), (_d))) : ((_x) / (_d))) 43*77c1e3ccSAndroid Build Coastguard Worker 44*77c1e3ccSAndroid Build Coastguard Worker #define OD_MINI AOMMIN 45*77c1e3ccSAndroid Build Coastguard Worker #define OD_MAXI AOMMAX 46*77c1e3ccSAndroid Build Coastguard Worker #define OD_CLAMPI(min, val, max) (OD_MAXI(min, OD_MINI(val, max))) 47*77c1e3ccSAndroid Build Coastguard Worker 48*77c1e3ccSAndroid Build Coastguard Worker /*Integer logarithm (base 2) of a nonzero unsigned 32-bit integer. 49*77c1e3ccSAndroid Build Coastguard Worker OD_ILOG_NZ(x) = (int)floor(log2(x)) + 1.*/ 50*77c1e3ccSAndroid Build Coastguard Worker #define OD_ILOG_NZ(x) (1 + get_msb(x)) 51*77c1e3ccSAndroid Build Coastguard Worker 52*77c1e3ccSAndroid Build Coastguard Worker /*Enable special features for gcc and compatible compilers.*/ 53*77c1e3ccSAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) 54*77c1e3ccSAndroid Build Coastguard Worker #define OD_GNUC_PREREQ(maj, min, pat) \ 55*77c1e3ccSAndroid Build Coastguard Worker ((__GNUC__ << 16) + (__GNUC_MINOR__ << 8) + __GNUC_PATCHLEVEL__ >= \ 56*77c1e3ccSAndroid Build Coastguard Worker ((maj) << 16) + ((min) << 8) + pat) // NOLINT 57*77c1e3ccSAndroid Build Coastguard Worker #else 58*77c1e3ccSAndroid Build Coastguard Worker #define OD_GNUC_PREREQ(maj, min, pat) (0) 59*77c1e3ccSAndroid Build Coastguard Worker #endif 60*77c1e3ccSAndroid Build Coastguard Worker 61*77c1e3ccSAndroid Build Coastguard Worker #if OD_GNUC_PREREQ(3, 4, 0) 62*77c1e3ccSAndroid Build Coastguard Worker #define OD_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) 63*77c1e3ccSAndroid Build Coastguard Worker #else 64*77c1e3ccSAndroid Build Coastguard Worker #define OD_WARN_UNUSED_RESULT 65*77c1e3ccSAndroid Build Coastguard Worker #endif 66*77c1e3ccSAndroid Build Coastguard Worker 67*77c1e3ccSAndroid Build Coastguard Worker #if OD_GNUC_PREREQ(3, 4, 0) 68*77c1e3ccSAndroid Build Coastguard Worker #define OD_ARG_NONNULL(x) __attribute__((__nonnull__(x))) 69*77c1e3ccSAndroid Build Coastguard Worker #else 70*77c1e3ccSAndroid Build Coastguard Worker #define OD_ARG_NONNULL(x) 71*77c1e3ccSAndroid Build Coastguard Worker #endif 72*77c1e3ccSAndroid Build Coastguard Worker 73*77c1e3ccSAndroid Build Coastguard Worker /*All of these macros should expect floats as arguments.*/ 74*77c1e3ccSAndroid Build Coastguard Worker # define OD_SIGNMASK(a) (-((a) < 0)) 75*77c1e3ccSAndroid Build Coastguard Worker # define OD_FLIPSIGNI(a, b) (((a) + OD_SIGNMASK(b)) ^ OD_SIGNMASK(b)) 76*77c1e3ccSAndroid Build Coastguard Worker 77*77c1e3ccSAndroid Build Coastguard Worker #ifdef __cplusplus 78*77c1e3ccSAndroid Build Coastguard Worker } // extern "C" 79*77c1e3ccSAndroid Build Coastguard Worker #endif 80*77c1e3ccSAndroid Build Coastguard Worker 81*77c1e3ccSAndroid Build Coastguard Worker #endif // AOM_AOM_DSP_ODINTRIN_H_ 82