| /* |
| * 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/. |
| */ |
| |
| #include "config/aom_dsp_rtcd.h" |
| #include "config/av1_rtcd.h" |
| |
| #include "av1/common/av1_txfm.h" |
| |
| /*! |
| * Secondary transform coeffs in 32-bit precision |
| * 16-bit buffers are sufficient to store the secondary transform kernels of |
| * 4x4 and 8x8. However, the 16-bit kernel is converted and maintained in a |
| * 32-bit buffer to improve the performance of load operation in x86 SIMD. |
| */ |
| DECLARE_ALIGNED( |
| 32, int32_t, |
| ist_4x4_kernel_int32[IST_SET_SIZE][STX_TYPES - 1][16][IST_4x4_WIDTH]); |
| DECLARE_ALIGNED(32, int32_t, |
| ist_8x8_kernel_int32[IST_SET_SIZE][STX_TYPES - 1] |
| [IST_8x8_HEIGHT_MAX][IST_8x8_WIDTH]); |
| |
| void av1_init_stxfm_kernels(void) { |
| const int set_max = IST_SET_SIZE; |
| const int type_max = STX_TYPES - 1; |
| |
| const int row_max_4x4 = 16; |
| const int col_max_4x4 = IST_4x4_WIDTH; |
| |
| const int row_max_8x8 = IST_8x8_HEIGHT_MAX; |
| const int col_max_8x8 = IST_8x8_WIDTH; |
| |
| for (int set = 0; set < set_max; ++set) { |
| for (int type = 0; type < type_max; ++type) { |
| for (int row = 0; row < row_max_4x4; ++row) { |
| for (int col = 0; col < col_max_4x4; ++col) { |
| ist_4x4_kernel_int32[set][type][row][col] = |
| (int32_t)ist_4x4_kernel[set][type][row][col]; |
| } |
| } |
| for (int row = 0; row < row_max_8x8; ++row) { |
| for (int col = 0; col < col_max_8x8; ++col) { |
| ist_8x8_kernel_int32[set][type][row][col] = |
| (int32_t)ist_8x8_kernel[set][type][row][col]; |
| } |
| } |
| } |
| } |
| } |
| |
| // Given a rotation angle t, the CCTX transform matrix is defined as |
| // [cos(t), sin(t); -sin(t), cos(t)] * 1<<CCTX_PREC_BITS). The array below only |
| // stores two values: cos(t) and sin(t) for each rotation angle. |
| const int32_t cctx_mtx[CCTX_TYPES - 1][2] = { |
| { 181, 181 }, // t = 45 degrees |
| { 222, 128 }, // t = 30 degrees |
| { 128, 222 }, // t = 60 degrees |
| { 181, -181 }, // t = -45 degrees |
| { 222, -128 }, // t = -30 degrees |
| { 128, -222 }, // t = -60 degrees |
| }; |