81 lines
2.5 KiB
C
81 lines
2.5 KiB
C
/*
|
|
* 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 <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#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_
|