| /* | |
| * Copyright (c) 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. | |
| */ | |
| #ifndef AV1_COMMON_ODINTRIN_H_ | |
| #define AV1_COMMON_ODINTRIN_H_ | |
| #include "aom/aom_integer.h" | |
| #include "aom_dsp/aom_dsp_common.h" | |
| #include "aom_ports/bitops.h" | |
| #include "av1/common/enums.h" | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| /*Smallest blocks are 4x4*/ | |
| #define OD_LOG_BSIZE0 (2) | |
| /*There are 5 block sizes total (4x4, 8x8, 16x16, 32x32 and 64x64).*/ | |
| #define OD_NBSIZES (5) | |
| /*The log of the maximum length of the side of a block.*/ | |
| #define OD_LOG_BSIZE_MAX (OD_LOG_BSIZE0 + OD_NBSIZES - 1) | |
| /*The maximum length of the side of a block.*/ | |
| #define OD_BSIZE_MAX (1 << OD_LOG_BSIZE_MAX) | |
| 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(_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) clamp((val), (min), (max)) | |
| #define OD_CLZ0 (1) | |
| #define OD_CLZ(x) (-get_msb(x)) | |
| #define OD_ILOG_NZ(x) (OD_CLZ0 - OD_CLZ(x)) | |
| /*Note that __builtin_clz is not defined when x == 0, according to the gcc | |
| documentation (and that of the x86 BSR instruction that implements it), so | |
| we have to special-case it. | |
| We define a special version of the macro to use when x can be zero.*/ | |
| #define OD_ILOG(x) ((x) ? OD_ILOG_NZ(x) : 0) | |
| #define OD_LOG2 AOMLOG2 | |
| /*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 | |
| #if defined(OD_ENABLE_ASSERTIONS) | |
| #if OD_GNUC_PREREQ(2, 5, 0) | |
| __attribute__((noreturn)) | |
| #endif | |
| void od_fatal_impl(const char *_str, const char *_file, int _line); | |
| #define OD_FATAL(_str) (od_fatal_impl(_str, __FILE__, __LINE__)) | |
| #define OD_ASSERT(_cond) \ | |
| do { \ | |
| if (!(_cond)) { \ | |
| OD_FATAL("assertion failed: " #_cond); \ | |
| } \ | |
| } while (0) | |
| #define OD_ASSERT2(_cond, _message) \ | |
| do { \ | |
| if (!(_cond)) { \ | |
| OD_FATAL("assertion failed: " #_cond "\n" _message); \ | |
| } \ | |
| } while (0) | |
| #define OD_ALWAYS_TRUE(_cond) OD_ASSERT(_cond) | |
| #else | |
| #define OD_ASSERT(_cond) | |
| #define OD_ASSERT2(_cond, _message) | |
| #define OD_ALWAYS_TRUE(_cond) ((void)(_cond)) | |
| #endif | |
| /** Copy n elements of memory from src to dst. The 0* term provides | |
| compile-time type checking */ | |
| #if !defined(OVERRIDE_OD_COPY) | |
| #define OD_COPY(dst, src, n) \ | |
| (memcpy((dst), (src), sizeof(*(dst)) * (n) + 0 * ((dst) - (src)))) | |
| #endif | |
| /** Copy n elements of memory from src to dst, allowing overlapping regions. | |
| The 0* term provides compile-time type checking */ | |
| #if !defined(OVERRIDE_OD_MOVE) | |
| #define OD_MOVE(dst, src, n) \ | |
| (memmove((dst), (src), sizeof(*(dst)) * (n) + 0 * ((dst) - (src)))) | |
| #endif | |
| #ifdef __cplusplus | |
| } // extern "C" | |
| #endif | |
| #endif // AV1_COMMON_ODINTRIN_H_ |