Line data Source code
1 : /*
2 : * Copyright (c) 2016, Alliance for Open Media. All rights reserved
3 : *
4 : * 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.
10 : */
11 :
12 : #include <immintrin.h> // avx2
13 :
14 : #include "./aom_config.h"
15 : #include "./av1_rtcd.h"
16 :
17 : #include "aom_dsp/x86/inv_txfm_common_avx2.h"
18 :
19 0 : void av1_idct16_avx2(__m256i *in) {
20 0 : const __m256i cospi_p30_m02 = pair256_set_epi16(cospi_30_64, -cospi_2_64);
21 0 : const __m256i cospi_p02_p30 = pair256_set_epi16(cospi_2_64, cospi_30_64);
22 0 : const __m256i cospi_p14_m18 = pair256_set_epi16(cospi_14_64, -cospi_18_64);
23 0 : const __m256i cospi_p18_p14 = pair256_set_epi16(cospi_18_64, cospi_14_64);
24 0 : const __m256i cospi_p22_m10 = pair256_set_epi16(cospi_22_64, -cospi_10_64);
25 0 : const __m256i cospi_p10_p22 = pair256_set_epi16(cospi_10_64, cospi_22_64);
26 0 : const __m256i cospi_p06_m26 = pair256_set_epi16(cospi_6_64, -cospi_26_64);
27 0 : const __m256i cospi_p26_p06 = pair256_set_epi16(cospi_26_64, cospi_6_64);
28 0 : const __m256i cospi_p28_m04 = pair256_set_epi16(cospi_28_64, -cospi_4_64);
29 0 : const __m256i cospi_p04_p28 = pair256_set_epi16(cospi_4_64, cospi_28_64);
30 0 : const __m256i cospi_p12_m20 = pair256_set_epi16(cospi_12_64, -cospi_20_64);
31 0 : const __m256i cospi_p20_p12 = pair256_set_epi16(cospi_20_64, cospi_12_64);
32 0 : const __m256i cospi_p16_p16 = _mm256_set1_epi16((int16_t)cospi_16_64);
33 0 : const __m256i cospi_p16_m16 = pair256_set_epi16(cospi_16_64, -cospi_16_64);
34 0 : const __m256i cospi_p24_m08 = pair256_set_epi16(cospi_24_64, -cospi_8_64);
35 0 : const __m256i cospi_p08_p24 = pair256_set_epi16(cospi_8_64, cospi_24_64);
36 0 : const __m256i cospi_m08_p24 = pair256_set_epi16(-cospi_8_64, cospi_24_64);
37 0 : const __m256i cospi_p24_p08 = pair256_set_epi16(cospi_24_64, cospi_8_64);
38 0 : const __m256i cospi_m24_m08 = pair256_set_epi16(-cospi_24_64, -cospi_8_64);
39 : __m256i u0, u1, u2, u3, u4, u5, u6, u7;
40 : __m256i v0, v1, v2, v3, v4, v5, v6, v7;
41 : __m256i t0, t1, t2, t3, t4, t5, t6, t7;
42 :
43 : // stage 1, (0-7)
44 0 : u0 = in[0];
45 0 : u1 = in[8];
46 0 : u2 = in[4];
47 0 : u3 = in[12];
48 0 : u4 = in[2];
49 0 : u5 = in[10];
50 0 : u6 = in[6];
51 0 : u7 = in[14];
52 :
53 : // stage 2, (0-7)
54 : // stage 3, (0-7)
55 0 : t0 = u0;
56 0 : t1 = u1;
57 0 : t2 = u2;
58 0 : t3 = u3;
59 0 : unpack_butter_fly(&u4, &u7, &cospi_p28_m04, &cospi_p04_p28, &t4, &t7);
60 0 : unpack_butter_fly(&u5, &u6, &cospi_p12_m20, &cospi_p20_p12, &t5, &t6);
61 :
62 : // stage 4, (0-7)
63 0 : unpack_butter_fly(&t0, &t1, &cospi_p16_p16, &cospi_p16_m16, &u0, &u1);
64 0 : unpack_butter_fly(&t2, &t3, &cospi_p24_m08, &cospi_p08_p24, &u2, &u3);
65 0 : u4 = _mm256_add_epi16(t4, t5);
66 0 : u5 = _mm256_sub_epi16(t4, t5);
67 0 : u6 = _mm256_sub_epi16(t7, t6);
68 0 : u7 = _mm256_add_epi16(t7, t6);
69 :
70 : // stage 5, (0-7)
71 0 : t0 = _mm256_add_epi16(u0, u3);
72 0 : t1 = _mm256_add_epi16(u1, u2);
73 0 : t2 = _mm256_sub_epi16(u1, u2);
74 0 : t3 = _mm256_sub_epi16(u0, u3);
75 0 : t4 = u4;
76 0 : t7 = u7;
77 0 : unpack_butter_fly(&u6, &u5, &cospi_p16_m16, &cospi_p16_p16, &t5, &t6);
78 :
79 : // stage 6, (0-7)
80 0 : u0 = _mm256_add_epi16(t0, t7);
81 0 : u1 = _mm256_add_epi16(t1, t6);
82 0 : u2 = _mm256_add_epi16(t2, t5);
83 0 : u3 = _mm256_add_epi16(t3, t4);
84 0 : u4 = _mm256_sub_epi16(t3, t4);
85 0 : u5 = _mm256_sub_epi16(t2, t5);
86 0 : u6 = _mm256_sub_epi16(t1, t6);
87 0 : u7 = _mm256_sub_epi16(t0, t7);
88 :
89 : // stage 1, (8-15)
90 0 : v0 = in[1];
91 0 : v1 = in[9];
92 0 : v2 = in[5];
93 0 : v3 = in[13];
94 0 : v4 = in[3];
95 0 : v5 = in[11];
96 0 : v6 = in[7];
97 0 : v7 = in[15];
98 :
99 : // stage 2, (8-15)
100 0 : unpack_butter_fly(&v0, &v7, &cospi_p30_m02, &cospi_p02_p30, &t0, &t7);
101 0 : unpack_butter_fly(&v1, &v6, &cospi_p14_m18, &cospi_p18_p14, &t1, &t6);
102 0 : unpack_butter_fly(&v2, &v5, &cospi_p22_m10, &cospi_p10_p22, &t2, &t5);
103 0 : unpack_butter_fly(&v3, &v4, &cospi_p06_m26, &cospi_p26_p06, &t3, &t4);
104 :
105 : // stage 3, (8-15)
106 0 : v0 = _mm256_add_epi16(t0, t1);
107 0 : v1 = _mm256_sub_epi16(t0, t1);
108 0 : v2 = _mm256_sub_epi16(t3, t2);
109 0 : v3 = _mm256_add_epi16(t2, t3);
110 0 : v4 = _mm256_add_epi16(t4, t5);
111 0 : v5 = _mm256_sub_epi16(t4, t5);
112 0 : v6 = _mm256_sub_epi16(t7, t6);
113 0 : v7 = _mm256_add_epi16(t6, t7);
114 :
115 : // stage 4, (8-15)
116 0 : t0 = v0;
117 0 : t7 = v7;
118 0 : t3 = v3;
119 0 : t4 = v4;
120 0 : unpack_butter_fly(&v1, &v6, &cospi_m08_p24, &cospi_p24_p08, &t1, &t6);
121 0 : unpack_butter_fly(&v2, &v5, &cospi_m24_m08, &cospi_m08_p24, &t2, &t5);
122 :
123 : // stage 5, (8-15)
124 0 : v0 = _mm256_add_epi16(t0, t3);
125 0 : v1 = _mm256_add_epi16(t1, t2);
126 0 : v2 = _mm256_sub_epi16(t1, t2);
127 0 : v3 = _mm256_sub_epi16(t0, t3);
128 0 : v4 = _mm256_sub_epi16(t7, t4);
129 0 : v5 = _mm256_sub_epi16(t6, t5);
130 0 : v6 = _mm256_add_epi16(t6, t5);
131 0 : v7 = _mm256_add_epi16(t7, t4);
132 :
133 : // stage 6, (8-15)
134 0 : t0 = v0;
135 0 : t1 = v1;
136 0 : t6 = v6;
137 0 : t7 = v7;
138 0 : unpack_butter_fly(&v5, &v2, &cospi_p16_m16, &cospi_p16_p16, &t2, &t5);
139 0 : unpack_butter_fly(&v4, &v3, &cospi_p16_m16, &cospi_p16_p16, &t3, &t4);
140 :
141 : // stage 7
142 0 : in[0] = _mm256_add_epi16(u0, t7);
143 0 : in[1] = _mm256_add_epi16(u1, t6);
144 0 : in[2] = _mm256_add_epi16(u2, t5);
145 0 : in[3] = _mm256_add_epi16(u3, t4);
146 0 : in[4] = _mm256_add_epi16(u4, t3);
147 0 : in[5] = _mm256_add_epi16(u5, t2);
148 0 : in[6] = _mm256_add_epi16(u6, t1);
149 0 : in[7] = _mm256_add_epi16(u7, t0);
150 0 : in[8] = _mm256_sub_epi16(u7, t0);
151 0 : in[9] = _mm256_sub_epi16(u6, t1);
152 0 : in[10] = _mm256_sub_epi16(u5, t2);
153 0 : in[11] = _mm256_sub_epi16(u4, t3);
154 0 : in[12] = _mm256_sub_epi16(u3, t4);
155 0 : in[13] = _mm256_sub_epi16(u2, t5);
156 0 : in[14] = _mm256_sub_epi16(u1, t6);
157 0 : in[15] = _mm256_sub_epi16(u0, t7);
158 0 : }
159 :
160 0 : static void idct16(__m256i *in) {
161 0 : mm256_transpose_16x16(in, in);
162 0 : av1_idct16_avx2(in);
163 0 : }
164 :
165 0 : static INLINE void butterfly_32b(const __m256i *a0, const __m256i *a1,
166 : const __m256i *c0, const __m256i *c1,
167 : __m256i *b) {
168 : __m256i x0, x1;
169 0 : x0 = _mm256_unpacklo_epi16(*a0, *a1);
170 0 : x1 = _mm256_unpackhi_epi16(*a0, *a1);
171 0 : b[0] = _mm256_madd_epi16(x0, *c0);
172 0 : b[1] = _mm256_madd_epi16(x1, *c0);
173 0 : b[2] = _mm256_madd_epi16(x0, *c1);
174 0 : b[3] = _mm256_madd_epi16(x1, *c1);
175 0 : }
176 :
177 0 : static INLINE void group_rounding(__m256i *a, int num) {
178 0 : const __m256i dct_rounding = _mm256_set1_epi32(DCT_CONST_ROUNDING);
179 : int i;
180 0 : for (i = 0; i < num; ++i) {
181 0 : a[i] = _mm256_add_epi32(a[i], dct_rounding);
182 0 : a[i] = _mm256_srai_epi32(a[i], DCT_CONST_BITS);
183 : }
184 0 : }
185 :
186 0 : static INLINE void add_rnd(const __m256i *a, const __m256i *b, __m256i *out) {
187 : __m256i x[4];
188 0 : x[0] = _mm256_add_epi32(a[0], b[0]);
189 0 : x[1] = _mm256_add_epi32(a[1], b[1]);
190 0 : x[2] = _mm256_add_epi32(a[2], b[2]);
191 0 : x[3] = _mm256_add_epi32(a[3], b[3]);
192 :
193 0 : group_rounding(x, 4);
194 :
195 0 : out[0] = _mm256_packs_epi32(x[0], x[1]);
196 0 : out[1] = _mm256_packs_epi32(x[2], x[3]);
197 0 : }
198 :
199 0 : static INLINE void sub_rnd(const __m256i *a, const __m256i *b, __m256i *out) {
200 : __m256i x[4];
201 0 : x[0] = _mm256_sub_epi32(a[0], b[0]);
202 0 : x[1] = _mm256_sub_epi32(a[1], b[1]);
203 0 : x[2] = _mm256_sub_epi32(a[2], b[2]);
204 0 : x[3] = _mm256_sub_epi32(a[3], b[3]);
205 :
206 0 : group_rounding(x, 4);
207 :
208 0 : out[0] = _mm256_packs_epi32(x[0], x[1]);
209 0 : out[1] = _mm256_packs_epi32(x[2], x[3]);
210 0 : }
211 :
212 0 : static INLINE void butterfly_rnd(__m256i *a, __m256i *out) {
213 0 : group_rounding(a, 4);
214 0 : out[0] = _mm256_packs_epi32(a[0], a[1]);
215 0 : out[1] = _mm256_packs_epi32(a[2], a[3]);
216 0 : }
217 :
218 0 : static void iadst16_avx2(__m256i *in) {
219 0 : const __m256i cospi_p01_p31 = pair256_set_epi16(cospi_1_64, cospi_31_64);
220 0 : const __m256i cospi_p31_m01 = pair256_set_epi16(cospi_31_64, -cospi_1_64);
221 0 : const __m256i cospi_p05_p27 = pair256_set_epi16(cospi_5_64, cospi_27_64);
222 0 : const __m256i cospi_p27_m05 = pair256_set_epi16(cospi_27_64, -cospi_5_64);
223 0 : const __m256i cospi_p09_p23 = pair256_set_epi16(cospi_9_64, cospi_23_64);
224 0 : const __m256i cospi_p23_m09 = pair256_set_epi16(cospi_23_64, -cospi_9_64);
225 0 : const __m256i cospi_p13_p19 = pair256_set_epi16(cospi_13_64, cospi_19_64);
226 0 : const __m256i cospi_p19_m13 = pair256_set_epi16(cospi_19_64, -cospi_13_64);
227 0 : const __m256i cospi_p17_p15 = pair256_set_epi16(cospi_17_64, cospi_15_64);
228 0 : const __m256i cospi_p15_m17 = pair256_set_epi16(cospi_15_64, -cospi_17_64);
229 0 : const __m256i cospi_p21_p11 = pair256_set_epi16(cospi_21_64, cospi_11_64);
230 0 : const __m256i cospi_p11_m21 = pair256_set_epi16(cospi_11_64, -cospi_21_64);
231 0 : const __m256i cospi_p25_p07 = pair256_set_epi16(cospi_25_64, cospi_7_64);
232 0 : const __m256i cospi_p07_m25 = pair256_set_epi16(cospi_7_64, -cospi_25_64);
233 0 : const __m256i cospi_p29_p03 = pair256_set_epi16(cospi_29_64, cospi_3_64);
234 0 : const __m256i cospi_p03_m29 = pair256_set_epi16(cospi_3_64, -cospi_29_64);
235 0 : const __m256i cospi_p04_p28 = pair256_set_epi16(cospi_4_64, cospi_28_64);
236 0 : const __m256i cospi_p28_m04 = pair256_set_epi16(cospi_28_64, -cospi_4_64);
237 0 : const __m256i cospi_p20_p12 = pair256_set_epi16(cospi_20_64, cospi_12_64);
238 0 : const __m256i cospi_p12_m20 = pair256_set_epi16(cospi_12_64, -cospi_20_64);
239 0 : const __m256i cospi_m28_p04 = pair256_set_epi16(-cospi_28_64, cospi_4_64);
240 0 : const __m256i cospi_m12_p20 = pair256_set_epi16(-cospi_12_64, cospi_20_64);
241 0 : const __m256i cospi_p08_p24 = pair256_set_epi16(cospi_8_64, cospi_24_64);
242 0 : const __m256i cospi_p24_m08 = pair256_set_epi16(cospi_24_64, -cospi_8_64);
243 0 : const __m256i cospi_m24_p08 = pair256_set_epi16(-cospi_24_64, cospi_8_64);
244 0 : const __m256i cospi_m16_m16 = _mm256_set1_epi16((int16_t)-cospi_16_64);
245 0 : const __m256i cospi_p16_p16 = _mm256_set1_epi16((int16_t)cospi_16_64);
246 0 : const __m256i cospi_p16_m16 = pair256_set_epi16(cospi_16_64, -cospi_16_64);
247 0 : const __m256i cospi_m16_p16 = pair256_set_epi16(-cospi_16_64, cospi_16_64);
248 0 : const __m256i zero = _mm256_setzero_si256();
249 : __m256i x[16], s[16];
250 : __m256i u[4], v[4];
251 :
252 : // stage 1
253 0 : butterfly_32b(&in[15], &in[0], &cospi_p01_p31, &cospi_p31_m01, u);
254 0 : butterfly_32b(&in[7], &in[8], &cospi_p17_p15, &cospi_p15_m17, v);
255 0 : add_rnd(u, v, &x[0]);
256 0 : sub_rnd(u, v, &x[8]);
257 :
258 0 : butterfly_32b(&in[13], &in[2], &cospi_p05_p27, &cospi_p27_m05, u);
259 0 : butterfly_32b(&in[5], &in[10], &cospi_p21_p11, &cospi_p11_m21, v);
260 0 : add_rnd(u, v, &x[2]);
261 0 : sub_rnd(u, v, &x[10]);
262 :
263 0 : butterfly_32b(&in[11], &in[4], &cospi_p09_p23, &cospi_p23_m09, u);
264 0 : butterfly_32b(&in[3], &in[12], &cospi_p25_p07, &cospi_p07_m25, v);
265 0 : add_rnd(u, v, &x[4]);
266 0 : sub_rnd(u, v, &x[12]);
267 :
268 0 : butterfly_32b(&in[9], &in[6], &cospi_p13_p19, &cospi_p19_m13, u);
269 0 : butterfly_32b(&in[1], &in[14], &cospi_p29_p03, &cospi_p03_m29, v);
270 0 : add_rnd(u, v, &x[6]);
271 0 : sub_rnd(u, v, &x[14]);
272 :
273 : // stage 2
274 0 : s[0] = _mm256_add_epi16(x[0], x[4]);
275 0 : s[1] = _mm256_add_epi16(x[1], x[5]);
276 0 : s[2] = _mm256_add_epi16(x[2], x[6]);
277 0 : s[3] = _mm256_add_epi16(x[3], x[7]);
278 0 : s[4] = _mm256_sub_epi16(x[0], x[4]);
279 0 : s[5] = _mm256_sub_epi16(x[1], x[5]);
280 0 : s[6] = _mm256_sub_epi16(x[2], x[6]);
281 0 : s[7] = _mm256_sub_epi16(x[3], x[7]);
282 0 : butterfly_32b(&x[8], &x[9], &cospi_p04_p28, &cospi_p28_m04, u);
283 0 : butterfly_32b(&x[12], &x[13], &cospi_m28_p04, &cospi_p04_p28, v);
284 0 : add_rnd(u, v, &s[8]);
285 0 : sub_rnd(u, v, &s[12]);
286 :
287 0 : butterfly_32b(&x[10], &x[11], &cospi_p20_p12, &cospi_p12_m20, u);
288 0 : butterfly_32b(&x[14], &x[15], &cospi_m12_p20, &cospi_p20_p12, v);
289 0 : add_rnd(u, v, &s[10]);
290 0 : sub_rnd(u, v, &s[14]);
291 :
292 : // stage 3
293 0 : x[0] = _mm256_add_epi16(s[0], s[2]);
294 0 : x[1] = _mm256_add_epi16(s[1], s[3]);
295 0 : x[2] = _mm256_sub_epi16(s[0], s[2]);
296 0 : x[3] = _mm256_sub_epi16(s[1], s[3]);
297 :
298 0 : x[8] = _mm256_add_epi16(s[8], s[10]);
299 0 : x[9] = _mm256_add_epi16(s[9], s[11]);
300 0 : x[10] = _mm256_sub_epi16(s[8], s[10]);
301 0 : x[11] = _mm256_sub_epi16(s[9], s[11]);
302 :
303 0 : butterfly_32b(&s[4], &s[5], &cospi_p08_p24, &cospi_p24_m08, u);
304 0 : butterfly_32b(&s[6], &s[7], &cospi_m24_p08, &cospi_p08_p24, v);
305 0 : add_rnd(u, v, &x[4]);
306 0 : sub_rnd(u, v, &x[6]);
307 :
308 0 : butterfly_32b(&s[12], &s[13], &cospi_p08_p24, &cospi_p24_m08, u);
309 0 : butterfly_32b(&s[14], &s[15], &cospi_m24_p08, &cospi_p08_p24, v);
310 0 : add_rnd(u, v, &x[12]);
311 0 : sub_rnd(u, v, &x[14]);
312 :
313 : // stage 4
314 0 : butterfly_32b(&x[2], &x[3], &cospi_m16_m16, &cospi_p16_m16, u);
315 0 : butterfly_32b(&x[6], &x[7], &cospi_p16_p16, &cospi_m16_p16, v);
316 0 : butterfly_rnd(u, &x[2]);
317 0 : butterfly_rnd(v, &x[6]);
318 :
319 0 : butterfly_32b(&x[10], &x[11], &cospi_p16_p16, &cospi_m16_p16, u);
320 0 : butterfly_32b(&x[14], &x[15], &cospi_m16_m16, &cospi_p16_m16, v);
321 0 : butterfly_rnd(u, &x[10]);
322 0 : butterfly_rnd(v, &x[14]);
323 :
324 0 : in[0] = x[0];
325 0 : in[1] = _mm256_sub_epi16(zero, x[8]);
326 0 : in[2] = x[12];
327 0 : in[3] = _mm256_sub_epi16(zero, x[4]);
328 0 : in[4] = x[6];
329 0 : in[5] = x[14];
330 0 : in[6] = x[10];
331 0 : in[7] = x[2];
332 0 : in[8] = x[3];
333 0 : in[9] = x[11];
334 0 : in[10] = x[15];
335 0 : in[11] = x[7];
336 0 : in[12] = x[5];
337 0 : in[13] = _mm256_sub_epi16(zero, x[13]);
338 0 : in[14] = x[9];
339 0 : in[15] = _mm256_sub_epi16(zero, x[1]);
340 0 : }
341 :
342 0 : static void iadst16(__m256i *in) {
343 0 : mm256_transpose_16x16(in, in);
344 0 : iadst16_avx2(in);
345 0 : }
346 :
347 : #if CONFIG_EXT_TX
348 0 : static void flip_row(__m256i *in, int rows) {
349 : int i;
350 0 : for (i = 0; i < rows; ++i) {
351 0 : mm256_reverse_epi16(&in[i]);
352 : }
353 0 : }
354 :
355 0 : static void flip_col(uint8_t **dest, int *stride, int rows) {
356 0 : *dest = *dest + (rows - 1) * (*stride);
357 0 : *stride = -*stride;
358 0 : }
359 :
360 0 : static void iidtx16(__m256i *in) {
361 0 : mm256_transpose_16x16(in, in);
362 0 : txfm_scaling16_avx2((int16_t)Sqrt2, in);
363 0 : }
364 : #endif
365 :
366 0 : void av1_iht16x16_256_add_avx2(const tran_low_t *input, uint8_t *dest,
367 : int stride, int tx_type) {
368 : __m256i in[16];
369 :
370 0 : load_buffer_16x16(input, in);
371 0 : switch (tx_type) {
372 : case DCT_DCT:
373 0 : idct16(in);
374 0 : idct16(in);
375 0 : break;
376 : case ADST_DCT:
377 0 : idct16(in);
378 0 : iadst16(in);
379 0 : break;
380 : case DCT_ADST:
381 0 : iadst16(in);
382 0 : idct16(in);
383 0 : break;
384 : case ADST_ADST:
385 0 : iadst16(in);
386 0 : iadst16(in);
387 0 : break;
388 : #if CONFIG_EXT_TX
389 : case FLIPADST_DCT:
390 0 : idct16(in);
391 0 : iadst16(in);
392 0 : flip_col(&dest, &stride, 16);
393 0 : break;
394 : case DCT_FLIPADST:
395 0 : iadst16(in);
396 0 : idct16(in);
397 0 : flip_row(in, 16);
398 0 : break;
399 : case FLIPADST_FLIPADST:
400 0 : iadst16(in);
401 0 : iadst16(in);
402 0 : flip_row(in, 16);
403 0 : flip_col(&dest, &stride, 16);
404 0 : break;
405 : case ADST_FLIPADST:
406 0 : iadst16(in);
407 0 : iadst16(in);
408 0 : flip_row(in, 16);
409 0 : break;
410 : case FLIPADST_ADST:
411 0 : iadst16(in);
412 0 : iadst16(in);
413 0 : flip_col(&dest, &stride, 16);
414 0 : break;
415 : case IDTX:
416 0 : iidtx16(in);
417 0 : iidtx16(in);
418 0 : break;
419 : case V_DCT:
420 0 : iidtx16(in);
421 0 : idct16(in);
422 0 : break;
423 : case H_DCT:
424 0 : idct16(in);
425 0 : iidtx16(in);
426 0 : break;
427 : case V_ADST:
428 0 : iidtx16(in);
429 0 : iadst16(in);
430 0 : break;
431 : case H_ADST:
432 0 : iadst16(in);
433 0 : iidtx16(in);
434 0 : break;
435 : case V_FLIPADST:
436 0 : iidtx16(in);
437 0 : iadst16(in);
438 0 : flip_col(&dest, &stride, 16);
439 0 : break;
440 : case H_FLIPADST:
441 0 : iadst16(in);
442 0 : iidtx16(in);
443 0 : flip_row(in, 16);
444 0 : break;
445 : #endif // CONFIG_EXT_TX
446 0 : default: assert(0); break;
447 : }
448 0 : store_buffer_16xN(in, stride, dest, 16);
449 0 : }
|