67 lines
2.2 KiB
C
67 lines
2.2 KiB
C
/*
|
|
* 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 "av1/common/enums.h"
|
|
#include "aom/aom_integer.h"
|
|
#include "aom_dsp/aom_dsp_common.h"
|
|
#include "aom_ports/bitops.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;
|
|
|
|
typedef int16_t od_dering_in;
|
|
|
|
#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_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)
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
|
|
#endif // AV1_COMMON_ODINTRIN_H_
|