/src/libhevc/common/ihevc_resi_trans.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2018 The Android Open Source Project |
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 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | /** |
21 | | ******************************************************************************* |
22 | | * @file |
23 | | * ihevc_resi_trans.c |
24 | | * |
25 | | * @brief |
26 | | * Contains function definitions for residual and forward transform |
27 | | * |
28 | | * @author |
29 | | * 100470 |
30 | | * |
31 | | * @par List of Functions: |
32 | | * - ihevc_resi_trans_4x4_ttype1() |
33 | | * - ihevc_resi_trans_4x4() |
34 | | * - ihevc_resi_trans_8x8() |
35 | | * - ihevc_resi_trans_16x16() |
36 | | * - ihevc_resi_trans_32x32() |
37 | | * |
38 | | * @remarks |
39 | | * None |
40 | | * |
41 | | ******************************************************************************* |
42 | | */ |
43 | | #include <stdio.h> |
44 | | #include <string.h> |
45 | | #include <stdlib.h> |
46 | | #include "ihevc_typedefs.h" |
47 | | #include "ihevc_macros.h" |
48 | | #include "ihevc_platform_macros.h" |
49 | | #include "ihevc_defs.h" |
50 | | #include "ihevc_trans_tables.h" |
51 | | #include "ihevc_resi_trans.h" |
52 | | #include "ihevc_trans_macros.h" |
53 | | |
54 | | /** |
55 | | ******************************************************************************* |
56 | | * |
57 | | * @brief |
58 | | * This function performs residue calculation and forward transform type 1 |
59 | | * on input pixels |
60 | | * |
61 | | * @par Description: |
62 | | * Performs residue calculation by subtracting source and prediction and |
63 | | * followed by forward transform |
64 | | * |
65 | | * @param[in] pu1_src |
66 | | * Input 4x4 pixels |
67 | | * |
68 | | * @param[in] pu1_pred |
69 | | * Prediction data |
70 | | * |
71 | | * @param[in] pi2_tmp |
72 | | * Temporary buffer of size 4x4 |
73 | | * |
74 | | * @param[out] pi2_dst |
75 | | * Output 4x4 coefficients |
76 | | * |
77 | | * @param[in] src_strd |
78 | | * Input stride |
79 | | * |
80 | | * @param[in] pred_strd |
81 | | * Prediction Stride |
82 | | * |
83 | | * @param[in] dst_strd |
84 | | * Output Stride |
85 | | * |
86 | | * @param[in] e_chroma_plane |
87 | | * Enum singalling chroma plane |
88 | | * |
89 | | * |
90 | | * @returns Void |
91 | | * |
92 | | * @remarks |
93 | | * None |
94 | | * |
95 | | ******************************************************************************* |
96 | | */ |
97 | | |
98 | | UWORD32 ihevc_resi_trans_4x4_ttype1(UWORD8 *pu1_src, |
99 | | UWORD8 *pu1_pred, |
100 | | WORD32 *pi4_temp, |
101 | | WORD16 *pi2_dst, |
102 | | WORD32 src_strd, |
103 | | WORD32 pred_strd, |
104 | | WORD32 dst_strd, |
105 | | CHROMA_PLANE_ID_T e_chroma_plane) |
106 | 7.23M | { |
107 | 7.23M | WORD32 i, c[4]; |
108 | 7.23M | WORD32 add, shift; |
109 | 7.23M | WORD32 trans_size; |
110 | 7.23M | WORD32 *pi4_tmp_orig; |
111 | 7.23M | WORD16 *pi2_dst_orig; |
112 | 7.23M | UWORD32 u4_blk_sad = 0; |
113 | 7.23M | UNUSED(e_chroma_plane); |
114 | | |
115 | 7.23M | pi2_dst_orig = pi2_dst; |
116 | 7.23M | pi4_tmp_orig = pi4_temp; |
117 | 7.23M | trans_size = TRANS_SIZE_4; |
118 | | |
119 | | /* Residue + Forward Transform 1st stage */ |
120 | 7.23M | shift = 1; // log2(iWidth) - 1 + g_uiBitIncrement |
121 | 7.23M | add = 1 << (shift - 1); |
122 | | |
123 | 36.1M | for(i = 0; i < trans_size; i++) |
124 | 28.9M | { |
125 | 28.9M | WORD32 resi_tmp_1, resi_tmp_2, resi_tmp_3; |
126 | | |
127 | | // Intermediate Variables |
128 | 28.9M | resi_tmp_1 = pu1_src[0] - pu1_pred[0]; |
129 | 28.9M | resi_tmp_2 = pu1_src[3] - pu1_pred[3]; |
130 | 28.9M | c[0] = resi_tmp_1 + resi_tmp_2; |
131 | 28.9M | u4_blk_sad += abs(resi_tmp_1) + abs(resi_tmp_2); |
132 | | |
133 | 28.9M | resi_tmp_1 = pu1_src[1] - pu1_pred[1]; |
134 | 28.9M | resi_tmp_2 = pu1_src[3] - pu1_pred[3]; |
135 | 28.9M | c[1] = resi_tmp_1 + resi_tmp_2; |
136 | 28.9M | u4_blk_sad += abs(resi_tmp_1); |
137 | | |
138 | 28.9M | resi_tmp_1 = pu1_src[0] - pu1_pred[0]; |
139 | 28.9M | resi_tmp_2 = pu1_src[1] - pu1_pred[1]; |
140 | 28.9M | c[2] = resi_tmp_1 - resi_tmp_2; |
141 | | |
142 | 28.9M | resi_tmp_1 = pu1_src[2] - pu1_pred[2]; |
143 | 28.9M | c[3] = 74 * resi_tmp_1; |
144 | 28.9M | u4_blk_sad += abs(resi_tmp_1); |
145 | | |
146 | 28.9M | pi4_temp[0] = (29 * c[0] + 55 * c[1] + c[3] + add) >> shift; |
147 | | |
148 | 28.9M | resi_tmp_1 = pu1_src[0] - pu1_pred[0]; |
149 | 28.9M | resi_tmp_2 = pu1_src[1] - pu1_pred[1]; |
150 | 28.9M | resi_tmp_3 = pu1_src[3] - pu1_pred[3]; |
151 | 28.9M | pi4_temp[trans_size] = |
152 | 28.9M | (74 * (resi_tmp_1 + resi_tmp_2 - resi_tmp_3) + add) |
153 | 28.9M | >> shift; |
154 | 28.9M | pi4_temp[2 * trans_size] = (29 * c[2] + 55 * c[0] - c[3] + add) >> shift; |
155 | 28.9M | pi4_temp[3 * trans_size] = (55 * c[2] - 29 * c[1] + c[3] + add) >> shift; |
156 | | |
157 | 28.9M | pu1_src += src_strd; |
158 | 28.9M | pu1_pred += pred_strd; |
159 | 28.9M | pi4_temp++; |
160 | 28.9M | } |
161 | | |
162 | 7.23M | pi4_temp = pi4_tmp_orig; |
163 | | |
164 | | /* Forward transform 2nd stage */ |
165 | 7.23M | shift = 8; // log2(iHeight) + 6 |
166 | 7.23M | add = 1 << (shift - 1); |
167 | | |
168 | 36.1M | for(i = 0; i < TRANS_SIZE_4; i++) |
169 | 28.9M | { |
170 | | // Intermediate Variables |
171 | 28.9M | c[0] = pi4_temp[0] + pi4_temp[3]; |
172 | 28.9M | c[1] = pi4_temp[1] + pi4_temp[3]; |
173 | 28.9M | c[2] = pi4_temp[0] - pi4_temp[1]; |
174 | 28.9M | c[3] = 74 * pi4_temp[2]; |
175 | | |
176 | 28.9M | pi2_dst[0] = (29 * c[0] + 55 * c[1] + c[3] + add) >> shift; |
177 | 28.9M | pi2_dst[dst_strd] = (74 * (pi4_temp[0] + pi4_temp[1] - pi4_temp[3]) + add) |
178 | 28.9M | >> shift; |
179 | 28.9M | pi2_dst[2 * dst_strd] = (29 * c[2] + 55 * c[0] - c[3] + add) >> shift; |
180 | 28.9M | pi2_dst[3 * dst_strd] = (55 * c[2] - 29 * c[1] + c[3] + add) >> shift; |
181 | | |
182 | 28.9M | pi4_temp += trans_size; |
183 | 28.9M | pi2_dst++; |
184 | 28.9M | } |
185 | | |
186 | 7.23M | return u4_blk_sad; |
187 | 7.23M | } |
188 | | |
189 | | /** |
190 | | ******************************************************************************* |
191 | | * |
192 | | * @brief |
193 | | * This function performs residue calculation and forward transform on |
194 | | * input pixels |
195 | | * |
196 | | * @par Description: |
197 | | * Performs residue calculation by subtracting source and prediction and |
198 | | * followed by forward transform |
199 | | * |
200 | | * @param[in] pu1_src |
201 | | * Input 4x4 pixels |
202 | | * |
203 | | * @param[in] pu1_pred |
204 | | * Prediction data |
205 | | * |
206 | | * @param[in] pi2_tmp |
207 | | * Temporary buffer of size 4x4 |
208 | | * |
209 | | * @param[out] pi2_dst |
210 | | * Output 4x4 coefficients |
211 | | * |
212 | | * @param[in] src_strd |
213 | | * Input stride |
214 | | * |
215 | | * @param[in] pred_strd |
216 | | * Prediction Stride |
217 | | * |
218 | | * @param[in] dst_strd |
219 | | * Output Stride |
220 | | * |
221 | | * @param[in] e_chroma_plane |
222 | | * Enum singalling chroma plane |
223 | | * |
224 | | * @returns Void |
225 | | * |
226 | | * @remarks |
227 | | * None |
228 | | * |
229 | | ******************************************************************************* |
230 | | */ |
231 | | |
232 | | UWORD32 ihevc_resi_trans_4x4(UWORD8 *pu1_src, |
233 | | UWORD8 *pu1_pred, |
234 | | WORD32 *pi4_temp, |
235 | | WORD16 *pi2_dst, |
236 | | WORD32 src_strd, |
237 | | WORD32 pred_strd, |
238 | | WORD32 dst_strd, |
239 | | CHROMA_PLANE_ID_T e_chroma_plane) |
240 | 2.77M | { |
241 | 2.77M | WORD32 i; |
242 | 2.77M | WORD32 e[2], o[2]; |
243 | 2.77M | WORD32 add, shift; |
244 | 2.77M | WORD32 trans_size; |
245 | 2.77M | WORD32 *pi4_tmp_orig; |
246 | 2.77M | WORD16 *pi2_dst_orig; |
247 | 2.77M | UWORD32 u4_blk_sad=0; |
248 | 2.77M | WORD32 chroma_flag = 0; |
249 | | |
250 | 2.77M | if (e_chroma_plane != NULL_PLANE) |
251 | 2.20M | { |
252 | 2.20M | chroma_flag = 1; |
253 | 2.20M | pu1_src += e_chroma_plane; |
254 | 2.20M | pu1_pred += e_chroma_plane; |
255 | 2.20M | } |
256 | | |
257 | 2.77M | pi2_dst_orig = pi2_dst; |
258 | 2.77M | pi4_tmp_orig = pi4_temp; |
259 | 2.77M | trans_size = TRANS_SIZE_4; |
260 | | |
261 | | /* Residue + Forward Transform 1st stage */ |
262 | 2.77M | shift = 1; // log2(iWidth) - 1 + g_uiBitIncrement |
263 | 2.77M | add = 1 << (shift - 1); |
264 | | |
265 | 13.8M | for(i = 0; i < trans_size; i++) |
266 | 11.1M | { |
267 | 11.1M | WORD32 resi_tmp_1, resi_tmp_2; |
268 | | |
269 | | /* e and o */ |
270 | 11.1M | resi_tmp_1 = pu1_src[0 + 0*chroma_flag] - pu1_pred[0 + 0*chroma_flag]; |
271 | 11.1M | resi_tmp_2 = pu1_src[3 + 3*chroma_flag] - pu1_pred[3 + 3*chroma_flag]; |
272 | 11.1M | e[0] = resi_tmp_1 + resi_tmp_2; |
273 | 11.1M | o[0] = resi_tmp_1 - resi_tmp_2; |
274 | 11.1M | u4_blk_sad += abs(resi_tmp_1); |
275 | 11.1M | u4_blk_sad += abs(resi_tmp_2); |
276 | | |
277 | 11.1M | resi_tmp_1 = pu1_src[1 + 1*chroma_flag] - pu1_pred[1 + 1*chroma_flag]; |
278 | 11.1M | resi_tmp_2 = pu1_src[2 + 2*chroma_flag] - pu1_pred[2 + 2*chroma_flag]; |
279 | 11.1M | e[1] = resi_tmp_1 + resi_tmp_2; |
280 | 11.1M | o[1] = resi_tmp_1 - resi_tmp_2; |
281 | 11.1M | u4_blk_sad += abs(resi_tmp_1); |
282 | 11.1M | u4_blk_sad += abs(resi_tmp_2); |
283 | | |
284 | 11.1M | pi4_temp[0] = (g_ai2_ihevc_trans_4[0][0] * e[0] |
285 | 11.1M | + g_ai2_ihevc_trans_4[0][1] * e[1]);// + add) >> shift; |
286 | 11.1M | pi4_temp[2 * trans_size] = (g_ai2_ihevc_trans_4[2][0] * e[0] |
287 | 11.1M | + g_ai2_ihevc_trans_4[2][1] * e[1]);// + add) >> shift; |
288 | 11.1M | pi4_temp[trans_size] = (g_ai2_ihevc_trans_4[1][0] * o[0] |
289 | 11.1M | + g_ai2_ihevc_trans_4[1][1] * o[1]);// + add) >> shift; |
290 | 11.1M | pi4_temp[3 * trans_size] = (g_ai2_ihevc_trans_4[3][0] * o[0] |
291 | 11.1M | + g_ai2_ihevc_trans_4[3][1] * o[1]);// + add) >> shift; |
292 | | |
293 | 11.1M | pu1_src += src_strd; |
294 | 11.1M | pu1_pred += pred_strd; |
295 | 11.1M | pi4_temp++; |
296 | 11.1M | } |
297 | | |
298 | 2.77M | pi4_temp = pi4_tmp_orig; |
299 | | /* Forward Transform 2nd stage */ |
300 | 2.77M | shift = 9; // log2(iHeight) + 6 |
301 | 2.77M | add = 1 << (shift - 1); |
302 | | |
303 | 13.8M | for(i = 0; i < trans_size; i++) |
304 | 11.1M | { |
305 | | |
306 | | /* e and o */ |
307 | 11.1M | e[0] = pi4_temp[0] + pi4_temp[3]; |
308 | 11.1M | o[0] = pi4_temp[0] - pi4_temp[3]; |
309 | 11.1M | e[1] = pi4_temp[1] + pi4_temp[2]; |
310 | 11.1M | o[1] = pi4_temp[1] - pi4_temp[2]; |
311 | | |
312 | 11.1M | pi2_dst[0] = (g_ai2_ihevc_trans_4[0][0] * e[0] |
313 | 11.1M | + g_ai2_ihevc_trans_4[0][1] * e[1] + add) >> shift; |
314 | 11.1M | pi2_dst[2 * dst_strd] = (g_ai2_ihevc_trans_4[2][0] * e[0] |
315 | 11.1M | + g_ai2_ihevc_trans_4[2][1] * e[1] + add) >> shift; |
316 | 11.1M | pi2_dst[dst_strd] = (g_ai2_ihevc_trans_4[1][0] * o[0] |
317 | 11.1M | + g_ai2_ihevc_trans_4[1][1] * o[1] + add) >> shift; |
318 | 11.1M | pi2_dst[3 * dst_strd] = (g_ai2_ihevc_trans_4[3][0] * o[0] |
319 | 11.1M | + g_ai2_ihevc_trans_4[3][1] * o[1] + add) >> shift; |
320 | | |
321 | 11.1M | pi4_temp += trans_size; |
322 | 11.1M | pi2_dst++; |
323 | 11.1M | } |
324 | | |
325 | 2.77M | return u4_blk_sad; |
326 | 2.77M | } |
327 | | |
328 | | void ihevc_resi_trans_4x4_16bit(WORD16 *pi2_src, |
329 | | UWORD8 *pu1_pred, |
330 | | WORD16 *pi2_tmp, |
331 | | WORD16 *pi2_dst, |
332 | | WORD32 src_strd, |
333 | | WORD32 pred_strd, |
334 | | WORD32 dst_strd) |
335 | 0 | { |
336 | 0 | WORD32 i; |
337 | 0 | WORD32 e[2], o[2]; |
338 | 0 | WORD32 add, shift; |
339 | 0 | WORD32 trans_size; |
340 | 0 | WORD16 *pi2_tmp_orig; |
341 | 0 | WORD16 *pi2_dst_orig; |
342 | |
|
343 | 0 | pi2_dst_orig = pi2_dst; |
344 | 0 | pi2_tmp_orig = pi2_tmp; |
345 | 0 | trans_size = TRANS_SIZE_4; |
346 | | |
347 | | /* Residue + Forward Transform 1st stage */ |
348 | 0 | shift = 1; // log2(iWidth) - 1 + g_uiBitIncrement |
349 | 0 | add = 1 << (shift - 1); |
350 | |
|
351 | 0 | for(i = 0; i < trans_size; i++) |
352 | 0 | { |
353 | 0 | WORD32 resi_tmp_1, resi_tmp_2; |
354 | | |
355 | | /* e and o */ |
356 | 0 | resi_tmp_1 = pi2_src[0] - pu1_pred[0]; |
357 | 0 | resi_tmp_2 = pi2_src[3] - pu1_pred[3]; |
358 | 0 | e[0] = resi_tmp_1 + resi_tmp_2; |
359 | 0 | o[0] = resi_tmp_1 - resi_tmp_2; |
360 | |
|
361 | 0 | resi_tmp_1 = pi2_src[1] - pu1_pred[1]; |
362 | 0 | resi_tmp_2 = pi2_src[2] - pu1_pred[2]; |
363 | 0 | e[1] = resi_tmp_1 + resi_tmp_2; |
364 | 0 | o[1] = resi_tmp_1 - resi_tmp_2; |
365 | |
|
366 | 0 | pi2_tmp[0] = (g_ai2_ihevc_trans_4[0][0] * e[0] |
367 | 0 | + g_ai2_ihevc_trans_4[0][1] * e[1] + add) >> shift; |
368 | 0 | pi2_tmp[2 * trans_size] = (g_ai2_ihevc_trans_4[2][0] * e[0] |
369 | 0 | + g_ai2_ihevc_trans_4[2][1] * e[1] + add) >> shift; |
370 | 0 | pi2_tmp[trans_size] = (g_ai2_ihevc_trans_4[1][0] * o[0] |
371 | 0 | + g_ai2_ihevc_trans_4[1][1] * o[1] + add) >> shift; |
372 | 0 | pi2_tmp[3 * trans_size] = (g_ai2_ihevc_trans_4[3][0] * o[0] |
373 | 0 | + g_ai2_ihevc_trans_4[3][1] * o[1] + add) >> shift; |
374 | |
|
375 | 0 | pi2_src += src_strd; |
376 | 0 | pu1_pred += pred_strd; |
377 | 0 | pi2_tmp++; |
378 | 0 | } |
379 | |
|
380 | 0 | pi2_tmp = pi2_tmp_orig; |
381 | | /* Forward Transform 2nd stage */ |
382 | 0 | shift = 8; // log2(iHeight) + 6 |
383 | 0 | add = 1 << (shift - 1); |
384 | |
|
385 | 0 | for(i = 0; i < trans_size; i++) |
386 | 0 | { |
387 | | |
388 | | /* e and o */ |
389 | 0 | e[0] = pi2_tmp[0] + pi2_tmp[3]; |
390 | 0 | o[0] = pi2_tmp[0] - pi2_tmp[3]; |
391 | 0 | e[1] = pi2_tmp[1] + pi2_tmp[2]; |
392 | 0 | o[1] = pi2_tmp[1] - pi2_tmp[2]; |
393 | |
|
394 | 0 | pi2_dst[0] = (g_ai2_ihevc_trans_4[0][0] * e[0] |
395 | 0 | + g_ai2_ihevc_trans_4[0][1] * e[1] + add) >> shift; |
396 | 0 | pi2_dst[2 * dst_strd] = (g_ai2_ihevc_trans_4[2][0] * e[0] |
397 | 0 | + g_ai2_ihevc_trans_4[2][1] * e[1] + add) >> shift; |
398 | 0 | pi2_dst[dst_strd] = (g_ai2_ihevc_trans_4[1][0] * o[0] |
399 | 0 | + g_ai2_ihevc_trans_4[1][1] * o[1] + add) >> shift; |
400 | 0 | pi2_dst[3 * dst_strd] = (g_ai2_ihevc_trans_4[3][0] * o[0] |
401 | 0 | + g_ai2_ihevc_trans_4[3][1] * o[1] + add) >> shift; |
402 | |
|
403 | 0 | pi2_tmp += trans_size; |
404 | 0 | pi2_dst++; |
405 | 0 | } |
406 | 0 | } |
407 | | /** |
408 | | ******************************************************************************* |
409 | | * |
410 | | * @brief |
411 | | * This function performs residue calculation and forward transform on |
412 | | * input pixels |
413 | | * |
414 | | * @par Description: |
415 | | * Performs residue calculation by subtracting source and prediction and |
416 | | * followed by forward transform |
417 | | * |
418 | | * @param[in] pu1_src |
419 | | * Input 8x8 pixels |
420 | | * |
421 | | * @param[in] pu1_pred |
422 | | * Prediction data |
423 | | * |
424 | | * @param[in] pi2_tmp |
425 | | * Temporary buffer of size 8x8 |
426 | | * |
427 | | * @param[out] pi2_dst |
428 | | * Output 8x8 coefficients |
429 | | * |
430 | | * @param[in] src_strd |
431 | | * Input stride |
432 | | * |
433 | | * @param[in] pred_strd |
434 | | * Prediction Stride |
435 | | * |
436 | | * @param[in] dst_strd |
437 | | * Output Stride |
438 | | * |
439 | | * @param[in] e_chroma_plane |
440 | | * Enum singalling chroma plane |
441 | | * |
442 | | * @returns Void |
443 | | * |
444 | | * @remarks |
445 | | * None |
446 | | * |
447 | | ******************************************************************************* |
448 | | */ |
449 | | |
450 | | UWORD32 ihevc_resi_trans_8x8(UWORD8 *pu1_src, |
451 | | UWORD8 *pu1_pred, |
452 | | WORD32 *pi4_temp, |
453 | | WORD16 *pi2_dst, |
454 | | WORD32 src_strd, |
455 | | WORD32 pred_strd, |
456 | | WORD32 dst_strd, |
457 | | CHROMA_PLANE_ID_T e_chroma_plane) |
458 | 1.55M | { |
459 | 1.55M | WORD32 i, k; |
460 | 1.55M | WORD32 e[4], o[4]; |
461 | 1.55M | WORD32 ee[2], eo[2]; |
462 | 1.55M | WORD32 add, shift; |
463 | 1.55M | WORD32 trans_size; |
464 | 1.55M | WORD32 *pi4_tmp_orig; |
465 | | // WORD16 *pi2_tmp; |
466 | 1.55M | WORD16 *pi2_dst_orig; |
467 | 1.55M | UWORD32 u4_blk_sad=0; |
468 | 1.55M | WORD32 chroma_flag = 0; |
469 | | |
470 | 1.55M | if (e_chroma_plane != NULL_PLANE) |
471 | 461k | { |
472 | 461k | chroma_flag = 1; |
473 | 461k | pu1_src += e_chroma_plane; |
474 | 461k | pu1_pred += e_chroma_plane; |
475 | 461k | } |
476 | | |
477 | 1.55M | pi2_dst_orig = pi2_dst; |
478 | 1.55M | pi4_tmp_orig = pi4_temp; |
479 | 1.55M | trans_size = TRANS_SIZE_8; |
480 | | /* Residue + Forward Transform 1st stage */ |
481 | 1.55M | shift = 2; // log2(iWidth) - 1 + g_uiBitIncrement |
482 | 1.55M | add = 1 << (shift - 1); |
483 | | |
484 | 14.0M | for(i = 0; i < trans_size; i++) |
485 | 12.4M | { |
486 | 12.4M | WORD32 resi_tmp_1, resi_tmp_2; |
487 | | |
488 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
489 | | /* e and o*/ |
490 | 62.2M | for(k = 0; k < 4; k++) |
491 | 49.8M | { |
492 | 49.8M | resi_tmp_1 = pu1_src[k*(1+chroma_flag)] - pu1_pred[k*(1+chroma_flag)]; |
493 | 49.8M | resi_tmp_2 = pu1_src[(7-k)*(1+chroma_flag)] - pu1_pred[(7-k)*(1+chroma_flag)]; |
494 | 49.8M | e[k] = resi_tmp_1 + resi_tmp_2; |
495 | 49.8M | o[k] = resi_tmp_1 - resi_tmp_2; |
496 | 49.8M | u4_blk_sad += abs(resi_tmp_1) + abs(resi_tmp_2); |
497 | 49.8M | } |
498 | | /* ee and eo */ |
499 | 12.4M | ee[0] = e[0] + e[3]; |
500 | 12.4M | eo[0] = e[0] - e[3]; |
501 | 12.4M | ee[1] = e[1] + e[2]; |
502 | 12.4M | eo[1] = e[1] - e[2]; |
503 | | |
504 | 12.4M | pi4_temp[0] = (g_ai2_ihevc_trans_8[0][0] * ee[0] |
505 | 12.4M | + g_ai2_ihevc_trans_8[0][1] * ee[1]);// + add) >> shift; |
506 | 12.4M | pi4_temp[4 * trans_size] = (g_ai2_ihevc_trans_8[4][0] * ee[0] |
507 | 12.4M | + g_ai2_ihevc_trans_8[4][1] * ee[1]);// + add) >> shift; |
508 | 12.4M | pi4_temp[2 * trans_size] = (g_ai2_ihevc_trans_8[2][0] * eo[0] |
509 | 12.4M | + g_ai2_ihevc_trans_8[2][1] * eo[1]);// + add) >> shift; |
510 | 12.4M | pi4_temp[6 * trans_size] = (g_ai2_ihevc_trans_8[6][0] * eo[0] |
511 | 12.4M | + g_ai2_ihevc_trans_8[6][1] * eo[1]);// + add) >> shift; |
512 | | |
513 | 12.4M | pi4_temp[trans_size] = (g_ai2_ihevc_trans_8[1][0] * o[0] |
514 | 12.4M | + g_ai2_ihevc_trans_8[1][1] * o[1] |
515 | 12.4M | + g_ai2_ihevc_trans_8[1][2] * o[2] |
516 | 12.4M | + g_ai2_ihevc_trans_8[1][3] * o[3]);// + add) >> shift; |
517 | 12.4M | pi4_temp[3 * trans_size] = (g_ai2_ihevc_trans_8[3][0] * o[0] |
518 | 12.4M | + g_ai2_ihevc_trans_8[3][1] * o[1] |
519 | 12.4M | + g_ai2_ihevc_trans_8[3][2] * o[2] |
520 | 12.4M | + g_ai2_ihevc_trans_8[3][3] * o[3]);// + add) >> shift; |
521 | 12.4M | pi4_temp[5 * trans_size] = (g_ai2_ihevc_trans_8[5][0] * o[0] |
522 | 12.4M | + g_ai2_ihevc_trans_8[5][1] * o[1] |
523 | 12.4M | + g_ai2_ihevc_trans_8[5][2] * o[2] |
524 | 12.4M | + g_ai2_ihevc_trans_8[5][3] * o[3]);// + add) >> shift; |
525 | 12.4M | pi4_temp[7 * trans_size] = (g_ai2_ihevc_trans_8[7][0] * o[0] |
526 | 12.4M | + g_ai2_ihevc_trans_8[7][1] * o[1] |
527 | 12.4M | + g_ai2_ihevc_trans_8[7][2] * o[2] |
528 | 12.4M | + g_ai2_ihevc_trans_8[7][3] * o[3]);// + add) >> shift; |
529 | | |
530 | 12.4M | pu1_src += src_strd; |
531 | 12.4M | pu1_pred += pred_strd; |
532 | 12.4M | pi4_temp++; |
533 | 12.4M | } |
534 | | |
535 | 1.55M | pi4_temp = pi4_tmp_orig; |
536 | | /* Forward Transform 2nd stage */ |
537 | 1.55M | shift = 11; // log2(iHeight) + 6 |
538 | 1.55M | add = 1 << (shift - 1); |
539 | | |
540 | 14.0M | for(i = 0; i < trans_size; i++) |
541 | 12.4M | { |
542 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
543 | | /* e and o*/ |
544 | 62.2M | for(k = 0; k < 4; k++) |
545 | 49.8M | { |
546 | 49.8M | e[k] = pi4_temp[k] + pi4_temp[7 - k]; |
547 | 49.8M | o[k] = pi4_temp[k] - pi4_temp[7 - k]; |
548 | 49.8M | } |
549 | | /* ee and eo */ |
550 | 12.4M | ee[0] = e[0] + e[3]; |
551 | 12.4M | eo[0] = e[0] - e[3]; |
552 | 12.4M | ee[1] = e[1] + e[2]; |
553 | 12.4M | eo[1] = e[1] - e[2]; |
554 | | |
555 | 12.4M | pi2_dst[0] = (g_ai2_ihevc_trans_8[0][0] * ee[0] |
556 | 12.4M | + g_ai2_ihevc_trans_8[0][1] * ee[1] + add) >> shift; |
557 | 12.4M | pi2_dst[4 * dst_strd] = (g_ai2_ihevc_trans_8[4][0] * ee[0] |
558 | 12.4M | + g_ai2_ihevc_trans_8[4][1] * ee[1] + add) >> shift; |
559 | 12.4M | pi2_dst[2 * dst_strd] = (g_ai2_ihevc_trans_8[2][0] * eo[0] |
560 | 12.4M | + g_ai2_ihevc_trans_8[2][1] * eo[1] + add) >> shift; |
561 | 12.4M | pi2_dst[6 * dst_strd] = (g_ai2_ihevc_trans_8[6][0] * eo[0] |
562 | 12.4M | + g_ai2_ihevc_trans_8[6][1] * eo[1] + add) >> shift; |
563 | | |
564 | 12.4M | pi2_dst[dst_strd] = (g_ai2_ihevc_trans_8[1][0] * o[0] |
565 | 12.4M | + g_ai2_ihevc_trans_8[1][1] * o[1] |
566 | 12.4M | + g_ai2_ihevc_trans_8[1][2] * o[2] |
567 | 12.4M | + g_ai2_ihevc_trans_8[1][3] * o[3] + add) >> shift; |
568 | 12.4M | pi2_dst[3 * dst_strd] = (g_ai2_ihevc_trans_8[3][0] * o[0] |
569 | 12.4M | + g_ai2_ihevc_trans_8[3][1] * o[1] |
570 | 12.4M | + g_ai2_ihevc_trans_8[3][2] * o[2] |
571 | 12.4M | + g_ai2_ihevc_trans_8[3][3] * o[3] + add) >> shift; |
572 | 12.4M | pi2_dst[5 * dst_strd] = (g_ai2_ihevc_trans_8[5][0] * o[0] |
573 | 12.4M | + g_ai2_ihevc_trans_8[5][1] * o[1] |
574 | 12.4M | + g_ai2_ihevc_trans_8[5][2] * o[2] |
575 | 12.4M | + g_ai2_ihevc_trans_8[5][3] * o[3] + add) >> shift; |
576 | 12.4M | pi2_dst[7 * dst_strd] = (g_ai2_ihevc_trans_8[7][0] * o[0] |
577 | 12.4M | + g_ai2_ihevc_trans_8[7][1] * o[1] |
578 | 12.4M | + g_ai2_ihevc_trans_8[7][2] * o[2] |
579 | 12.4M | + g_ai2_ihevc_trans_8[7][3] * o[3] + add) >> shift; |
580 | | |
581 | 12.4M | pi4_temp += trans_size; |
582 | 12.4M | pi2_dst++; |
583 | 12.4M | } |
584 | | |
585 | 1.55M | return u4_blk_sad; |
586 | 1.55M | } |
587 | | |
588 | | void ihevc_resi_trans_8x8_16bit(WORD16 *pi2_src, |
589 | | UWORD8 *pu1_pred, |
590 | | WORD16 *pi2_tmp, |
591 | | WORD16 *pi2_dst, |
592 | | WORD32 src_strd, |
593 | | WORD32 pred_strd, |
594 | | WORD32 dst_strd) |
595 | 0 | { |
596 | 0 | WORD32 i, k; |
597 | 0 | WORD32 e[4], o[4]; |
598 | 0 | WORD32 ee[2], eo[2]; |
599 | 0 | WORD32 add, shift; |
600 | 0 | WORD32 trans_size; |
601 | 0 | WORD16 *pi2_tmp_orig; |
602 | 0 | WORD16 *pi2_dst_orig; |
603 | |
|
604 | 0 | pi2_dst_orig = pi2_dst; |
605 | 0 | pi2_tmp_orig = pi2_tmp; |
606 | 0 | trans_size = TRANS_SIZE_8; |
607 | | /* Residue + Forward Transform 1st stage */ |
608 | 0 | shift = 2; // log2(iWidth) - 1 + g_uiBitIncrement |
609 | 0 | add = 1 << (shift - 1); |
610 | |
|
611 | 0 | for(i = 0; i < trans_size; i++) |
612 | 0 | { |
613 | 0 | WORD32 resi_tmp_1, resi_tmp_2; |
614 | | |
615 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
616 | | /* e and o*/ |
617 | 0 | for(k = 0; k < 4; k++) |
618 | 0 | { |
619 | 0 | resi_tmp_1 = pi2_src[k] - pu1_pred[k]; |
620 | 0 | resi_tmp_2 = pi2_src[7 - k] - pu1_pred[7 - k]; |
621 | 0 | e[k] = resi_tmp_1 + resi_tmp_2; |
622 | 0 | o[k] = resi_tmp_1 - resi_tmp_2; |
623 | 0 | } |
624 | | /* ee and eo */ |
625 | 0 | ee[0] = e[0] + e[3]; |
626 | 0 | eo[0] = e[0] - e[3]; |
627 | 0 | ee[1] = e[1] + e[2]; |
628 | 0 | eo[1] = e[1] - e[2]; |
629 | |
|
630 | 0 | pi2_tmp[0] = (g_ai2_ihevc_trans_8[0][0] * ee[0] |
631 | 0 | + g_ai2_ihevc_trans_8[0][1] * ee[1] + add) >> shift; |
632 | 0 | pi2_tmp[4 * trans_size] = (g_ai2_ihevc_trans_8[4][0] * ee[0] |
633 | 0 | + g_ai2_ihevc_trans_8[4][1] * ee[1] + add) >> shift; |
634 | 0 | pi2_tmp[2 * trans_size] = (g_ai2_ihevc_trans_8[2][0] * eo[0] |
635 | 0 | + g_ai2_ihevc_trans_8[2][1] * eo[1] + add) >> shift; |
636 | 0 | pi2_tmp[6 * trans_size] = (g_ai2_ihevc_trans_8[6][0] * eo[0] |
637 | 0 | + g_ai2_ihevc_trans_8[6][1] * eo[1] + add) >> shift; |
638 | |
|
639 | 0 | pi2_tmp[trans_size] = (g_ai2_ihevc_trans_8[1][0] * o[0] |
640 | 0 | + g_ai2_ihevc_trans_8[1][1] * o[1] |
641 | 0 | + g_ai2_ihevc_trans_8[1][2] * o[2] |
642 | 0 | + g_ai2_ihevc_trans_8[1][3] * o[3] + add) >> shift; |
643 | 0 | pi2_tmp[3 * trans_size] = (g_ai2_ihevc_trans_8[3][0] * o[0] |
644 | 0 | + g_ai2_ihevc_trans_8[3][1] * o[1] |
645 | 0 | + g_ai2_ihevc_trans_8[3][2] * o[2] |
646 | 0 | + g_ai2_ihevc_trans_8[3][3] * o[3] + add) >> shift; |
647 | 0 | pi2_tmp[5 * trans_size] = (g_ai2_ihevc_trans_8[5][0] * o[0] |
648 | 0 | + g_ai2_ihevc_trans_8[5][1] * o[1] |
649 | 0 | + g_ai2_ihevc_trans_8[5][2] * o[2] |
650 | 0 | + g_ai2_ihevc_trans_8[5][3] * o[3] + add) >> shift; |
651 | 0 | pi2_tmp[7 * trans_size] = (g_ai2_ihevc_trans_8[7][0] * o[0] |
652 | 0 | + g_ai2_ihevc_trans_8[7][1] * o[1] |
653 | 0 | + g_ai2_ihevc_trans_8[7][2] * o[2] |
654 | 0 | + g_ai2_ihevc_trans_8[7][3] * o[3] + add) >> shift; |
655 | |
|
656 | 0 | pi2_src += src_strd; |
657 | 0 | pu1_pred += pred_strd; |
658 | 0 | pi2_tmp++; |
659 | 0 | } |
660 | |
|
661 | 0 | pi2_tmp = pi2_tmp_orig; |
662 | | /* Forward Transform 2nd stage */ |
663 | 0 | shift = 9; // log2(iHeight) + 6 |
664 | 0 | add = 1 << (shift - 1); |
665 | |
|
666 | 0 | for(i = 0; i < trans_size; i++) |
667 | 0 | { |
668 | | /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */ |
669 | | /* e and o*/ |
670 | 0 | for(k = 0; k < 4; k++) |
671 | 0 | { |
672 | 0 | e[k] = pi2_tmp[k] + pi2_tmp[7 - k]; |
673 | 0 | o[k] = pi2_tmp[k] - pi2_tmp[7 - k]; |
674 | 0 | } |
675 | | /* ee and eo */ |
676 | 0 | ee[0] = e[0] + e[3]; |
677 | 0 | eo[0] = e[0] - e[3]; |
678 | 0 | ee[1] = e[1] + e[2]; |
679 | 0 | eo[1] = e[1] - e[2]; |
680 | |
|
681 | 0 | pi2_dst[0] = (g_ai2_ihevc_trans_8[0][0] * ee[0] |
682 | 0 | + g_ai2_ihevc_trans_8[0][1] * ee[1] + add) >> shift; |
683 | 0 | pi2_dst[4 * dst_strd] = (g_ai2_ihevc_trans_8[4][0] * ee[0] |
684 | 0 | + g_ai2_ihevc_trans_8[4][1] * ee[1] + add) >> shift; |
685 | 0 | pi2_dst[2 * dst_strd] = (g_ai2_ihevc_trans_8[2][0] * eo[0] |
686 | 0 | + g_ai2_ihevc_trans_8[2][1] * eo[1] + add) >> shift; |
687 | 0 | pi2_dst[6 * dst_strd] = (g_ai2_ihevc_trans_8[6][0] * eo[0] |
688 | 0 | + g_ai2_ihevc_trans_8[6][1] * eo[1] + add) >> shift; |
689 | |
|
690 | 0 | pi2_dst[dst_strd] = (g_ai2_ihevc_trans_8[1][0] * o[0] |
691 | 0 | + g_ai2_ihevc_trans_8[1][1] * o[1] |
692 | 0 | + g_ai2_ihevc_trans_8[1][2] * o[2] |
693 | 0 | + g_ai2_ihevc_trans_8[1][3] * o[3] + add) >> shift; |
694 | 0 | pi2_dst[3 * dst_strd] = (g_ai2_ihevc_trans_8[3][0] * o[0] |
695 | 0 | + g_ai2_ihevc_trans_8[3][1] * o[1] |
696 | 0 | + g_ai2_ihevc_trans_8[3][2] * o[2] |
697 | 0 | + g_ai2_ihevc_trans_8[3][3] * o[3] + add) >> shift; |
698 | 0 | pi2_dst[5 * dst_strd] = (g_ai2_ihevc_trans_8[5][0] * o[0] |
699 | 0 | + g_ai2_ihevc_trans_8[5][1] * o[1] |
700 | 0 | + g_ai2_ihevc_trans_8[5][2] * o[2] |
701 | 0 | + g_ai2_ihevc_trans_8[5][3] * o[3] + add) >> shift; |
702 | 0 | pi2_dst[7 * dst_strd] = (g_ai2_ihevc_trans_8[7][0] * o[0] |
703 | 0 | + g_ai2_ihevc_trans_8[7][1] * o[1] |
704 | 0 | + g_ai2_ihevc_trans_8[7][2] * o[2] |
705 | 0 | + g_ai2_ihevc_trans_8[7][3] * o[3] + add) >> shift; |
706 | |
|
707 | 0 | pi2_tmp += trans_size; |
708 | 0 | pi2_dst++; |
709 | 0 | } |
710 | 0 | } |
711 | | /** |
712 | | ******************************************************************************* |
713 | | * |
714 | | * @brief |
715 | | * This function performs residue calculation and forward transform on |
716 | | * input pixels |
717 | | * |
718 | | * @par Description: |
719 | | * Performs residue calculation by subtracting source and prediction and |
720 | | * followed by forward transform |
721 | | * |
722 | | * @param[in] pu1_src |
723 | | * Input 16x16 pixels |
724 | | * |
725 | | * @param[in] pu1_pred |
726 | | * Prediction data |
727 | | * |
728 | | * @param[in] pi2_tmp |
729 | | * Temporary buffer of size 16x16 |
730 | | * |
731 | | * @param[out] pi2_dst |
732 | | * Output 16x16 coefficients |
733 | | * |
734 | | * @param[in] src_strd |
735 | | * Input stride |
736 | | * |
737 | | * @param[in] pred_strd |
738 | | * Prediction Stride |
739 | | * |
740 | | * @param[in] dst_strd |
741 | | * Output Stride |
742 | | * |
743 | | * @param[in] e_chroma_plane |
744 | | * Enum singalling chroma plane |
745 | | * |
746 | | * @returns Void |
747 | | * |
748 | | * @remarks |
749 | | * None |
750 | | * |
751 | | ******************************************************************************* |
752 | | */ |
753 | | |
754 | | UWORD32 ihevc_resi_trans_16x16(UWORD8 *pu1_src, |
755 | | UWORD8 *pu1_pred, |
756 | | WORD32 *pi4_temp, |
757 | | WORD16 *pi2_dst, |
758 | | WORD32 src_strd, |
759 | | WORD32 pred_strd, |
760 | | WORD32 dst_strd, |
761 | | CHROMA_PLANE_ID_T e_chroma_plane) |
762 | 431k | { |
763 | 431k | WORD32 i, k; |
764 | 431k | WORD32 e[8], o[8]; |
765 | 431k | WORD32 ee[4], eo[4]; |
766 | 431k | WORD32 eee[2], eeo[2]; |
767 | 431k | WORD32 add, shift; |
768 | 431k | WORD32 trans_size; |
769 | 431k | WORD32 *pi4_tmp_orig; |
770 | 431k | WORD16 *pi2_dst_orig; |
771 | 431k | UWORD32 u4_blk_sad = 0; |
772 | 431k | WORD32 chroma_flag = 0; |
773 | | |
774 | 431k | if (e_chroma_plane != NULL_PLANE) |
775 | 125k | { |
776 | 125k | chroma_flag = 1; |
777 | 125k | pu1_src += e_chroma_plane; |
778 | 125k | pu1_pred += e_chroma_plane; |
779 | 125k | } |
780 | | |
781 | 431k | pi2_dst_orig = pi2_dst; |
782 | 431k | pi4_tmp_orig = pi4_temp; |
783 | 431k | trans_size = TRANS_SIZE_16; |
784 | | /* Residue + Forward Transform 1st stage */ |
785 | 431k | shift = 3; // log2(iWidth) - 1 + g_uiBitIncrement |
786 | 431k | add = 1 << (shift - 1); |
787 | | |
788 | 7.33M | for(i = 0; i < trans_size; i++) |
789 | 6.90M | { |
790 | 6.90M | WORD32 resi_tmp_1, resi_tmp_2; |
791 | | /* e and o*/ |
792 | 62.1M | for(k = 0; k < 8; k++) |
793 | 55.2M | { |
794 | 55.2M | resi_tmp_1 = pu1_src[k*(1+chroma_flag)] - pu1_pred[k*(1+chroma_flag)]; |
795 | 55.2M | resi_tmp_2 = pu1_src[(15-k)*(1+chroma_flag)] - pu1_pred[(15-k)*(1+chroma_flag)]; |
796 | 55.2M | e[k] = resi_tmp_1 + resi_tmp_2; |
797 | 55.2M | o[k] = resi_tmp_1 - resi_tmp_2; |
798 | 55.2M | u4_blk_sad += abs(resi_tmp_1) + abs(resi_tmp_2); |
799 | 55.2M | } |
800 | | /* ee and eo */ |
801 | 34.5M | for(k = 0; k < 4; k++) |
802 | 27.6M | { |
803 | 27.6M | ee[k] = e[k] + e[7 - k]; |
804 | 27.6M | eo[k] = e[k] - e[7 - k]; |
805 | 27.6M | } |
806 | | /* eee and eeo */ |
807 | 6.90M | eee[0] = ee[0] + ee[3]; |
808 | 6.90M | eeo[0] = ee[0] - ee[3]; |
809 | 6.90M | eee[1] = ee[1] + ee[2]; |
810 | 6.90M | eeo[1] = ee[1] - ee[2]; |
811 | | |
812 | 6.90M | pi4_temp[0] = (g_ai2_ihevc_trans_16[0][0] * eee[0] |
813 | 6.90M | + g_ai2_ihevc_trans_16[0][1] * eee[1]);// + add) >> shift; |
814 | 6.90M | pi4_temp[8 * trans_size] = (g_ai2_ihevc_trans_16[8][0] * eee[0] |
815 | 6.90M | + g_ai2_ihevc_trans_16[8][1] * eee[1]);// + add) >> shift; |
816 | 6.90M | pi4_temp[4 * trans_size] = (g_ai2_ihevc_trans_16[4][0] * eeo[0] |
817 | 6.90M | + g_ai2_ihevc_trans_16[4][1] * eeo[1]);// + add) >> shift; |
818 | 6.90M | pi4_temp[12 * trans_size] = (g_ai2_ihevc_trans_16[12][0] * eeo[0] |
819 | 6.90M | + g_ai2_ihevc_trans_16[12][1] * eeo[1]);// + add) >> shift; |
820 | | |
821 | 34.5M | for(k = 2; k < 16; k += 4) |
822 | 27.6M | { |
823 | 27.6M | pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_16[k][0] * eo[0] |
824 | 27.6M | + g_ai2_ihevc_trans_16[k][1] * eo[1] |
825 | 27.6M | + g_ai2_ihevc_trans_16[k][2] * eo[2] |
826 | 27.6M | + g_ai2_ihevc_trans_16[k][3] * eo[3]);// + add)>> shift; |
827 | | |
828 | 27.6M | } |
829 | | |
830 | 62.1M | for(k = 1; k < 16; k += 2) |
831 | 55.2M | { |
832 | 55.2M | pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_16[k][0] * o[0] |
833 | 55.2M | + g_ai2_ihevc_trans_16[k][1] * o[1] |
834 | 55.2M | + g_ai2_ihevc_trans_16[k][2] * o[2] |
835 | 55.2M | + g_ai2_ihevc_trans_16[k][3] * o[3] |
836 | 55.2M | + g_ai2_ihevc_trans_16[k][4] * o[4] |
837 | 55.2M | + g_ai2_ihevc_trans_16[k][5] * o[5] |
838 | 55.2M | + g_ai2_ihevc_trans_16[k][6] * o[6] |
839 | 55.2M | + g_ai2_ihevc_trans_16[k][7] * o[7]);// + add) >> shift; |
840 | 55.2M | } |
841 | 6.90M | pu1_src += src_strd; |
842 | 6.90M | pu1_pred += pred_strd; |
843 | 6.90M | pi4_temp++; |
844 | 6.90M | } |
845 | | |
846 | 431k | pi4_temp = pi4_tmp_orig; |
847 | | /* Forward Transform 2nd stage */ |
848 | 431k | shift = 13; // log2(iHeight) + 6 |
849 | 431k | add = 1 << (shift - 1); |
850 | | |
851 | 7.33M | for(i = 0; i < TRANS_SIZE_16; i++) |
852 | 6.90M | { |
853 | | /* e and o*/ |
854 | 62.1M | for(k = 0; k < 8; k++) |
855 | 55.2M | { |
856 | 55.2M | e[k] = pi4_temp[k] + pi4_temp[15 - k]; |
857 | 55.2M | o[k] = pi4_temp[k] - pi4_temp[15 - k]; |
858 | 55.2M | } |
859 | | /* ee and eo */ |
860 | 34.5M | for(k = 0; k < 4; k++) |
861 | 27.6M | { |
862 | 27.6M | ee[k] = e[k] + e[7 - k]; |
863 | 27.6M | eo[k] = e[k] - e[7 - k]; |
864 | 27.6M | } |
865 | | /* eee and eeo */ |
866 | 6.90M | eee[0] = ee[0] + ee[3]; |
867 | 6.90M | eeo[0] = ee[0] - ee[3]; |
868 | 6.90M | eee[1] = ee[1] + ee[2]; |
869 | 6.90M | eeo[1] = ee[1] - ee[2]; |
870 | | |
871 | 6.90M | pi2_dst[0] = (g_ai2_ihevc_trans_16[0][0] * eee[0] |
872 | 6.90M | + g_ai2_ihevc_trans_16[0][1] * eee[1] + add) >> shift; |
873 | 6.90M | pi2_dst[8 * dst_strd] = (g_ai2_ihevc_trans_16[8][0] * eee[0] |
874 | 6.90M | + g_ai2_ihevc_trans_16[8][1] * eee[1] + add) >> shift; |
875 | 6.90M | pi2_dst[4 * dst_strd] = (g_ai2_ihevc_trans_16[4][0] * eeo[0] |
876 | 6.90M | + g_ai2_ihevc_trans_16[4][1] * eeo[1] + add) >> shift; |
877 | 6.90M | pi2_dst[12 * dst_strd] = (g_ai2_ihevc_trans_16[12][0] * eeo[0] |
878 | 6.90M | + g_ai2_ihevc_trans_16[12][1] * eeo[1] + add) >> shift; |
879 | | |
880 | 34.5M | for(k = 2; k < 16; k += 4) |
881 | 27.6M | { |
882 | 27.6M | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_16[k][0] * eo[0] |
883 | 27.6M | + g_ai2_ihevc_trans_16[k][1] * eo[1] |
884 | 27.6M | + g_ai2_ihevc_trans_16[k][2] * eo[2] |
885 | 27.6M | + g_ai2_ihevc_trans_16[k][3] * eo[3] + add) |
886 | 27.6M | >> shift; |
887 | 27.6M | } |
888 | | |
889 | 62.1M | for(k = 1; k < 16; k += 2) |
890 | 55.2M | { |
891 | 55.2M | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_16[k][0] * o[0] |
892 | 55.2M | + g_ai2_ihevc_trans_16[k][1] * o[1] |
893 | 55.2M | + g_ai2_ihevc_trans_16[k][2] * o[2] |
894 | 55.2M | + g_ai2_ihevc_trans_16[k][3] * o[3] |
895 | 55.2M | + g_ai2_ihevc_trans_16[k][4] * o[4] |
896 | 55.2M | + g_ai2_ihevc_trans_16[k][5] * o[5] |
897 | 55.2M | + g_ai2_ihevc_trans_16[k][6] * o[6] |
898 | 55.2M | + g_ai2_ihevc_trans_16[k][7] * o[7] + add) >> shift; |
899 | 55.2M | } |
900 | | |
901 | 6.90M | pi4_temp += trans_size; |
902 | 6.90M | pi2_dst++; |
903 | 6.90M | } |
904 | | |
905 | 431k | return u4_blk_sad; |
906 | 431k | } |
907 | | |
908 | | |
909 | | void ihevc_resi_trans_16x16_16bit(WORD16 *pi2_src, |
910 | | UWORD8 *pu1_pred, |
911 | | WORD16 *pi2_tmp, |
912 | | WORD16 *pi2_dst, |
913 | | WORD32 src_strd, |
914 | | WORD32 pred_strd, |
915 | | WORD32 dst_strd) |
916 | 0 | { |
917 | 0 | WORD32 i, k; |
918 | 0 | WORD32 e[8], o[8]; |
919 | 0 | WORD32 ee[4], eo[4]; |
920 | 0 | WORD32 eee[2], eeo[2]; |
921 | 0 | WORD32 add, shift; |
922 | 0 | WORD32 trans_size; |
923 | 0 | WORD16 *pi2_tmp_orig; |
924 | 0 | WORD16 *pi2_dst_orig; |
925 | |
|
926 | 0 | pi2_dst_orig = pi2_dst; |
927 | 0 | pi2_tmp_orig = pi2_tmp; |
928 | 0 | trans_size = TRANS_SIZE_16; |
929 | | /* Residue + Forward Transform 1st stage */ |
930 | 0 | shift = 3; // log2(iWidth) - 1 + g_uiBitIncrement |
931 | 0 | add = 1 << (shift - 1); |
932 | |
|
933 | 0 | for(i = 0; i < trans_size; i++) |
934 | 0 | { |
935 | 0 | WORD32 resi_tmp_1, resi_tmp_2; |
936 | | /* e and o*/ |
937 | 0 | for(k = 0; k < 8; k++) |
938 | 0 | { |
939 | 0 | resi_tmp_1 = pi2_src[k] - pu1_pred[k]; |
940 | 0 | resi_tmp_2 = pi2_src[15 - k] - pu1_pred[15 - k]; |
941 | 0 | e[k] = resi_tmp_1 + resi_tmp_2; |
942 | 0 | o[k] = resi_tmp_1 - resi_tmp_2; |
943 | 0 | } |
944 | | /* ee and eo */ |
945 | 0 | for(k = 0; k < 4; k++) |
946 | 0 | { |
947 | 0 | ee[k] = e[k] + e[7 - k]; |
948 | 0 | eo[k] = e[k] - e[7 - k]; |
949 | 0 | } |
950 | | /* eee and eeo */ |
951 | 0 | eee[0] = ee[0] + ee[3]; |
952 | 0 | eeo[0] = ee[0] - ee[3]; |
953 | 0 | eee[1] = ee[1] + ee[2]; |
954 | 0 | eeo[1] = ee[1] - ee[2]; |
955 | |
|
956 | 0 | pi2_tmp[0] = (g_ai2_ihevc_trans_16[0][0] * eee[0] |
957 | 0 | + g_ai2_ihevc_trans_16[0][1] * eee[1] + add) >> shift; |
958 | 0 | pi2_tmp[8 * trans_size] = (g_ai2_ihevc_trans_16[8][0] * eee[0] |
959 | 0 | + g_ai2_ihevc_trans_16[8][1] * eee[1] + add) >> shift; |
960 | 0 | pi2_tmp[4 * trans_size] = (g_ai2_ihevc_trans_16[4][0] * eeo[0] |
961 | 0 | + g_ai2_ihevc_trans_16[4][1] * eeo[1] + add) >> shift; |
962 | 0 | pi2_tmp[12 * trans_size] = (g_ai2_ihevc_trans_16[12][0] * eeo[0] |
963 | 0 | + g_ai2_ihevc_trans_16[12][1] * eeo[1] + add) >> shift; |
964 | |
|
965 | 0 | for(k = 2; k < 16; k += 4) |
966 | 0 | { |
967 | 0 | pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_16[k][0] * eo[0] |
968 | 0 | + g_ai2_ihevc_trans_16[k][1] * eo[1] |
969 | 0 | + g_ai2_ihevc_trans_16[k][2] * eo[2] |
970 | 0 | + g_ai2_ihevc_trans_16[k][3] * eo[3] + add) |
971 | 0 | >> shift; |
972 | 0 | } |
973 | |
|
974 | 0 | for(k = 1; k < 16; k += 2) |
975 | 0 | { |
976 | 0 | pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_16[k][0] * o[0] |
977 | 0 | + g_ai2_ihevc_trans_16[k][1] * o[1] |
978 | 0 | + g_ai2_ihevc_trans_16[k][2] * o[2] |
979 | 0 | + g_ai2_ihevc_trans_16[k][3] * o[3] |
980 | 0 | + g_ai2_ihevc_trans_16[k][4] * o[4] |
981 | 0 | + g_ai2_ihevc_trans_16[k][5] * o[5] |
982 | 0 | + g_ai2_ihevc_trans_16[k][6] * o[6] |
983 | 0 | + g_ai2_ihevc_trans_16[k][7] * o[7] + add) >> shift; |
984 | 0 | } |
985 | 0 | pi2_src += src_strd; |
986 | 0 | pu1_pred += pred_strd; |
987 | 0 | pi2_tmp++; |
988 | 0 | } |
989 | |
|
990 | 0 | pi2_tmp = pi2_tmp_orig; |
991 | | /* Forward Transform 2nd stage */ |
992 | 0 | shift = 10; // log2(iHeight) + 6 |
993 | 0 | add = 1 << (shift - 1); |
994 | |
|
995 | 0 | for(i = 0; i < TRANS_SIZE_16; i++) |
996 | 0 | { |
997 | | /* e and o*/ |
998 | 0 | for(k = 0; k < 8; k++) |
999 | 0 | { |
1000 | 0 | e[k] = pi2_tmp[k] + pi2_tmp[15 - k]; |
1001 | 0 | o[k] = pi2_tmp[k] - pi2_tmp[15 - k]; |
1002 | 0 | } |
1003 | | /* ee and eo */ |
1004 | 0 | for(k = 0; k < 4; k++) |
1005 | 0 | { |
1006 | 0 | ee[k] = e[k] + e[7 - k]; |
1007 | 0 | eo[k] = e[k] - e[7 - k]; |
1008 | 0 | } |
1009 | | /* eee and eeo */ |
1010 | 0 | eee[0] = ee[0] + ee[3]; |
1011 | 0 | eeo[0] = ee[0] - ee[3]; |
1012 | 0 | eee[1] = ee[1] + ee[2]; |
1013 | 0 | eeo[1] = ee[1] - ee[2]; |
1014 | |
|
1015 | 0 | pi2_dst[0] = (g_ai2_ihevc_trans_16[0][0] * eee[0] |
1016 | 0 | + g_ai2_ihevc_trans_16[0][1] * eee[1] + add) >> shift; |
1017 | 0 | pi2_dst[8 * dst_strd] = (g_ai2_ihevc_trans_16[8][0] * eee[0] |
1018 | 0 | + g_ai2_ihevc_trans_16[8][1] * eee[1] + add) >> shift; |
1019 | 0 | pi2_dst[4 * dst_strd] = (g_ai2_ihevc_trans_16[4][0] * eeo[0] |
1020 | 0 | + g_ai2_ihevc_trans_16[4][1] * eeo[1] + add) >> shift; |
1021 | 0 | pi2_dst[12 * dst_strd] = (g_ai2_ihevc_trans_16[12][0] * eeo[0] |
1022 | 0 | + g_ai2_ihevc_trans_16[12][1] * eeo[1] + add) >> shift; |
1023 | |
|
1024 | 0 | for(k = 2; k < 16; k += 4) |
1025 | 0 | { |
1026 | 0 | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_16[k][0] * eo[0] |
1027 | 0 | + g_ai2_ihevc_trans_16[k][1] * eo[1] |
1028 | 0 | + g_ai2_ihevc_trans_16[k][2] * eo[2] |
1029 | 0 | + g_ai2_ihevc_trans_16[k][3] * eo[3] + add) |
1030 | 0 | >> shift; |
1031 | 0 | } |
1032 | |
|
1033 | 0 | for(k = 1; k < 16; k += 2) |
1034 | 0 | { |
1035 | 0 | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_16[k][0] * o[0] |
1036 | 0 | + g_ai2_ihevc_trans_16[k][1] * o[1] |
1037 | 0 | + g_ai2_ihevc_trans_16[k][2] * o[2] |
1038 | 0 | + g_ai2_ihevc_trans_16[k][3] * o[3] |
1039 | 0 | + g_ai2_ihevc_trans_16[k][4] * o[4] |
1040 | 0 | + g_ai2_ihevc_trans_16[k][5] * o[5] |
1041 | 0 | + g_ai2_ihevc_trans_16[k][6] * o[6] |
1042 | 0 | + g_ai2_ihevc_trans_16[k][7] * o[7] + add) >> shift; |
1043 | 0 | } |
1044 | |
|
1045 | 0 | pi2_tmp += trans_size; |
1046 | 0 | pi2_dst++; |
1047 | 0 | } |
1048 | 0 | } |
1049 | | |
1050 | | /** |
1051 | | ******************************************************************************* |
1052 | | * |
1053 | | * @brief |
1054 | | * This function performs residue calculation and forward transform on |
1055 | | * input pixels |
1056 | | * |
1057 | | * @par Description: |
1058 | | * Performs residue calculation by subtracting source and prediction and |
1059 | | * followed by forward transform |
1060 | | * |
1061 | | * @param[in] pu1_src |
1062 | | * Input 32x32 pixels |
1063 | | * |
1064 | | * @param[in] pu1_pred |
1065 | | * Prediction data |
1066 | | * |
1067 | | * @param[in] pi2_tmp |
1068 | | * Temporary buffer of size 32x32 |
1069 | | * |
1070 | | * @param[out] pi2_dst |
1071 | | * Output 32x32 coefficients |
1072 | | * |
1073 | | * @param[in] src_strd |
1074 | | * Input stride |
1075 | | * |
1076 | | * @param[in] pred_strd |
1077 | | * Prediction Stride |
1078 | | * |
1079 | | * @param[in] dst_strd |
1080 | | * Output Stride |
1081 | | * |
1082 | | * @param[in] e_chroma_plane |
1083 | | * Enum singalling chroma plane |
1084 | | * |
1085 | | * @returns Void |
1086 | | * |
1087 | | * @remarks |
1088 | | * None |
1089 | | * |
1090 | | ******************************************************************************* |
1091 | | */ |
1092 | | |
1093 | | UWORD32 ihevc_resi_trans_32x32(UWORD8 *pu1_src, |
1094 | | UWORD8 *pu1_pred, |
1095 | | WORD32 *pi4_temp, |
1096 | | WORD16 *pi2_dst, |
1097 | | WORD32 src_strd, |
1098 | | WORD32 pred_strd, |
1099 | | WORD32 dst_strd, |
1100 | | CHROMA_PLANE_ID_T e_chroma_plane) |
1101 | 77.2k | { |
1102 | 77.2k | WORD32 i, k; |
1103 | 77.2k | WORD32 e[16], o[16]; |
1104 | 77.2k | WORD32 ee[8], eo[8]; |
1105 | 77.2k | WORD32 eee[4], eeo[4]; |
1106 | 77.2k | WORD32 eeee[2], eeeo[2]; |
1107 | 77.2k | WORD32 add, shift; |
1108 | 77.2k | WORD32 trans_size; |
1109 | 77.2k | WORD32 *pi4_tmp_orig; |
1110 | 77.2k | WORD16 *pi2_dst_orig; |
1111 | 77.2k | UWORD32 u4_blk_sad = 0 ; |
1112 | 77.2k | UNUSED(e_chroma_plane); |
1113 | | |
1114 | 77.2k | pi2_dst_orig = pi2_dst; |
1115 | 77.2k | pi4_tmp_orig = pi4_temp; |
1116 | 77.2k | trans_size = TRANS_SIZE_32; |
1117 | | /* Residue + Forward Transform 1st stage */ |
1118 | | /* Made to zero to match with intrinsics */ |
1119 | 77.2k | shift = 0; // 4 : log2(iWidth) - 1 + g_uiBitIncrement |
1120 | 77.2k | add = 0 ; //1 << (shift - 1); |
1121 | | |
1122 | 2.54M | for(i = 0; i < trans_size; i++) |
1123 | 2.47M | { |
1124 | 2.47M | WORD32 resi_tmp_1, resi_tmp_2; |
1125 | | /* e and o*/ |
1126 | 42.0M | for(k = 0; k < 16; k++) |
1127 | 39.5M | { |
1128 | 39.5M | resi_tmp_1 = pu1_src[k] - pu1_pred[k]; |
1129 | 39.5M | resi_tmp_2 = pu1_src[31 - k] - pu1_pred[31 - k]; |
1130 | 39.5M | e[k] = resi_tmp_1 + resi_tmp_2; |
1131 | 39.5M | o[k] = resi_tmp_1 - resi_tmp_2; |
1132 | 39.5M | u4_blk_sad += abs(resi_tmp_1) + abs(resi_tmp_2); |
1133 | 39.5M | } |
1134 | | /* ee and eo */ |
1135 | 22.2M | for(k = 0; k < 8; k++) |
1136 | 19.7M | { |
1137 | 19.7M | ee[k] = e[k] + e[15 - k]; |
1138 | 19.7M | eo[k] = e[k] - e[15 - k]; |
1139 | 19.7M | } |
1140 | | /* eee and eeo */ |
1141 | 12.3M | for(k = 0; k < 4; k++) |
1142 | 9.88M | { |
1143 | 9.88M | eee[k] = ee[k] + ee[7 - k]; |
1144 | 9.88M | eeo[k] = ee[k] - ee[7 - k]; |
1145 | 9.88M | } |
1146 | | /* eeee and eeeo */ |
1147 | 2.47M | eeee[0] = eee[0] + eee[3]; |
1148 | 2.47M | eeeo[0] = eee[0] - eee[3]; |
1149 | 2.47M | eeee[1] = eee[1] + eee[2]; |
1150 | 2.47M | eeeo[1] = eee[1] - eee[2]; |
1151 | | |
1152 | 2.47M | pi4_temp[0] = (g_ai2_ihevc_trans_32[0][0] * eeee[0] |
1153 | 2.47M | + g_ai2_ihevc_trans_32[0][1] * eeee[1]);// + add) >> shift; |
1154 | 2.47M | pi4_temp[16 * trans_size] = (g_ai2_ihevc_trans_32[16][0] * eeee[0] |
1155 | 2.47M | + g_ai2_ihevc_trans_32[16][1] * eeee[1]);// + add) >> shift; |
1156 | 2.47M | pi4_temp[8 * trans_size] = (g_ai2_ihevc_trans_32[8][0] * eeeo[0] |
1157 | 2.47M | + g_ai2_ihevc_trans_32[8][1] * eeeo[1]);// + add) >> shift; |
1158 | 2.47M | pi4_temp[24 * trans_size] = (g_ai2_ihevc_trans_32[24][0] * eeeo[0] |
1159 | 2.47M | + g_ai2_ihevc_trans_32[24][1] * eeeo[1]);// + add) >> shift; |
1160 | 12.3M | for(k = 4; k < 32; k += 8) |
1161 | 9.88M | { |
1162 | 9.88M | pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * eeo[0] |
1163 | 9.88M | + g_ai2_ihevc_trans_32[k][1] * eeo[1] |
1164 | 9.88M | + g_ai2_ihevc_trans_32[k][2] * eeo[2] |
1165 | 9.88M | + g_ai2_ihevc_trans_32[k][3] * eeo[3]);// + add)>> shift; |
1166 | 9.88M | } |
1167 | 22.2M | for(k = 2; k < 32; k += 4) |
1168 | 19.7M | { |
1169 | 19.7M | pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * eo[0] |
1170 | 19.7M | + g_ai2_ihevc_trans_32[k][1] * eo[1] |
1171 | 19.7M | + g_ai2_ihevc_trans_32[k][2] * eo[2] |
1172 | 19.7M | + g_ai2_ihevc_trans_32[k][3] * eo[3] |
1173 | 19.7M | + g_ai2_ihevc_trans_32[k][4] * eo[4] |
1174 | 19.7M | + g_ai2_ihevc_trans_32[k][5] * eo[5] |
1175 | 19.7M | + g_ai2_ihevc_trans_32[k][6] * eo[6] |
1176 | 19.7M | + g_ai2_ihevc_trans_32[k][7] * eo[7]);// + add)>> shift; |
1177 | 19.7M | } |
1178 | 42.0M | for(k = 1; k < 32; k += 2) |
1179 | 39.5M | { |
1180 | 39.5M | pi4_temp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * o[0] |
1181 | 39.5M | + g_ai2_ihevc_trans_32[k][1] * o[1] |
1182 | 39.5M | + g_ai2_ihevc_trans_32[k][2] * o[2] |
1183 | 39.5M | + g_ai2_ihevc_trans_32[k][3] * o[3] |
1184 | 39.5M | + g_ai2_ihevc_trans_32[k][4] * o[4] |
1185 | 39.5M | + g_ai2_ihevc_trans_32[k][5] * o[5] |
1186 | 39.5M | + g_ai2_ihevc_trans_32[k][6] * o[6] |
1187 | 39.5M | + g_ai2_ihevc_trans_32[k][7] * o[7] |
1188 | 39.5M | + g_ai2_ihevc_trans_32[k][8] * o[8] |
1189 | 39.5M | + g_ai2_ihevc_trans_32[k][9] * o[9] |
1190 | 39.5M | + g_ai2_ihevc_trans_32[k][10] * o[10] |
1191 | 39.5M | + g_ai2_ihevc_trans_32[k][11] * o[11] |
1192 | 39.5M | + g_ai2_ihevc_trans_32[k][12] * o[12] |
1193 | 39.5M | + g_ai2_ihevc_trans_32[k][13] * o[13] |
1194 | 39.5M | + g_ai2_ihevc_trans_32[k][14] * o[14] |
1195 | 39.5M | + g_ai2_ihevc_trans_32[k][15] * o[15]);// + add) >> shift; |
1196 | 39.5M | } |
1197 | 2.47M | pu1_src += src_strd; |
1198 | 2.47M | pu1_pred += pred_strd; |
1199 | 2.47M | pi4_temp++; |
1200 | 2.47M | } |
1201 | | |
1202 | 77.2k | pi4_temp = pi4_tmp_orig; |
1203 | | /* Forward Transform 2nd stage */ |
1204 | 77.2k | shift = 15; // log2(iHeight) + 6 |
1205 | 77.2k | add = 1 << (shift - 1); |
1206 | | |
1207 | 2.54M | for(i = 0; i < TRANS_SIZE_32; i++) |
1208 | 2.47M | { |
1209 | | /* e and o*/ |
1210 | 42.0M | for(k = 0; k < 16; k++) |
1211 | 39.5M | { |
1212 | 39.5M | e[k] = pi4_temp[k] + pi4_temp[31 - k]; |
1213 | 39.5M | o[k] = pi4_temp[k] - pi4_temp[31 - k]; |
1214 | 39.5M | } |
1215 | | /* ee and eo */ |
1216 | 22.2M | for(k = 0; k < 8; k++) |
1217 | 19.7M | { |
1218 | 19.7M | ee[k] = e[k] + e[15 - k]; |
1219 | 19.7M | eo[k] = e[k] - e[15 - k]; |
1220 | 19.7M | } |
1221 | | /* eee and eeo */ |
1222 | 12.3M | for(k = 0; k < 4; k++) |
1223 | 9.88M | { |
1224 | 9.88M | eee[k] = ee[k] + ee[7 - k]; |
1225 | 9.88M | eeo[k] = ee[k] - ee[7 - k]; |
1226 | 9.88M | } |
1227 | | /* eeee and eeeo */ |
1228 | 2.47M | eeee[0] = eee[0] + eee[3]; |
1229 | 2.47M | eeeo[0] = eee[0] - eee[3]; |
1230 | 2.47M | eeee[1] = eee[1] + eee[2]; |
1231 | 2.47M | eeeo[1] = eee[1] - eee[2]; |
1232 | | |
1233 | 2.47M | pi2_dst[0] = (g_ai2_ihevc_trans_32[0][0] * eeee[0] |
1234 | 2.47M | + g_ai2_ihevc_trans_32[0][1] * eeee[1] + add) >> shift; |
1235 | 2.47M | pi2_dst[16 * dst_strd] = (g_ai2_ihevc_trans_32[16][0] * eeee[0] |
1236 | 2.47M | + g_ai2_ihevc_trans_32[16][1] * eeee[1] + add) >> shift; |
1237 | 2.47M | pi2_dst[8 * dst_strd] = (g_ai2_ihevc_trans_32[8][0] * eeeo[0] |
1238 | 2.47M | + g_ai2_ihevc_trans_32[8][1] * eeeo[1] + add) >> shift; |
1239 | 2.47M | pi2_dst[24 * dst_strd] = (g_ai2_ihevc_trans_32[24][0] * eeeo[0] |
1240 | 2.47M | + g_ai2_ihevc_trans_32[24][1] * eeeo[1] + add) >> shift; |
1241 | 12.3M | for(k = 4; k < 32; k += 8) |
1242 | 9.88M | { |
1243 | 9.88M | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * eeo[0] |
1244 | 9.88M | + g_ai2_ihevc_trans_32[k][1] * eeo[1] |
1245 | 9.88M | + g_ai2_ihevc_trans_32[k][2] * eeo[2] |
1246 | 9.88M | + g_ai2_ihevc_trans_32[k][3] * eeo[3] + add) |
1247 | 9.88M | >> shift; |
1248 | 9.88M | } |
1249 | 22.2M | for(k = 2; k < 32; k += 4) |
1250 | 19.7M | { |
1251 | 19.7M | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * eo[0] |
1252 | 19.7M | + g_ai2_ihevc_trans_32[k][1] * eo[1] |
1253 | 19.7M | + g_ai2_ihevc_trans_32[k][2] * eo[2] |
1254 | 19.7M | + g_ai2_ihevc_trans_32[k][3] * eo[3] |
1255 | 19.7M | + g_ai2_ihevc_trans_32[k][4] * eo[4] |
1256 | 19.7M | + g_ai2_ihevc_trans_32[k][5] * eo[5] |
1257 | 19.7M | + g_ai2_ihevc_trans_32[k][6] * eo[6] |
1258 | 19.7M | + g_ai2_ihevc_trans_32[k][7] * eo[7] + add) |
1259 | 19.7M | >> shift; |
1260 | 19.7M | } |
1261 | 42.0M | for(k = 1; k < 32; k += 2) |
1262 | 39.5M | { |
1263 | 39.5M | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * o[0] |
1264 | 39.5M | + g_ai2_ihevc_trans_32[k][1] * o[1] |
1265 | 39.5M | + g_ai2_ihevc_trans_32[k][2] * o[2] |
1266 | 39.5M | + g_ai2_ihevc_trans_32[k][3] * o[3] |
1267 | 39.5M | + g_ai2_ihevc_trans_32[k][4] * o[4] |
1268 | 39.5M | + g_ai2_ihevc_trans_32[k][5] * o[5] |
1269 | 39.5M | + g_ai2_ihevc_trans_32[k][6] * o[6] |
1270 | 39.5M | + g_ai2_ihevc_trans_32[k][7] * o[7] |
1271 | 39.5M | + g_ai2_ihevc_trans_32[k][8] * o[8] |
1272 | 39.5M | + g_ai2_ihevc_trans_32[k][9] * o[9] |
1273 | 39.5M | + g_ai2_ihevc_trans_32[k][10] * o[10] |
1274 | 39.5M | + g_ai2_ihevc_trans_32[k][11] * o[11] |
1275 | 39.5M | + g_ai2_ihevc_trans_32[k][12] * o[12] |
1276 | 39.5M | + g_ai2_ihevc_trans_32[k][13] * o[13] |
1277 | 39.5M | + g_ai2_ihevc_trans_32[k][14] * o[14] |
1278 | 39.5M | + g_ai2_ihevc_trans_32[k][15] * o[15] + add) |
1279 | 39.5M | >> shift; |
1280 | 39.5M | } |
1281 | | |
1282 | 2.47M | pi4_temp += trans_size; |
1283 | 2.47M | pi2_dst++; |
1284 | 2.47M | } |
1285 | | |
1286 | 77.2k | return u4_blk_sad; |
1287 | 77.2k | } |
1288 | | |
1289 | | |
1290 | | |
1291 | | void ihevc_resi_trans_32x32_16bit(WORD16 *pi2_src, |
1292 | | UWORD8 *pu1_pred, |
1293 | | WORD16 *pi2_tmp, |
1294 | | WORD16 *pi2_dst, |
1295 | | WORD32 src_strd, |
1296 | | WORD32 pred_strd, |
1297 | | WORD32 dst_strd) |
1298 | 0 | { |
1299 | 0 | WORD32 i, k; |
1300 | 0 | WORD32 e[16], o[16]; |
1301 | 0 | WORD32 ee[8], eo[8]; |
1302 | 0 | WORD32 eee[4], eeo[4]; |
1303 | 0 | WORD32 eeee[2], eeeo[2]; |
1304 | 0 | WORD32 add, shift; |
1305 | 0 | WORD32 trans_size; |
1306 | 0 | WORD16 *pi2_tmp_orig; |
1307 | 0 | WORD16 *pi2_dst_orig; |
1308 | |
|
1309 | 0 | pi2_dst_orig = pi2_dst; |
1310 | 0 | pi2_tmp_orig = pi2_tmp; |
1311 | 0 | trans_size = TRANS_SIZE_32; |
1312 | | /* Residue + Forward Transform 1st stage */ |
1313 | 0 | shift = 4; // log2(iWidth) - 1 + g_uiBitIncrement |
1314 | 0 | add = 1 << (shift - 1); |
1315 | |
|
1316 | 0 | for(i = 0; i < trans_size; i++) |
1317 | 0 | { |
1318 | 0 | WORD32 resi_tmp_1, resi_tmp_2; |
1319 | | /* e and o*/ |
1320 | 0 | for(k = 0; k < 16; k++) |
1321 | 0 | { |
1322 | 0 | resi_tmp_1 = pi2_src[k] - pu1_pred[k]; |
1323 | 0 | resi_tmp_2 = pi2_src[31 - k] - pu1_pred[31 - k]; |
1324 | 0 | e[k] = resi_tmp_1 + resi_tmp_2; |
1325 | 0 | o[k] = resi_tmp_1 - resi_tmp_2; |
1326 | 0 | } |
1327 | | /* ee and eo */ |
1328 | 0 | for(k = 0; k < 8; k++) |
1329 | 0 | { |
1330 | 0 | ee[k] = e[k] + e[15 - k]; |
1331 | 0 | eo[k] = e[k] - e[15 - k]; |
1332 | 0 | } |
1333 | | /* eee and eeo */ |
1334 | 0 | for(k = 0; k < 4; k++) |
1335 | 0 | { |
1336 | 0 | eee[k] = ee[k] + ee[7 - k]; |
1337 | 0 | eeo[k] = ee[k] - ee[7 - k]; |
1338 | 0 | } |
1339 | | /* eeee and eeeo */ |
1340 | 0 | eeee[0] = eee[0] + eee[3]; |
1341 | 0 | eeeo[0] = eee[0] - eee[3]; |
1342 | 0 | eeee[1] = eee[1] + eee[2]; |
1343 | 0 | eeeo[1] = eee[1] - eee[2]; |
1344 | |
|
1345 | 0 | pi2_tmp[0] = (g_ai2_ihevc_trans_32[0][0] * eeee[0] |
1346 | 0 | + g_ai2_ihevc_trans_32[0][1] * eeee[1] + add) >> shift; |
1347 | 0 | pi2_tmp[16 * trans_size] = (g_ai2_ihevc_trans_32[16][0] * eeee[0] |
1348 | 0 | + g_ai2_ihevc_trans_32[16][1] * eeee[1] + add) >> shift; |
1349 | 0 | pi2_tmp[8 * trans_size] = (g_ai2_ihevc_trans_32[8][0] * eeeo[0] |
1350 | 0 | + g_ai2_ihevc_trans_32[8][1] * eeeo[1] + add) >> shift; |
1351 | 0 | pi2_tmp[24 * trans_size] = (g_ai2_ihevc_trans_32[24][0] * eeeo[0] |
1352 | 0 | + g_ai2_ihevc_trans_32[24][1] * eeeo[1] + add) >> shift; |
1353 | 0 | for(k = 4; k < 32; k += 8) |
1354 | 0 | { |
1355 | 0 | pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * eeo[0] |
1356 | 0 | + g_ai2_ihevc_trans_32[k][1] * eeo[1] |
1357 | 0 | + g_ai2_ihevc_trans_32[k][2] * eeo[2] |
1358 | 0 | + g_ai2_ihevc_trans_32[k][3] * eeo[3] + add) |
1359 | 0 | >> shift; |
1360 | 0 | } |
1361 | 0 | for(k = 2; k < 32; k += 4) |
1362 | 0 | { |
1363 | 0 | pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * eo[0] |
1364 | 0 | + g_ai2_ihevc_trans_32[k][1] * eo[1] |
1365 | 0 | + g_ai2_ihevc_trans_32[k][2] * eo[2] |
1366 | 0 | + g_ai2_ihevc_trans_32[k][3] * eo[3] |
1367 | 0 | + g_ai2_ihevc_trans_32[k][4] * eo[4] |
1368 | 0 | + g_ai2_ihevc_trans_32[k][5] * eo[5] |
1369 | 0 | + g_ai2_ihevc_trans_32[k][6] * eo[6] |
1370 | 0 | + g_ai2_ihevc_trans_32[k][7] * eo[7] + add) |
1371 | 0 | >> shift; |
1372 | 0 | } |
1373 | 0 | for(k = 1; k < 32; k += 2) |
1374 | 0 | { |
1375 | 0 | pi2_tmp[k * trans_size] = (g_ai2_ihevc_trans_32[k][0] * o[0] |
1376 | 0 | + g_ai2_ihevc_trans_32[k][1] * o[1] |
1377 | 0 | + g_ai2_ihevc_trans_32[k][2] * o[2] |
1378 | 0 | + g_ai2_ihevc_trans_32[k][3] * o[3] |
1379 | 0 | + g_ai2_ihevc_trans_32[k][4] * o[4] |
1380 | 0 | + g_ai2_ihevc_trans_32[k][5] * o[5] |
1381 | 0 | + g_ai2_ihevc_trans_32[k][6] * o[6] |
1382 | 0 | + g_ai2_ihevc_trans_32[k][7] * o[7] |
1383 | 0 | + g_ai2_ihevc_trans_32[k][8] * o[8] |
1384 | 0 | + g_ai2_ihevc_trans_32[k][9] * o[9] |
1385 | 0 | + g_ai2_ihevc_trans_32[k][10] * o[10] |
1386 | 0 | + g_ai2_ihevc_trans_32[k][11] * o[11] |
1387 | 0 | + g_ai2_ihevc_trans_32[k][12] * o[12] |
1388 | 0 | + g_ai2_ihevc_trans_32[k][13] * o[13] |
1389 | 0 | + g_ai2_ihevc_trans_32[k][14] * o[14] |
1390 | 0 | + g_ai2_ihevc_trans_32[k][15] * o[15] + add) |
1391 | 0 | >> shift; |
1392 | 0 | } |
1393 | 0 | pi2_src += src_strd; |
1394 | 0 | pu1_pred += pred_strd; |
1395 | 0 | pi2_tmp++; |
1396 | 0 | } |
1397 | |
|
1398 | 0 | pi2_tmp = pi2_tmp_orig; |
1399 | | /* Forward Transform 2nd stage */ |
1400 | 0 | shift = 11; // log2(iHeight) + 6 |
1401 | 0 | add = 1 << (shift - 1); |
1402 | |
|
1403 | 0 | for(i = 0; i < TRANS_SIZE_32; i++) |
1404 | 0 | { |
1405 | | /* e and o*/ |
1406 | 0 | for(k = 0; k < 16; k++) |
1407 | 0 | { |
1408 | 0 | e[k] = pi2_tmp[k] + pi2_tmp[31 - k]; |
1409 | 0 | o[k] = pi2_tmp[k] - pi2_tmp[31 - k]; |
1410 | 0 | } |
1411 | | /* ee and eo */ |
1412 | 0 | for(k = 0; k < 8; k++) |
1413 | 0 | { |
1414 | 0 | ee[k] = e[k] + e[15 - k]; |
1415 | 0 | eo[k] = e[k] - e[15 - k]; |
1416 | 0 | } |
1417 | | /* eee and eeo */ |
1418 | 0 | for(k = 0; k < 4; k++) |
1419 | 0 | { |
1420 | 0 | eee[k] = ee[k] + ee[7 - k]; |
1421 | 0 | eeo[k] = ee[k] - ee[7 - k]; |
1422 | 0 | } |
1423 | | /* eeee and eeeo */ |
1424 | 0 | eeee[0] = eee[0] + eee[3]; |
1425 | 0 | eeeo[0] = eee[0] - eee[3]; |
1426 | 0 | eeee[1] = eee[1] + eee[2]; |
1427 | 0 | eeeo[1] = eee[1] - eee[2]; |
1428 | |
|
1429 | 0 | pi2_dst[0] = (g_ai2_ihevc_trans_32[0][0] * eeee[0] |
1430 | 0 | + g_ai2_ihevc_trans_32[0][1] * eeee[1] + add) >> shift; |
1431 | 0 | pi2_dst[16 * dst_strd] = (g_ai2_ihevc_trans_32[16][0] * eeee[0] |
1432 | 0 | + g_ai2_ihevc_trans_32[16][1] * eeee[1] + add) >> shift; |
1433 | 0 | pi2_dst[8 * dst_strd] = (g_ai2_ihevc_trans_32[8][0] * eeeo[0] |
1434 | 0 | + g_ai2_ihevc_trans_32[8][1] * eeeo[1] + add) >> shift; |
1435 | 0 | pi2_dst[24 * dst_strd] = (g_ai2_ihevc_trans_32[24][0] * eeeo[0] |
1436 | 0 | + g_ai2_ihevc_trans_32[24][1] * eeeo[1] + add) >> shift; |
1437 | 0 | for(k = 4; k < 32; k += 8) |
1438 | 0 | { |
1439 | 0 | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * eeo[0] |
1440 | 0 | + g_ai2_ihevc_trans_32[k][1] * eeo[1] |
1441 | 0 | + g_ai2_ihevc_trans_32[k][2] * eeo[2] |
1442 | 0 | + g_ai2_ihevc_trans_32[k][3] * eeo[3] + add) |
1443 | 0 | >> shift; |
1444 | 0 | } |
1445 | 0 | for(k = 2; k < 32; k += 4) |
1446 | 0 | { |
1447 | 0 | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * eo[0] |
1448 | 0 | + g_ai2_ihevc_trans_32[k][1] * eo[1] |
1449 | 0 | + g_ai2_ihevc_trans_32[k][2] * eo[2] |
1450 | 0 | + g_ai2_ihevc_trans_32[k][3] * eo[3] |
1451 | 0 | + g_ai2_ihevc_trans_32[k][4] * eo[4] |
1452 | 0 | + g_ai2_ihevc_trans_32[k][5] * eo[5] |
1453 | 0 | + g_ai2_ihevc_trans_32[k][6] * eo[6] |
1454 | 0 | + g_ai2_ihevc_trans_32[k][7] * eo[7] + add) |
1455 | 0 | >> shift; |
1456 | 0 | } |
1457 | 0 | for(k = 1; k < 32; k += 2) |
1458 | 0 | { |
1459 | 0 | pi2_dst[k * dst_strd] = (g_ai2_ihevc_trans_32[k][0] * o[0] |
1460 | 0 | + g_ai2_ihevc_trans_32[k][1] * o[1] |
1461 | 0 | + g_ai2_ihevc_trans_32[k][2] * o[2] |
1462 | 0 | + g_ai2_ihevc_trans_32[k][3] * o[3] |
1463 | 0 | + g_ai2_ihevc_trans_32[k][4] * o[4] |
1464 | 0 | + g_ai2_ihevc_trans_32[k][5] * o[5] |
1465 | 0 | + g_ai2_ihevc_trans_32[k][6] * o[6] |
1466 | 0 | + g_ai2_ihevc_trans_32[k][7] * o[7] |
1467 | 0 | + g_ai2_ihevc_trans_32[k][8] * o[8] |
1468 | 0 | + g_ai2_ihevc_trans_32[k][9] * o[9] |
1469 | 0 | + g_ai2_ihevc_trans_32[k][10] * o[10] |
1470 | 0 | + g_ai2_ihevc_trans_32[k][11] * o[11] |
1471 | 0 | + g_ai2_ihevc_trans_32[k][12] * o[12] |
1472 | 0 | + g_ai2_ihevc_trans_32[k][13] * o[13] |
1473 | 0 | + g_ai2_ihevc_trans_32[k][14] * o[14] |
1474 | 0 | + g_ai2_ihevc_trans_32[k][15] * o[15] + add) |
1475 | 0 | >> shift; |
1476 | 0 | } |
1477 | |
|
1478 | 0 | pi2_tmp += trans_size; |
1479 | 0 | pi2_dst++; |
1480 | 0 | } |
1481 | 0 | } |
1482 | | |