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