/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 | 67.2k | { |
107 | 67.2k | WORD32 j, k; |
108 | 67.2k | WORD32 e[8], o[8]; |
109 | 67.2k | WORD32 ee[4], eo[4]; |
110 | 67.2k | WORD32 eee[2], eeo[2]; |
111 | 67.2k | WORD32 add; |
112 | 67.2k | WORD32 shift; |
113 | 67.2k | WORD16 *pi2_tmp_orig; |
114 | 67.2k | WORD32 trans_size; |
115 | 67.2k | WORD32 zero_rows_2nd_stage = zero_cols; |
116 | 67.2k | WORD32 row_limit_2nd_stage; |
117 | | |
118 | 67.2k | if((zero_cols & 0xFFF0) == 0xFFF0) |
119 | 3.17k | row_limit_2nd_stage = 4; |
120 | 64.0k | else if((zero_cols & 0xFF00) == 0xFF00) |
121 | 1.98k | row_limit_2nd_stage = 8; |
122 | 62.0k | else |
123 | 62.0k | row_limit_2nd_stage = TRANS_SIZE_16; |
124 | | |
125 | 67.2k | trans_size = TRANS_SIZE_16; |
126 | 67.2k | pi2_tmp_orig = pi2_tmp; |
127 | 67.2k | if((zero_rows & 0xFFF0) == 0xFFF0) /* First 4 rows of input are non-zero */ |
128 | 6.33k | { |
129 | | /* Inverse Transform 1st stage */ |
130 | | /************************************************************************************************/ |
131 | | /**********************************START - IT_RECON_16x16****************************************/ |
132 | | /************************************************************************************************/ |
133 | | |
134 | 6.33k | shift = IT_SHIFT_STAGE_1; |
135 | 6.33k | add = 1 << (shift - 1); |
136 | | |
137 | 97.4k | for(j = 0; j < row_limit_2nd_stage; j++) |
138 | 91.1k | { |
139 | | /* Checking for Zero Cols */ |
140 | 91.1k | if((zero_cols & 1) == 1) |
141 | 1.03k | { |
142 | 1.03k | memset(pi2_tmp, 0, trans_size * sizeof(WORD16)); |
143 | 1.03k | } |
144 | 90.1k | else |
145 | 90.1k | { |
146 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
147 | 810k | for(k = 0; k < 8; k++) |
148 | 720k | { |
149 | 720k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd] |
150 | 720k | + g_ai2_ihevc_trans_16[3][k] |
151 | 720k | * pi2_src[3 * src_strd]; |
152 | 720k | } |
153 | 450k | for(k = 0; k < 4; k++) |
154 | 360k | { |
155 | 360k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd]; |
156 | 360k | } |
157 | 90.1k | eeo[0] = 0; |
158 | 90.1k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0]; |
159 | 90.1k | eeo[1] = 0; |
160 | 90.1k | 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 | 270k | for(k = 0; k < 2; k++) |
164 | 180k | { |
165 | 180k | ee[k] = eee[k] + eeo[k]; |
166 | 180k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
167 | 180k | } |
168 | 450k | for(k = 0; k < 4; k++) |
169 | 360k | { |
170 | 360k | e[k] = ee[k] + eo[k]; |
171 | 360k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
172 | 360k | } |
173 | 810k | for(k = 0; k < 8; k++) |
174 | 720k | { |
175 | 720k | pi2_tmp[k] = |
176 | 720k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
177 | 720k | pi2_tmp[k + 8] = |
178 | 720k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
179 | 720k | } |
180 | 90.1k | } |
181 | 91.1k | pi2_src++; |
182 | 91.1k | pi2_tmp += trans_size; |
183 | 91.1k | zero_cols = zero_cols >> 1; |
184 | 91.1k | } |
185 | | |
186 | 6.33k | pi2_tmp = pi2_tmp_orig; |
187 | | |
188 | | /* Inverse Transform 2nd stage */ |
189 | 6.33k | shift = IT_SHIFT_STAGE_2; |
190 | 6.33k | add = 1 << (shift - 1); |
191 | | |
192 | 6.33k | if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */ |
193 | 753 | { |
194 | 12.8k | for(j = 0; j < trans_size; j++) |
195 | 12.0k | { |
196 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
197 | 108k | for(k = 0; k < 8; k++) |
198 | 96.3k | { |
199 | 96.3k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
200 | 96.3k | + g_ai2_ihevc_trans_16[3][k] |
201 | 96.3k | * pi2_tmp[3 * trans_size]; |
202 | 96.3k | } |
203 | 60.2k | for(k = 0; k < 4; k++) |
204 | 48.1k | { |
205 | 48.1k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]; |
206 | 48.1k | } |
207 | 12.0k | eeo[0] = 0; |
208 | 12.0k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
209 | 12.0k | eeo[1] = 0; |
210 | 12.0k | 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 | 36.1k | for(k = 0; k < 2; k++) |
214 | 24.0k | { |
215 | 24.0k | ee[k] = eee[k] + eeo[k]; |
216 | 24.0k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
217 | 24.0k | } |
218 | 60.2k | for(k = 0; k < 4; k++) |
219 | 48.1k | { |
220 | 48.1k | e[k] = ee[k] + eo[k]; |
221 | 48.1k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
222 | 48.1k | } |
223 | 108k | for(k = 0; k < 8; k++) |
224 | 96.3k | { |
225 | 96.3k | WORD32 itrans_out; |
226 | 96.3k | itrans_out = |
227 | 96.3k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
228 | 96.3k | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
229 | 96.3k | itrans_out = |
230 | 96.3k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
231 | 96.3k | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
232 | 96.3k | } |
233 | 12.0k | pi2_tmp++; |
234 | 12.0k | pu1_pred += pred_strd; |
235 | 12.0k | pu1_dst += dst_strd; |
236 | 12.0k | } |
237 | 753 | } |
238 | 5.57k | else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */ |
239 | 142 | { |
240 | 2.41k | for(j = 0; j < trans_size; j++) |
241 | 2.27k | { |
242 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
243 | 20.4k | for(k = 0; k < 8; k++) |
244 | 18.1k | { |
245 | 18.1k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
246 | 18.1k | + g_ai2_ihevc_trans_16[3][k] |
247 | 18.1k | * pi2_tmp[3 * trans_size] |
248 | 18.1k | + g_ai2_ihevc_trans_16[5][k] |
249 | 18.1k | * pi2_tmp[5 * trans_size] |
250 | 18.1k | + g_ai2_ihevc_trans_16[7][k] |
251 | 18.1k | * pi2_tmp[7 * trans_size]; |
252 | 18.1k | } |
253 | 11.3k | for(k = 0; k < 4; k++) |
254 | 9.08k | { |
255 | 9.08k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
256 | 9.08k | + g_ai2_ihevc_trans_16[6][k] |
257 | 9.08k | * pi2_tmp[6 * trans_size]; |
258 | 9.08k | } |
259 | 2.27k | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]; |
260 | 2.27k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
261 | 2.27k | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]; |
262 | 2.27k | 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 | 6.81k | for(k = 0; k < 2; k++) |
266 | 4.54k | { |
267 | 4.54k | ee[k] = eee[k] + eeo[k]; |
268 | 4.54k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
269 | 4.54k | } |
270 | 11.3k | for(k = 0; k < 4; k++) |
271 | 9.08k | { |
272 | 9.08k | e[k] = ee[k] + eo[k]; |
273 | 9.08k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
274 | 9.08k | } |
275 | 20.4k | for(k = 0; k < 8; k++) |
276 | 18.1k | { |
277 | 18.1k | WORD32 itrans_out; |
278 | 18.1k | itrans_out = |
279 | 18.1k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
280 | 18.1k | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
281 | 18.1k | itrans_out = |
282 | 18.1k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
283 | 18.1k | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
284 | 18.1k | } |
285 | 2.27k | pi2_tmp++; |
286 | 2.27k | pu1_pred += pred_strd; |
287 | 2.27k | pu1_dst += dst_strd; |
288 | 2.27k | } |
289 | 142 | } |
290 | 5.43k | else /* All rows of output of 1st stage are non-zero */ |
291 | 5.43k | { |
292 | 92.4k | for(j = 0; j < trans_size; j++) |
293 | 86.9k | { |
294 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
295 | 782k | for(k = 0; k < 8; k++) |
296 | 695k | { |
297 | 695k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
298 | 695k | + g_ai2_ihevc_trans_16[3][k] |
299 | 695k | * pi2_tmp[3 * trans_size] |
300 | 695k | + g_ai2_ihevc_trans_16[5][k] |
301 | 695k | * pi2_tmp[5 * trans_size] |
302 | 695k | + g_ai2_ihevc_trans_16[7][k] |
303 | 695k | * pi2_tmp[7 * trans_size] |
304 | 695k | + g_ai2_ihevc_trans_16[9][k] |
305 | 695k | * pi2_tmp[9 * trans_size] |
306 | 695k | + g_ai2_ihevc_trans_16[11][k] |
307 | 695k | * pi2_tmp[11 * trans_size] |
308 | 695k | + g_ai2_ihevc_trans_16[13][k] |
309 | 695k | * pi2_tmp[13 * trans_size] |
310 | 695k | + g_ai2_ihevc_trans_16[15][k] |
311 | 695k | * pi2_tmp[15 * trans_size]; |
312 | 695k | } |
313 | 434k | for(k = 0; k < 4; k++) |
314 | 347k | { |
315 | 347k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
316 | 347k | + g_ai2_ihevc_trans_16[6][k] |
317 | 347k | * pi2_tmp[6 * trans_size] |
318 | 347k | + g_ai2_ihevc_trans_16[10][k] |
319 | 347k | * pi2_tmp[10 * trans_size] |
320 | 347k | + g_ai2_ihevc_trans_16[14][k] |
321 | 347k | * pi2_tmp[14 * trans_size]; |
322 | 347k | } |
323 | 86.9k | eeo[0] = |
324 | 86.9k | g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size] |
325 | 86.9k | + g_ai2_ihevc_trans_16[12][0] |
326 | 86.9k | * pi2_tmp[12 |
327 | 86.9k | * trans_size]; |
328 | 86.9k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0] |
329 | 86.9k | + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size]; |
330 | 86.9k | eeo[1] = |
331 | 86.9k | g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size] |
332 | 86.9k | + g_ai2_ihevc_trans_16[12][1] |
333 | 86.9k | * pi2_tmp[12 |
334 | 86.9k | * trans_size]; |
335 | 86.9k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0] |
336 | 86.9k | + 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 | 260k | for(k = 0; k < 2; k++) |
340 | 173k | { |
341 | 173k | ee[k] = eee[k] + eeo[k]; |
342 | 173k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
343 | 173k | } |
344 | 434k | for(k = 0; k < 4; k++) |
345 | 347k | { |
346 | 347k | e[k] = ee[k] + eo[k]; |
347 | 347k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
348 | 347k | } |
349 | 782k | for(k = 0; k < 8; k++) |
350 | 695k | { |
351 | 695k | WORD32 itrans_out; |
352 | 695k | itrans_out = |
353 | 695k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
354 | 695k | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
355 | 695k | itrans_out = |
356 | 695k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
357 | 695k | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
358 | 695k | } |
359 | 86.9k | pi2_tmp++; |
360 | 86.9k | pu1_pred += pred_strd; |
361 | 86.9k | pu1_dst += dst_strd; |
362 | 86.9k | } |
363 | 5.43k | } |
364 | | /************************************************************************************************/ |
365 | | /************************************END - IT_RECON_16x16****************************************/ |
366 | | /************************************************************************************************/ |
367 | 6.33k | } |
368 | 60.9k | else if((zero_rows & 0xFF00) == 0xFF00) /* First 8 rows of input are non-zero */ |
369 | 3.65k | { |
370 | | /* Inverse Transform 1st stage */ |
371 | | /************************************************************************************************/ |
372 | | /**********************************START - IT_RECON_16x16****************************************/ |
373 | | /************************************************************************************************/ |
374 | | |
375 | 3.65k | shift = IT_SHIFT_STAGE_1; |
376 | 3.65k | add = 1 << (shift - 1); |
377 | | |
378 | 54.9k | for(j = 0; j < row_limit_2nd_stage; j++) |
379 | 51.3k | { |
380 | | /* Checking for Zero Cols */ |
381 | 51.3k | if((zero_cols & 1) == 1) |
382 | 3.58k | { |
383 | 3.58k | memset(pi2_tmp, 0, trans_size * sizeof(WORD16)); |
384 | 3.58k | } |
385 | 47.7k | else |
386 | 47.7k | { |
387 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
388 | 429k | for(k = 0; k < 8; k++) |
389 | 381k | { |
390 | 381k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd] |
391 | 381k | + g_ai2_ihevc_trans_16[3][k] |
392 | 381k | * pi2_src[3 * src_strd] |
393 | 381k | + g_ai2_ihevc_trans_16[5][k] |
394 | 381k | * pi2_src[5 * src_strd] |
395 | 381k | + g_ai2_ihevc_trans_16[7][k] |
396 | 381k | * pi2_src[7 * src_strd]; |
397 | 381k | } |
398 | 238k | for(k = 0; k < 4; k++) |
399 | 190k | { |
400 | 190k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd] |
401 | 190k | + g_ai2_ihevc_trans_16[6][k] |
402 | 190k | * pi2_src[6 * src_strd]; |
403 | 190k | } |
404 | 47.7k | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd]; |
405 | 47.7k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_src[0]; |
406 | 47.7k | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd]; |
407 | 47.7k | 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 | 143k | for(k = 0; k < 2; k++) |
411 | 95.4k | { |
412 | 95.4k | ee[k] = eee[k] + eeo[k]; |
413 | 95.4k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
414 | 95.4k | } |
415 | 238k | for(k = 0; k < 4; k++) |
416 | 190k | { |
417 | 190k | e[k] = ee[k] + eo[k]; |
418 | 190k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
419 | 190k | } |
420 | 429k | for(k = 0; k < 8; k++) |
421 | 381k | { |
422 | 381k | pi2_tmp[k] = |
423 | 381k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
424 | 381k | pi2_tmp[k + 8] = |
425 | 381k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
426 | 381k | } |
427 | 47.7k | } |
428 | 51.3k | pi2_src++; |
429 | 51.3k | pi2_tmp += trans_size; |
430 | 51.3k | zero_cols = zero_cols >> 1; |
431 | 51.3k | } |
432 | | |
433 | 3.65k | pi2_tmp = pi2_tmp_orig; |
434 | | |
435 | | /* Inverse Transform 2nd stage */ |
436 | 3.65k | shift = IT_SHIFT_STAGE_2; |
437 | 3.65k | add = 1 << (shift - 1); |
438 | | |
439 | 3.65k | if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */ |
440 | 419 | { |
441 | 7.12k | for(j = 0; j < trans_size; j++) |
442 | 6.70k | { |
443 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
444 | 60.3k | for(k = 0; k < 8; k++) |
445 | 53.6k | { |
446 | 53.6k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
447 | 53.6k | + g_ai2_ihevc_trans_16[3][k] |
448 | 53.6k | * pi2_tmp[3 * trans_size]; |
449 | 53.6k | } |
450 | 33.5k | for(k = 0; k < 4; k++) |
451 | 26.8k | { |
452 | 26.8k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]; |
453 | 26.8k | } |
454 | 6.70k | eeo[0] = 0; |
455 | 6.70k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
456 | 6.70k | eeo[1] = 0; |
457 | 6.70k | 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 | 20.1k | for(k = 0; k < 2; k++) |
461 | 13.4k | { |
462 | 13.4k | ee[k] = eee[k] + eeo[k]; |
463 | 13.4k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
464 | 13.4k | } |
465 | 33.5k | for(k = 0; k < 4; k++) |
466 | 26.8k | { |
467 | 26.8k | e[k] = ee[k] + eo[k]; |
468 | 26.8k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
469 | 26.8k | } |
470 | 60.3k | for(k = 0; k < 8; k++) |
471 | 53.6k | { |
472 | 53.6k | WORD32 itrans_out; |
473 | 53.6k | itrans_out = |
474 | 53.6k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
475 | 53.6k | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
476 | 53.6k | itrans_out = |
477 | 53.6k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
478 | 53.6k | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
479 | 53.6k | } |
480 | 6.70k | pi2_tmp++; |
481 | 6.70k | pu1_pred += pred_strd; |
482 | 6.70k | pu1_dst += dst_strd; |
483 | 6.70k | } |
484 | 419 | } |
485 | 3.23k | else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */ |
486 | 258 | { |
487 | 4.38k | for(j = 0; j < trans_size; j++) |
488 | 4.12k | { |
489 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
490 | 37.1k | for(k = 0; k < 8; k++) |
491 | 33.0k | { |
492 | 33.0k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
493 | 33.0k | + g_ai2_ihevc_trans_16[3][k] |
494 | 33.0k | * pi2_tmp[3 * trans_size] |
495 | 33.0k | + g_ai2_ihevc_trans_16[5][k] |
496 | 33.0k | * pi2_tmp[5 * trans_size] |
497 | 33.0k | + g_ai2_ihevc_trans_16[7][k] |
498 | 33.0k | * pi2_tmp[7 * trans_size]; |
499 | 33.0k | } |
500 | 20.6k | for(k = 0; k < 4; k++) |
501 | 16.5k | { |
502 | 16.5k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
503 | 16.5k | + g_ai2_ihevc_trans_16[6][k] |
504 | 16.5k | * pi2_tmp[6 * trans_size]; |
505 | 16.5k | } |
506 | 4.12k | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]; |
507 | 4.12k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
508 | 4.12k | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]; |
509 | 4.12k | 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 | 12.3k | for(k = 0; k < 2; k++) |
513 | 8.25k | { |
514 | 8.25k | ee[k] = eee[k] + eeo[k]; |
515 | 8.25k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
516 | 8.25k | } |
517 | 20.6k | for(k = 0; k < 4; k++) |
518 | 16.5k | { |
519 | 16.5k | e[k] = ee[k] + eo[k]; |
520 | 16.5k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
521 | 16.5k | } |
522 | 37.1k | for(k = 0; k < 8; k++) |
523 | 33.0k | { |
524 | 33.0k | WORD32 itrans_out; |
525 | 33.0k | itrans_out = |
526 | 33.0k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
527 | 33.0k | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
528 | 33.0k | itrans_out = |
529 | 33.0k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
530 | 33.0k | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
531 | 33.0k | } |
532 | 4.12k | pi2_tmp++; |
533 | 4.12k | pu1_pred += pred_strd; |
534 | 4.12k | pu1_dst += dst_strd; |
535 | 4.12k | } |
536 | 258 | } |
537 | 2.97k | else /* All rows of output of 1st stage are non-zero */ |
538 | 2.97k | { |
539 | 50.5k | for(j = 0; j < trans_size; j++) |
540 | 47.5k | { |
541 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
542 | 428k | for(k = 0; k < 8; k++) |
543 | 380k | { |
544 | 380k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
545 | 380k | + g_ai2_ihevc_trans_16[3][k] |
546 | 380k | * pi2_tmp[3 * trans_size] |
547 | 380k | + g_ai2_ihevc_trans_16[5][k] |
548 | 380k | * pi2_tmp[5 * trans_size] |
549 | 380k | + g_ai2_ihevc_trans_16[7][k] |
550 | 380k | * pi2_tmp[7 * trans_size] |
551 | 380k | + g_ai2_ihevc_trans_16[9][k] |
552 | 380k | * pi2_tmp[9 * trans_size] |
553 | 380k | + g_ai2_ihevc_trans_16[11][k] |
554 | 380k | * pi2_tmp[11 * trans_size] |
555 | 380k | + g_ai2_ihevc_trans_16[13][k] |
556 | 380k | * pi2_tmp[13 * trans_size] |
557 | 380k | + g_ai2_ihevc_trans_16[15][k] |
558 | 380k | * pi2_tmp[15 * trans_size]; |
559 | 380k | } |
560 | 237k | for(k = 0; k < 4; k++) |
561 | 190k | { |
562 | 190k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
563 | 190k | + g_ai2_ihevc_trans_16[6][k] |
564 | 190k | * pi2_tmp[6 * trans_size] |
565 | 190k | + g_ai2_ihevc_trans_16[10][k] |
566 | 190k | * pi2_tmp[10 * trans_size] |
567 | 190k | + g_ai2_ihevc_trans_16[14][k] |
568 | 190k | * pi2_tmp[14 * trans_size]; |
569 | 190k | } |
570 | 47.5k | eeo[0] = |
571 | 47.5k | g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size] |
572 | 47.5k | + g_ai2_ihevc_trans_16[12][0] |
573 | 47.5k | * pi2_tmp[12 |
574 | 47.5k | * trans_size]; |
575 | 47.5k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0] |
576 | 47.5k | + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size]; |
577 | 47.5k | eeo[1] = |
578 | 47.5k | g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size] |
579 | 47.5k | + g_ai2_ihevc_trans_16[12][1] |
580 | 47.5k | * pi2_tmp[12 |
581 | 47.5k | * trans_size]; |
582 | 47.5k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0] |
583 | 47.5k | + 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 | 142k | for(k = 0; k < 2; k++) |
587 | 95.1k | { |
588 | 95.1k | ee[k] = eee[k] + eeo[k]; |
589 | 95.1k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
590 | 95.1k | } |
591 | 237k | for(k = 0; k < 4; k++) |
592 | 190k | { |
593 | 190k | e[k] = ee[k] + eo[k]; |
594 | 190k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
595 | 190k | } |
596 | 428k | for(k = 0; k < 8; k++) |
597 | 380k | { |
598 | 380k | WORD32 itrans_out; |
599 | 380k | itrans_out = |
600 | 380k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
601 | 380k | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
602 | 380k | itrans_out = |
603 | 380k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
604 | 380k | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
605 | 380k | } |
606 | 47.5k | pi2_tmp++; |
607 | 47.5k | pu1_pred += pred_strd; |
608 | 47.5k | pu1_dst += dst_strd; |
609 | 47.5k | } |
610 | 2.97k | } |
611 | | /************************************************************************************************/ |
612 | | /************************************END - IT_RECON_16x16****************************************/ |
613 | | /************************************************************************************************/ |
614 | 3.65k | } |
615 | 57.2k | else /* All rows of input are non-zero */ |
616 | 57.2k | { |
617 | | /* Inverse Transform 1st stage */ |
618 | | /************************************************************************************************/ |
619 | | /**********************************START - IT_RECON_16x16****************************************/ |
620 | | /************************************************************************************************/ |
621 | | |
622 | 57.2k | shift = IT_SHIFT_STAGE_1; |
623 | 57.2k | add = 1 << (shift - 1); |
624 | | |
625 | 936k | for(j = 0; j < row_limit_2nd_stage; j++) |
626 | 879k | { |
627 | | /* Checking for Zero Cols */ |
628 | 879k | if((zero_cols & 1) == 1) |
629 | 10.2k | { |
630 | 10.2k | memset(pi2_tmp, 0, trans_size * sizeof(WORD16)); |
631 | 10.2k | } |
632 | 869k | else |
633 | 869k | { |
634 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
635 | 7.82M | for(k = 0; k < 8; k++) |
636 | 6.95M | { |
637 | 6.95M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_src[src_strd] |
638 | 6.95M | + g_ai2_ihevc_trans_16[3][k] |
639 | 6.95M | * pi2_src[3 * src_strd] |
640 | 6.95M | + g_ai2_ihevc_trans_16[5][k] |
641 | 6.95M | * pi2_src[5 * src_strd] |
642 | 6.95M | + g_ai2_ihevc_trans_16[7][k] |
643 | 6.95M | * pi2_src[7 * src_strd] |
644 | 6.95M | + g_ai2_ihevc_trans_16[9][k] |
645 | 6.95M | * pi2_src[9 * src_strd] |
646 | 6.95M | + g_ai2_ihevc_trans_16[11][k] |
647 | 6.95M | * pi2_src[11 * src_strd] |
648 | 6.95M | + g_ai2_ihevc_trans_16[13][k] |
649 | 6.95M | * pi2_src[13 * src_strd] |
650 | 6.95M | + g_ai2_ihevc_trans_16[15][k] |
651 | 6.95M | * pi2_src[15 * src_strd]; |
652 | 6.95M | } |
653 | 4.34M | for(k = 0; k < 4; k++) |
654 | 3.47M | { |
655 | 3.47M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_src[2 * src_strd] |
656 | 3.47M | + g_ai2_ihevc_trans_16[6][k] |
657 | 3.47M | * pi2_src[6 * src_strd] |
658 | 3.47M | + g_ai2_ihevc_trans_16[10][k] |
659 | 3.47M | * pi2_src[10 * src_strd] |
660 | 3.47M | + g_ai2_ihevc_trans_16[14][k] |
661 | 3.47M | * pi2_src[14 * src_strd]; |
662 | 3.47M | } |
663 | 869k | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_src[4 * src_strd] |
664 | 869k | + g_ai2_ihevc_trans_16[12][0] |
665 | 869k | * pi2_src[12 * src_strd]; |
666 | 869k | eee[0] = |
667 | 869k | g_ai2_ihevc_trans_16[0][0] * pi2_src[0] |
668 | 869k | + g_ai2_ihevc_trans_16[8][0] |
669 | 869k | * pi2_src[8 |
670 | 869k | * src_strd]; |
671 | 869k | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_src[4 * src_strd] |
672 | 869k | + g_ai2_ihevc_trans_16[12][1] |
673 | 869k | * pi2_src[12 * src_strd]; |
674 | 869k | eee[1] = |
675 | 869k | g_ai2_ihevc_trans_16[0][1] * pi2_src[0] |
676 | 869k | + g_ai2_ihevc_trans_16[8][1] |
677 | 869k | * pi2_src[8 |
678 | 869k | * src_strd]; |
679 | | |
680 | | /* Combining e and o terms at each hierarchy levels to calculate the final spatial domain vector */ |
681 | 2.60M | for(k = 0; k < 2; k++) |
682 | 1.73M | { |
683 | 1.73M | ee[k] = eee[k] + eeo[k]; |
684 | 1.73M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
685 | 1.73M | } |
686 | 4.34M | for(k = 0; k < 4; k++) |
687 | 3.47M | { |
688 | 3.47M | e[k] = ee[k] + eo[k]; |
689 | 3.47M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
690 | 3.47M | } |
691 | 7.82M | for(k = 0; k < 8; k++) |
692 | 6.95M | { |
693 | 6.95M | pi2_tmp[k] = |
694 | 6.95M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
695 | 6.95M | pi2_tmp[k + 8] = |
696 | 6.95M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
697 | 6.95M | } |
698 | 869k | } |
699 | 879k | pi2_src++; |
700 | 879k | pi2_tmp += trans_size; |
701 | 879k | zero_cols = zero_cols >> 1; |
702 | 879k | } |
703 | | |
704 | 57.2k | pi2_tmp = pi2_tmp_orig; |
705 | | |
706 | | /* Inverse Transform 2nd stage */ |
707 | 57.2k | shift = IT_SHIFT_STAGE_2; |
708 | 57.2k | add = 1 << (shift - 1); |
709 | | |
710 | 57.2k | if((zero_rows_2nd_stage & 0xFFF0) == 0xFFF0) /* First 4 rows of output of 1st stage are non-zero */ |
711 | 1.99k | { |
712 | 33.9k | for(j = 0; j < trans_size; j++) |
713 | 31.9k | { |
714 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
715 | 287k | for(k = 0; k < 8; k++) |
716 | 255k | { |
717 | 255k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
718 | 255k | + g_ai2_ihevc_trans_16[3][k] |
719 | 255k | * pi2_tmp[3 * trans_size]; |
720 | 255k | } |
721 | 159k | for(k = 0; k < 4; k++) |
722 | 127k | { |
723 | 127k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size]; |
724 | 127k | } |
725 | 31.9k | eeo[0] = 0; |
726 | 31.9k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
727 | 31.9k | eeo[1] = 0; |
728 | 31.9k | 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 | 95.9k | for(k = 0; k < 2; k++) |
732 | 63.9k | { |
733 | 63.9k | ee[k] = eee[k] + eeo[k]; |
734 | 63.9k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
735 | 63.9k | } |
736 | 159k | for(k = 0; k < 4; k++) |
737 | 127k | { |
738 | 127k | e[k] = ee[k] + eo[k]; |
739 | 127k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
740 | 127k | } |
741 | 287k | for(k = 0; k < 8; k++) |
742 | 255k | { |
743 | 255k | WORD32 itrans_out; |
744 | 255k | itrans_out = |
745 | 255k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
746 | 255k | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
747 | 255k | itrans_out = |
748 | 255k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
749 | 255k | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
750 | 255k | } |
751 | 31.9k | pi2_tmp++; |
752 | 31.9k | pu1_pred += pred_strd; |
753 | 31.9k | pu1_dst += dst_strd; |
754 | 31.9k | } |
755 | 1.99k | } |
756 | 55.2k | else if((zero_rows_2nd_stage & 0xFF00) == 0xFF00) /* First 4 rows of output of 1st stage are non-zero */ |
757 | 1.58k | { |
758 | 26.9k | for(j = 0; j < trans_size; j++) |
759 | 25.4k | { |
760 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
761 | 228k | for(k = 0; k < 8; k++) |
762 | 203k | { |
763 | 203k | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
764 | 203k | + g_ai2_ihevc_trans_16[3][k] |
765 | 203k | * pi2_tmp[3 * trans_size] |
766 | 203k | + g_ai2_ihevc_trans_16[5][k] |
767 | 203k | * pi2_tmp[5 * trans_size] |
768 | 203k | + g_ai2_ihevc_trans_16[7][k] |
769 | 203k | * pi2_tmp[7 * trans_size]; |
770 | 203k | } |
771 | 127k | for(k = 0; k < 4; k++) |
772 | 101k | { |
773 | 101k | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
774 | 101k | + g_ai2_ihevc_trans_16[6][k] |
775 | 101k | * pi2_tmp[6 * trans_size]; |
776 | 101k | } |
777 | 25.4k | eeo[0] = g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size]; |
778 | 25.4k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0]; |
779 | 25.4k | eeo[1] = g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size]; |
780 | 25.4k | 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 | 76.2k | for(k = 0; k < 2; k++) |
784 | 50.8k | { |
785 | 50.8k | ee[k] = eee[k] + eeo[k]; |
786 | 50.8k | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
787 | 50.8k | } |
788 | 127k | for(k = 0; k < 4; k++) |
789 | 101k | { |
790 | 101k | e[k] = ee[k] + eo[k]; |
791 | 101k | e[k + 4] = ee[3 - k] - eo[3 - k]; |
792 | 101k | } |
793 | 228k | for(k = 0; k < 8; k++) |
794 | 203k | { |
795 | 203k | WORD32 itrans_out; |
796 | 203k | itrans_out = |
797 | 203k | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
798 | 203k | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
799 | 203k | itrans_out = |
800 | 203k | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
801 | 203k | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
802 | 203k | } |
803 | 25.4k | pi2_tmp++; |
804 | 25.4k | pu1_pred += pred_strd; |
805 | 25.4k | pu1_dst += dst_strd; |
806 | 25.4k | } |
807 | 1.58k | } |
808 | 53.6k | else /* All rows of output of 1st stage are non-zero */ |
809 | 53.6k | { |
810 | 912k | for(j = 0; j < trans_size; j++) |
811 | 858k | { |
812 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
813 | 7.72M | for(k = 0; k < 8; k++) |
814 | 6.87M | { |
815 | 6.87M | o[k] = g_ai2_ihevc_trans_16[1][k] * pi2_tmp[trans_size] |
816 | 6.87M | + g_ai2_ihevc_trans_16[3][k] |
817 | 6.87M | * pi2_tmp[3 * trans_size] |
818 | 6.87M | + g_ai2_ihevc_trans_16[5][k] |
819 | 6.87M | * pi2_tmp[5 * trans_size] |
820 | 6.87M | + g_ai2_ihevc_trans_16[7][k] |
821 | 6.87M | * pi2_tmp[7 * trans_size] |
822 | 6.87M | + g_ai2_ihevc_trans_16[9][k] |
823 | 6.87M | * pi2_tmp[9 * trans_size] |
824 | 6.87M | + g_ai2_ihevc_trans_16[11][k] |
825 | 6.87M | * pi2_tmp[11 * trans_size] |
826 | 6.87M | + g_ai2_ihevc_trans_16[13][k] |
827 | 6.87M | * pi2_tmp[13 * trans_size] |
828 | 6.87M | + g_ai2_ihevc_trans_16[15][k] |
829 | 6.87M | * pi2_tmp[15 * trans_size]; |
830 | 6.87M | } |
831 | 4.29M | for(k = 0; k < 4; k++) |
832 | 3.43M | { |
833 | 3.43M | eo[k] = g_ai2_ihevc_trans_16[2][k] * pi2_tmp[2 * trans_size] |
834 | 3.43M | + g_ai2_ihevc_trans_16[6][k] |
835 | 3.43M | * pi2_tmp[6 * trans_size] |
836 | 3.43M | + g_ai2_ihevc_trans_16[10][k] |
837 | 3.43M | * pi2_tmp[10 * trans_size] |
838 | 3.43M | + g_ai2_ihevc_trans_16[14][k] |
839 | 3.43M | * pi2_tmp[14 * trans_size]; |
840 | 3.43M | } |
841 | 858k | eeo[0] = |
842 | 858k | g_ai2_ihevc_trans_16[4][0] * pi2_tmp[4 * trans_size] |
843 | 858k | + g_ai2_ihevc_trans_16[12][0] |
844 | 858k | * pi2_tmp[12 |
845 | 858k | * trans_size]; |
846 | 858k | eee[0] = g_ai2_ihevc_trans_16[0][0] * pi2_tmp[0] |
847 | 858k | + g_ai2_ihevc_trans_16[8][0] * pi2_tmp[8 * trans_size]; |
848 | 858k | eeo[1] = |
849 | 858k | g_ai2_ihevc_trans_16[4][1] * pi2_tmp[4 * trans_size] |
850 | 858k | + g_ai2_ihevc_trans_16[12][1] |
851 | 858k | * pi2_tmp[12 |
852 | 858k | * trans_size]; |
853 | 858k | eee[1] = g_ai2_ihevc_trans_16[0][1] * pi2_tmp[0] |
854 | 858k | + 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 | 2.57M | for(k = 0; k < 2; k++) |
858 | 1.71M | { |
859 | 1.71M | ee[k] = eee[k] + eeo[k]; |
860 | 1.71M | ee[k + 2] = eee[1 - k] - eeo[1 - k]; |
861 | 1.71M | } |
862 | 4.29M | for(k = 0; k < 4; k++) |
863 | 3.43M | { |
864 | 3.43M | e[k] = ee[k] + eo[k]; |
865 | 3.43M | e[k + 4] = ee[3 - k] - eo[3 - k]; |
866 | 3.43M | } |
867 | 7.72M | for(k = 0; k < 8; k++) |
868 | 6.87M | { |
869 | 6.87M | WORD32 itrans_out; |
870 | 6.87M | itrans_out = |
871 | 6.87M | CLIP_S16(((e[k] + o[k] + add) >> shift)); |
872 | 6.87M | pu1_dst[k] = CLIP_U8((itrans_out + pu1_pred[k])); |
873 | 6.87M | itrans_out = |
874 | 6.87M | CLIP_S16(((e[7 - k] - o[7 - k] + add) >> shift)); |
875 | 6.87M | pu1_dst[k + 8] = CLIP_U8((itrans_out + pu1_pred[k + 8])); |
876 | 6.87M | } |
877 | 858k | pi2_tmp++; |
878 | 858k | pu1_pred += pred_strd; |
879 | 858k | pu1_dst += dst_strd; |
880 | 858k | } |
881 | 53.6k | } |
882 | | /************************************************************************************************/ |
883 | | /************************************END - IT_RECON_16x16****************************************/ |
884 | | /************************************************************************************************/ |
885 | 57.2k | } |
886 | | |
887 | 67.2k | } |
888 | | |