blob: a5894286301c4066ce3b770ccce117266cf1b32b [file] [log] [blame] [edit]
/*
* Copyright (c) 2021, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 3-Clause Clear License
* and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
* License was not distributed with this source code in the LICENSE file, you
* can obtain it at aomedia.org/license/software-license/bsd-3-c-c/. 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
* aomedia.org/license/patent-license/.
*/
#ifndef AOM_AV1_COMMON_AV1_TXFM_H_
#define AOM_AV1_COMMON_AV1_TXFM_H_
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include "config/aom_config.h"
#include "av1/common/enums.h"
#include "av1/common/blockd.h"
#include "av1/common/secondary_tx.h"
#include "aom/aom_integer.h"
#include "aom_dsp/aom_dsp_common.h"
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(DO_RANGE_CHECK_CLAMP)
#define DO_RANGE_CHECK_CLAMP 0
#endif
// Secondary transform coeffs in int precision
extern int32_t ist_4x4_kernel_int32[IST_SET_SIZE][STX_TYPES - 1][16]
[IST_4x4_WIDTH];
extern int32_t ist_8x8_kernel_int32[IST_SET_SIZE][STX_TYPES - 1]
[IST_8x8_HEIGHT_MAX][IST_8x8_WIDTH];
#define REPLACE_ADST4 0
#define REPLACE_ADST8 1
#define REPLACE_ADST16 1
#define CCTX_PREC_BITS 8
extern const int32_t cctx_mtx[CCTX_TYPES - 1][2];
#define NewSqrt2Bits ((int32_t)12)
// 2^12 * sqrt(2)
static const int32_t NewSqrt2 = 5793;
// 2^12 / sqrt(2)
static const int32_t NewInvSqrt2 = 2896;
void av1_init_stxfm_kernels(void);
static INLINE int32_t clamp_value(int32_t value, int8_t bit) {
if (bit <= 0) return value; // Do nothing for invalid clamp bit.
const int64_t max_value = (1LL << (bit - 1)) - 1;
const int64_t min_value = -(1LL << (bit - 1));
return (int32_t)clamp64(value, min_value, max_value);
}
static INLINE int32_t range_check_value(int32_t value, int8_t bit) {
#if CONFIG_COEFFICIENT_RANGE_CHECKING
const int64_t max_value = (1LL << (bit - 1)) - 1;
const int64_t min_value = -(1LL << (bit - 1));
if (value < min_value || value > max_value) {
fprintf(stderr, "coeff out of bit range, value: %d bit %d\n", value, bit);
#if !CONFIG_AV1_ENCODER
assert(0);
#endif
}
#endif // CONFIG_COEFFICIENT_RANGE_CHECKING
#if DO_RANGE_CHECK_CLAMP
bit = AOMMIN(bit, 31);
return clamp(value, -(1 << (bit - 1)), (1 << (bit - 1)) - 1);
#endif // DO_RANGE_CHECK_CLAMP
(void)bit;
return value;
}
static INLINE int32_t round_shift(int64_t value, int bit) {
assert(bit >= 1);
return (int32_t)((value + (1ll << (bit - 1))) >> bit);
}
static INLINE uint16_t highbd_clip_pixel_add(uint16_t dest, tran_high_t trans,
int bd) {
return clip_pixel_highbd(dest + (int)trans, bd);
}
typedef void (*TxfmFunc)(const int32_t *input, int32_t *output, int8_t cos_bit,
const int8_t *stage_range);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // AOM_AV1_COMMON_AV1_TXFM_H_