idct.c 77.8 KB
Newer Older
Jingning Han's avatar
Jingning Han committed
1
/*
Yaowu Xu's avatar
Yaowu Xu committed
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Jingning Han's avatar
Jingning Han committed
3
 *
Yaowu Xu's avatar
Yaowu Xu committed
4
5
6
7
8
9
 * 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.
Jingning Han's avatar
Jingning Han committed
10
11
12
13
 */

#include <math.h>

Yaowu Xu's avatar
Yaowu Xu committed
14
#include "./aom_dsp_rtcd.h"
Geza Lore's avatar
Geza Lore committed
15
16
17
#include "./av1_rtcd.h"
#include "aom_dsp/inv_txfm.h"
#include "aom_ports/mem.h"
18
#include "av1/common/av1_inv_txfm1d_cfg.h"
19
20
21
#include "av1/common/blockd.h"
#include "av1/common/enums.h"
#include "av1/common/idct.h"
22
23
24
25
#if CONFIG_DAALA_DCT4 || CONFIG_DAALA_DCT8 || CONFIG_DAALA_DCT16 || \
    CONFIG_DAALA_DCT32 || CONFIG_DAALA_DCT64
#include "av1/common/daala_tx.h"
#endif
Jingning Han's avatar
Jingning Han committed
26

27
int av1_get_tx_scale(const TX_SIZE tx_size) {
28
29
  const int pels = tx_size_2d[tx_size];
  return (pels > 256) + (pels > 1024) + (pels > 4096);
30
31
}

32
33
34
// NOTE: The implementation of all inverses need to be aware of the fact
// that input and output could be the same buffer.

35
#if CONFIG_EXT_TX
Debargha Mukherjee's avatar
Debargha Mukherjee committed
36
37
static void iidtx4_c(const tran_low_t *input, tran_low_t *output) {
  int i;
38
  for (i = 0; i < 4; ++i) {
Debargha Mukherjee's avatar
Debargha Mukherjee committed
39
    output[i] = (tran_low_t)dct_const_round_shift(input[i] * Sqrt2);
40
  }
Debargha Mukherjee's avatar
Debargha Mukherjee committed
41
42
43
44
}

static void iidtx8_c(const tran_low_t *input, tran_low_t *output) {
  int i;
45
46
47
  for (i = 0; i < 8; ++i) {
    output[i] = input[i] * 2;
  }
Debargha Mukherjee's avatar
Debargha Mukherjee committed
48
49
50
51
}

static void iidtx16_c(const tran_low_t *input, tran_low_t *output) {
  int i;
52
  for (i = 0; i < 16; ++i) {
Debargha Mukherjee's avatar
Debargha Mukherjee committed
53
    output[i] = (tran_low_t)dct_const_round_shift(input[i] * 2 * Sqrt2);
54
  }
Debargha Mukherjee's avatar
Debargha Mukherjee committed
55
56
57
58
}

static void iidtx32_c(const tran_low_t *input, tran_low_t *output) {
  int i;
59
60
61
  for (i = 0; i < 32; ++i) {
    output[i] = input[i] * 4;
  }
Debargha Mukherjee's avatar
Debargha Mukherjee committed
62
}
63

64
#if CONFIG_TX64X64 && !CONFIG_DAALA_DCT64
65
66
static void iidtx64_c(const tran_low_t *input, tran_low_t *output) {
  int i;
67
  for (i = 0; i < 64; ++i) {
68
    output[i] = (tran_low_t)dct_const_round_shift(input[i] * 4 * Sqrt2);
69
  }
70
71
}
#endif  // CONFIG_TX64X64
72
#endif  // CONFIG_EXT_TX
Debargha Mukherjee's avatar
Debargha Mukherjee committed
73

74
// For use in lieu of ADST
75
76
77
78
79
80
81
static void ihalfright32_c(const tran_low_t *input, tran_low_t *output) {
  int i;
  tran_low_t inputhalf[16];
  // Multiply input by sqrt(2)
  for (i = 0; i < 16; ++i) {
    inputhalf[i] = (tran_low_t)dct_const_round_shift(input[i] * Sqrt2);
  }
82
83
84
  for (i = 0; i < 16; ++i) {
    output[i] = input[16 + i] * 4;
  }
Luca Barbato's avatar
Luca Barbato committed
85
  aom_idct16_c(inputhalf, output + 16);
86
87
88
  // Note overall scaling factor is 4 times orthogonal
}

89
#if CONFIG_TX64X64 && !CONFIG_DAALA_DCT64
90
91
92
93
static void idct64_col_c(const tran_low_t *input, tran_low_t *output) {
  int32_t in[64], out[64];
  int i;
  for (i = 0; i < 64; ++i) in[i] = (int32_t)input[i];
94
  av1_idct64_new(in, out, inv_cos_bit_col_dct_64, inv_stage_range_col_dct_64);
95
96
97
98
99
100
101
  for (i = 0; i < 64; ++i) output[i] = (tran_low_t)out[i];
}

static void idct64_row_c(const tran_low_t *input, tran_low_t *output) {
  int32_t in[64], out[64];
  int i;
  for (i = 0; i < 64; ++i) in[i] = (int32_t)input[i];
102
  av1_idct64_new(in, out, inv_cos_bit_row_dct_64, inv_stage_range_row_dct_64);
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  for (i = 0; i < 64; ++i) output[i] = (tran_low_t)out[i];
}

// For use in lieu of ADST
static void ihalfright64_c(const tran_low_t *input, tran_low_t *output) {
  int i;
  tran_low_t inputhalf[32];
  // Multiply input by sqrt(2)
  for (i = 0; i < 32; ++i) {
    inputhalf[i] = (tran_low_t)dct_const_round_shift(input[i] * Sqrt2);
  }
  for (i = 0; i < 32; ++i) {
    output[i] = (tran_low_t)dct_const_round_shift(input[32 + i] * 4 * Sqrt2);
  }
  aom_idct32_c(inputhalf, output + 32);
  // Note overall scaling factor is 4 * sqrt(2)  times orthogonal
}
#endif  // CONFIG_TX64X64

Jingning Han's avatar
Jingning Han committed
122
// Inverse identity transform and add.
123
#if CONFIG_EXT_TX
124
static void inv_idtx_add_c(const tran_low_t *input, uint8_t *dest, int stride,
Jingning Han's avatar
Jingning Han committed
125
                           int bs, int tx_type) {
126
  int r, c;
127
  const int shift = bs < 32 ? 3 : (bs < 64 ? 2 : 1);
Debargha Mukherjee's avatar
Debargha Mukherjee committed
128
  if (tx_type == IDTX) {
Jingning Han's avatar
Jingning Han committed
129
130
    for (r = 0; r < bs; ++r) {
      for (c = 0; c < bs; ++c)
Debargha Mukherjee's avatar
Debargha Mukherjee committed
131
132
133
        dest[c] = clip_pixel_add(dest[c], input[c] >> shift);
      dest += stride;
      input += bs;
Jingning Han's avatar
Jingning Han committed
134
    }
135
136
  }
}
137
#endif  // CONFIG_EXT_TX
138

clang-format's avatar
clang-format committed
139
140
141
142
143
#define FLIPUD_PTR(dest, stride, size)       \
  do {                                       \
    (dest) = (dest) + ((size)-1) * (stride); \
    (stride) = -(stride);                    \
  } while (0)
144

145
#if CONFIG_EXT_TX
clang-format's avatar
clang-format committed
146
147
148
static void maybe_flip_strides(uint8_t **dst, int *dstride, tran_low_t **src,
                               int *sstride, int tx_type, int sizey,
                               int sizex) {
149
150
151
152
153
154
155
156
  // Note that the transpose of src will be added to dst. In order to LR
  // flip the addends (in dst coordinates), we UD flip the src. To UD flip
  // the addends, we UD flip the dst.
  switch (tx_type) {
    case DCT_DCT:
    case ADST_DCT:
    case DCT_ADST:
    case ADST_ADST:
Debargha Mukherjee's avatar
Debargha Mukherjee committed
157
    case IDTX:
Jingning Han's avatar
Jingning Han committed
158
159
    case V_DCT:
    case H_DCT:
160
    case V_ADST:
clang-format's avatar
clang-format committed
161
    case H_ADST: break;
162
163
    case FLIPADST_DCT:
    case FLIPADST_ADST:
164
    case V_FLIPADST:
165
      // flip UD
166
      FLIPUD_PTR(*dst, *dstride, sizey);
167
168
169
      break;
    case DCT_FLIPADST:
    case ADST_FLIPADST:
170
    case H_FLIPADST:
171
      // flip LR
172
      FLIPUD_PTR(*src, *sstride, sizex);
173
174
175
      break;
    case FLIPADST_FLIPADST:
      // flip UD
176
      FLIPUD_PTR(*dst, *dstride, sizey);
177
      // flip LR
178
      FLIPUD_PTR(*src, *sstride, sizex);
179
      break;
clang-format's avatar
clang-format committed
180
    default: assert(0); break;
181
182
  }
}
183
#endif  // CONFIG_EXT_TX
184

185
#if CONFIG_HIGHBITDEPTH
186
#if CONFIG_EXT_TX && CONFIG_TX64X64
187
static void highbd_inv_idtx_add_c(const tran_low_t *input, uint8_t *dest8,
188
                                  int stride, int bs, int tx_type, int bd) {
189
190
191
  int r, c;
  const int shift = bs < 32 ? 3 : 2;
  uint16_t *dest = CONVERT_TO_SHORTPTR(dest8);
192

Debargha Mukherjee's avatar
Debargha Mukherjee committed
193
  if (tx_type == IDTX) {
194
195
    for (r = 0; r < bs; ++r) {
      for (c = 0; c < bs; ++c)
Debargha Mukherjee's avatar
Debargha Mukherjee committed
196
197
198
        dest[c] = highbd_clip_pixel_add(dest[c], input[c] >> shift, bd);
      dest += stride;
      input += bs;
199
    }
200
201
  }
}
202
#endif  // CONFIG_EXT_TX && CONFIG_TX64X64
203
#endif  // CONFIG_HIGHBITDEPTH
204

Lester Lu's avatar
Lester Lu committed
205
206
207
#if CONFIG_LGT
void ilgt4(const tran_low_t *input, tran_low_t *output,
           const tran_high_t *lgtmtx) {
Lester Lu's avatar
Lester Lu committed
208
209
  if (!lgtmtx) assert(0);
  // evaluate s[j] = sum of all lgtmtx[j]*input[i] over i=1,...,4
Lester Lu's avatar
Lester Lu committed
210
211
212
213
214
215
216
217
218
  tran_high_t s[4] = { 0 };
  for (int i = 0; i < 4; ++i)
    for (int j = 0; j < 4; ++j) s[j] += lgtmtx[i * 4 + j] * input[i];

  for (int i = 0; i < 4; ++i) output[i] = WRAPLOW(dct_const_round_shift(s[i]));
}

void ilgt8(const tran_low_t *input, tran_low_t *output,
           const tran_high_t *lgtmtx) {
Lester Lu's avatar
Lester Lu committed
219
220
  if (!lgtmtx) assert(0);
  // evaluate s[j] = sum of all lgtmtx[j]*input[i] over i=1,...,8
Lester Lu's avatar
Lester Lu committed
221
222
223
224
225
226
227
  tran_high_t s[8] = { 0 };
  for (int i = 0; i < 8; ++i)
    for (int j = 0; j < 8; ++j) s[j] += lgtmtx[i * 8 + j] * input[i];

  for (int i = 0; i < 8; ++i) output[i] = WRAPLOW(dct_const_round_shift(s[i]));
}

Lester Lu's avatar
Lester Lu committed
228
229
230
231
232
233
234
235
236
237
238
// get_lgt4 and get_lgt8 return 1 and pick a lgt matrix if LGT is chosen to
// apply. Otherwise they return 0
int get_lgt4(const TxfmParam *txfm_param, int is_col,
             const tran_high_t **lgtmtx) {
  if (is_col && (vtx_tab[txfm_param->tx_type] == ADST_1D ||
                 vtx_tab[txfm_param->tx_type] == FLIPADST_1D)) {
    lgtmtx[0] = txfm_param->is_inter ? &lgt4_170[0][0] : &lgt4_140[0][0];
    return 1;
  } else if (!is_col && (htx_tab[txfm_param->tx_type] == ADST_1D ||
                         htx_tab[txfm_param->tx_type] == FLIPADST_1D)) {
    lgtmtx[0] = txfm_param->is_inter ? &lgt4_170[0][0] : &lgt4_140[0][0];
Lester Lu's avatar
Lester Lu committed
239
240
    return 1;
  }
Lester Lu's avatar
Lester Lu committed
241
  lgtmtx[0] = NULL;
Lester Lu's avatar
Lester Lu committed
242
243
244
  return 0;
}

Lester Lu's avatar
Lester Lu committed
245
246
247
248
249
250
251
252
253
int get_lgt8(const TxfmParam *txfm_param, int is_col,
             const tran_high_t **lgtmtx) {
  if (is_col && (vtx_tab[txfm_param->tx_type] == ADST_1D ||
                 vtx_tab[txfm_param->tx_type] == FLIPADST_1D)) {
    lgtmtx[0] = txfm_param->is_inter ? &lgt8_170[0][0] : &lgt8_150[0][0];
    return 1;
  } else if (!is_col && (htx_tab[txfm_param->tx_type] == ADST_1D ||
                         htx_tab[txfm_param->tx_type] == FLIPADST_1D)) {
    lgtmtx[0] = txfm_param->is_inter ? &lgt8_170[0][0] : &lgt8_150[0][0];
Lester Lu's avatar
Lester Lu committed
254
255
    return 1;
  }
Lester Lu's avatar
Lester Lu committed
256
  lgtmtx[0] = NULL;
Lester Lu's avatar
Lester Lu committed
257
258
259
260
  return 0;
}
#endif  // CONFIG_LGT

Yaowu Xu's avatar
Yaowu Xu committed
261
void av1_iht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int stride,
262
263
                         const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
264
265
266
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
267
#if !CONFIG_DAALA_DCT4
268
269
270
271
  if (tx_type == DCT_DCT) {
    aom_idct4x4_16_add(input, dest, stride);
    return;
  }
272
#endif
273
  static const transform_2d IHT_4[] = {
274
#if CONFIG_DAALA_DCT4
275
276
277
278
    { daala_idct4, daala_idct4 },  // DCT_DCT  = 0
    { daala_idst4, daala_idct4 },  // ADST_DCT = 1
    { daala_idct4, daala_idst4 },  // DCT_ADST = 2
    { daala_idst4, daala_idst4 },  // ADST_ADST = 3
279
#if CONFIG_EXT_TX
280
281
282
283
284
    { daala_idst4, daala_idct4 },  // FLIPADST_DCT
    { daala_idct4, daala_idst4 },  // DCT_FLIPADST
    { daala_idst4, daala_idst4 },  // FLIPADST_FLIPADST
    { daala_idst4, daala_idst4 },  // ADST_FLIPADST
    { daala_idst4, daala_idst4 },  // FLIPADST_ADST
285
286
287
288
289
290
291
    { daala_idtx4, daala_idtx4 },  // IDTX
    { daala_idct4, daala_idtx4 },  // V_DCT
    { daala_idtx4, daala_idct4 },  // H_DCT
    { daala_idst4, daala_idtx4 },  // V_ADST
    { daala_idtx4, daala_idst4 },  // H_ADST
    { daala_idst4, daala_idtx4 },  // V_FLIPADST
    { daala_idtx4, daala_idst4 },  // H_FLIPADST
292
293
#endif
#else
Luca Barbato's avatar
Luca Barbato committed
294
295
296
297
    { aom_idct4_c, aom_idct4_c },    // DCT_DCT  = 0
    { aom_iadst4_c, aom_idct4_c },   // ADST_DCT = 1
    { aom_idct4_c, aom_iadst4_c },   // DCT_ADST = 2
    { aom_iadst4_c, aom_iadst4_c },  // ADST_ADST = 3
298
#if CONFIG_EXT_TX
Luca Barbato's avatar
Luca Barbato committed
299
300
301
302
303
304
305
306
307
308
309
310
    { aom_iadst4_c, aom_idct4_c },   // FLIPADST_DCT
    { aom_idct4_c, aom_iadst4_c },   // DCT_FLIPADST
    { aom_iadst4_c, aom_iadst4_c },  // FLIPADST_FLIPADST
    { aom_iadst4_c, aom_iadst4_c },  // ADST_FLIPADST
    { aom_iadst4_c, aom_iadst4_c },  // FLIPADST_ADST
    { iidtx4_c, iidtx4_c },          // IDTX
    { aom_idct4_c, iidtx4_c },       // V_DCT
    { iidtx4_c, aom_idct4_c },       // H_DCT
    { aom_iadst4_c, iidtx4_c },      // V_ADST
    { iidtx4_c, aom_iadst4_c },      // H_ADST
    { aom_iadst4_c, iidtx4_c },      // V_FLIPADST
    { iidtx4_c, aom_iadst4_c },      // H_FLIPADST
311
#endif
312
#endif
313
314
315
  };

  int i, j;
316
  tran_low_t tmp[4][4];
317
318
319
  tran_low_t out[4][4];
  tran_low_t *outp = &out[0][0];
  int outstride = 4;
320

321
322
323
324
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif

Lester Lu's avatar
Lester Lu committed
325
#if CONFIG_LGT
Lester Lu's avatar
Lester Lu committed
326
327
328
329
  const tran_high_t *lgtmtx_col[1];
  const tran_high_t *lgtmtx_row[1];
  int use_lgt_col = get_lgt4(txfm_param, 1, lgtmtx_col);
  int use_lgt_row = get_lgt4(txfm_param, 0, lgtmtx_row);
Lester Lu's avatar
Lester Lu committed
330
331
#endif

332
333
  // inverse transform row vectors
  for (i = 0; i < 4; ++i) {
334
335
#if CONFIG_DAALA_DCT4
    tran_low_t temp_in[4];
336
    for (j = 0; j < 4; j++) temp_in[j] = input[j] * 2;
337
338
    IHT_4[tx_type].rows(temp_in, out[i]);
#else
Lester Lu's avatar
Lester Lu committed
339
340
#if CONFIG_LGT
    if (use_lgt_row)
Lester Lu's avatar
Lester Lu committed
341
      ilgt4(input, out[i], lgtmtx_row[0]);
Lester Lu's avatar
Lester Lu committed
342
343
344
    else
#endif
      IHT_4[tx_type].rows(input, out[i]);
345
#endif
clang-format's avatar
clang-format committed
346
    input += 4;
347
348
349
  }

  // transpose
350
351
352
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 4; j++) {
      tmp[j][i] = out[i][j];
353
    }
354
355
356
357
  }

  // inverse transform column vectors
  for (i = 0; i < 4; ++i) {
Lester Lu's avatar
Lester Lu committed
358
359
#if CONFIG_LGT
    if (use_lgt_col)
Lester Lu's avatar
Lester Lu committed
360
      ilgt4(tmp[i], out[i], lgtmtx_col[0]);
Lester Lu's avatar
Lester Lu committed
361
362
363
    else
#endif
      IHT_4[tx_type].cols(tmp[i], out[i]);
364
365
366
  }

#if CONFIG_EXT_TX
367
  maybe_flip_strides(&dest, &stride, &outp, &outstride, tx_type, 4, 4);
368
369
370
371
#endif

  // Sum with the destination
  for (i = 0; i < 4; ++i) {
372
    for (j = 0; j < 4; ++j) {
373
374
      int d = i * stride + j;
      int s = j * outstride + i;
375
#if CONFIG_DAALA_DCT4
376
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 4));
377
378
379
#else
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 4));
#endif
380
381
382
383
    }
  }
}

Yaowu Xu's avatar
Yaowu Xu committed
384
void av1_iht4x8_32_add_c(const tran_low_t *input, uint8_t *dest, int stride,
385
386
                         const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
387
388
389
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
390
391
392
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif
393
  static const transform_2d IHT_4x8[] = {
Luca Barbato's avatar
Luca Barbato committed
394
395
396
397
    { aom_idct8_c, aom_idct4_c },    // DCT_DCT
    { aom_iadst8_c, aom_idct4_c },   // ADST_DCT
    { aom_idct8_c, aom_iadst4_c },   // DCT_ADST
    { aom_iadst8_c, aom_iadst4_c },  // ADST_ADST
398
#if CONFIG_EXT_TX
Luca Barbato's avatar
Luca Barbato committed
399
400
401
402
403
404
405
406
407
408
409
410
    { aom_iadst8_c, aom_idct4_c },   // FLIPADST_DCT
    { aom_idct8_c, aom_iadst4_c },   // DCT_FLIPADST
    { aom_iadst8_c, aom_iadst4_c },  // FLIPADST_FLIPADST
    { aom_iadst8_c, aom_iadst4_c },  // ADST_FLIPADST
    { aom_iadst8_c, aom_iadst4_c },  // FLIPADST_ADST
    { iidtx8_c, iidtx4_c },          // IDTX
    { aom_idct8_c, iidtx4_c },       // V_DCT
    { iidtx8_c, aom_idct4_c },       // H_DCT
    { aom_iadst8_c, iidtx4_c },      // V_ADST
    { iidtx8_c, aom_iadst4_c },      // H_ADST
    { aom_iadst8_c, iidtx4_c },      // V_FLIPADST
    { iidtx8_c, aom_iadst4_c },      // H_FLIPADST
411
#endif
412
413
  };

414
415
  const int n = 4;
  const int n2 = 8;
416
  int i, j;
417
  tran_low_t out[4][8], tmp[4][8], outtmp[4];
418
  tran_low_t *outp = &out[0][0];
419
  int outstride = n2;
420

Lester Lu's avatar
Lester Lu committed
421
#if CONFIG_LGT
Lester Lu's avatar
Lester Lu committed
422
423
424
425
  const tran_high_t *lgtmtx_col[1];
  const tran_high_t *lgtmtx_row[1];
  int use_lgt_col = get_lgt8(txfm_param, 1, lgtmtx_col);
  int use_lgt_row = get_lgt4(txfm_param, 0, lgtmtx_row);
Lester Lu's avatar
Lester Lu committed
426
427
#endif

428
  // inverse transform row vectors and transpose
429
  for (i = 0; i < n2; ++i) {
Lester Lu's avatar
Lester Lu committed
430
431
#if CONFIG_LGT
    if (use_lgt_row)
Lester Lu's avatar
Lester Lu committed
432
      ilgt4(input, outtmp, lgtmtx_row[0]);
Lester Lu's avatar
Lester Lu committed
433
434
435
    else
#endif
      IHT_4x8[tx_type].rows(input, outtmp);
436
    for (j = 0; j < n; ++j)
437
      tmp[j][i] = (tran_low_t)dct_const_round_shift(outtmp[j] * Sqrt2);
438
    input += n;
439
440
441
  }

  // inverse transform column vectors
442
  for (i = 0; i < n; ++i) {
Lester Lu's avatar
Lester Lu committed
443
444
#if CONFIG_LGT
    if (use_lgt_col)
Lester Lu's avatar
Lester Lu committed
445
      ilgt8(tmp[i], out[i], lgtmtx_col[0]);
Lester Lu's avatar
Lester Lu committed
446
447
448
    else
#endif
      IHT_4x8[tx_type].cols(tmp[i], out[i]);
449
450
  }

451
#if CONFIG_EXT_TX
452
  maybe_flip_strides(&dest, &stride, &outp, &outstride, tx_type, n2, n);
453
#endif
454
455

  // Sum with the destination
456
457
  for (i = 0; i < n2; ++i) {
    for (j = 0; j < n; ++j) {
458
459
460
461
462
463
464
      int d = i * stride + j;
      int s = j * outstride + i;
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 5));
    }
  }
}

Yaowu Xu's avatar
Yaowu Xu committed
465
void av1_iht8x4_32_add_c(const tran_low_t *input, uint8_t *dest, int stride,
466
467
                         const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
468
469
470
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
471
472
473
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif
474
  static const transform_2d IHT_8x4[] = {
Luca Barbato's avatar
Luca Barbato committed
475
476
477
478
    { aom_idct4_c, aom_idct8_c },    // DCT_DCT
    { aom_iadst4_c, aom_idct8_c },   // ADST_DCT
    { aom_idct4_c, aom_iadst8_c },   // DCT_ADST
    { aom_iadst4_c, aom_iadst8_c },  // ADST_ADST
479
#if CONFIG_EXT_TX
Luca Barbato's avatar
Luca Barbato committed
480
481
482
483
484
485
486
487
488
489
490
491
    { aom_iadst4_c, aom_idct8_c },   // FLIPADST_DCT
    { aom_idct4_c, aom_iadst8_c },   // DCT_FLIPADST
    { aom_iadst4_c, aom_iadst8_c },  // FLIPADST_FLIPADST
    { aom_iadst4_c, aom_iadst8_c },  // ADST_FLIPADST
    { aom_iadst4_c, aom_iadst8_c },  // FLIPADST_ADST
    { iidtx4_c, iidtx8_c },          // IDTX
    { aom_idct4_c, iidtx8_c },       // V_DCT
    { iidtx4_c, aom_idct8_c },       // H_DCT
    { aom_iadst4_c, iidtx8_c },      // V_ADST
    { iidtx4_c, aom_iadst8_c },      // H_ADST
    { aom_iadst4_c, iidtx8_c },      // V_FLIPADST
    { iidtx4_c, aom_iadst8_c },      // H_FLIPADST
492
#endif
493
  };
494

495
496
  const int n = 4;
  const int n2 = 8;
497
498

  int i, j;
499
  tran_low_t out[8][4], tmp[8][4], outtmp[8];
500
  tran_low_t *outp = &out[0][0];
501
  int outstride = n;
502

Lester Lu's avatar
Lester Lu committed
503
#if CONFIG_LGT
Lester Lu's avatar
Lester Lu committed
504
505
506
507
  const tran_high_t *lgtmtx_col[1];
  const tran_high_t *lgtmtx_row[1];
  int use_lgt_col = get_lgt4(txfm_param, 1, lgtmtx_col);
  int use_lgt_row = get_lgt8(txfm_param, 0, lgtmtx_row);
Lester Lu's avatar
Lester Lu committed
508
509
#endif

510
  // inverse transform row vectors and transpose
511
  for (i = 0; i < n; ++i) {
Lester Lu's avatar
Lester Lu committed
512
513
#if CONFIG_LGT
    if (use_lgt_row)
Lester Lu's avatar
Lester Lu committed
514
      ilgt8(input, outtmp, lgtmtx_row[0]);
Lester Lu's avatar
Lester Lu committed
515
516
517
    else
#endif
      IHT_8x4[tx_type].rows(input, outtmp);
518
    for (j = 0; j < n2; ++j)
519
      tmp[j][i] = (tran_low_t)dct_const_round_shift(outtmp[j] * Sqrt2);
520
    input += n2;
521
522
523
  }

  // inverse transform column vectors
524
  for (i = 0; i < n2; ++i) {
Lester Lu's avatar
Lester Lu committed
525
526
#if CONFIG_LGT
    if (use_lgt_col)
Lester Lu's avatar
Lester Lu committed
527
      ilgt4(tmp[i], out[i], lgtmtx_col[0]);
Lester Lu's avatar
Lester Lu committed
528
529
530
    else
#endif
      IHT_8x4[tx_type].cols(tmp[i], out[i]);
531
532
  }

533
#if CONFIG_EXT_TX
534
  maybe_flip_strides(&dest, &stride, &outp, &outstride, tx_type, n, n2);
535
#endif
536
537

  // Sum with the destination
538
539
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n2; ++j) {
540
541
542
543
544
545
546
      int d = i * stride + j;
      int s = j * outstride + i;
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 5));
    }
  }
}

547
void av1_iht4x16_64_add_c(const tran_low_t *input, uint8_t *dest, int stride,
548
549
                          const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
550
551
552
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
553
554
555
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
  static const transform_2d IHT_4x16[] = {
    { aom_idct16_c, aom_idct4_c },    // DCT_DCT
    { aom_iadst16_c, aom_idct4_c },   // ADST_DCT
    { aom_idct16_c, aom_iadst4_c },   // DCT_ADST
    { aom_iadst16_c, aom_iadst4_c },  // ADST_ADST
#if CONFIG_EXT_TX
    { aom_iadst16_c, aom_idct4_c },   // FLIPADST_DCT
    { aom_idct16_c, aom_iadst4_c },   // DCT_FLIPADST
    { aom_iadst16_c, aom_iadst4_c },  // FLIPADST_FLIPADST
    { aom_iadst16_c, aom_iadst4_c },  // ADST_FLIPADST
    { aom_iadst16_c, aom_iadst4_c },  // FLIPADST_ADST
    { iidtx16_c, iidtx4_c },          // IDTX
    { aom_idct16_c, iidtx4_c },       // V_DCT
    { iidtx16_c, aom_idct4_c },       // H_DCT
    { aom_iadst16_c, iidtx4_c },      // V_ADST
    { iidtx16_c, aom_iadst4_c },      // H_ADST
    { aom_iadst16_c, iidtx4_c },      // V_FLIPADST
    { iidtx16_c, aom_iadst4_c },      // H_FLIPADST
#endif
  };

  const int n = 4;
  const int n4 = 16;
  int i, j;
580
  tran_low_t out[4][16], tmp[4][16], outtmp[4];
581
582
583
  tran_low_t *outp = &out[0][0];
  int outstride = n4;

Lester Lu's avatar
Lester Lu committed
584
#if CONFIG_LGT
Lester Lu's avatar
Lester Lu committed
585
586
  const tran_high_t *lgtmtx_row[1];
  int use_lgt_row = get_lgt4(txfm_param, 0, lgtmtx_row);
Lester Lu's avatar
Lester Lu committed
587
588
#endif

589
590
  // inverse transform row vectors and transpose
  for (i = 0; i < n4; ++i) {
Lester Lu's avatar
Lester Lu committed
591
592
#if CONFIG_LGT
    if (use_lgt_row)
Lester Lu's avatar
Lester Lu committed
593
      ilgt4(input, outtmp, lgtmtx_row[0]);
Lester Lu's avatar
Lester Lu committed
594
595
596
    else
#endif
      IHT_4x16[tx_type].rows(input, outtmp);
597
    for (j = 0; j < n; ++j) tmp[j][i] = outtmp[j];
598
599
600
601
    input += n;
  }

  // inverse transform column vectors
Lester Lu's avatar
Lester Lu committed
602
603
604
  for (i = 0; i < n; ++i) {
    IHT_4x16[tx_type].cols(tmp[i], out[i]);
  }
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620

#if CONFIG_EXT_TX
  maybe_flip_strides(&dest, &stride, &outp, &outstride, tx_type, n4, n);
#endif

  // Sum with the destination
  for (i = 0; i < n4; ++i) {
    for (j = 0; j < n; ++j) {
      int d = i * stride + j;
      int s = j * outstride + i;
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 5));
    }
  }
}

void av1_iht16x4_64_add_c(const tran_low_t *input, uint8_t *dest, int stride,
621
622
                          const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
623
624
625
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
626
627
628
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
  static const transform_2d IHT_16x4[] = {
    { aom_idct4_c, aom_idct16_c },    // DCT_DCT
    { aom_iadst4_c, aom_idct16_c },   // ADST_DCT
    { aom_idct4_c, aom_iadst16_c },   // DCT_ADST
    { aom_iadst4_c, aom_iadst16_c },  // ADST_ADST
#if CONFIG_EXT_TX
    { aom_iadst4_c, aom_idct16_c },   // FLIPADST_DCT
    { aom_idct4_c, aom_iadst16_c },   // DCT_FLIPADST
    { aom_iadst4_c, aom_iadst16_c },  // FLIPADST_FLIPADST
    { aom_iadst4_c, aom_iadst16_c },  // ADST_FLIPADST
    { aom_iadst4_c, aom_iadst16_c },  // FLIPADST_ADST
    { iidtx4_c, iidtx16_c },          // IDTX
    { aom_idct4_c, iidtx16_c },       // V_DCT
    { iidtx4_c, aom_idct16_c },       // H_DCT
    { aom_iadst4_c, iidtx16_c },      // V_ADST
    { iidtx4_c, aom_iadst16_c },      // H_ADST
    { aom_iadst4_c, iidtx16_c },      // V_FLIPADST
    { iidtx4_c, aom_iadst16_c },      // H_FLIPADST
#endif
  };
649

650
651
652
653
  const int n = 4;
  const int n4 = 16;

  int i, j;
654
  tran_low_t out[16][4], tmp[16][4], outtmp[16];
655
656
657
  tran_low_t *outp = &out[0][0];
  int outstride = n;

Lester Lu's avatar
Lester Lu committed
658
#if CONFIG_LGT
Lester Lu's avatar
Lester Lu committed
659
660
  const tran_high_t *lgtmtx_col[1];
  int use_lgt_col = get_lgt4(txfm_param, 1, lgtmtx_col);
Lester Lu's avatar
Lester Lu committed
661
662
#endif

663
664
665
  // inverse transform row vectors and transpose
  for (i = 0; i < n; ++i) {
    IHT_16x4[tx_type].rows(input, outtmp);
666
    for (j = 0; j < n4; ++j) tmp[j][i] = outtmp[j];
667
668
669
670
    input += n4;
  }

  // inverse transform column vectors
Lester Lu's avatar
Lester Lu committed
671
672
673
  for (i = 0; i < n4; ++i) {
#if CONFIG_LGT
    if (use_lgt_col)
Lester Lu's avatar
Lester Lu committed
674
      ilgt4(tmp[i], out[i], lgtmtx_col[0]);
Lester Lu's avatar
Lester Lu committed
675
676
677
678
    else
#endif
      IHT_16x4[tx_type].cols(tmp[i], out[i]);
  }
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693

#if CONFIG_EXT_TX
  maybe_flip_strides(&dest, &stride, &outp, &outstride, tx_type, n, n4);
#endif

  // Sum with the destination
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n4; ++j) {
      int d = i * stride + j;
      int s = j * outstride + i;
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 5));
    }
  }
}

Yaowu Xu's avatar
Yaowu Xu committed
694
void av1_iht8x16_128_add_c(const tran_low_t *input, uint8_t *dest, int stride,
695
696
                           const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
697
698
699
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
700
701
702
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif
703
  static const transform_2d IHT_8x16[] = {
Luca Barbato's avatar
Luca Barbato committed
704
705
706
707
    { aom_idct16_c, aom_idct8_c },    // DCT_DCT
    { aom_iadst16_c, aom_idct8_c },   // ADST_DCT
    { aom_idct16_c, aom_iadst8_c },   // DCT_ADST
    { aom_iadst16_c, aom_iadst8_c },  // ADST_ADST
708
#if CONFIG_EXT_TX
Luca Barbato's avatar
Luca Barbato committed
709
710
711
712
713
714
715
716
717
718
719
720
    { aom_iadst16_c, aom_idct8_c },   // FLIPADST_DCT
    { aom_idct16_c, aom_iadst8_c },   // DCT_FLIPADST
    { aom_iadst16_c, aom_iadst8_c },  // FLIPADST_FLIPADST
    { aom_iadst16_c, aom_iadst8_c },  // ADST_FLIPADST
    { aom_iadst16_c, aom_iadst8_c },  // FLIPADST_ADST
    { iidtx16_c, iidtx8_c },          // IDTX
    { aom_idct16_c, iidtx8_c },       // V_DCT
    { iidtx16_c, aom_idct8_c },       // H_DCT
    { aom_iadst16_c, iidtx8_c },      // V_ADST
    { iidtx16_c, aom_iadst8_c },      // H_ADST
    { aom_iadst16_c, iidtx8_c },      // V_FLIPADST
    { iidtx16_c, aom_iadst8_c },      // H_FLIPADST
721
#endif
722
723
724
725
726
  };

  const int n = 8;
  const int n2 = 16;
  int i, j;
727
  tran_low_t out[8][16], tmp[8][16], outtmp[8];
728
729
730
  tran_low_t *outp = &out[0][0];
  int outstride = n2;

Lester Lu's avatar
Lester Lu committed
731
#if CONFIG_LGT
Lester Lu's avatar
Lester Lu committed
732
733
  const tran_high_t *lgtmtx_row[1];
  int use_lgt_row = get_lgt8(txfm_param, 0, lgtmtx_row);
Lester Lu's avatar
Lester Lu committed
734
735
#endif

736
737
  // inverse transform row vectors and transpose
  for (i = 0; i < n2; ++i) {
Lester Lu's avatar
Lester Lu committed
738
739
#if CONFIG_LGT
    if (use_lgt_row)
Lester Lu's avatar
Lester Lu committed
740
      ilgt8(input, outtmp, lgtmtx_row[0]);
Lester Lu's avatar
Lester Lu committed
741
742
743
    else
#endif
      IHT_8x16[tx_type].rows(input, outtmp);
744
    for (j = 0; j < n; ++j)
745
      tmp[j][i] = (tran_low_t)dct_const_round_shift(outtmp[j] * Sqrt2);
clang-format's avatar
clang-format committed
746
    input += n;
747
748
749
750
  }

  // inverse transform column vectors
  for (i = 0; i < n; ++i) {
751
    IHT_8x16[tx_type].cols(tmp[i], out[i]);
752
753
  }

754
#if CONFIG_EXT_TX
755
  maybe_flip_strides(&dest, &stride, &outp, &outstride, tx_type, n2, n);
756
#endif
757
758
759
760
761
762
763
764
765
766
767

  // Sum with the destination
  for (i = 0; i < n2; ++i) {
    for (j = 0; j < n; ++j) {
      int d = i * stride + j;
      int s = j * outstride + i;
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 6));
    }
  }
}

Yaowu Xu's avatar
Yaowu Xu committed
768
void av1_iht16x8_128_add_c(const tran_low_t *input, uint8_t *dest, int stride,
769
770
                           const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
771
772
773
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
774
775
776
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif
777
  static const transform_2d IHT_16x8[] = {
Luca Barbato's avatar
Luca Barbato committed
778
779
780
781
    { aom_idct8_c, aom_idct16_c },    // DCT_DCT
    { aom_iadst8_c, aom_idct16_c },   // ADST_DCT
    { aom_idct8_c, aom_iadst16_c },   // DCT_ADST
    { aom_iadst8_c, aom_iadst16_c },  // ADST_ADST
782
#if CONFIG_EXT_TX
Luca Barbato's avatar
Luca Barbato committed
783
784
785
786
787
788
789
790
791
792
793
794
    { aom_iadst8_c, aom_idct16_c },   // FLIPADST_DCT
    { aom_idct8_c, aom_iadst16_c },   // DCT_FLIPADST
    { aom_iadst8_c, aom_iadst16_c },  // FLIPADST_FLIPADST
    { aom_iadst8_c, aom_iadst16_c },  // ADST_FLIPADST
    { aom_iadst8_c, aom_iadst16_c },  // FLIPADST_ADST
    { iidtx8_c, iidtx16_c },          // IDTX
    { aom_idct8_c, iidtx16_c },       // V_DCT
    { iidtx8_c, aom_idct16_c },       // H_DCT
    { aom_iadst8_c, iidtx16_c },      // V_ADST
    { iidtx8_c, aom_iadst16_c },      // H_ADST
    { aom_iadst8_c, iidtx16_c },      // V_FLIPADST
    { iidtx8_c, aom_iadst16_c },      // H_FLIPADST
795
#endif
796
  };
797

798
799
800
801
  const int n = 8;
  const int n2 = 16;

  int i, j;
802
  tran_low_t out[16][8], tmp[16][8], outtmp[16];
803
804
805
  tran_low_t *outp = &out[0][0];
  int outstride = n;

Lester Lu's avatar
Lester Lu committed
806
#if CONFIG_LGT
Lester Lu's avatar
Lester Lu committed
807
808
  const tran_high_t *lgtmtx_col[1];
  int use_lgt_col = get_lgt8(txfm_param, 1, lgtmtx_col);
Lester Lu's avatar
Lester Lu committed
809
810
#endif

811
812
813
814
  // inverse transform row vectors and transpose
  for (i = 0; i < n; ++i) {
    IHT_16x8[tx_type].rows(input, outtmp);
    for (j = 0; j < n2; ++j)
815
      tmp[j][i] = (tran_low_t)dct_const_round_shift(outtmp[j] * Sqrt2);
clang-format's avatar
clang-format committed
816
    input += n2;
817
818
819
820
  }

  // inverse transform column vectors
  for (i = 0; i < n2; ++i) {
Lester Lu's avatar
Lester Lu committed
821
822
#if CONFIG_LGT
    if (use_lgt_col)
Lester Lu's avatar
Lester Lu committed
823
      ilgt8(tmp[i], out[i], lgtmtx_col[0]);
Lester Lu's avatar
Lester Lu committed
824
825
826
    else
#endif
      IHT_16x8[tx_type].cols(tmp[i], out[i]);
827
828
  }

829
#if CONFIG_EXT_TX
830
  maybe_flip_strides(&dest, &stride, &outp, &outstride, tx_type, n, n2);
831
#endif
832
833
834
835
836
837
838
839
840
841
842

  // Sum with the destination
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n2; ++j) {
      int d = i * stride + j;
      int s = j * outstride + i;
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 6));
    }
  }
}

843
void av1_iht8x32_256_add_c(const tran_low_t *input, uint8_t *dest, int stride,
844
845
                           const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
846
847
848
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
849
850
851
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
  static const transform_2d IHT_8x32[] = {
    { aom_idct32_c, aom_idct8_c },     // DCT_DCT
    { ihalfright32_c, aom_idct8_c },   // ADST_DCT
    { aom_idct32_c, aom_iadst8_c },    // DCT_ADST
    { ihalfright32_c, aom_iadst8_c },  // ADST_ADST
#if CONFIG_EXT_TX
    { ihalfright32_c, aom_idct8_c },   // FLIPADST_DCT
    { aom_idct32_c, aom_iadst8_c },    // DCT_FLIPADST
    { ihalfright32_c, aom_iadst8_c },  // FLIPADST_FLIPADST
    { ihalfright32_c, aom_iadst8_c },  // ADST_FLIPADST
    { ihalfright32_c, aom_iadst8_c },  // FLIPADST_ADST
    { iidtx32_c, iidtx8_c },           // IDTX
    { aom_idct32_c, iidtx8_c },        // V_DCT
    { iidtx32_c, aom_idct8_c },        // H_DCT
    { ihalfright32_c, iidtx8_c },      // V_ADST
    { iidtx32_c, aom_iadst8_c },       // H_ADST
    { ihalfright32_c, iidtx8_c },      // V_FLIPADST
    { iidtx32_c, aom_iadst8_c },       // H_FLIPADST
#endif
  };

  const int n = 8;
  const int n4 = 32;
  int i, j;
876
  tran_low_t out[8][32], tmp[8][32], outtmp[8];
877
878
879
  tran_low_t *outp = &out[0][0];
  int outstride = n4;

Lester Lu's avatar
Lester Lu committed
880
#if CONFIG_LGT
Lester Lu's avatar
Lester Lu committed
881
882
  const tran_high_t *lgtmtx_row[1];
  int use_lgt_row = get_lgt8(txfm_param, 0, lgtmtx_row);
Lester Lu's avatar
Lester Lu committed
883
884
#endif

885
886
  // inverse transform row vectors and transpose
  for (i = 0; i < n4; ++i) {
Lester Lu's avatar
Lester Lu committed
887
888
#if CONFIG_LGT
    if (use_lgt_row)
Lester Lu's avatar
Lester Lu committed
889
      ilgt8(input, outtmp, lgtmtx_row[0]);
Lester Lu's avatar
Lester Lu committed
890
891
892
    else
#endif
      IHT_8x32[tx_type].rows(input, outtmp);
893
    for (j = 0; j < n; ++j) tmp[j][i] = outtmp[j];
894
895
896
897
    input += n;
  }

  // inverse transform column vectors
Lester Lu's avatar
Lester Lu committed
898
899
900
  for (i = 0; i < n; ++i) {
    IHT_8x32[tx_type].cols(tmp[i], out[i]);
  }
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916

#if CONFIG_EXT_TX
  maybe_flip_strides(&dest, &stride, &outp, &outstride, tx_type, n4, n);
#endif

  // Sum with the destination
  for (i = 0; i < n4; ++i) {
    for (j = 0; j < n; ++j) {
      int d = i * stride + j;
      int s = j * outstride + i;
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 6));
    }
  }
}

void av1_iht32x8_256_add_c(const tran_low_t *input, uint8_t *dest, int stride,
917
918
                           const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
919
920
921
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
922
923
924
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
  static const transform_2d IHT_32x8[] = {
    { aom_idct8_c, aom_idct32_c },     // DCT_DCT
    { aom_iadst8_c, aom_idct32_c },    // ADST_DCT
    { aom_idct8_c, ihalfright32_c },   // DCT_ADST
    { aom_iadst8_c, ihalfright32_c },  // ADST_ADST
#if CONFIG_EXT_TX
    { aom_iadst8_c, aom_idct32_c },    // FLIPADST_DCT
    { aom_idct8_c, ihalfright32_c },   // DCT_FLIPADST
    { aom_iadst8_c, ihalfright32_c },  // FLIPADST_FLIPADST
    { aom_iadst8_c, ihalfright32_c },  // ADST_FLIPADST
    { aom_iadst8_c, ihalfright32_c },  // FLIPADST_ADST
    { iidtx8_c, iidtx32_c },           // IDTX
    { aom_idct8_c, iidtx32_c },        // V_DCT
    { iidtx8_c, aom_idct32_c },        // H_DCT
    { aom_iadst8_c, iidtx32_c },       // V_ADST
    { iidtx8_c, ihalfright32_c },      // H_ADST
    { aom_iadst8_c, iidtx32_c },       // V_FLIPADST
    { iidtx8_c, ihalfright32_c },      // H_FLIPADST
#endif
  };
945

946
947
948
949
  const int n = 8;
  const int n4 = 32;

  int i, j;
950
  tran_low_t out[32][8], tmp[32][8], outtmp[32];
951
952
953
  tran_low_t *outp = &out[0][0];
  int outstride = n;

Lester Lu's avatar
Lester Lu committed
954
#if CONFIG_LGT
Lester Lu's avatar
Lester Lu committed
955
956
  const tran_high_t *lgtmtx_col[1];
  int use_lgt_col = get_lgt4(txfm_param, 1, lgtmtx_col);
Lester Lu's avatar
Lester Lu committed
957
958
#endif

959
960
961
  // inverse transform row vectors and transpose
  for (i = 0; i < n; ++i) {
    IHT_32x8[tx_type].rows(input, outtmp);
962
    for (j = 0; j < n4; ++j) tmp[j][i] = outtmp[j];
963
964
965
966
    input += n4;
  }

  // inverse transform column vectors
Lester Lu's avatar
Lester Lu committed
967
968
969
  for (i = 0; i < n4; ++i) {
#if CONFIG_LGT
    if (use_lgt_col)
Lester Lu's avatar
Lester Lu committed
970
      ilgt8(tmp[i], out[i], lgtmtx_col[0]);
Lester Lu's avatar
Lester Lu committed
971
972
973
974
    else
#endif
      IHT_32x8[tx_type].cols(tmp[i], out[i]);
  }
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989

#if CONFIG_EXT_TX
  maybe_flip_strides(&dest, &stride, &outp, &outstride, tx_type, n, n4);
#endif

  // Sum with the destination
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n4; ++j) {
      int d = i * stride + j;
      int s = j * outstride + i;
      dest[d] = clip_pixel_add(dest[d], ROUND_POWER_OF_TWO(outp[s], 6));
    }
  }
}

Yaowu Xu's avatar
Yaowu Xu committed
990
void av1_iht16x32_512_add_c(const tran_low_t *input, uint8_t *dest, int stride,
991
992
                            const TxfmParam *txfm_param) {
  int tx_type = txfm_param->tx_type;
Sarah Parker's avatar
Sarah Parker committed
993
994
995
#if CONFIG_MRC_TX
  assert(tx_type != MRC_DCT && "Invalid tx type for tx size");
#endif  // CONFIG_MRC_TX
996
997
998
#if CONFIG_DCT_ONLY
  assert(tx_type == DCT_DCT);
#endif
999
  static const transform_2d IHT_16x32[] = {
Luca Barbato's avatar
Luca Barbato committed
1000
    { aom_idct32_c, aom_idct16_c },     // DCT_DCT
For faster browsing, not all history is shown. View entire blame