/* * Copyright (c) 2001-2016, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ /* clang-format off */ #ifndef AOM_AOM_DSP_ODINTRIN_H_ #define AOM_AOM_DSP_ODINTRIN_H_ #include #include #include "aom/aom_integer.h" #include "aom_dsp/aom_dsp_common.h" #include "aom_ports/bitops.h" #ifdef __cplusplus extern "C" { #endif typedef int od_coeff; #define OD_DIVU_DMAX (1024) extern uint32_t OD_DIVU_SMALL_CONSTS[OD_DIVU_DMAX][2]; /*Translate unsigned division by small divisors into multiplications.*/ #define OD_DIVU_SMALL(_x, _d) \ ((uint32_t)((OD_DIVU_SMALL_CONSTS[(_d)-1][0] * (uint64_t)(_x) + \ OD_DIVU_SMALL_CONSTS[(_d)-1][1]) >> \ 32) >> \ (OD_ILOG_NZ(_d) - 1)) #define OD_DIVU(_x, _d) \ (((_d) < OD_DIVU_DMAX) ? (OD_DIVU_SMALL((_x), (_d))) : ((_x) / (_d))) #define OD_MINI AOMMIN #define OD_MAXI AOMMAX #define OD_CLAMPI(min, val, max) (OD_MAXI(min, OD_MINI(val, max))) /*Integer logarithm (base 2) of a nonzero unsigned 32-bit integer. OD_ILOG_NZ(x) = (int)floor(log2(x)) + 1.*/ #define OD_ILOG_NZ(x) (1 + get_msb(x)) /*Enable special features for gcc and compatible compilers.*/ #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) #define OD_GNUC_PREREQ(maj, min, pat) \ ((__GNUC__ << 16) + (__GNUC_MINOR__ << 8) + __GNUC_PATCHLEVEL__ >= \ ((maj) << 16) + ((min) << 8) + pat) // NOLINT #else #define OD_GNUC_PREREQ(maj, min, pat) (0) #endif #if OD_GNUC_PREREQ(3, 4, 0) #define OD_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) #else #define OD_WARN_UNUSED_RESULT #endif #if OD_GNUC_PREREQ(3, 4, 0) #define OD_ARG_NONNULL(x) __attribute__((__nonnull__(x))) #else #define OD_ARG_NONNULL(x) #endif /*All of these macros should expect floats as arguments.*/ # define OD_SIGNMASK(a) (-((a) < 0)) # define OD_FLIPSIGNI(a, b) (((a) + OD_SIGNMASK(b)) ^ OD_SIGNMASK(b)) #ifdef __cplusplus } // extern "C" #endif #endif // AOM_AOM_DSP_ODINTRIN_H_