blob: 76b417cbbcbf2ac64a0dca2fb389ebf1e3aa0a4f [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * 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.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
Yaowu Xuf883b422016-08-30 14:01:10 -070012#include "./av1_rtcd.h"
13#include "./aom_config.h"
14#include "./aom_dsp_rtcd.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070015
16#include "av1/common/idct.h"
17#include "av1/encoder/hybrid_fwd_txfm.h"
Monty Montgomerya2d40a32017-10-30 23:32:03 -040018#if CONFIG_DAALA_TX
19#include "av1/encoder/daala_fwd_txfm.h"
20#else
Yaowu Xuc27fc142016-08-22 16:08:15 -070021
Yaowu Xuc27fc142016-08-22 16:08:15 -070022static void fwd_txfm_4x4(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -070023 int diff_stride, TxfmParam *txfm_param) {
24 if (txfm_param->lossless) {
25 assert(txfm_param->tx_type == DCT_DCT);
Yaowu Xuf883b422016-08-30 14:01:10 -070026 av1_fwht4x4(src_diff, coeff, diff_stride);
Yaowu Xuc27fc142016-08-22 16:08:15 -070027 return;
28 }
29
Sebastien Alaiwan2fa189e2017-11-08 12:37:42 +010030#if CONFIG_DAALA_TX4
Lester Luad8290b2017-06-12 18:26:18 -070031 // only C version has LGTs
Lester Lu27319b62017-07-10 16:57:15 -070032 av1_fht4x4_c(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070033#else
Lester Lu27319b62017-07-10 16:57:15 -070034 av1_fht4x4(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070035#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070036}
37
Yaowu Xuc27fc142016-08-22 16:08:15 -070038static void fwd_txfm_4x8(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -070039 int diff_stride, TxfmParam *txfm_param) {
Sebastien Alaiwan2fa189e2017-11-08 12:37:42 +010040#if (CONFIG_DAALA_TX4 && CONFIG_DAALA_TX8)
Lester Lu27319b62017-07-10 16:57:15 -070041 av1_fht4x8_c(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070042#else
Lester Lu27319b62017-07-10 16:57:15 -070043 av1_fht4x8(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070044#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070045}
46
47static void fwd_txfm_8x4(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -070048 int diff_stride, TxfmParam *txfm_param) {
Sebastien Alaiwan2fa189e2017-11-08 12:37:42 +010049#if (CONFIG_DAALA_TX4 && CONFIG_DAALA_TX8)
Lester Lu27319b62017-07-10 16:57:15 -070050 av1_fht8x4_c(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070051#else
Lester Lu27319b62017-07-10 16:57:15 -070052 av1_fht8x4(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070053#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070054}
55
56static void fwd_txfm_8x16(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -070057 int diff_stride, TxfmParam *txfm_param) {
Sebastien Alaiwan2fa189e2017-11-08 12:37:42 +010058#if (CONFIG_DAALA_TX8 && CONFIG_DAALA_TX16)
Lester Lu27319b62017-07-10 16:57:15 -070059 av1_fht8x16_c(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070060#else
Lester Lu27319b62017-07-10 16:57:15 -070061 av1_fht8x16(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070062#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070063}
64
65static void fwd_txfm_16x8(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -070066 int diff_stride, TxfmParam *txfm_param) {
Sebastien Alaiwan2fa189e2017-11-08 12:37:42 +010067#if (CONFIG_DAALA_TX8 && CONFIG_DAALA_TX16)
Lester Lu27319b62017-07-10 16:57:15 -070068 av1_fht16x8_c(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070069#else
Lester Lu27319b62017-07-10 16:57:15 -070070 av1_fht16x8(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070071#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070072}
73
74static void fwd_txfm_16x32(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -070075 int diff_stride, TxfmParam *txfm_param) {
Monty Montgomeryad396852017-10-20 03:35:26 -040076#if CONFIG_DAALA_TX16 && CONFIG_DAALA_TX32
77 av1_fht16x32_c(src_diff, coeff, diff_stride, txfm_param);
78#else
Lester Lu27319b62017-07-10 16:57:15 -070079 av1_fht16x32(src_diff, coeff, diff_stride, txfm_param);
Monty Montgomeryad396852017-10-20 03:35:26 -040080#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070081}
82
83static void fwd_txfm_32x16(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -070084 int diff_stride, TxfmParam *txfm_param) {
Monty Montgomeryad396852017-10-20 03:35:26 -040085#if CONFIG_DAALA_TX16 && CONFIG_DAALA_TX32
86 av1_fht32x16_c(src_diff, coeff, diff_stride, txfm_param);
87#else
Lester Lu27319b62017-07-10 16:57:15 -070088 av1_fht32x16(src_diff, coeff, diff_stride, txfm_param);
Monty Montgomeryad396852017-10-20 03:35:26 -040089#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070090}
Yaowu Xuc27fc142016-08-22 16:08:15 -070091
92static void fwd_txfm_8x8(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -070093 int diff_stride, TxfmParam *txfm_param) {
Sebastien Alaiwan2fa189e2017-11-08 12:37:42 +010094#if CONFIG_DAALA_TX8
Lester Lu27319b62017-07-10 16:57:15 -070095 av1_fht8x8_c(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070096#else
Lester Lu27319b62017-07-10 16:57:15 -070097 av1_fht8x8(src_diff, coeff, diff_stride, txfm_param);
Lester Luad8290b2017-06-12 18:26:18 -070098#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070099}
100
101static void fwd_txfm_16x16(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700102 int diff_stride, TxfmParam *txfm_param) {
Nathan E. Eggee554f362017-10-04 14:44:38 -0400103#if CONFIG_DAALA_TX16
Nathan E. Egge34e12012017-09-13 09:02:32 -0400104 av1_fht16x16_c(src_diff, coeff, diff_stride, txfm_param);
105#else
Lester Lu27319b62017-07-10 16:57:15 -0700106 av1_fht16x16(src_diff, coeff, diff_stride, txfm_param);
Nathan E. Eggee554f362017-10-04 14:44:38 -0400107#endif // CONFIG_DAALA_TX16
Yaowu Xuc27fc142016-08-22 16:08:15 -0700108}
109
Angie Chiang8fd2d7a2017-01-03 15:50:15 -0800110static void fwd_txfm_32x32(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700111 int diff_stride, TxfmParam *txfm_param) {
Sarah Parker53f93db2017-07-11 17:20:04 -0700112#if CONFIG_MRC_TX
113 // MRC_DCT currently only has a C implementation
114 if (txfm_param->tx_type == MRC_DCT) {
115 av1_fht32x32_c(src_diff, coeff, diff_stride, txfm_param);
116 return;
117 }
118#endif // CONFIG_MRC_TX
Lester Lu27319b62017-07-10 16:57:15 -0700119 av1_fht32x32(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700120}
121
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700122#if CONFIG_TX64X64
123static void fwd_txfm_64x64(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700124 int diff_stride, TxfmParam *txfm_param) {
Lester Lu27319b62017-07-10 16:57:15 -0700125 if (txfm_param->tx_type == IDTX)
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700126 av1_fwd_idtx_c(src_diff, coeff, diff_stride, 64, 64, txfm_param->tx_type);
Angie Chiang2cc057c2017-01-03 18:31:47 -0800127 else
Lester Lu27319b62017-07-10 16:57:15 -0700128 av1_fht64x64(src_diff, coeff, diff_stride, txfm_param);
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700129}
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700130
131static void fwd_txfm_32x64(const int16_t *src_diff, tran_low_t *coeff,
132 int diff_stride, TxfmParam *txfm_param) {
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700133 if (txfm_param->tx_type == IDTX)
134 av1_fwd_idtx_c(src_diff, coeff, diff_stride, 32, 64, txfm_param->tx_type);
135 else
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700136 av1_fht32x64(src_diff, coeff, diff_stride, txfm_param);
137}
138
139static void fwd_txfm_64x32(const int16_t *src_diff, tran_low_t *coeff,
140 int diff_stride, TxfmParam *txfm_param) {
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700141 if (txfm_param->tx_type == IDTX)
142 av1_fwd_idtx_c(src_diff, coeff, diff_stride, 64, 32, txfm_param->tx_type);
143 else
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700144 av1_fht64x32(src_diff, coeff, diff_stride, txfm_param);
145}
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700146#endif // CONFIG_TX64X64
147
Sebastien Alaiwanfb838772017-10-24 12:02:54 +0200148#if CONFIG_RECT_TX_EXT
Yue Chen56e226e2017-05-02 16:21:40 -0700149static void fwd_txfm_16x4(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700150 int diff_stride, TxfmParam *txfm_param) {
Lester Lu27319b62017-07-10 16:57:15 -0700151 av1_fht16x4(src_diff, coeff, diff_stride, txfm_param);
Yue Chen56e226e2017-05-02 16:21:40 -0700152}
153
154static void fwd_txfm_4x16(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700155 int diff_stride, TxfmParam *txfm_param) {
Lester Lu27319b62017-07-10 16:57:15 -0700156 av1_fht4x16(src_diff, coeff, diff_stride, txfm_param);
Yue Chen56e226e2017-05-02 16:21:40 -0700157}
158
159static void fwd_txfm_32x8(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700160 int diff_stride, TxfmParam *txfm_param) {
Lester Lu27319b62017-07-10 16:57:15 -0700161 av1_fht32x8(src_diff, coeff, diff_stride, txfm_param);
Yue Chen56e226e2017-05-02 16:21:40 -0700162}
163
164static void fwd_txfm_8x32(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700165 int diff_stride, TxfmParam *txfm_param) {
Lester Lu27319b62017-07-10 16:57:15 -0700166 av1_fht8x32(src_diff, coeff, diff_stride, txfm_param);
Yue Chen56e226e2017-05-02 16:21:40 -0700167}
Yue Chend6bdd462017-07-19 16:05:43 -0700168#endif
Yue Chen56e226e2017-05-02 16:21:40 -0700169
Yaowu Xuc27fc142016-08-22 16:08:15 -0700170static void highbd_fwd_txfm_4x4(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700171 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700172 int32_t *dst_coeff = (int32_t *)coeff;
Urvang Joshi2283d372017-10-02 17:16:45 -0700173 const TX_TYPE tx_type = txfm_param->tx_type;
Lester Lu27319b62017-07-10 16:57:15 -0700174 const int bd = txfm_param->bd;
175 if (txfm_param->lossless) {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700176 assert(tx_type == DCT_DCT);
Yaowu Xuf883b422016-08-30 14:01:10 -0700177 av1_highbd_fwht4x4(src_diff, coeff, diff_stride);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700178 return;
179 }
Yaowu Xuc27fc142016-08-22 16:08:15 -0700180 switch (tx_type) {
181 case DCT_DCT:
182 case ADST_DCT:
183 case DCT_ADST:
184 case ADST_ADST:
Yi Luo0f4195c2017-06-27 16:07:28 -0700185 av1_fwd_txfm2d_4x4(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700186 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700187 case FLIPADST_DCT:
188 case DCT_FLIPADST:
189 case FLIPADST_FLIPADST:
190 case ADST_FLIPADST:
191 case FLIPADST_ADST:
Yi Luo0f4195c2017-06-27 16:07:28 -0700192 av1_fwd_txfm2d_4x4(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700193 break;
Sarah Parker31c66502017-05-19 16:51:07 -0700194 // use the c version for anything including identity for now
Yaowu Xuc27fc142016-08-22 16:08:15 -0700195 case V_DCT:
196 case H_DCT:
197 case V_ADST:
198 case H_ADST:
199 case V_FLIPADST:
200 case H_FLIPADST:
Sarah Parker31c66502017-05-19 16:51:07 -0700201 case IDTX:
Yi Luo0f4195c2017-06-27 16:07:28 -0700202 av1_fwd_txfm2d_4x4_c(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700203 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700204 default: assert(0);
205 }
206}
207
Yaowu Xuc27fc142016-08-22 16:08:15 -0700208static void highbd_fwd_txfm_4x8(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700209 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700210 int32_t *dst_coeff = (int32_t *)coeff;
Lester Lu27319b62017-07-10 16:57:15 -0700211 av1_fwd_txfm2d_4x8_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type,
212 txfm_param->bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700213}
214
215static void highbd_fwd_txfm_8x4(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700216 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700217 int32_t *dst_coeff = (int32_t *)coeff;
Lester Lu27319b62017-07-10 16:57:15 -0700218 av1_fwd_txfm2d_8x4_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type,
219 txfm_param->bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700220}
221
222static void highbd_fwd_txfm_8x16(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700223 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700224 int32_t *dst_coeff = (int32_t *)coeff;
Lester Lu27319b62017-07-10 16:57:15 -0700225 av1_fwd_txfm2d_8x16_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type,
226 txfm_param->bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700227}
228
229static void highbd_fwd_txfm_16x8(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700230 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700231 int32_t *dst_coeff = (int32_t *)coeff;
Lester Lu27319b62017-07-10 16:57:15 -0700232 av1_fwd_txfm2d_16x8_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type,
233 txfm_param->bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700234}
235
236static void highbd_fwd_txfm_16x32(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700237 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700238 int32_t *dst_coeff = (int32_t *)coeff;
Lester Lu27319b62017-07-10 16:57:15 -0700239 av1_fwd_txfm2d_16x32_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type,
240 txfm_param->bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700241}
242
243static void highbd_fwd_txfm_32x16(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700244 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700245 int32_t *dst_coeff = (int32_t *)coeff;
Lester Lu27319b62017-07-10 16:57:15 -0700246 av1_fwd_txfm2d_32x16_c(src_diff, dst_coeff, diff_stride, txfm_param->tx_type,
247 txfm_param->bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700248}
Yaowu Xuc27fc142016-08-22 16:08:15 -0700249
250static void highbd_fwd_txfm_8x8(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700251 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700252 int32_t *dst_coeff = (int32_t *)coeff;
Urvang Joshi2283d372017-10-02 17:16:45 -0700253 const TX_TYPE tx_type = txfm_param->tx_type;
Lester Lu27319b62017-07-10 16:57:15 -0700254 const int bd = txfm_param->bd;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700255 switch (tx_type) {
256 case DCT_DCT:
257 case ADST_DCT:
258 case DCT_ADST:
259 case ADST_ADST:
Yi Luo0f4195c2017-06-27 16:07:28 -0700260 av1_fwd_txfm2d_8x8(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700261 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700262 case FLIPADST_DCT:
263 case DCT_FLIPADST:
264 case FLIPADST_FLIPADST:
265 case ADST_FLIPADST:
266 case FLIPADST_ADST:
Yi Luo0f4195c2017-06-27 16:07:28 -0700267 av1_fwd_txfm2d_8x8(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700268 break;
Sarah Parker31c66502017-05-19 16:51:07 -0700269 // use the c version for anything including identity for now
Yaowu Xuc27fc142016-08-22 16:08:15 -0700270 case V_DCT:
271 case H_DCT:
272 case V_ADST:
273 case H_ADST:
274 case V_FLIPADST:
275 case H_FLIPADST:
Sarah Parker31c66502017-05-19 16:51:07 -0700276 case IDTX:
Yi Luo0f4195c2017-06-27 16:07:28 -0700277 av1_fwd_txfm2d_8x8_c(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700278 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700279 default: assert(0);
280 }
281}
282
283static void highbd_fwd_txfm_16x16(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700284 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700285 int32_t *dst_coeff = (int32_t *)coeff;
Urvang Joshi2283d372017-10-02 17:16:45 -0700286 const TX_TYPE tx_type = txfm_param->tx_type;
Lester Lu27319b62017-07-10 16:57:15 -0700287 const int bd = txfm_param->bd;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700288 switch (tx_type) {
289 case DCT_DCT:
290 case ADST_DCT:
291 case DCT_ADST:
292 case ADST_ADST:
Yi Luo0f4195c2017-06-27 16:07:28 -0700293 av1_fwd_txfm2d_16x16(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700294 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700295 case FLIPADST_DCT:
296 case DCT_FLIPADST:
297 case FLIPADST_FLIPADST:
298 case ADST_FLIPADST:
299 case FLIPADST_ADST:
Yi Luo0f4195c2017-06-27 16:07:28 -0700300 av1_fwd_txfm2d_16x16(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700301 break;
Sarah Parker31c66502017-05-19 16:51:07 -0700302 // use the c version for anything including identity for now
Yaowu Xuc27fc142016-08-22 16:08:15 -0700303 case V_DCT:
304 case H_DCT:
305 case V_ADST:
306 case H_ADST:
307 case V_FLIPADST:
308 case H_FLIPADST:
Sarah Parker31c66502017-05-19 16:51:07 -0700309 case IDTX:
Yi Luo0f4195c2017-06-27 16:07:28 -0700310 av1_fwd_txfm2d_16x16_c(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700311 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700312 default: assert(0);
313 }
314}
315
Angie Chiang8fd2d7a2017-01-03 15:50:15 -0800316static void highbd_fwd_txfm_32x32(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700317 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700318 int32_t *dst_coeff = (int32_t *)coeff;
Urvang Joshi2283d372017-10-02 17:16:45 -0700319 const TX_TYPE tx_type = txfm_param->tx_type;
Lester Lu27319b62017-07-10 16:57:15 -0700320 const int bd = txfm_param->bd;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700321 switch (tx_type) {
322 case DCT_DCT:
Yaowu Xuc27fc142016-08-22 16:08:15 -0700323 case ADST_DCT:
324 case DCT_ADST:
325 case ADST_ADST:
Yi Luo0f4195c2017-06-27 16:07:28 -0700326 av1_fwd_txfm2d_32x32(src_diff, dst_coeff, diff_stride, tx_type, bd);
Sarah Parker31c66502017-05-19 16:51:07 -0700327 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700328 case FLIPADST_DCT:
329 case DCT_FLIPADST:
330 case FLIPADST_FLIPADST:
331 case ADST_FLIPADST:
332 case FLIPADST_ADST:
Yi Luo0f4195c2017-06-27 16:07:28 -0700333 av1_fwd_txfm2d_32x32(src_diff, dst_coeff, diff_stride, tx_type, bd);
Sarah Parker31c66502017-05-19 16:51:07 -0700334 break;
335 // use the c version for anything including identity for now
Yaowu Xuc27fc142016-08-22 16:08:15 -0700336 case V_DCT:
337 case H_DCT:
338 case V_ADST:
339 case H_ADST:
340 case V_FLIPADST:
341 case H_FLIPADST:
Sarah Parker31c66502017-05-19 16:51:07 -0700342 case IDTX:
Yi Luo0f4195c2017-06-27 16:07:28 -0700343 av1_fwd_txfm2d_32x32_c(src_diff, dst_coeff, diff_stride, tx_type, bd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700344 break;
Sarah Parker31c66502017-05-19 16:51:07 -0700345 default: assert(0);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700346 }
347}
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700348
349#if CONFIG_TX64X64
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700350static void highbd_fwd_txfm_32x64(const int16_t *src_diff, tran_low_t *coeff,
351 int diff_stride, TxfmParam *txfm_param) {
352 int32_t *dst_coeff = (int32_t *)coeff;
Urvang Joshi2283d372017-10-02 17:16:45 -0700353 const TX_TYPE tx_type = txfm_param->tx_type;
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700354 const int bd = txfm_param->bd;
355 switch (tx_type) {
356 case DCT_DCT:
357 av1_fwd_txfm2d_32x64_c(src_diff, dst_coeff, diff_stride, tx_type, bd);
358 break;
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700359 case ADST_DCT:
360 case DCT_ADST:
361 case ADST_ADST:
362 case FLIPADST_DCT:
363 case DCT_FLIPADST:
364 case FLIPADST_FLIPADST:
365 case ADST_FLIPADST:
366 case FLIPADST_ADST:
367 case V_DCT:
368 case H_DCT:
369 case V_ADST:
370 case H_ADST:
371 case V_FLIPADST:
372 case H_FLIPADST:
373 // TODO(sarahparker)
374 // I've deleted the 64x64 implementations that existed in lieu
375 // of adst, flipadst and identity for simplicity but will bring back
376 // in a later change. This shouldn't impact performance since
377 // DCT_DCT is the only extended type currently allowed for 64x64,
378 // as dictated by get_ext_tx_set_type in blockd.h.
379 av1_fwd_txfm2d_32x64_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
380 break;
381 case IDTX:
382 av1_fwd_idtx_c(src_diff, dst_coeff, diff_stride, 32, 64, tx_type);
383 break;
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700384 default: assert(0); break;
385 }
386}
387
388static void highbd_fwd_txfm_64x32(const int16_t *src_diff, tran_low_t *coeff,
389 int diff_stride, TxfmParam *txfm_param) {
390 int32_t *dst_coeff = (int32_t *)coeff;
Urvang Joshi2283d372017-10-02 17:16:45 -0700391 const TX_TYPE tx_type = txfm_param->tx_type;
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700392 const int bd = txfm_param->bd;
393 switch (tx_type) {
394 case DCT_DCT:
395 av1_fwd_txfm2d_64x32_c(src_diff, dst_coeff, diff_stride, tx_type, bd);
396 break;
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700397 case ADST_DCT:
398 case DCT_ADST:
399 case ADST_ADST:
400 case FLIPADST_DCT:
401 case DCT_FLIPADST:
402 case FLIPADST_FLIPADST:
403 case ADST_FLIPADST:
404 case FLIPADST_ADST:
405 case V_DCT:
406 case H_DCT:
407 case V_ADST:
408 case H_ADST:
409 case V_FLIPADST:
410 case H_FLIPADST:
411 // TODO(sarahparker)
412 // I've deleted the 64x64 implementations that existed in lieu
413 // of adst, flipadst and identity for simplicity but will bring back
414 // in a later change. This shouldn't impact performance since
415 // DCT_DCT is the only extended type currently allowed for 64x64,
416 // as dictated by get_ext_tx_set_type in blockd.h.
417 av1_fwd_txfm2d_64x32_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
418 break;
419 case IDTX:
420 av1_fwd_idtx_c(src_diff, dst_coeff, diff_stride, 64, 32, tx_type);
421 break;
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700422 default: assert(0); break;
423 }
424}
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700425static void highbd_fwd_txfm_64x64(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700426 int diff_stride, TxfmParam *txfm_param) {
Yi Luo0f4195c2017-06-27 16:07:28 -0700427 int32_t *dst_coeff = (int32_t *)coeff;
Urvang Joshi2283d372017-10-02 17:16:45 -0700428 const TX_TYPE tx_type = txfm_param->tx_type;
Lester Lu27319b62017-07-10 16:57:15 -0700429 const int bd = txfm_param->bd;
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700430 switch (tx_type) {
431 case DCT_DCT:
Yi Luo0f4195c2017-06-27 16:07:28 -0700432 av1_fwd_txfm2d_64x64(src_diff, dst_coeff, diff_stride, tx_type, bd);
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700433 break;
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700434 case ADST_DCT:
435 case DCT_ADST:
436 case ADST_ADST:
437 case FLIPADST_DCT:
438 case DCT_FLIPADST:
439 case FLIPADST_FLIPADST:
440 case ADST_FLIPADST:
441 case FLIPADST_ADST:
442 case V_DCT:
443 case H_DCT:
444 case V_ADST:
445 case H_ADST:
446 case V_FLIPADST:
447 case H_FLIPADST:
Sarah Parker31c66502017-05-19 16:51:07 -0700448 // TODO(sarahparker)
449 // I've deleted the 64x64 implementations that existed in lieu
450 // of adst, flipadst and identity for simplicity but will bring back
451 // in a later change. This shouldn't impact performance since
452 // DCT_DCT is the only extended type currently allowed for 64x64,
453 // as dictated by get_ext_tx_set_type in blockd.h.
Yi Luo0f4195c2017-06-27 16:07:28 -0700454 av1_fwd_txfm2d_64x64_c(src_diff, dst_coeff, diff_stride, DCT_DCT, bd);
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700455 break;
Lester Lud8b1ddc2017-07-06 16:13:29 -0700456 case IDTX:
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700457 av1_fwd_idtx_c(src_diff, dst_coeff, diff_stride, 64, 64, tx_type);
Lester Lud8b1ddc2017-07-06 16:13:29 -0700458 break;
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700459 default: assert(0); break;
460 }
461}
462#endif // CONFIG_TX64X64
Monty Montgomerya2d40a32017-10-30 23:32:03 -0400463#endif // CONFIG_DAALA_TXFM
Yaowu Xuc27fc142016-08-22 16:08:15 -0700464
hui suf11fb882017-03-27 14:56:33 -0700465void av1_fwd_txfm(const int16_t *src_diff, tran_low_t *coeff, int diff_stride,
Lester Lu27319b62017-07-10 16:57:15 -0700466 TxfmParam *txfm_param) {
Sarah Parker90024e42017-10-06 16:50:47 -0700467 assert(av1_ext_tx_used[txfm_param->tx_set_type][txfm_param->tx_type]);
Monty Montgomerya2d40a32017-10-30 23:32:03 -0400468#if CONFIG_DAALA_TX
469 daala_fwd_txfm(src_diff, coeff, diff_stride, txfm_param);
470#else
Lester Lu27319b62017-07-10 16:57:15 -0700471 const TX_SIZE tx_size = txfm_param->tx_size;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700472 switch (tx_size) {
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700473#if CONFIG_TX64X64
474 case TX_64X64:
Lester Lu27319b62017-07-10 16:57:15 -0700475 fwd_txfm_64x64(src_diff, coeff, diff_stride, txfm_param);
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700476 break;
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700477 case TX_32X64:
478 fwd_txfm_32x64(src_diff, coeff, diff_stride, txfm_param);
479 break;
480 case TX_64X32:
481 fwd_txfm_64x32(src_diff, coeff, diff_stride, txfm_param);
482 break;
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700483#endif // CONFIG_TX64X64
Yaowu Xuc27fc142016-08-22 16:08:15 -0700484 case TX_32X32:
Lester Lu27319b62017-07-10 16:57:15 -0700485 fwd_txfm_32x32(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700486 break;
487 case TX_16X16:
Lester Lu27319b62017-07-10 16:57:15 -0700488 fwd_txfm_16x16(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700489 break;
Lester Lu27319b62017-07-10 16:57:15 -0700490 case TX_8X8: fwd_txfm_8x8(src_diff, coeff, diff_stride, txfm_param); break;
491 case TX_4X8: fwd_txfm_4x8(src_diff, coeff, diff_stride, txfm_param); break;
492 case TX_8X4: fwd_txfm_8x4(src_diff, coeff, diff_stride, txfm_param); break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700493 case TX_8X16:
Lester Lu27319b62017-07-10 16:57:15 -0700494 fwd_txfm_8x16(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700495 break;
496 case TX_16X8:
Lester Lu27319b62017-07-10 16:57:15 -0700497 fwd_txfm_16x8(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700498 break;
499 case TX_16X32:
Lester Lu27319b62017-07-10 16:57:15 -0700500 fwd_txfm_16x32(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700501 break;
502 case TX_32X16:
Lester Lu27319b62017-07-10 16:57:15 -0700503 fwd_txfm_32x16(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700504 break;
Lester Lu27319b62017-07-10 16:57:15 -0700505 case TX_4X4: fwd_txfm_4x4(src_diff, coeff, diff_stride, txfm_param); break;
Sebastien Alaiwanfb838772017-10-24 12:02:54 +0200506#if CONFIG_RECT_TX_EXT
Yue Chen56e226e2017-05-02 16:21:40 -0700507 case TX_4X16:
Lester Lu27319b62017-07-10 16:57:15 -0700508 fwd_txfm_4x16(src_diff, coeff, diff_stride, txfm_param);
Yue Chen56e226e2017-05-02 16:21:40 -0700509 break;
510 case TX_16X4:
Lester Lu27319b62017-07-10 16:57:15 -0700511 fwd_txfm_16x4(src_diff, coeff, diff_stride, txfm_param);
Yue Chen56e226e2017-05-02 16:21:40 -0700512 break;
513 case TX_8X32:
Lester Lu27319b62017-07-10 16:57:15 -0700514 fwd_txfm_8x32(src_diff, coeff, diff_stride, txfm_param);
Yue Chen56e226e2017-05-02 16:21:40 -0700515 break;
516 case TX_32X8:
Lester Lu27319b62017-07-10 16:57:15 -0700517 fwd_txfm_32x8(src_diff, coeff, diff_stride, txfm_param);
Yue Chen56e226e2017-05-02 16:21:40 -0700518 break;
Yue Chend6bdd462017-07-19 16:05:43 -0700519#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -0700520 default: assert(0); break;
521 }
Monty Montgomerya2d40a32017-10-30 23:32:03 -0400522#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -0700523}
524
hui suf11fb882017-03-27 14:56:33 -0700525void av1_highbd_fwd_txfm(const int16_t *src_diff, tran_low_t *coeff,
Lester Lu27319b62017-07-10 16:57:15 -0700526 int diff_stride, TxfmParam *txfm_param) {
Sarah Parker90024e42017-10-06 16:50:47 -0700527 assert(av1_ext_tx_used[txfm_param->tx_set_type][txfm_param->tx_type]);
Monty Montgomerya2d40a32017-10-30 23:32:03 -0400528#if CONFIG_DAALA_TX
529 daala_fwd_txfm(src_diff, coeff, diff_stride, txfm_param);
530#else
Lester Lu27319b62017-07-10 16:57:15 -0700531 const TX_SIZE tx_size = txfm_param->tx_size;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700532 switch (tx_size) {
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700533#if CONFIG_TX64X64
534 case TX_64X64:
Lester Lu27319b62017-07-10 16:57:15 -0700535 highbd_fwd_txfm_64x64(src_diff, coeff, diff_stride, txfm_param);
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700536 break;
Debargha Mukherjee2b435012017-09-28 08:30:35 -0700537 case TX_32X64:
538 highbd_fwd_txfm_32x64(src_diff, coeff, diff_stride, txfm_param);
539 break;
540 case TX_64X32:
541 highbd_fwd_txfm_64x32(src_diff, coeff, diff_stride, txfm_param);
542 break;
Debargha Mukherjee6a47cff2016-11-02 14:57:42 -0700543#endif // CONFIG_TX64X64
Yaowu Xuc27fc142016-08-22 16:08:15 -0700544 case TX_32X32:
Lester Lu27319b62017-07-10 16:57:15 -0700545 highbd_fwd_txfm_32x32(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700546 break;
547 case TX_16X16:
Lester Lu27319b62017-07-10 16:57:15 -0700548 highbd_fwd_txfm_16x16(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700549 break;
550 case TX_8X8:
Lester Lu27319b62017-07-10 16:57:15 -0700551 highbd_fwd_txfm_8x8(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700552 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700553 case TX_4X8:
Lester Lu27319b62017-07-10 16:57:15 -0700554 highbd_fwd_txfm_4x8(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700555 break;
556 case TX_8X4:
Lester Lu27319b62017-07-10 16:57:15 -0700557 highbd_fwd_txfm_8x4(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700558 break;
559 case TX_8X16:
Lester Lu27319b62017-07-10 16:57:15 -0700560 highbd_fwd_txfm_8x16(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700561 break;
562 case TX_16X8:
Lester Lu27319b62017-07-10 16:57:15 -0700563 highbd_fwd_txfm_16x8(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700564 break;
565 case TX_16X32:
Lester Lu27319b62017-07-10 16:57:15 -0700566 highbd_fwd_txfm_16x32(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700567 break;
568 case TX_32X16:
Lester Lu27319b62017-07-10 16:57:15 -0700569 highbd_fwd_txfm_32x16(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700570 break;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700571 case TX_4X4:
Lester Lu27319b62017-07-10 16:57:15 -0700572 highbd_fwd_txfm_4x4(src_diff, coeff, diff_stride, txfm_param);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700573 break;
574 default: assert(0); break;
575 }
Monty Montgomerya2d40a32017-10-30 23:32:03 -0400576#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -0700577}