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