/src/libhevc/common/ihevc_itrans_recon_32x32.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ******************************************************************************/ |
18 | | /** |
19 | | ******************************************************************************* |
20 | | * @file |
21 | | * ihevc_itrans_recon_32x32.c |
22 | | * |
23 | | * @brief |
24 | | * Contains function definitions for inverse transform and reconstruction 32x32 |
25 | | * |
26 | | * |
27 | | * @author |
28 | | * 100470 |
29 | | * |
30 | | * @par List of Functions: |
31 | | * - ihevc_itrans_recon_32x32() |
32 | | * |
33 | | * @remarks |
34 | | * None |
35 | | * |
36 | | ******************************************************************************* |
37 | | */ |
38 | | #include <stdio.h> |
39 | | #include <string.h> |
40 | | #include "ihevc_typedefs.h" |
41 | | #include "ihevc_macros.h" |
42 | | #include "ihevc_platform_macros.h" |
43 | | #include "ihevc_defs.h" |
44 | | #include "ihevc_trans_tables.h" |
45 | | #include "ihevc_itrans_recon.h" |
46 | | #include "ihevc_trans_macros.h" |
47 | | |
48 | | |
49 | | /** |
50 | | ******************************************************************************* |
51 | | * |
52 | | * @brief |
53 | | * This function performs Inverse transform and reconstruction for 32x32 |
54 | | * input block |
55 | | * |
56 | | * @par Description: |
57 | | * Performs inverse transform and adds the prediction data and clips output |
58 | | * to 8 bit |
59 | | * |
60 | | * @param[in] pi2_src |
61 | | * Input 32x32 coefficients |
62 | | * |
63 | | * @param[in] pi2_tmp |
64 | | * Temporary 32x32 buffer for storing inverse |
65 | | * |
66 | | * transform |
67 | | * 1st stage output |
68 | | * |
69 | | * @param[in] pu1_pred |
70 | | * Prediction 32x32 block |
71 | | * |
72 | | * @param[out] pu1_dst |
73 | | * Output 32x32 block |
74 | | * |
75 | | * @param[in] src_strd |
76 | | * Input stride |
77 | | * |
78 | | * @param[in] pred_strd |
79 | | * Prediction stride |
80 | | * |
81 | | * @param[in] dst_strd |
82 | | * Output Stride |
83 | | * |
84 | | * @param[in] shift |
85 | | * Output shift |
86 | | * |
87 | | * @param[in] zero_cols |
88 | | * Zero columns in pi2_src |
89 | | * |
90 | | * @returns Void |
91 | | * |
92 | | * @remarks |
93 | | * None |
94 | | * |
95 | | ******************************************************************************* |
96 | | */ |
97 | | |
98 | | void ihevc_itrans_recon_32x32(WORD16 *pi2_src, |
99 | | WORD16 *pi2_tmp, |
100 | | UWORD8 *pu1_pred, |
101 | | UWORD8 *pu1_dst, |
102 | | WORD32 src_strd, |
103 | | WORD32 pred_strd, |
104 | | WORD32 dst_strd, |
105 | | WORD32 zero_cols, |
106 | | WORD32 zero_rows) |
107 | 299k | { |
108 | 299k | WORD32 j, k; |
109 | 299k | WORD32 e[16], o[16]; |
110 | 299k | WORD32 ee[8], eo[8]; |
111 | 299k | WORD32 eee[4], eeo[4]; |
112 | 299k | WORD32 eeee[2], eeeo[2]; |
113 | 299k | WORD32 add; |
114 | 299k | WORD32 shift; |
115 | 299k | WORD16 *pi2_tmp_orig; |
116 | 299k | WORD32 trans_size; |
117 | 299k | WORD32 zero_rows_2nd_stage = zero_cols; |
118 | 299k | WORD32 row_limit_2nd_stage; |
119 | | |
120 | 299k | trans_size = TRANS_SIZE_32; |
121 | 299k | pi2_tmp_orig = pi2_tmp; |
122 | | |
123 | 299k | if((zero_cols & 0xFFFFFFF0) == 0xFFFFFFF0) |
124 | 85.1k | row_limit_2nd_stage = 4; |
125 | 214k | else if((zero_cols & 0xFFFFFF00) == 0xFFFFFF00) |
126 | 50.0k | row_limit_2nd_stage = 8; |
127 | 163k | else |
128 | 163k | row_limit_2nd_stage = TRANS_SIZE_32; |
129 | | |
130 | 299k | if((zero_rows & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of input are non-zero */ |
131 | 82.9k | { |
132 | | /************************************************************************************************/ |
133 | | /**********************************START - IT_RECON_32x32****************************************/ |
134 | | /************************************************************************************************/ |
135 | | /* Inverse Transform 1st stage */ |
136 | 82.9k | shift = IT_SHIFT_STAGE_1; |
137 | 82.9k | add = 1 << (shift - 1); |
138 | | |
139 | 1.18M | for(j = 0; j < row_limit_2nd_stage; j++) |
140 | 1.09M | { |
141 | | /* Checking for Zero Cols */ |
142 | 1.09M | if((zero_cols & 1) == 1) |
143 | 680k | { |
144 | 680k | memset(pi2_tmp, 0, trans_size * sizeof(WORD16)); |
145 | 680k | } |
146 | 418k | else |
147 | 418k | { |
148 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
149 | 7.12M | for(k = 0; k < 16; k++) |
150 | 6.70M | { |
151 | 6.70M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_src[src_strd] |
152 | 6.70M | + g_ai2_ihevc_trans_32[3][k] |
153 | 6.70M | * pi2_src[3 * src_strd]; |
154 | 6.70M | } |
155 | 3.77M | for(k = 0; k < 8; k++) |
156 | 3.35M | { |
157 | 3.35M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_src[2 * src_strd]; |
158 | 3.35M | } |
159 | | // for(k = 0; k < 4; k++) |
160 | 418k | { |
161 | 418k | eeo[0] = 0; |
162 | 418k | eeo[1] = 0; |
163 | 418k | eeo[2] = 0; |
164 | 418k | eeo[3] = 0; |
165 | 418k | } |
166 | 418k | eeeo[0] = 0; |
167 | 418k | eeeo[1] = 0; |
168 | 418k | eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_src[0]; |
169 | 418k | eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_src[0]; |
170 | | |
171 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
172 | 418k | eee[0] = eeee[0] + eeeo[0]; |
173 | 418k | eee[3] = eeee[0] - eeeo[0]; |
174 | 418k | eee[1] = eeee[1] + eeeo[1]; |
175 | 418k | eee[2] = eeee[1] - eeeo[1]; |
176 | 2.09M | for(k = 0; k < 4; k++) |
177 | 1.67M | { |
178 | 1.67M | ee[k] = eee[k] + eeo[k]; |
179 | 1.67M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
180 | 1.67M | } |
181 | 3.77M | for(k = 0; k < 8; k++) |
182 | 3.35M | { |
183 | 3.35M | e[k] = ee[k] + eo[k]; |
184 | 3.35M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
185 | 3.35M | } |
186 | 7.12M | for(k = 0; k < 16; k++) |
187 | 6.70M | { |
188 | 6.70M | pi2_tmp[k] = |
189 | 6.70M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
190 | 6.70M | pi2_tmp[k + 16] = |
191 | 6.70M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
192 | 6.70M | } |
193 | 418k | } |
194 | 1.09M | pi2_src++; |
195 | 1.09M | pi2_tmp += trans_size; |
196 | 1.09M | zero_cols = zero_cols >> 1; |
197 | 1.09M | } |
198 | | |
199 | 82.9k | pi2_tmp = pi2_tmp_orig; |
200 | | |
201 | | /* Inverse Transform 2nd stage */ |
202 | 82.9k | shift = IT_SHIFT_STAGE_2; |
203 | 82.9k | add = 1 << (shift - 1); |
204 | 82.9k | if((zero_rows_2nd_stage & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of output of 1st stage are non-zero */ |
205 | 41.0k | { |
206 | 1.30M | for(j = 0; j < trans_size; j++) |
207 | 1.25M | { |
208 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
209 | 21.3M | for(k = 0; k < 16; k++) |
210 | 20.0M | { |
211 | 20.0M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size] |
212 | 20.0M | + g_ai2_ihevc_trans_32[3][k] |
213 | 20.0M | * pi2_tmp[3 * trans_size]; |
214 | 20.0M | } |
215 | 11.3M | for(k = 0; k < 8; k++) |
216 | 10.1M | { |
217 | 10.1M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]; |
218 | 10.1M | } |
219 | | // for(k = 0; k < 4; k++) |
220 | 1.25M | { |
221 | 1.25M | eeo[0] = 0; |
222 | 1.25M | eeo[1] = 0; |
223 | 1.25M | eeo[2] = 0; |
224 | 1.25M | eeo[3] = 0; |
225 | 1.25M | } |
226 | 1.25M | eeeo[0] = 0; |
227 | 1.25M | eeeo[1] = 0; |
228 | 1.25M | eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]; |
229 | 1.25M | eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]; |
230 | | |
231 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
232 | 1.25M | eee[0] = eeee[0] + eeeo[0]; |
233 | 1.25M | eee[3] = eeee[0] - eeeo[0]; |
234 | 1.25M | eee[1] = eeee[1] + eeeo[1]; |
235 | 1.25M | eee[2] = eeee[1] - eeeo[1]; |
236 | 6.33M | for(k = 0; k < 4; k++) |
237 | 5.07M | { |
238 | 5.07M | ee[k] = eee[k] + eeo[k]; |
239 | 5.07M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
240 | 5.07M | } |
241 | 11.3M | for(k = 0; k < 8; k++) |
242 | 10.0M | { |
243 | 10.0M | e[k] = ee[k] + eo[k]; |
244 | 10.0M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
245 | 10.0M | } |
246 | 21.2M | for(k = 0; k < 16; k++) |
247 | 19.9M | { |
248 | 19.9M | WORD32 itrans_out; |
249 | 19.9M | itrans_out = |
250 | 19.9M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
251 | 19.9M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
252 | 19.9M | itrans_out = |
253 | 19.9M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
254 | 19.9M | pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16])); |
255 | 19.9M | } |
256 | 1.25M | pi2_tmp++; |
257 | 1.25M | pu1_pred += pred_strd; |
258 | 1.25M | pu1_dst += dst_strd; |
259 | 1.25M | } |
260 | 41.0k | } |
261 | 41.8k | else if((zero_rows_2nd_stage & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of output of 1st stage are non-zero */ |
262 | 16.9k | { |
263 | 522k | for(j = 0; j < trans_size; j++) |
264 | 505k | { |
265 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
266 | 8.54M | for(k = 0; k < 16; k++) |
267 | 8.03M | { |
268 | 8.03M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size] |
269 | 8.03M | + g_ai2_ihevc_trans_32[3][k] |
270 | 8.03M | * pi2_tmp[3 * trans_size] |
271 | 8.03M | + g_ai2_ihevc_trans_32[5][k] |
272 | 8.03M | * pi2_tmp[5 * trans_size] |
273 | 8.03M | + g_ai2_ihevc_trans_32[7][k] |
274 | 8.03M | * pi2_tmp[7 * trans_size]; |
275 | 8.03M | } |
276 | 4.60M | for(k = 0; k < 8; k++) |
277 | 4.09M | { |
278 | 4.09M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size] |
279 | 4.09M | + g_ai2_ihevc_trans_32[6][k] |
280 | 4.09M | * pi2_tmp[6 * trans_size]; |
281 | 4.09M | } |
282 | 2.57M | for(k = 0; k < 4; k++) |
283 | 2.06M | { |
284 | 2.06M | eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size]; |
285 | 2.06M | } |
286 | 505k | eeeo[0] = 0; |
287 | 505k | eeeo[1] = 0; |
288 | 505k | eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]; |
289 | 505k | eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]; |
290 | | |
291 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
292 | 505k | eee[0] = eeee[0] + eeeo[0]; |
293 | 505k | eee[3] = eeee[0] - eeeo[0]; |
294 | 505k | eee[1] = eeee[1] + eeeo[1]; |
295 | 505k | eee[2] = eeee[1] - eeeo[1]; |
296 | 2.57M | for(k = 0; k < 4; k++) |
297 | 2.07M | { |
298 | 2.07M | ee[k] = eee[k] + eeo[k]; |
299 | 2.07M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
300 | 2.07M | } |
301 | 4.55M | for(k = 0; k < 8; k++) |
302 | 4.04M | { |
303 | 4.04M | e[k] = ee[k] + eo[k]; |
304 | 4.04M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
305 | 4.04M | } |
306 | 8.47M | for(k = 0; k < 16; k++) |
307 | 7.97M | { |
308 | 7.97M | WORD32 itrans_out; |
309 | 7.97M | itrans_out = |
310 | 7.97M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
311 | 7.97M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
312 | 7.97M | itrans_out = |
313 | 7.97M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
314 | 7.97M | pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16])); |
315 | 7.97M | } |
316 | 505k | pi2_tmp++; |
317 | 505k | pu1_pred += pred_strd; |
318 | 505k | pu1_dst += dst_strd; |
319 | 505k | } |
320 | 16.9k | } |
321 | 24.9k | else /* All rows of output of 1st stage are non-zero */ |
322 | 24.9k | { |
323 | 802k | for(j = 0; j < trans_size; j++) |
324 | 777k | { |
325 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
326 | 13.1M | for(k = 0; k < 16; k++) |
327 | 12.3M | { |
328 | 12.3M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size] |
329 | 12.3M | + g_ai2_ihevc_trans_32[3][k] |
330 | 12.3M | * pi2_tmp[3 * trans_size] |
331 | 12.3M | + g_ai2_ihevc_trans_32[5][k] |
332 | 12.3M | * pi2_tmp[5 * trans_size] |
333 | 12.3M | + g_ai2_ihevc_trans_32[7][k] |
334 | 12.3M | * pi2_tmp[7 * trans_size] |
335 | 12.3M | + g_ai2_ihevc_trans_32[9][k] |
336 | 12.3M | * pi2_tmp[9 * trans_size] |
337 | 12.3M | + g_ai2_ihevc_trans_32[11][k] |
338 | 12.3M | * pi2_tmp[11 * trans_size] |
339 | 12.3M | + g_ai2_ihevc_trans_32[13][k] |
340 | 12.3M | * pi2_tmp[13 * trans_size] |
341 | 12.3M | + g_ai2_ihevc_trans_32[15][k] |
342 | 12.3M | * pi2_tmp[15 * trans_size] |
343 | 12.3M | + g_ai2_ihevc_trans_32[17][k] |
344 | 12.3M | * pi2_tmp[17 * trans_size] |
345 | 12.3M | + g_ai2_ihevc_trans_32[19][k] |
346 | 12.3M | * pi2_tmp[19 * trans_size] |
347 | 12.3M | + g_ai2_ihevc_trans_32[21][k] |
348 | 12.3M | * pi2_tmp[21 * trans_size] |
349 | 12.3M | + g_ai2_ihevc_trans_32[23][k] |
350 | 12.3M | * pi2_tmp[23 * trans_size] |
351 | 12.3M | + g_ai2_ihevc_trans_32[25][k] |
352 | 12.3M | * pi2_tmp[25 * trans_size] |
353 | 12.3M | + g_ai2_ihevc_trans_32[27][k] |
354 | 12.3M | * pi2_tmp[27 * trans_size] |
355 | 12.3M | + g_ai2_ihevc_trans_32[29][k] |
356 | 12.3M | * pi2_tmp[29 * trans_size] |
357 | 12.3M | + g_ai2_ihevc_trans_32[31][k] |
358 | 12.3M | * pi2_tmp[31 * trans_size]; |
359 | 12.3M | } |
360 | 7.05M | for(k = 0; k < 8; k++) |
361 | 6.27M | { |
362 | 6.27M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size] |
363 | 6.27M | + g_ai2_ihevc_trans_32[6][k] |
364 | 6.27M | * pi2_tmp[6 * trans_size] |
365 | 6.27M | + g_ai2_ihevc_trans_32[10][k] |
366 | 6.27M | * pi2_tmp[10 * trans_size] |
367 | 6.27M | + g_ai2_ihevc_trans_32[14][k] |
368 | 6.27M | * pi2_tmp[14 * trans_size] |
369 | 6.27M | + g_ai2_ihevc_trans_32[18][k] |
370 | 6.27M | * pi2_tmp[18 * trans_size] |
371 | 6.27M | + g_ai2_ihevc_trans_32[22][k] |
372 | 6.27M | * pi2_tmp[22 * trans_size] |
373 | 6.27M | + g_ai2_ihevc_trans_32[26][k] |
374 | 6.27M | * pi2_tmp[26 * trans_size] |
375 | 6.27M | + g_ai2_ihevc_trans_32[30][k] |
376 | 6.27M | * pi2_tmp[30 * trans_size]; |
377 | 6.27M | } |
378 | 3.95M | for(k = 0; k < 4; k++) |
379 | 3.17M | { |
380 | 3.17M | eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size] |
381 | 3.17M | + g_ai2_ihevc_trans_32[12][k] |
382 | 3.17M | * pi2_tmp[12 * trans_size] |
383 | 3.17M | + g_ai2_ihevc_trans_32[20][k] |
384 | 3.17M | * pi2_tmp[20 * trans_size] |
385 | 3.17M | + g_ai2_ihevc_trans_32[28][k] |
386 | 3.17M | * pi2_tmp[28 * trans_size]; |
387 | 3.17M | } |
388 | 777k | eeeo[0] = |
389 | 777k | g_ai2_ihevc_trans_32[8][0] * pi2_tmp[8 * trans_size] |
390 | 777k | + g_ai2_ihevc_trans_32[24][0] |
391 | 777k | * pi2_tmp[24 |
392 | 777k | * trans_size]; |
393 | 777k | eeeo[1] = |
394 | 777k | g_ai2_ihevc_trans_32[8][1] * pi2_tmp[8 * trans_size] |
395 | 777k | + g_ai2_ihevc_trans_32[24][1] |
396 | 777k | * pi2_tmp[24 |
397 | 777k | * trans_size]; |
398 | 777k | eeee[0] = |
399 | 777k | g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0] |
400 | 777k | + g_ai2_ihevc_trans_32[16][0] |
401 | 777k | * pi2_tmp[16 |
402 | 777k | * trans_size]; |
403 | 777k | eeee[1] = |
404 | 777k | g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0] |
405 | 777k | + g_ai2_ihevc_trans_32[16][1] |
406 | 777k | * pi2_tmp[16 |
407 | 777k | * trans_size]; |
408 | | |
409 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
410 | 777k | eee[0] = eeee[0] + eeeo[0]; |
411 | 777k | eee[3] = eeee[0] - eeeo[0]; |
412 | 777k | eee[1] = eeee[1] + eeeo[1]; |
413 | 777k | eee[2] = eeee[1] - eeeo[1]; |
414 | 3.92M | for(k = 0; k < 4; k++) |
415 | 3.14M | { |
416 | 3.14M | ee[k] = eee[k] + eeo[k]; |
417 | 3.14M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
418 | 3.14M | } |
419 | 7.05M | for(k = 0; k < 8; k++) |
420 | 6.27M | { |
421 | 6.27M | e[k] = ee[k] + eo[k]; |
422 | 6.27M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
423 | 6.27M | } |
424 | 13.1M | for(k = 0; k < 16; k++) |
425 | 12.3M | { |
426 | 12.3M | WORD32 itrans_out; |
427 | 12.3M | itrans_out = |
428 | 12.3M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
429 | 12.3M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
430 | 12.3M | itrans_out = |
431 | 12.3M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
432 | 12.3M | pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16])); |
433 | 12.3M | } |
434 | 777k | pi2_tmp++; |
435 | 777k | pu1_pred += pred_strd; |
436 | 777k | pu1_dst += dst_strd; |
437 | 777k | } |
438 | 24.9k | } |
439 | | /************************************************************************************************/ |
440 | | /************************************END - IT_RECON_32x32****************************************/ |
441 | | /************************************************************************************************/ |
442 | 82.9k | } |
443 | 216k | else if((zero_rows & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of input are non-zero */ |
444 | 50.9k | { |
445 | | /************************************************************************************************/ |
446 | | /**********************************START - IT_RECON_32x32****************************************/ |
447 | | /************************************************************************************************/ |
448 | | /* Inverse Transform 1st stage */ |
449 | 50.9k | shift = IT_SHIFT_STAGE_1; |
450 | 50.9k | add = 1 << (shift - 1); |
451 | | |
452 | 668k | for(j = 0; j < row_limit_2nd_stage; j++) |
453 | 617k | { |
454 | | /* Checking for Zero Cols */ |
455 | 617k | if((zero_cols & 1) == 1) |
456 | 444k | { |
457 | 444k | memset(pi2_tmp, 0, trans_size * sizeof(WORD16)); |
458 | 444k | } |
459 | 173k | else |
460 | 173k | { |
461 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
462 | 2.95M | for(k = 0; k < 16; k++) |
463 | 2.78M | { |
464 | 2.78M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_src[src_strd] |
465 | 2.78M | + g_ai2_ihevc_trans_32[3][k] |
466 | 2.78M | * pi2_src[3 * src_strd] |
467 | 2.78M | + g_ai2_ihevc_trans_32[5][k] |
468 | 2.78M | * pi2_src[5 * src_strd] |
469 | 2.78M | + g_ai2_ihevc_trans_32[7][k] |
470 | 2.78M | * pi2_src[7 * src_strd]; |
471 | 2.78M | } |
472 | 1.56M | for(k = 0; k < 8; k++) |
473 | 1.39M | { |
474 | 1.39M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_src[2 * src_strd] |
475 | 1.39M | + g_ai2_ihevc_trans_32[6][k] |
476 | 1.39M | * pi2_src[6 * src_strd]; |
477 | 1.39M | } |
478 | 870k | for(k = 0; k < 4; k++) |
479 | 696k | { |
480 | 696k | eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_src[4 * src_strd]; |
481 | 696k | } |
482 | 173k | eeeo[0] = 0; |
483 | 173k | eeeo[1] = 0; |
484 | 173k | eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_src[0]; |
485 | 173k | eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_src[0]; |
486 | | |
487 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
488 | 173k | eee[0] = eeee[0] + eeeo[0]; |
489 | 173k | eee[3] = eeee[0] - eeeo[0]; |
490 | 173k | eee[1] = eeee[1] + eeeo[1]; |
491 | 173k | eee[2] = eeee[1] - eeeo[1]; |
492 | 870k | for(k = 0; k < 4; k++) |
493 | 696k | { |
494 | 696k | ee[k] = eee[k] + eeo[k]; |
495 | 696k | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
496 | 696k | } |
497 | 1.56M | for(k = 0; k < 8; k++) |
498 | 1.39M | { |
499 | 1.39M | e[k] = ee[k] + eo[k]; |
500 | 1.39M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
501 | 1.39M | } |
502 | 2.95M | for(k = 0; k < 16; k++) |
503 | 2.78M | { |
504 | 2.78M | pi2_tmp[k] = |
505 | 2.78M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
506 | 2.78M | pi2_tmp[k + 16] = |
507 | 2.78M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
508 | 2.78M | } |
509 | 173k | } |
510 | 617k | pi2_src++; |
511 | 617k | pi2_tmp += trans_size; |
512 | 617k | zero_cols = zero_cols >> 1; |
513 | 617k | } |
514 | | |
515 | 50.9k | pi2_tmp = pi2_tmp_orig; |
516 | | |
517 | | /* Inverse Transform 2nd stage */ |
518 | 50.9k | shift = IT_SHIFT_STAGE_2; |
519 | 50.9k | add = 1 << (shift - 1); |
520 | 50.9k | if((zero_rows_2nd_stage & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of output of 1st stage are non-zero */ |
521 | 19.1k | { |
522 | 613k | for(j = 0; j < trans_size; j++) |
523 | 594k | { |
524 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
525 | 10.0M | for(k = 0; k < 16; k++) |
526 | 9.43M | { |
527 | 9.43M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size] |
528 | 9.43M | + g_ai2_ihevc_trans_32[3][k] |
529 | 9.43M | * pi2_tmp[3 * trans_size]; |
530 | 9.43M | } |
531 | 5.34M | for(k = 0; k < 8; k++) |
532 | 4.75M | { |
533 | 4.75M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]; |
534 | 4.75M | } |
535 | | // for(k = 0; k < 4; k++) |
536 | 594k | { |
537 | 594k | eeo[0] = 0; |
538 | 594k | eeo[1] = 0; |
539 | 594k | eeo[2] = 0; |
540 | 594k | eeo[3] = 0; |
541 | 594k | } |
542 | 594k | eeeo[0] = 0; |
543 | 594k | eeeo[1] = 0; |
544 | 594k | eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]; |
545 | 594k | eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]; |
546 | | |
547 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
548 | 594k | eee[0] = eeee[0] + eeeo[0]; |
549 | 594k | eee[3] = eeee[0] - eeeo[0]; |
550 | 594k | eee[1] = eeee[1] + eeeo[1]; |
551 | 594k | eee[2] = eeee[1] - eeeo[1]; |
552 | 2.97M | for(k = 0; k < 4; k++) |
553 | 2.38M | { |
554 | 2.38M | ee[k] = eee[k] + eeo[k]; |
555 | 2.38M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
556 | 2.38M | } |
557 | 5.40M | for(k = 0; k < 8; k++) |
558 | 4.80M | { |
559 | 4.80M | e[k] = ee[k] + eo[k]; |
560 | 4.80M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
561 | 4.80M | } |
562 | 10.0M | for(k = 0; k < 16; k++) |
563 | 9.41M | { |
564 | 9.41M | WORD32 itrans_out; |
565 | 9.41M | itrans_out = |
566 | 9.41M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
567 | 9.41M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
568 | 9.41M | itrans_out = |
569 | 9.41M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
570 | 9.41M | pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16])); |
571 | 9.41M | } |
572 | 594k | pi2_tmp++; |
573 | 594k | pu1_pred += pred_strd; |
574 | 594k | pu1_dst += dst_strd; |
575 | 594k | } |
576 | 19.1k | } |
577 | 31.8k | else if((zero_rows_2nd_stage & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of output of 1st stage are non-zero */ |
578 | 19.8k | { |
579 | 635k | for(j = 0; j < trans_size; j++) |
580 | 615k | { |
581 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
582 | 10.4M | for(k = 0; k < 16; k++) |
583 | 9.83M | { |
584 | 9.83M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size] |
585 | 9.83M | + g_ai2_ihevc_trans_32[3][k] |
586 | 9.83M | * pi2_tmp[3 * trans_size] |
587 | 9.83M | + g_ai2_ihevc_trans_32[5][k] |
588 | 9.83M | * pi2_tmp[5 * trans_size] |
589 | 9.83M | + g_ai2_ihevc_trans_32[7][k] |
590 | 9.83M | * pi2_tmp[7 * trans_size]; |
591 | 9.83M | } |
592 | 5.48M | for(k = 0; k < 8; k++) |
593 | 4.86M | { |
594 | 4.86M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size] |
595 | 4.86M | + g_ai2_ihevc_trans_32[6][k] |
596 | 4.86M | * pi2_tmp[6 * trans_size]; |
597 | 4.86M | } |
598 | 3.07M | for(k = 0; k < 4; k++) |
599 | 2.46M | { |
600 | 2.46M | eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size]; |
601 | 2.46M | } |
602 | 615k | eeeo[0] = 0; |
603 | 615k | eeeo[1] = 0; |
604 | 615k | eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]; |
605 | 615k | eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]; |
606 | | |
607 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
608 | 615k | eee[0] = eeee[0] + eeeo[0]; |
609 | 615k | eee[3] = eeee[0] - eeeo[0]; |
610 | 615k | eee[1] = eeee[1] + eeeo[1]; |
611 | 615k | eee[2] = eeee[1] - eeeo[1]; |
612 | 3.06M | for(k = 0; k < 4; k++) |
613 | 2.45M | { |
614 | 2.45M | ee[k] = eee[k] + eeo[k]; |
615 | 2.45M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
616 | 2.45M | } |
617 | 5.50M | for(k = 0; k < 8; k++) |
618 | 4.89M | { |
619 | 4.89M | e[k] = ee[k] + eo[k]; |
620 | 4.89M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
621 | 4.89M | } |
622 | 10.1M | for(k = 0; k < 16; k++) |
623 | 9.50M | { |
624 | 9.50M | WORD32 itrans_out; |
625 | 9.50M | itrans_out = |
626 | 9.50M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
627 | 9.50M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
628 | 9.50M | itrans_out = |
629 | 9.50M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
630 | 9.50M | pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16])); |
631 | 9.50M | } |
632 | 615k | pi2_tmp++; |
633 | 615k | pu1_pred += pred_strd; |
634 | 615k | pu1_dst += dst_strd; |
635 | 615k | } |
636 | 19.8k | } |
637 | 11.9k | else /* All rows of output of 1st stage are non-zero */ |
638 | 11.9k | { |
639 | 392k | for(j = 0; j < trans_size; j++) |
640 | 380k | { |
641 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
642 | 6.45M | for(k = 0; k < 16; k++) |
643 | 6.07M | { |
644 | 6.07M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size] |
645 | 6.07M | + g_ai2_ihevc_trans_32[3][k] |
646 | 6.07M | * pi2_tmp[3 * trans_size] |
647 | 6.07M | + g_ai2_ihevc_trans_32[5][k] |
648 | 6.07M | * pi2_tmp[5 * trans_size] |
649 | 6.07M | + g_ai2_ihevc_trans_32[7][k] |
650 | 6.07M | * pi2_tmp[7 * trans_size] |
651 | 6.07M | + g_ai2_ihevc_trans_32[9][k] |
652 | 6.07M | * pi2_tmp[9 * trans_size] |
653 | 6.07M | + g_ai2_ihevc_trans_32[11][k] |
654 | 6.07M | * pi2_tmp[11 * trans_size] |
655 | 6.07M | + g_ai2_ihevc_trans_32[13][k] |
656 | 6.07M | * pi2_tmp[13 * trans_size] |
657 | 6.07M | + g_ai2_ihevc_trans_32[15][k] |
658 | 6.07M | * pi2_tmp[15 * trans_size] |
659 | 6.07M | + g_ai2_ihevc_trans_32[17][k] |
660 | 6.07M | * pi2_tmp[17 * trans_size] |
661 | 6.07M | + g_ai2_ihevc_trans_32[19][k] |
662 | 6.07M | * pi2_tmp[19 * trans_size] |
663 | 6.07M | + g_ai2_ihevc_trans_32[21][k] |
664 | 6.07M | * pi2_tmp[21 * trans_size] |
665 | 6.07M | + g_ai2_ihevc_trans_32[23][k] |
666 | 6.07M | * pi2_tmp[23 * trans_size] |
667 | 6.07M | + g_ai2_ihevc_trans_32[25][k] |
668 | 6.07M | * pi2_tmp[25 * trans_size] |
669 | 6.07M | + g_ai2_ihevc_trans_32[27][k] |
670 | 6.07M | * pi2_tmp[27 * trans_size] |
671 | 6.07M | + g_ai2_ihevc_trans_32[29][k] |
672 | 6.07M | * pi2_tmp[29 * trans_size] |
673 | 6.07M | + g_ai2_ihevc_trans_32[31][k] |
674 | 6.07M | * pi2_tmp[31 * trans_size]; |
675 | 6.07M | } |
676 | 3.43M | for(k = 0; k < 8; k++) |
677 | 3.05M | { |
678 | 3.05M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size] |
679 | 3.05M | + g_ai2_ihevc_trans_32[6][k] |
680 | 3.05M | * pi2_tmp[6 * trans_size] |
681 | 3.05M | + g_ai2_ihevc_trans_32[10][k] |
682 | 3.05M | * pi2_tmp[10 * trans_size] |
683 | 3.05M | + g_ai2_ihevc_trans_32[14][k] |
684 | 3.05M | * pi2_tmp[14 * trans_size] |
685 | 3.05M | + g_ai2_ihevc_trans_32[18][k] |
686 | 3.05M | * pi2_tmp[18 * trans_size] |
687 | 3.05M | + g_ai2_ihevc_trans_32[22][k] |
688 | 3.05M | * pi2_tmp[22 * trans_size] |
689 | 3.05M | + g_ai2_ihevc_trans_32[26][k] |
690 | 3.05M | * pi2_tmp[26 * trans_size] |
691 | 3.05M | + g_ai2_ihevc_trans_32[30][k] |
692 | 3.05M | * pi2_tmp[30 * trans_size]; |
693 | 3.05M | } |
694 | 1.90M | for(k = 0; k < 4; k++) |
695 | 1.52M | { |
696 | 1.52M | eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size] |
697 | 1.52M | + g_ai2_ihevc_trans_32[12][k] |
698 | 1.52M | * pi2_tmp[12 * trans_size] |
699 | 1.52M | + g_ai2_ihevc_trans_32[20][k] |
700 | 1.52M | * pi2_tmp[20 * trans_size] |
701 | 1.52M | + g_ai2_ihevc_trans_32[28][k] |
702 | 1.52M | * pi2_tmp[28 * trans_size]; |
703 | 1.52M | } |
704 | 380k | eeeo[0] = |
705 | 380k | g_ai2_ihevc_trans_32[8][0] * pi2_tmp[8 * trans_size] |
706 | 380k | + g_ai2_ihevc_trans_32[24][0] |
707 | 380k | * pi2_tmp[24 |
708 | 380k | * trans_size]; |
709 | 380k | eeeo[1] = |
710 | 380k | g_ai2_ihevc_trans_32[8][1] * pi2_tmp[8 * trans_size] |
711 | 380k | + g_ai2_ihevc_trans_32[24][1] |
712 | 380k | * pi2_tmp[24 |
713 | 380k | * trans_size]; |
714 | 380k | eeee[0] = |
715 | 380k | g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0] |
716 | 380k | + g_ai2_ihevc_trans_32[16][0] |
717 | 380k | * pi2_tmp[16 |
718 | 380k | * trans_size]; |
719 | 380k | eeee[1] = |
720 | 380k | g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0] |
721 | 380k | + g_ai2_ihevc_trans_32[16][1] |
722 | 380k | * pi2_tmp[16 |
723 | 380k | * trans_size]; |
724 | | |
725 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
726 | 380k | eee[0] = eeee[0] + eeeo[0]; |
727 | 380k | eee[3] = eeee[0] - eeeo[0]; |
728 | 380k | eee[1] = eeee[1] + eeeo[1]; |
729 | 380k | eee[2] = eeee[1] - eeeo[1]; |
730 | 1.90M | for(k = 0; k < 4; k++) |
731 | 1.52M | { |
732 | 1.52M | ee[k] = eee[k] + eeo[k]; |
733 | 1.52M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
734 | 1.52M | } |
735 | 3.43M | for(k = 0; k < 8; k++) |
736 | 3.05M | { |
737 | 3.05M | e[k] = ee[k] + eo[k]; |
738 | 3.05M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
739 | 3.05M | } |
740 | 6.46M | for(k = 0; k < 16; k++) |
741 | 6.08M | { |
742 | 6.08M | WORD32 itrans_out; |
743 | 6.08M | itrans_out = |
744 | 6.08M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
745 | 6.08M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
746 | 6.08M | itrans_out = |
747 | 6.08M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
748 | 6.08M | pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16])); |
749 | 6.08M | } |
750 | 380k | pi2_tmp++; |
751 | 380k | pu1_pred += pred_strd; |
752 | 380k | pu1_dst += dst_strd; |
753 | 380k | } |
754 | 11.9k | } |
755 | | /************************************************************************************************/ |
756 | | /************************************END - IT_RECON_32x32****************************************/ |
757 | | /************************************************************************************************/ |
758 | 50.9k | } |
759 | 165k | else /* All rows of input are non-zero */ |
760 | 165k | { |
761 | | /************************************************************************************************/ |
762 | | /**********************************START - IT_RECON_32x32****************************************/ |
763 | | /************************************************************************************************/ |
764 | | /* Inverse Transform 1st stage */ |
765 | 165k | shift = IT_SHIFT_STAGE_1; |
766 | 165k | add = 1 << (shift - 1); |
767 | | |
768 | 4.43M | for(j = 0; j < row_limit_2nd_stage; j++) |
769 | 4.26M | { |
770 | | /* Checking for Zero Cols */ |
771 | 4.26M | if((zero_cols & 1) == 1) |
772 | 491k | { |
773 | 491k | memset(pi2_tmp, 0, trans_size * sizeof(WORD16)); |
774 | 491k | } |
775 | 3.77M | else |
776 | 3.77M | { |
777 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
778 | 64.2M | for(k = 0; k < 16; k++) |
779 | 60.4M | { |
780 | 60.4M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_src[src_strd] |
781 | 60.4M | + g_ai2_ihevc_trans_32[3][k] |
782 | 60.4M | * pi2_src[3 * src_strd] |
783 | 60.4M | + g_ai2_ihevc_trans_32[5][k] |
784 | 60.4M | * pi2_src[5 * src_strd] |
785 | 60.4M | + g_ai2_ihevc_trans_32[7][k] |
786 | 60.4M | * pi2_src[7 * src_strd] |
787 | 60.4M | + g_ai2_ihevc_trans_32[9][k] |
788 | 60.4M | * pi2_src[9 * src_strd] |
789 | 60.4M | + g_ai2_ihevc_trans_32[11][k] |
790 | 60.4M | * pi2_src[11 * src_strd] |
791 | 60.4M | + g_ai2_ihevc_trans_32[13][k] |
792 | 60.4M | * pi2_src[13 * src_strd] |
793 | 60.4M | + g_ai2_ihevc_trans_32[15][k] |
794 | 60.4M | * pi2_src[15 * src_strd] |
795 | 60.4M | + g_ai2_ihevc_trans_32[17][k] |
796 | 60.4M | * pi2_src[17 * src_strd] |
797 | 60.4M | + g_ai2_ihevc_trans_32[19][k] |
798 | 60.4M | * pi2_src[19 * src_strd] |
799 | 60.4M | + g_ai2_ihevc_trans_32[21][k] |
800 | 60.4M | * pi2_src[21 * src_strd] |
801 | 60.4M | + g_ai2_ihevc_trans_32[23][k] |
802 | 60.4M | * pi2_src[23 * src_strd] |
803 | 60.4M | + g_ai2_ihevc_trans_32[25][k] |
804 | 60.4M | * pi2_src[25 * src_strd] |
805 | 60.4M | + g_ai2_ihevc_trans_32[27][k] |
806 | 60.4M | * pi2_src[27 * src_strd] |
807 | 60.4M | + g_ai2_ihevc_trans_32[29][k] |
808 | 60.4M | * pi2_src[29 * src_strd] |
809 | 60.4M | + g_ai2_ihevc_trans_32[31][k] |
810 | 60.4M | * pi2_src[31 * src_strd]; |
811 | 60.4M | } |
812 | 34.0M | for(k = 0; k < 8; k++) |
813 | 30.2M | { |
814 | 30.2M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_src[2 * src_strd] |
815 | 30.2M | + g_ai2_ihevc_trans_32[6][k] |
816 | 30.2M | * pi2_src[6 * src_strd] |
817 | 30.2M | + g_ai2_ihevc_trans_32[10][k] |
818 | 30.2M | * pi2_src[10 * src_strd] |
819 | 30.2M | + g_ai2_ihevc_trans_32[14][k] |
820 | 30.2M | * pi2_src[14 * src_strd] |
821 | 30.2M | + g_ai2_ihevc_trans_32[18][k] |
822 | 30.2M | * pi2_src[18 * src_strd] |
823 | 30.2M | + g_ai2_ihevc_trans_32[22][k] |
824 | 30.2M | * pi2_src[22 * src_strd] |
825 | 30.2M | + g_ai2_ihevc_trans_32[26][k] |
826 | 30.2M | * pi2_src[26 * src_strd] |
827 | 30.2M | + g_ai2_ihevc_trans_32[30][k] |
828 | 30.2M | * pi2_src[30 * src_strd]; |
829 | 30.2M | } |
830 | 18.8M | for(k = 0; k < 4; k++) |
831 | 15.1M | { |
832 | 15.1M | eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_src[4 * src_strd] |
833 | 15.1M | + g_ai2_ihevc_trans_32[12][k] |
834 | 15.1M | * pi2_src[12 * src_strd] |
835 | 15.1M | + g_ai2_ihevc_trans_32[20][k] |
836 | 15.1M | * pi2_src[20 * src_strd] |
837 | 15.1M | + g_ai2_ihevc_trans_32[28][k] |
838 | 15.1M | * pi2_src[28 * src_strd]; |
839 | 15.1M | } |
840 | 3.77M | eeeo[0] = g_ai2_ihevc_trans_32[8][0] * pi2_src[8 * src_strd] |
841 | 3.77M | + g_ai2_ihevc_trans_32[24][0] |
842 | 3.77M | * pi2_src[24 * src_strd]; |
843 | 3.77M | eeeo[1] = g_ai2_ihevc_trans_32[8][1] * pi2_src[8 * src_strd] |
844 | 3.77M | + g_ai2_ihevc_trans_32[24][1] |
845 | 3.77M | * pi2_src[24 * src_strd]; |
846 | 3.77M | eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_src[0] |
847 | 3.77M | + g_ai2_ihevc_trans_32[16][0] |
848 | 3.77M | * pi2_src[16 * src_strd]; |
849 | 3.77M | eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_src[0] |
850 | 3.77M | + g_ai2_ihevc_trans_32[16][1] |
851 | 3.77M | * pi2_src[16 * src_strd]; |
852 | | |
853 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
854 | 3.77M | eee[0] = eeee[0] + eeeo[0]; |
855 | 3.77M | eee[3] = eeee[0] - eeeo[0]; |
856 | 3.77M | eee[1] = eeee[1] + eeeo[1]; |
857 | 3.77M | eee[2] = eeee[1] - eeeo[1]; |
858 | 18.8M | for(k = 0; k < 4; k++) |
859 | 15.1M | { |
860 | 15.1M | ee[k] = eee[k] + eeo[k]; |
861 | 15.1M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
862 | 15.1M | } |
863 | 34.0M | for(k = 0; k < 8; k++) |
864 | 30.2M | { |
865 | 30.2M | e[k] = ee[k] + eo[k]; |
866 | 30.2M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
867 | 30.2M | } |
868 | 64.2M | for(k = 0; k < 16; k++) |
869 | 60.4M | { |
870 | 60.4M | pi2_tmp[k] = |
871 | 60.4M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
872 | 60.4M | pi2_tmp[k + 16] = |
873 | 60.4M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
874 | 60.4M | } |
875 | 3.77M | } |
876 | 4.26M | pi2_src++; |
877 | 4.26M | pi2_tmp += trans_size; |
878 | 4.26M | zero_cols = zero_cols >> 1; |
879 | 4.26M | } |
880 | | |
881 | 165k | pi2_tmp = pi2_tmp_orig; |
882 | | |
883 | | /* Inverse Transform 2nd stage */ |
884 | 165k | shift = IT_SHIFT_STAGE_2; |
885 | 165k | add = 1 << (shift - 1); |
886 | 165k | if((zero_rows_2nd_stage & 0xFFFFFFF0) == 0xFFFFFFF0) /* First 4 rows of output of 1st stage are non-zero */ |
887 | 25.0k | { |
888 | 813k | for(j = 0; j < trans_size; j++) |
889 | 788k | { |
890 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
891 | 13.3M | for(k = 0; k < 16; k++) |
892 | 12.5M | { |
893 | 12.5M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size] |
894 | 12.5M | + g_ai2_ihevc_trans_32[3][k] |
895 | 12.5M | * pi2_tmp[3 * trans_size]; |
896 | 12.5M | } |
897 | 7.09M | for(k = 0; k < 8; k++) |
898 | 6.31M | { |
899 | 6.31M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size]; |
900 | 6.31M | } |
901 | | // for(k = 0; k < 4; k++) |
902 | 788k | { |
903 | 788k | eeo[0] = 0; |
904 | 788k | eeo[1] = 0; |
905 | 788k | eeo[2] = 0; |
906 | 788k | eeo[3] = 0; |
907 | 788k | } |
908 | 788k | eeeo[0] = 0; |
909 | 788k | eeeo[1] = 0; |
910 | 788k | eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]; |
911 | 788k | eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]; |
912 | | |
913 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
914 | 788k | eee[0] = eeee[0] + eeeo[0]; |
915 | 788k | eee[3] = eeee[0] - eeeo[0]; |
916 | 788k | eee[1] = eeee[1] + eeeo[1]; |
917 | 788k | eee[2] = eeee[1] - eeeo[1]; |
918 | 3.94M | for(k = 0; k < 4; k++) |
919 | 3.15M | { |
920 | 3.15M | ee[k] = eee[k] + eeo[k]; |
921 | 3.15M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
922 | 3.15M | } |
923 | 7.09M | for(k = 0; k < 8; k++) |
924 | 6.30M | { |
925 | 6.30M | e[k] = ee[k] + eo[k]; |
926 | 6.30M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
927 | 6.30M | } |
928 | 13.2M | for(k = 0; k < 16; k++) |
929 | 12.4M | { |
930 | 12.4M | WORD32 itrans_out; |
931 | 12.4M | itrans_out = |
932 | 12.4M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
933 | 12.4M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
934 | 12.4M | itrans_out = |
935 | 12.4M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
936 | 12.4M | pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16])); |
937 | 12.4M | } |
938 | 788k | pi2_tmp++; |
939 | 788k | pu1_pred += pred_strd; |
940 | 788k | pu1_dst += dst_strd; |
941 | 788k | } |
942 | 25.0k | } |
943 | 140k | else if((zero_rows_2nd_stage & 0xFFFFFF00) == 0xFFFFFF00) /* First 8 rows of output of 1st stage are non-zero */ |
944 | 13.2k | { |
945 | 423k | for(j = 0; j < trans_size; j++) |
946 | 410k | { |
947 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
948 | 6.91M | for(k = 0; k < 16; k++) |
949 | 6.50M | { |
950 | 6.50M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size] |
951 | 6.50M | + g_ai2_ihevc_trans_32[3][k] |
952 | 6.50M | * pi2_tmp[3 * trans_size] |
953 | 6.50M | + g_ai2_ihevc_trans_32[5][k] |
954 | 6.50M | * pi2_tmp[5 * trans_size] |
955 | 6.50M | + g_ai2_ihevc_trans_32[7][k] |
956 | 6.50M | * pi2_tmp[7 * trans_size]; |
957 | 6.50M | } |
958 | 3.71M | for(k = 0; k < 8; k++) |
959 | 3.30M | { |
960 | 3.30M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size] |
961 | 3.30M | + g_ai2_ihevc_trans_32[6][k] |
962 | 3.30M | * pi2_tmp[6 * trans_size]; |
963 | 3.30M | } |
964 | 2.07M | for(k = 0; k < 4; k++) |
965 | 1.66M | { |
966 | 1.66M | eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size]; |
967 | 1.66M | } |
968 | 410k | eeeo[0] = 0; |
969 | 410k | eeeo[1] = 0; |
970 | 410k | eeee[0] = g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0]; |
971 | 410k | eeee[1] = g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0]; |
972 | | |
973 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
974 | 410k | eee[0] = eeee[0] + eeeo[0]; |
975 | 410k | eee[3] = eeee[0] - eeeo[0]; |
976 | 410k | eee[1] = eeee[1] + eeeo[1]; |
977 | 410k | eee[2] = eeee[1] - eeeo[1]; |
978 | 2.07M | for(k = 0; k < 4; k++) |
979 | 1.66M | { |
980 | 1.66M | ee[k] = eee[k] + eeo[k]; |
981 | 1.66M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
982 | 1.66M | } |
983 | 3.71M | for(k = 0; k < 8; k++) |
984 | 3.30M | { |
985 | 3.30M | e[k] = ee[k] + eo[k]; |
986 | 3.30M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
987 | 3.30M | } |
988 | 6.85M | for(k = 0; k < 16; k++) |
989 | 6.44M | { |
990 | 6.44M | WORD32 itrans_out; |
991 | 6.44M | itrans_out = |
992 | 6.44M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
993 | 6.44M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
994 | 6.44M | itrans_out = |
995 | 6.44M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
996 | 6.44M | pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16])); |
997 | 6.44M | } |
998 | 410k | pi2_tmp++; |
999 | 410k | pu1_pred += pred_strd; |
1000 | 410k | pu1_dst += dst_strd; |
1001 | 410k | } |
1002 | 13.2k | } |
1003 | 126k | else /* All rows of output of 1st stage are non-zero */ |
1004 | 126k | { |
1005 | 4.17M | for(j = 0; j < trans_size; j++) |
1006 | 4.05M | { |
1007 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
1008 | 68.8M | for(k = 0; k < 16; k++) |
1009 | 64.7M | { |
1010 | 64.7M | o[k] = g_ai2_ihevc_trans_32[1][k] * pi2_tmp[trans_size] |
1011 | 64.7M | + g_ai2_ihevc_trans_32[3][k] |
1012 | 64.7M | * pi2_tmp[3 * trans_size] |
1013 | 64.7M | + g_ai2_ihevc_trans_32[5][k] |
1014 | 64.7M | * pi2_tmp[5 * trans_size] |
1015 | 64.7M | + g_ai2_ihevc_trans_32[7][k] |
1016 | 64.7M | * pi2_tmp[7 * trans_size] |
1017 | 64.7M | + g_ai2_ihevc_trans_32[9][k] |
1018 | 64.7M | * pi2_tmp[9 * trans_size] |
1019 | 64.7M | + g_ai2_ihevc_trans_32[11][k] |
1020 | 64.7M | * pi2_tmp[11 * trans_size] |
1021 | 64.7M | + g_ai2_ihevc_trans_32[13][k] |
1022 | 64.7M | * pi2_tmp[13 * trans_size] |
1023 | 64.7M | + g_ai2_ihevc_trans_32[15][k] |
1024 | 64.7M | * pi2_tmp[15 * trans_size] |
1025 | 64.7M | + g_ai2_ihevc_trans_32[17][k] |
1026 | 64.7M | * pi2_tmp[17 * trans_size] |
1027 | 64.7M | + g_ai2_ihevc_trans_32[19][k] |
1028 | 64.7M | * pi2_tmp[19 * trans_size] |
1029 | 64.7M | + g_ai2_ihevc_trans_32[21][k] |
1030 | 64.7M | * pi2_tmp[21 * trans_size] |
1031 | 64.7M | + g_ai2_ihevc_trans_32[23][k] |
1032 | 64.7M | * pi2_tmp[23 * trans_size] |
1033 | 64.7M | + g_ai2_ihevc_trans_32[25][k] |
1034 | 64.7M | * pi2_tmp[25 * trans_size] |
1035 | 64.7M | + g_ai2_ihevc_trans_32[27][k] |
1036 | 64.7M | * pi2_tmp[27 * trans_size] |
1037 | 64.7M | + g_ai2_ihevc_trans_32[29][k] |
1038 | 64.7M | * pi2_tmp[29 * trans_size] |
1039 | 64.7M | + g_ai2_ihevc_trans_32[31][k] |
1040 | 64.7M | * pi2_tmp[31 * trans_size]; |
1041 | 64.7M | } |
1042 | 36.4M | for(k = 0; k < 8; k++) |
1043 | 32.4M | { |
1044 | 32.4M | eo[k] = g_ai2_ihevc_trans_32[2][k] * pi2_tmp[2 * trans_size] |
1045 | 32.4M | + g_ai2_ihevc_trans_32[6][k] |
1046 | 32.4M | * pi2_tmp[6 * trans_size] |
1047 | 32.4M | + g_ai2_ihevc_trans_32[10][k] |
1048 | 32.4M | * pi2_tmp[10 * trans_size] |
1049 | 32.4M | + g_ai2_ihevc_trans_32[14][k] |
1050 | 32.4M | * pi2_tmp[14 * trans_size] |
1051 | 32.4M | + g_ai2_ihevc_trans_32[18][k] |
1052 | 32.4M | * pi2_tmp[18 * trans_size] |
1053 | 32.4M | + g_ai2_ihevc_trans_32[22][k] |
1054 | 32.4M | * pi2_tmp[22 * trans_size] |
1055 | 32.4M | + g_ai2_ihevc_trans_32[26][k] |
1056 | 32.4M | * pi2_tmp[26 * trans_size] |
1057 | 32.4M | + g_ai2_ihevc_trans_32[30][k] |
1058 | 32.4M | * pi2_tmp[30 * trans_size]; |
1059 | 32.4M | } |
1060 | 20.2M | for(k = 0; k < 4; k++) |
1061 | 16.2M | { |
1062 | 16.2M | eeo[k] = g_ai2_ihevc_trans_32[4][k] * pi2_tmp[4 * trans_size] |
1063 | 16.2M | + g_ai2_ihevc_trans_32[12][k] |
1064 | 16.2M | * pi2_tmp[12 * trans_size] |
1065 | 16.2M | + g_ai2_ihevc_trans_32[20][k] |
1066 | 16.2M | * pi2_tmp[20 * trans_size] |
1067 | 16.2M | + g_ai2_ihevc_trans_32[28][k] |
1068 | 16.2M | * pi2_tmp[28 * trans_size]; |
1069 | 16.2M | } |
1070 | 4.05M | eeeo[0] = |
1071 | 4.05M | g_ai2_ihevc_trans_32[8][0] * pi2_tmp[8 * trans_size] |
1072 | 4.05M | + g_ai2_ihevc_trans_32[24][0] |
1073 | 4.05M | * pi2_tmp[24 |
1074 | 4.05M | * trans_size]; |
1075 | 4.05M | eeeo[1] = |
1076 | 4.05M | g_ai2_ihevc_trans_32[8][1] * pi2_tmp[8 * trans_size] |
1077 | 4.05M | + g_ai2_ihevc_trans_32[24][1] |
1078 | 4.05M | * pi2_tmp[24 |
1079 | 4.05M | * trans_size]; |
1080 | 4.05M | eeee[0] = |
1081 | 4.05M | g_ai2_ihevc_trans_32[0][0] * pi2_tmp[0] |
1082 | 4.05M | + g_ai2_ihevc_trans_32[16][0] |
1083 | 4.05M | * pi2_tmp[16 |
1084 | 4.05M | * trans_size]; |
1085 | 4.05M | eeee[1] = |
1086 | 4.05M | g_ai2_ihevc_trans_32[0][1] * pi2_tmp[0] |
1087 | 4.05M | + g_ai2_ihevc_trans_32[16][1] |
1088 | 4.05M | * pi2_tmp[16 |
1089 | 4.05M | * trans_size]; |
1090 | | |
1091 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
1092 | 4.05M | eee[0] = eeee[0] + eeeo[0]; |
1093 | 4.05M | eee[3] = eeee[0] - eeeo[0]; |
1094 | 4.05M | eee[1] = eeee[1] + eeeo[1]; |
1095 | 4.05M | eee[2] = eeee[1] - eeeo[1]; |
1096 | 20.2M | for(k = 0; k < 4; k++) |
1097 | 16.2M | { |
1098 | 16.2M | ee[k] = eee[k] + eeo[k]; |
1099 | 16.2M | ee[k + 4] = eee[3 - k] - eeo[3 - k]; |
1100 | 16.2M | } |
1101 | 36.5M | for(k = 0; k < 8; k++) |
1102 | 32.4M | { |
1103 | 32.4M | e[k] = ee[k] + eo[k]; |
1104 | 32.4M | e[k + 8] = ee[7 - k] - eo[7 - k]; |
1105 | 32.4M | } |
1106 | 68.8M | for(k = 0; k < 16; k++) |
1107 | 64.7M | { |
1108 | 64.7M | WORD32 itrans_out; |
1109 | 64.7M | itrans_out = |
1110 | 64.7M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
1111 | 64.7M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
1112 | 64.7M | itrans_out = |
1113 | 64.7M | CLIP_S16(((e[15 - k] - o[15 - k] + add) >> shift)); |
1114 | 64.7M | pu1_dst[k + 16] = CLIP_U8((itrans_out + pu1_pred[k + 16])); |
1115 | 64.7M | } |
1116 | 4.05M | pi2_tmp++; |
1117 | 4.05M | pu1_pred += pred_strd; |
1118 | 4.05M | pu1_dst += dst_strd; |
1119 | 4.05M | } |
1120 | 126k | } |
1121 | | /************************************************************************************************/ |
1122 | | /************************************END - IT_RECON_32x32****************************************/ |
1123 | | /************************************************************************************************/ |
1124 | 165k | } |
1125 | 299k | } |
1126 | | |