/src/libhevc/common/ihevc_itrans_recon_16x16.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_16x16.c |
22 | | * |
23 | | * @brief |
24 | | * Contains function definitions for inverse transform and reconstruction 16x16 |
25 | | * |
26 | | * |
27 | | * @author |
28 | | * 100470 |
29 | | * |
30 | | * @par List of Functions: |
31 | | * - ihevc_itrans_recon_16x16() |
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 | | * @brief |
52 | | * This function performs Inverse transform and reconstruction for 16x16 |
53 | | * input block |
54 | | * |
55 | | * @par Description: |
56 | | * Performs inverse transform and adds the prediction data and clips output |
57 | | * to 8 bit |
58 | | * |
59 | | * @param[in] pi2_src |
60 | | * Input 16x16 coefficients |
61 | | * |
62 | | * @param[in] pi2_tmp |
63 | | * Temporary 16x16 buffer for storing inverse |
64 | | * |
65 | | * transform |
66 | | * 1st stage output |
67 | | * |
68 | | * @param[in] pu1_pred |
69 | | * Prediction 16x16 block |
70 | | * |
71 | | * @param[out] pu1_dst |
72 | | * Output 16x16 block |
73 | | * |
74 | | * @param[in] src_strd |
75 | | * Input stride |
76 | | * |
77 | | * @param[in] pred_strd |
78 | | * Prediction stride |
79 | | * |
80 | | * @param[in] dst_strd |
81 | | * Output Stride |
82 | | * |
83 | | * @param[in] shift |
84 | | * Output shift |
85 | | * |
86 | | * @param[in] zero_cols |
87 | | * Zero columns in pi2_src |
88 | | * |
89 | | * @returns Void |
90 | | * |
91 | | * @remarks |
92 | | * None |
93 | | * |
94 | | ******************************************************************************* |
95 | | */ |
96 | | |
97 | | void ihevc_itrans_recon_16x16(WORD16 *pi2_src, |
98 | | WORD16 *pi2_tmp, |
99 | | UWORD8 *pu1_pred, |
100 | | UWORD8 *pu1_dst, |
101 | | WORD32 src_strd, |
102 | | WORD32 pred_strd, |
103 | | WORD32 dst_strd, |
104 | | WORD32 zero_cols, |
105 | | WORD32 zero_rows) |
106 | 514k | { |
107 | 514k | WORD32 j, k; |
108 | 514k | WORD32 e[8], o[8]; |
109 | 514k | WORD32 ee[4], eo[4]; |
110 | 514k | WORD32 eee[2], eeo[2]; |
111 | 514k | WORD32 add; |
112 | 514k | WORD32 shift; |
113 | 514k | WORD16 *pi2_tmp_orig; |
114 | 514k | WORD32 trans_size; |
115 | 514k | WORD32 zero_rows_2nd_stage = zero_cols; |
116 | 514k | WORD32 row_limit_2nd_stage; |
117 | | |
118 | 514k | if((zero_cols & 0xFFF0) == 0xFFF0) |
119 | 225k | row_limit_2nd_stage = 4; |
120 | 289k | else if((zero_cols & 0xFF00) == 0xFF00) |
121 | 80.9k | row_limit_2nd_stage = 8; |
122 | 208k | else |
123 | 208k | row_limit_2nd_stage = TRANS_SIZE_16; |
124 | | |
125 | 514k | trans_size = TRANS_SIZE_16; |
126 | 514k | pi2_tmp_orig = pi2_tmp; |
127 | 514k | if((zero_rows & 0xFFF0) == 0xFFF0) /* First 4 rows of input are non-zero */ |
128 | 186k | { |
129 | | /* Inverse Transform 1st stage */ |
130 | | /************************************************************************************************/ |
131 | | /**********************************START - IT_RECON_16x16****************************************/ |
132 | | /************************************************************************************************/ |
133 | | |
134 | 186k | shift = IT_SHIFT_STAGE_1; |
135 | 186k | add = 1 << (shift - 1); |
136 | | |
137 | 1.69M | for(j = 0; j < row_limit_2nd_stage; j++) |
138 | 1.51M | { |
139 | | /* Checking for Zero Cols */ |
140 | 1.51M | if((zero_cols & 1) == 1) |
141 | 866k | { |
142 | 866k | memset(pi2_tmp, 0, trans_size * sizeof(WORD16)); |
143 | 866k | } |
144 | 645k | else |
145 | 645k | { |
146 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
147 | 5.85M | for(k = 0; k < 8; k++) |
148 | 5.20M | { |
149 | 5.20M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd] |
150 | 5.20M | + g_ai2_ihevc_trans_16[3][k] |
151 | 5.20M | * pi2_src[3 * src_strd]; |
152 | 5.20M | } |
153 | 3.25M | for(k = 0; k < 4; k++) |
154 | 2.60M | { |
155 | 2.60M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd]; |
156 | 2.60M | } |
157 | 645k | eeo[0] = 0; |
158 | 645k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0]; |
159 | 645k | eeo[1] = 0; |
160 | 645k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_src[0]; |
161 | | |
162 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
163 | 1.94M | for(k = 0; k < 2; k++) |
164 | 1.30M | { |
165 | 1.30M | ee[k] = eee[k] + eeo[k]; |
166 | 1.30M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
167 | 1.30M | } |
168 | 3.25M | for(k = 0; k < 4; k++) |
169 | 2.60M | { |
170 | 2.60M | e[k] = ee[k] + eo[k]; |
171 | 2.60M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
172 | 2.60M | } |
173 | 5.85M | for(k = 0; k < 8; k++) |
174 | 5.21M | { |
175 | 5.21M | pi2_tmp[k] = |
176 | 5.21M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
177 | 5.21M | pi2_tmp[k + 8] = |
178 | 5.21M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
179 | 5.21M | } |
180 | 645k | } |
181 | 1.51M | pi2_src++; |
182 | 1.51M | pi2_tmp += trans_size; |
183 | 1.51M | zero_cols = zero_cols >> 1; |
184 | 1.51M | } |
185 | | |
186 | 186k | pi2_tmp = pi2_tmp_orig; |
187 | | |
188 | | /* Inverse Transform 2nd stage */ |
189 | 186k | shift = IT_SHIFT_STAGE_2; |
190 | 186k | add = 1 << (shift - 1); |
191 | | |
192 | 186k | if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */ |
193 | 95.3k | { |
194 | 1.57M | for(j = 0; j < trans_size; j++) |
195 | 1.48M | { |
196 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
197 | 13.3M | for(k = 0; k < 8; k++) |
198 | 11.8M | { |
199 | 11.8M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
200 | 11.8M | + g_ai2_ihevc_trans_16[3][k] |
201 | 11.8M | * pi2_tmp[3 * trans_size]; |
202 | 11.8M | } |
203 | 7.40M | for(k = 0; k < 4; k++) |
204 | 5.92M | { |
205 | 5.92M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]; |
206 | 5.92M | } |
207 | 1.48M | eeo[0] = 0; |
208 | 1.48M | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
209 | 1.48M | eeo[1] = 0; |
210 | 1.48M | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]; |
211 | | |
212 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
213 | 4.44M | for(k = 0; k < 2; k++) |
214 | 2.96M | { |
215 | 2.96M | ee[k] = eee[k] + eeo[k]; |
216 | 2.96M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
217 | 2.96M | } |
218 | 7.41M | for(k = 0; k < 4; k++) |
219 | 5.93M | { |
220 | 5.93M | e[k] = ee[k] + eo[k]; |
221 | 5.93M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
222 | 5.93M | } |
223 | 13.2M | for(k = 0; k < 8; k++) |
224 | 11.7M | { |
225 | 11.7M | WORD32 itrans_out; |
226 | 11.7M | itrans_out = |
227 | 11.7M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
228 | 11.7M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
229 | 11.7M | itrans_out = |
230 | 11.7M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
231 | 11.7M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
232 | 11.7M | } |
233 | 1.48M | pi2_tmp++; |
234 | 1.48M | pu1_pred += pred_strd; |
235 | 1.48M | pu1_dst += dst_strd; |
236 | 1.48M | } |
237 | 95.3k | } |
238 | 91.1k | else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */ |
239 | 40.0k | { |
240 | 662k | for(j = 0; j < trans_size; j++) |
241 | 622k | { |
242 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
243 | 5.58M | for(k = 0; k < 8; k++) |
244 | 4.96M | { |
245 | 4.96M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
246 | 4.96M | + g_ai2_ihevc_trans_16[3][k] |
247 | 4.96M | * pi2_tmp[3 * trans_size] |
248 | 4.96M | + g_ai2_ihevc_trans_16[5][k] |
249 | 4.96M | * pi2_tmp[5 * trans_size] |
250 | 4.96M | + g_ai2_ihevc_trans_16[7][k] |
251 | 4.96M | * pi2_tmp[7 * trans_size]; |
252 | 4.96M | } |
253 | 3.12M | for(k = 0; k < 4; k++) |
254 | 2.49M | { |
255 | 2.49M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
256 | 2.49M | + g_ai2_ihevc_trans_16[6][k] |
257 | 2.49M | * pi2_tmp[6 * trans_size]; |
258 | 2.49M | } |
259 | 622k | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]; |
260 | 622k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
261 | 622k | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]; |
262 | 622k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]; |
263 | | |
264 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
265 | 1.87M | for(k = 0; k < 2; k++) |
266 | 1.24M | { |
267 | 1.24M | ee[k] = eee[k] + eeo[k]; |
268 | 1.24M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
269 | 1.24M | } |
270 | 3.12M | for(k = 0; k < 4; k++) |
271 | 2.49M | { |
272 | 2.49M | e[k] = ee[k] + eo[k]; |
273 | 2.49M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
274 | 2.49M | } |
275 | 5.55M | for(k = 0; k < 8; k++) |
276 | 4.93M | { |
277 | 4.93M | WORD32 itrans_out; |
278 | 4.93M | itrans_out = |
279 | 4.93M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
280 | 4.93M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
281 | 4.93M | itrans_out = |
282 | 4.93M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
283 | 4.93M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
284 | 4.93M | } |
285 | 622k | pi2_tmp++; |
286 | 622k | pu1_pred += pred_strd; |
287 | 622k | pu1_dst += dst_strd; |
288 | 622k | } |
289 | 40.0k | } |
290 | 51.1k | else /* All rows of output of 1st stage are non-zero */ |
291 | 51.1k | { |
292 | 827k | for(j = 0; j < trans_size; j++) |
293 | 776k | { |
294 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
295 | 6.95M | for(k = 0; k < 8; k++) |
296 | 6.17M | { |
297 | 6.17M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
298 | 6.17M | + g_ai2_ihevc_trans_16[3][k] |
299 | 6.17M | * pi2_tmp[3 * trans_size] |
300 | 6.17M | + g_ai2_ihevc_trans_16[5][k] |
301 | 6.17M | * pi2_tmp[5 * trans_size] |
302 | 6.17M | + g_ai2_ihevc_trans_16[7][k] |
303 | 6.17M | * pi2_tmp[7 * trans_size] |
304 | 6.17M | + g_ai2_ihevc_trans_16[9][k] |
305 | 6.17M | * pi2_tmp[9 * trans_size] |
306 | 6.17M | + g_ai2_ihevc_trans_16[11][k] |
307 | 6.17M | * pi2_tmp[11 * trans_size] |
308 | 6.17M | + g_ai2_ihevc_trans_16[13][k] |
309 | 6.17M | * pi2_tmp[13 * trans_size] |
310 | 6.17M | + g_ai2_ihevc_trans_16[15][k] |
311 | 6.17M | * pi2_tmp[15 * trans_size]; |
312 | 6.17M | } |
313 | 3.90M | for(k = 0; k < 4; k++) |
314 | 3.12M | { |
315 | 3.12M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
316 | 3.12M | + g_ai2_ihevc_trans_16[6][k] |
317 | 3.12M | * pi2_tmp[6 * trans_size] |
318 | 3.12M | + g_ai2_ihevc_trans_16[10][k] |
319 | 3.12M | * pi2_tmp[10 * trans_size] |
320 | 3.12M | + g_ai2_ihevc_trans_16[14][k] |
321 | 3.12M | * pi2_tmp[14 * trans_size]; |
322 | 3.12M | } |
323 | 776k | eeo[0] = |
324 | 776k | g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size] |
325 | 776k | + g_ai2_ihevc_trans_16[12][0] |
326 | 776k | * pi2_tmp[12 |
327 | 776k | * trans_size]; |
328 | 776k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0] |
329 | 776k | + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size]; |
330 | 776k | eeo[1] = |
331 | 776k | g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size] |
332 | 776k | + g_ai2_ihevc_trans_16[12][1] |
333 | 776k | * pi2_tmp[12 |
334 | 776k | * trans_size]; |
335 | 776k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0] |
336 | 776k | + g_ai2_ihevc_trans_16[8][1] * pi2_tmp[8 * trans_size]; |
337 | | |
338 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
339 | 2.33M | for(k = 0; k < 2; k++) |
340 | 1.55M | { |
341 | 1.55M | ee[k] = eee[k] + eeo[k]; |
342 | 1.55M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
343 | 1.55M | } |
344 | 3.89M | for(k = 0; k < 4; k++) |
345 | 3.12M | { |
346 | 3.12M | e[k] = ee[k] + eo[k]; |
347 | 3.12M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
348 | 3.12M | } |
349 | 6.90M | for(k = 0; k < 8; k++) |
350 | 6.13M | { |
351 | 6.13M | WORD32 itrans_out; |
352 | 6.13M | itrans_out = |
353 | 6.13M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
354 | 6.13M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
355 | 6.13M | itrans_out = |
356 | 6.13M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
357 | 6.13M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
358 | 6.13M | } |
359 | 776k | pi2_tmp++; |
360 | 776k | pu1_pred += pred_strd; |
361 | 776k | pu1_dst += dst_strd; |
362 | 776k | } |
363 | 51.1k | } |
364 | | /************************************************************************************************/ |
365 | | /************************************END - IT_RECON_16x16****************************************/ |
366 | | /************************************************************************************************/ |
367 | 186k | } |
368 | 328k | else if((zero_rows & 0xFF00) == 0xFF00) /* First 8 rows of input are non-zero */ |
369 | 103k | { |
370 | | /* Inverse Transform 1st stage */ |
371 | | /************************************************************************************************/ |
372 | | /**********************************START - IT_RECON_16x16****************************************/ |
373 | | /************************************************************************************************/ |
374 | | |
375 | 103k | shift = IT_SHIFT_STAGE_1; |
376 | 103k | add = 1 << (shift - 1); |
377 | | |
378 | 878k | for(j = 0; j < row_limit_2nd_stage; j++) |
379 | 775k | { |
380 | | /* Checking for Zero Cols */ |
381 | 775k | if((zero_cols & 1) == 1) |
382 | 371k | { |
383 | 371k | memset(pi2_tmp, 0, trans_size * sizeof(WORD16)); |
384 | 371k | } |
385 | 404k | else |
386 | 404k | { |
387 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
388 | 3.65M | for(k = 0; k < 8; k++) |
389 | 3.25M | { |
390 | 3.25M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd] |
391 | 3.25M | + g_ai2_ihevc_trans_16[3][k] |
392 | 3.25M | * pi2_src[3 * src_strd] |
393 | 3.25M | + g_ai2_ihevc_trans_16[5][k] |
394 | 3.25M | * pi2_src[5 * src_strd] |
395 | 3.25M | + g_ai2_ihevc_trans_16[7][k] |
396 | 3.25M | * pi2_src[7 * src_strd]; |
397 | 3.25M | } |
398 | 2.03M | for(k = 0; k < 4; k++) |
399 | 1.62M | { |
400 | 1.62M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd] |
401 | 1.62M | + g_ai2_ihevc_trans_16[6][k] |
402 | 1.62M | * pi2_src[6 * src_strd]; |
403 | 1.62M | } |
404 | 404k | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd]; |
405 | 404k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0]; |
406 | 404k | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd]; |
407 | 404k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_src[0]; |
408 | | |
409 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
410 | 1.21M | for(k = 0; k < 2; k++) |
411 | 813k | { |
412 | 813k | ee[k] = eee[k] + eeo[k]; |
413 | 813k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
414 | 813k | } |
415 | 2.03M | for(k = 0; k < 4; k++) |
416 | 1.62M | { |
417 | 1.62M | e[k] = ee[k] + eo[k]; |
418 | 1.62M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
419 | 1.62M | } |
420 | 3.65M | for(k = 0; k < 8; k++) |
421 | 3.25M | { |
422 | 3.25M | pi2_tmp[k] = |
423 | 3.25M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
424 | 3.25M | pi2_tmp[k + 8] = |
425 | 3.25M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
426 | 3.25M | } |
427 | 404k | } |
428 | 775k | pi2_src++; |
429 | 775k | pi2_tmp += trans_size; |
430 | 775k | zero_cols = zero_cols >> 1; |
431 | 775k | } |
432 | | |
433 | 103k | pi2_tmp = pi2_tmp_orig; |
434 | | |
435 | | /* Inverse Transform 2nd stage */ |
436 | 103k | shift = IT_SHIFT_STAGE_2; |
437 | 103k | add = 1 << (shift - 1); |
438 | | |
439 | 103k | if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */ |
440 | 60.7k | { |
441 | 1.00M | for(j = 0; j < trans_size; j++) |
442 | 945k | { |
443 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
444 | 8.50M | for(k = 0; k < 8; k++) |
445 | 7.55M | { |
446 | 7.55M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
447 | 7.55M | + g_ai2_ihevc_trans_16[3][k] |
448 | 7.55M | * pi2_tmp[3 * trans_size]; |
449 | 7.55M | } |
450 | 4.73M | for(k = 0; k < 4; k++) |
451 | 3.78M | { |
452 | 3.78M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]; |
453 | 3.78M | } |
454 | 945k | eeo[0] = 0; |
455 | 945k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
456 | 945k | eeo[1] = 0; |
457 | 945k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]; |
458 | | |
459 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
460 | 2.84M | for(k = 0; k < 2; k++) |
461 | 1.89M | { |
462 | 1.89M | ee[k] = eee[k] + eeo[k]; |
463 | 1.89M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
464 | 1.89M | } |
465 | 4.74M | for(k = 0; k < 4; k++) |
466 | 3.79M | { |
467 | 3.79M | e[k] = ee[k] + eo[k]; |
468 | 3.79M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
469 | 3.79M | } |
470 | 8.45M | for(k = 0; k < 8; k++) |
471 | 7.50M | { |
472 | 7.50M | WORD32 itrans_out; |
473 | 7.50M | itrans_out = |
474 | 7.50M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
475 | 7.50M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
476 | 7.50M | itrans_out = |
477 | 7.50M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
478 | 7.50M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
479 | 7.50M | } |
480 | 945k | pi2_tmp++; |
481 | 945k | pu1_pred += pred_strd; |
482 | 945k | pu1_dst += dst_strd; |
483 | 945k | } |
484 | 60.7k | } |
485 | 42.4k | else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */ |
486 | 18.0k | { |
487 | 301k | for(j = 0; j < trans_size; j++) |
488 | 283k | { |
489 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
490 | 2.54M | for(k = 0; k < 8; k++) |
491 | 2.26M | { |
492 | 2.26M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
493 | 2.26M | + g_ai2_ihevc_trans_16[3][k] |
494 | 2.26M | * pi2_tmp[3 * trans_size] |
495 | 2.26M | + g_ai2_ihevc_trans_16[5][k] |
496 | 2.26M | * pi2_tmp[5 * trans_size] |
497 | 2.26M | + g_ai2_ihevc_trans_16[7][k] |
498 | 2.26M | * pi2_tmp[7 * trans_size]; |
499 | 2.26M | } |
500 | 1.42M | for(k = 0; k < 4; k++) |
501 | 1.13M | { |
502 | 1.13M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
503 | 1.13M | + g_ai2_ihevc_trans_16[6][k] |
504 | 1.13M | * pi2_tmp[6 * trans_size]; |
505 | 1.13M | } |
506 | 283k | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]; |
507 | 283k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
508 | 283k | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]; |
509 | 283k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]; |
510 | | |
511 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
512 | 852k | for(k = 0; k < 2; k++) |
513 | 568k | { |
514 | 568k | ee[k] = eee[k] + eeo[k]; |
515 | 568k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
516 | 568k | } |
517 | 1.42M | for(k = 0; k < 4; k++) |
518 | 1.13M | { |
519 | 1.13M | e[k] = ee[k] + eo[k]; |
520 | 1.13M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
521 | 1.13M | } |
522 | 2.53M | for(k = 0; k < 8; k++) |
523 | 2.24M | { |
524 | 2.24M | WORD32 itrans_out; |
525 | 2.24M | itrans_out = |
526 | 2.24M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
527 | 2.24M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
528 | 2.24M | itrans_out = |
529 | 2.24M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
530 | 2.24M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
531 | 2.24M | } |
532 | 283k | pi2_tmp++; |
533 | 283k | pu1_pred += pred_strd; |
534 | 283k | pu1_dst += dst_strd; |
535 | 283k | } |
536 | 18.0k | } |
537 | 24.3k | else /* All rows of output of 1st stage are non-zero */ |
538 | 24.3k | { |
539 | 402k | for(j = 0; j < trans_size; j++) |
540 | 377k | { |
541 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
542 | 3.38M | for(k = 0; k < 8; k++) |
543 | 3.00M | { |
544 | 3.00M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
545 | 3.00M | + g_ai2_ihevc_trans_16[3][k] |
546 | 3.00M | * pi2_tmp[3 * trans_size] |
547 | 3.00M | + g_ai2_ihevc_trans_16[5][k] |
548 | 3.00M | * pi2_tmp[5 * trans_size] |
549 | 3.00M | + g_ai2_ihevc_trans_16[7][k] |
550 | 3.00M | * pi2_tmp[7 * trans_size] |
551 | 3.00M | + g_ai2_ihevc_trans_16[9][k] |
552 | 3.00M | * pi2_tmp[9 * trans_size] |
553 | 3.00M | + g_ai2_ihevc_trans_16[11][k] |
554 | 3.00M | * pi2_tmp[11 * trans_size] |
555 | 3.00M | + g_ai2_ihevc_trans_16[13][k] |
556 | 3.00M | * pi2_tmp[13 * trans_size] |
557 | 3.00M | + g_ai2_ihevc_trans_16[15][k] |
558 | 3.00M | * pi2_tmp[15 * trans_size]; |
559 | 3.00M | } |
560 | 1.89M | for(k = 0; k < 4; k++) |
561 | 1.51M | { |
562 | 1.51M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
563 | 1.51M | + g_ai2_ihevc_trans_16[6][k] |
564 | 1.51M | * pi2_tmp[6 * trans_size] |
565 | 1.51M | + g_ai2_ihevc_trans_16[10][k] |
566 | 1.51M | * pi2_tmp[10 * trans_size] |
567 | 1.51M | + g_ai2_ihevc_trans_16[14][k] |
568 | 1.51M | * pi2_tmp[14 * trans_size]; |
569 | 1.51M | } |
570 | 377k | eeo[0] = |
571 | 377k | g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size] |
572 | 377k | + g_ai2_ihevc_trans_16[12][0] |
573 | 377k | * pi2_tmp[12 |
574 | 377k | * trans_size]; |
575 | 377k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0] |
576 | 377k | + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size]; |
577 | 377k | eeo[1] = |
578 | 377k | g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size] |
579 | 377k | + g_ai2_ihevc_trans_16[12][1] |
580 | 377k | * pi2_tmp[12 |
581 | 377k | * trans_size]; |
582 | 377k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0] |
583 | 377k | + g_ai2_ihevc_trans_16[8][1] * pi2_tmp[8 * trans_size]; |
584 | | |
585 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
586 | 1.13M | for(k = 0; k < 2; k++) |
587 | 755k | { |
588 | 755k | ee[k] = eee[k] + eeo[k]; |
589 | 755k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
590 | 755k | } |
591 | 1.89M | for(k = 0; k < 4; k++) |
592 | 1.51M | { |
593 | 1.51M | e[k] = ee[k] + eo[k]; |
594 | 1.51M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
595 | 1.51M | } |
596 | 3.36M | for(k = 0; k < 8; k++) |
597 | 2.98M | { |
598 | 2.98M | WORD32 itrans_out; |
599 | 2.98M | itrans_out = |
600 | 2.98M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
601 | 2.98M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
602 | 2.98M | itrans_out = |
603 | 2.98M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
604 | 2.98M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
605 | 2.98M | } |
606 | 377k | pi2_tmp++; |
607 | 377k | pu1_pred += pred_strd; |
608 | 377k | pu1_dst += dst_strd; |
609 | 377k | } |
610 | 24.3k | } |
611 | | /************************************************************************************************/ |
612 | | /************************************END - IT_RECON_16x16****************************************/ |
613 | | /************************************************************************************************/ |
614 | 103k | } |
615 | 225k | else /* All rows of input are non-zero */ |
616 | 225k | { |
617 | | /* Inverse Transform 1st stage */ |
618 | | /************************************************************************************************/ |
619 | | /**********************************START - IT_RECON_16x16****************************************/ |
620 | | /************************************************************************************************/ |
621 | | |
622 | 225k | shift = IT_SHIFT_STAGE_1; |
623 | 225k | add = 1 << (shift - 1); |
624 | | |
625 | 2.80M | for(j = 0; j < row_limit_2nd_stage; j++) |
626 | 2.57M | { |
627 | | /* Checking for Zero Cols */ |
628 | 2.57M | if((zero_cols & 1) == 1) |
629 | 343k | { |
630 | 343k | memset(pi2_tmp, 0, trans_size * sizeof(WORD16)); |
631 | 343k | } |
632 | 2.23M | else |
633 | 2.23M | { |
634 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
635 | 20.1M | for(k = 0; k < 8; k++) |
636 | 17.9M | { |
637 | 17.9M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd] |
638 | 17.9M | + g_ai2_ihevc_trans_16[3][k] |
639 | 17.9M | * pi2_src[3 * src_strd] |
640 | 17.9M | + g_ai2_ihevc_trans_16[5][k] |
641 | 17.9M | * pi2_src[5 * src_strd] |
642 | 17.9M | + g_ai2_ihevc_trans_16[7][k] |
643 | 17.9M | * pi2_src[7 * src_strd] |
644 | 17.9M | + g_ai2_ihevc_trans_16[9][k] |
645 | 17.9M | * pi2_src[9 * src_strd] |
646 | 17.9M | + g_ai2_ihevc_trans_16[11][k] |
647 | 17.9M | * pi2_src[11 * src_strd] |
648 | 17.9M | + g_ai2_ihevc_trans_16[13][k] |
649 | 17.9M | * pi2_src[13 * src_strd] |
650 | 17.9M | + g_ai2_ihevc_trans_16[15][k] |
651 | 17.9M | * pi2_src[15 * src_strd]; |
652 | 17.9M | } |
653 | 11.1M | for(k = 0; k < 4; k++) |
654 | 8.96M | { |
655 | 8.96M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd] |
656 | 8.96M | + g_ai2_ihevc_trans_16[6][k] |
657 | 8.96M | * pi2_src[6 * src_strd] |
658 | 8.96M | + g_ai2_ihevc_trans_16[10][k] |
659 | 8.96M | * pi2_src[10 * src_strd] |
660 | 8.96M | + g_ai2_ihevc_trans_16[14][k] |
661 | 8.96M | * pi2_src[14 * src_strd]; |
662 | 8.96M | } |
663 | 2.23M | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd] |
664 | 2.23M | + g_ai2_ihevc_trans_16[12][0] |
665 | 2.23M | * pi2_src[12 * src_strd]; |
666 | 2.23M | eee[0] = |
667 | 2.23M | g_ai2_ihevc_trans_16[0][0] * pi2_src[0] |
668 | 2.23M | + g_ai2_ihevc_trans_16[8][0] |
669 | 2.23M | * pi2_src[8 |
670 | 2.23M | * src_strd]; |
671 | 2.23M | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd] |
672 | 2.23M | + g_ai2_ihevc_trans_16[12][1] |
673 | 2.23M | * pi2_src[12 * src_strd]; |
674 | 2.23M | eee[1] = |
675 | 2.23M | g_ai2_ihevc_trans_16[0][1] * pi2_src[0] |
676 | 2.23M | + g_ai2_ihevc_trans_16[8][1] |
677 | 2.23M | * pi2_src[8 |
678 | 2.23M | * src_strd]; |
679 | | |
680 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
681 | 6.71M | for(k = 0; k < 2; k++) |
682 | 4.48M | { |
683 | 4.48M | ee[k] = eee[k] + eeo[k]; |
684 | 4.48M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
685 | 4.48M | } |
686 | 11.1M | for(k = 0; k < 4; k++) |
687 | 8.96M | { |
688 | 8.96M | e[k] = ee[k] + eo[k]; |
689 | 8.96M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
690 | 8.96M | } |
691 | 20.1M | for(k = 0; k < 8; k++) |
692 | 17.9M | { |
693 | 17.9M | pi2_tmp[k] = |
694 | 17.9M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
695 | 17.9M | pi2_tmp[k + 8] = |
696 | 17.9M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
697 | 17.9M | } |
698 | 2.23M | } |
699 | 2.57M | pi2_src++; |
700 | 2.57M | pi2_tmp += trans_size; |
701 | 2.57M | zero_cols = zero_cols >> 1; |
702 | 2.57M | } |
703 | | |
704 | 225k | pi2_tmp = pi2_tmp_orig; |
705 | | |
706 | | /* Inverse Transform 2nd stage */ |
707 | 225k | shift = IT_SHIFT_STAGE_2; |
708 | 225k | add = 1 << (shift - 1); |
709 | | |
710 | 225k | if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */ |
711 | 69.9k | { |
712 | 1.15M | for(j = 0; j < trans_size; j++) |
713 | 1.08M | { |
714 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
715 | 9.75M | for(k = 0; k < 8; k++) |
716 | 8.67M | { |
717 | 8.67M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
718 | 8.67M | + g_ai2_ihevc_trans_16[3][k] |
719 | 8.67M | * pi2_tmp[3 * trans_size]; |
720 | 8.67M | } |
721 | 5.42M | for(k = 0; k < 4; k++) |
722 | 4.34M | { |
723 | 4.34M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]; |
724 | 4.34M | } |
725 | 1.08M | eeo[0] = 0; |
726 | 1.08M | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
727 | 1.08M | eeo[1] = 0; |
728 | 1.08M | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]; |
729 | | |
730 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
731 | 3.26M | for(k = 0; k < 2; k++) |
732 | 2.17M | { |
733 | 2.17M | ee[k] = eee[k] + eeo[k]; |
734 | 2.17M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
735 | 2.17M | } |
736 | 5.44M | for(k = 0; k < 4; k++) |
737 | 4.35M | { |
738 | 4.35M | e[k] = ee[k] + eo[k]; |
739 | 4.35M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
740 | 4.35M | } |
741 | 9.71M | for(k = 0; k < 8; k++) |
742 | 8.62M | { |
743 | 8.62M | WORD32 itrans_out; |
744 | 8.62M | itrans_out = |
745 | 8.62M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
746 | 8.62M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
747 | 8.62M | itrans_out = |
748 | 8.62M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
749 | 8.62M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
750 | 8.62M | } |
751 | 1.08M | pi2_tmp++; |
752 | 1.08M | pu1_pred += pred_strd; |
753 | 1.08M | pu1_dst += dst_strd; |
754 | 1.08M | } |
755 | 69.9k | } |
756 | 155k | else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */ |
757 | 23.0k | { |
758 | 373k | for(j = 0; j < trans_size; j++) |
759 | 350k | { |
760 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
761 | 3.15M | for(k = 0; k < 8; k++) |
762 | 2.80M | { |
763 | 2.80M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
764 | 2.80M | + g_ai2_ihevc_trans_16[3][k] |
765 | 2.80M | * pi2_tmp[3 * trans_size] |
766 | 2.80M | + g_ai2_ihevc_trans_16[5][k] |
767 | 2.80M | * pi2_tmp[5 * trans_size] |
768 | 2.80M | + g_ai2_ihevc_trans_16[7][k] |
769 | 2.80M | * pi2_tmp[7 * trans_size]; |
770 | 2.80M | } |
771 | 1.75M | for(k = 0; k < 4; k++) |
772 | 1.40M | { |
773 | 1.40M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
774 | 1.40M | + g_ai2_ihevc_trans_16[6][k] |
775 | 1.40M | * pi2_tmp[6 * trans_size]; |
776 | 1.40M | } |
777 | 350k | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]; |
778 | 350k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
779 | 350k | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]; |
780 | 350k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0]; |
781 | | |
782 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
783 | 1.05M | for(k = 0; k < 2; k++) |
784 | 705k | { |
785 | 705k | ee[k] = eee[k] + eeo[k]; |
786 | 705k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
787 | 705k | } |
788 | 1.76M | for(k = 0; k < 4; k++) |
789 | 1.41M | { |
790 | 1.41M | e[k] = ee[k] + eo[k]; |
791 | 1.41M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
792 | 1.41M | } |
793 | 3.13M | for(k = 0; k < 8; k++) |
794 | 2.78M | { |
795 | 2.78M | WORD32 itrans_out; |
796 | 2.78M | itrans_out = |
797 | 2.78M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
798 | 2.78M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
799 | 2.78M | itrans_out = |
800 | 2.78M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
801 | 2.78M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
802 | 2.78M | } |
803 | 350k | pi2_tmp++; |
804 | 350k | pu1_pred += pred_strd; |
805 | 350k | pu1_dst += dst_strd; |
806 | 350k | } |
807 | 23.0k | } |
808 | 132k | else /* All rows of output of 1st stage are non-zero */ |
809 | 132k | { |
810 | 2.24M | for(j = 0; j < trans_size; j++) |
811 | 2.11M | { |
812 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
813 | 19.0M | for(k = 0; k < 8; k++) |
814 | 16.9M | { |
815 | 16.9M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
816 | 16.9M | + g_ai2_ihevc_trans_16[3][k] |
817 | 16.9M | * pi2_tmp[3 * trans_size] |
818 | 16.9M | + g_ai2_ihevc_trans_16[5][k] |
819 | 16.9M | * pi2_tmp[5 * trans_size] |
820 | 16.9M | + g_ai2_ihevc_trans_16[7][k] |
821 | 16.9M | * pi2_tmp[7 * trans_size] |
822 | 16.9M | + g_ai2_ihevc_trans_16[9][k] |
823 | 16.9M | * pi2_tmp[9 * trans_size] |
824 | 16.9M | + g_ai2_ihevc_trans_16[11][k] |
825 | 16.9M | * pi2_tmp[11 * trans_size] |
826 | 16.9M | + g_ai2_ihevc_trans_16[13][k] |
827 | 16.9M | * pi2_tmp[13 * trans_size] |
828 | 16.9M | + g_ai2_ihevc_trans_16[15][k] |
829 | 16.9M | * pi2_tmp[15 * trans_size]; |
830 | 16.9M | } |
831 | 10.5M | for(k = 0; k < 4; k++) |
832 | 8.45M | { |
833 | 8.45M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
834 | 8.45M | + g_ai2_ihevc_trans_16[6][k] |
835 | 8.45M | * pi2_tmp[6 * trans_size] |
836 | 8.45M | + g_ai2_ihevc_trans_16[10][k] |
837 | 8.45M | * pi2_tmp[10 * trans_size] |
838 | 8.45M | + g_ai2_ihevc_trans_16[14][k] |
839 | 8.45M | * pi2_tmp[14 * trans_size]; |
840 | 8.45M | } |
841 | 2.11M | eeo[0] = |
842 | 2.11M | g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size] |
843 | 2.11M | + g_ai2_ihevc_trans_16[12][0] |
844 | 2.11M | * pi2_tmp[12 |
845 | 2.11M | * trans_size]; |
846 | 2.11M | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0] |
847 | 2.11M | + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size]; |
848 | 2.11M | eeo[1] = |
849 | 2.11M | g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size] |
850 | 2.11M | + g_ai2_ihevc_trans_16[12][1] |
851 | 2.11M | * pi2_tmp[12 |
852 | 2.11M | * trans_size]; |
853 | 2.11M | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0] |
854 | 2.11M | + g_ai2_ihevc_trans_16[8][1] * pi2_tmp[8 * trans_size]; |
855 | | |
856 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
857 | 6.34M | for(k = 0; k < 2; k++) |
858 | 4.22M | { |
859 | 4.22M | ee[k] = eee[k] + eeo[k]; |
860 | 4.22M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
861 | 4.22M | } |
862 | 10.5M | for(k = 0; k < 4; k++) |
863 | 8.45M | { |
864 | 8.45M | e[k] = ee[k] + eo[k]; |
865 | 8.45M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
866 | 8.45M | } |
867 | 18.9M | for(k = 0; k < 8; k++) |
868 | 16.8M | { |
869 | 16.8M | WORD32 itrans_out; |
870 | 16.8M | itrans_out = |
871 | 16.8M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
872 | 16.8M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
873 | 16.8M | itrans_out = |
874 | 16.8M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
875 | 16.8M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
876 | 16.8M | } |
877 | 2.11M | pi2_tmp++; |
878 | 2.11M | pu1_pred += pred_strd; |
879 | 2.11M | pu1_dst += dst_strd; |
880 | 2.11M | } |
881 | 132k | } |
882 | | /************************************************************************************************/ |
883 | | /************************************END - IT_RECON_16x16****************************************/ |
884 | | /************************************************************************************************/ |
885 | 225k | } |
886 | | |
887 | 514k | } |
888 | | |