/src/libavc/common/ih264_luma_intra_pred_filters.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2015 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 | | ******************************************************************************* |
23 | | * @file |
24 | | * ih264_luma_intra_pred_filters.c |
25 | | * |
26 | | * @brief |
27 | | * Contains function definitions for intra prediction filters |
28 | | * |
29 | | * @author |
30 | | * ittiam |
31 | | * |
32 | | * @par List of Functions: |
33 | | * - ih264_intra_pred_luma_4x4_mode_vert |
34 | | * - ih264_intra_pred_luma_4x4_mode_horz |
35 | | * - ih264_intra_pred_luma_4x4_mode_dc |
36 | | * - ih264_intra_pred_luma_4x4_mode_diag_dl |
37 | | * - ih264_intra_pred_luma_4x4_mode_diag_dr |
38 | | * - ih264_intra_pred_luma_4x4_mode_vert_r |
39 | | * - ih264_intra_pred_luma_4x4_mode_horz_d |
40 | | * - ih264_intra_pred_luma_4x4_mode_vert_l |
41 | | * - ih264_intra_pred_luma_4x4_mode_horz_u |
42 | | * - ih264_intra_pred_luma_8x8_mode_ref_filtering |
43 | | * - ih264_intra_pred_luma_8x8_mode_vert |
44 | | * - ih264_intra_pred_luma_8x8_mode_horz |
45 | | * - ih264_intra_pred_luma_8x8_mode_dc |
46 | | * - ih264_intra_pred_luma_8x8_mode_diag_dl |
47 | | * - ih264_intra_pred_luma_8x8_mode_diag_dr |
48 | | * - ih264_intra_pred_luma_8x8_mode_vert_r |
49 | | * - ih264_intra_pred_luma_8x8_mode_horz_d |
50 | | * - ih264_intra_pred_luma_8x8_mode_vert_l |
51 | | * - ih264_intra_pred_luma_8x8_mode_horz_u |
52 | | * - ih264_intra_pred_luma_16x16_mode_vert |
53 | | * - ih264_intra_pred_luma_16x16_mode_horz |
54 | | * - ih264_intra_pred_luma_16x16_mode_dc |
55 | | * - ih264_intra_pred_luma_16x16_mode_plane |
56 | | * |
57 | | * @remarks |
58 | | * none |
59 | | * |
60 | | ****************************************************************************** |
61 | | */ |
62 | | |
63 | | /*****************************************************************************/ |
64 | | /* File Includes */ |
65 | | /*****************************************************************************/ |
66 | | /* System include files */ |
67 | | #include <stdio.h> |
68 | | #include <stddef.h> |
69 | | #include <string.h> |
70 | | |
71 | | /* User include files */ |
72 | | #include "ih264_typedefs.h" |
73 | | #include "ih264_macros.h" |
74 | | #include "ih264_defs.h" |
75 | | #include "ih264_intra_pred_filters.h" |
76 | | #include "ih264_platform_macros.h" |
77 | | |
78 | | /*****************************************************************************/ |
79 | | /* Global definitions */ |
80 | | /*****************************************************************************/ |
81 | | /* Note: Global variables used only in assembly files */ |
82 | | const WORD8 ih264_gai1_intrapred_luma_plane_coeffs[] = |
83 | | { |
84 | | 0x01, 0x02, 0x03, 0x04, |
85 | | 0x05, 0x06, 0x07, 0x08, |
86 | | 0x09, 0x0A, 0x0B, 0x0C, |
87 | | 0x0D, 0x0E, 0x0F, 0x10, |
88 | | }; |
89 | | |
90 | | const WORD8 ih264_gai1_intrapred_luma_8x8_horz_u[] = |
91 | | { |
92 | | 0x06, 0x15, 0x05, 0x14, |
93 | | 0x04, 0x13, 0x03, 0x12, |
94 | | 0x02, 0x11, 0x01, 0x10, |
95 | | 0x00, 0x1F, 0x0F, 0x0F, |
96 | | }; |
97 | | |
98 | | |
99 | | /*****************************************************************************/ |
100 | | /* Function Definitions */ |
101 | | /*****************************************************************************/ |
102 | | |
103 | | /** |
104 | | ******************************************************************************* |
105 | | * |
106 | | * @brief |
107 | | * Perform Intra prediction for luma_4x4 mode:vertical |
108 | | * |
109 | | * @par Description: |
110 | | * Perform Intra prediction for luma_4x4 mode:vertical, described in sec 8.3.1.2.1 |
111 | | * |
112 | | * @param[in] pu1_src |
113 | | * pointer to the source |
114 | | * |
115 | | * @param[out] pu1_dst |
116 | | * pointer to the destination |
117 | | * |
118 | | * @param[in] src_strd |
119 | | * source stride |
120 | | * |
121 | | * @param[in] dst_strd |
122 | | * destination stride |
123 | | * |
124 | | * @param[in] ngbr_avail |
125 | | * availability of neighbouring pixels |
126 | | * |
127 | | * @returns |
128 | | * |
129 | | * @remarks |
130 | | * none |
131 | | * |
132 | | ******************************************************************************* |
133 | | */ |
134 | | void ih264_intra_pred_luma_4x4_mode_vert(UWORD8 *pu1_src, |
135 | | UWORD8 *pu1_dst, |
136 | | WORD32 src_strd, |
137 | | WORD32 dst_strd, |
138 | | WORD32 ngbr_avail) |
139 | 0 | { |
140 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
141 | |
|
142 | 0 | UNUSED(src_strd); |
143 | 0 | UNUSED(ngbr_avail); |
144 | 0 | pu1_top = pu1_src + BLK_SIZE + 1; |
145 | 0 | memcpy(pu1_dst, pu1_top, 4); |
146 | 0 | memcpy(pu1_dst + dst_strd, pu1_top, 4); |
147 | 0 | memcpy(pu1_dst + 2 * dst_strd, pu1_top, 4); |
148 | 0 | memcpy(pu1_dst + 3 * dst_strd, pu1_top, 4); |
149 | 0 | } |
150 | | |
151 | | /** |
152 | | ******************************************************************************* |
153 | | * |
154 | | * @brief |
155 | | * Perform Intra prediction for luma_4x4 mode:horizontal |
156 | | * |
157 | | * @par Description: |
158 | | * Perform Intra prediction for luma_4x4 mode:horizontal, described in |
159 | | * sec 8.3.1.2.2 |
160 | | * |
161 | | * @param[in] pu1_src |
162 | | * pointer to the source |
163 | | * |
164 | | * @param[out] pu1_dst |
165 | | * pointer to the destination |
166 | | * |
167 | | * @param[in] src_strd |
168 | | * source stride |
169 | | * |
170 | | * @param[in] dst_strd |
171 | | * destination stride |
172 | | * |
173 | | * @param[in] ngbr_avail |
174 | | * availability of neighbouring pixels |
175 | | * |
176 | | * @returns |
177 | | * |
178 | | * @remarks |
179 | | * none |
180 | | * |
181 | | ******************************************************************************* |
182 | | */ |
183 | | void ih264_intra_pred_luma_4x4_mode_horz(UWORD8 *pu1_src, |
184 | | UWORD8 *pu1_dst, |
185 | | WORD32 src_strd, |
186 | | WORD32 dst_strd, |
187 | | WORD32 ngbr_avail) |
188 | 0 | { |
189 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
190 | |
|
191 | 0 | UNUSED(src_strd); |
192 | 0 | UNUSED(ngbr_avail); |
193 | 0 | pu1_left = pu1_src + BLK_SIZE - 1; |
194 | 0 | memset(pu1_dst, *pu1_left, 4); |
195 | 0 | memset(pu1_dst + dst_strd, *(pu1_left - 1), 4); |
196 | 0 | memset(pu1_dst + 2 * dst_strd, *(pu1_left - 2), 4); |
197 | 0 | memset(pu1_dst + 3 * dst_strd, *(pu1_left - 3), 4); |
198 | 0 | } |
199 | | |
200 | | /** |
201 | | ******************************************************************************* |
202 | | * |
203 | | * @brief |
204 | | * Perform Intra prediction for luma_4x4 mode:DC |
205 | | * |
206 | | * @par Description: |
207 | | * Perform Intra prediction for luma_4x4 mode:DC, described in sec 8.3.1.2.3 |
208 | | * |
209 | | * @param[in] pu1_src |
210 | | * pointer to the source |
211 | | * |
212 | | * @param[out] pu1_dst |
213 | | * pointer to the destination |
214 | | * |
215 | | * @param[in] src_strd |
216 | | * source stride |
217 | | * |
218 | | * @param[in] dst_strd |
219 | | * destination stride |
220 | | * |
221 | | * @param[in] ngbr_avail |
222 | | * availability of neighbouring pixels |
223 | | * |
224 | | * @returns |
225 | | * |
226 | | * @remarks |
227 | | * none |
228 | | * |
229 | | ******************************************************************************* |
230 | | */ |
231 | | void ih264_intra_pred_luma_4x4_mode_dc(UWORD8 *pu1_src, |
232 | | UWORD8 *pu1_dst, |
233 | | WORD32 src_strd, |
234 | | WORD32 dst_strd, |
235 | | WORD32 ngbr_avail) |
236 | 0 | { |
237 | 0 | UWORD8 u1_useleft; /* availability of left predictors (only for DC) */ |
238 | 0 | UWORD8 u1_usetop; /* availability of top predictors (only for DC) */ |
239 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
240 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
241 | 0 | WORD32 val = 0; |
242 | |
|
243 | 0 | UNUSED(src_strd); |
244 | 0 | UNUSED(ngbr_avail); |
245 | 0 | u1_useleft = BOOLEAN(ngbr_avail & LEFT_MB_AVAILABLE_MASK); |
246 | 0 | u1_usetop = BOOLEAN(ngbr_avail & TOP_MB_AVAILABLE_MASK); |
247 | 0 | pu1_top = pu1_src + BLK_SIZE + 1; |
248 | 0 | pu1_left = pu1_src + BLK_SIZE - 1; |
249 | |
|
250 | 0 | if(u1_useleft) |
251 | 0 | { |
252 | 0 | val += *pu1_left--; |
253 | 0 | val += *pu1_left--; |
254 | 0 | val += *pu1_left--; |
255 | 0 | val += *pu1_left + 2; |
256 | 0 | } |
257 | 0 | if(u1_usetop) |
258 | 0 | { |
259 | 0 | val += *pu1_top + *(pu1_top + 1) + *(pu1_top + 2) + *(pu1_top + 3) |
260 | 0 | + 2; |
261 | 0 | } |
262 | | /* Since 2 is added if either left/top pred is there, |
263 | | val still being zero implies both preds are not there */ |
264 | 0 | val = (val) ? (val >> (1 + u1_useleft + u1_usetop)) : 128; |
265 | | /* 4 bytes are copied from src to dst */ |
266 | 0 | memset(pu1_dst, val, 4); |
267 | 0 | memset(pu1_dst + dst_strd, val, 4); |
268 | 0 | memset(pu1_dst + 2 * dst_strd, val, 4); |
269 | 0 | memset(pu1_dst + 3 * dst_strd, val, 4); |
270 | 0 | } |
271 | | |
272 | | /** |
273 | | ******************************************************************************* |
274 | | * |
275 | | * @brief |
276 | | * Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Left |
277 | | * |
278 | | * @par Description: |
279 | | * Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Left, described in |
280 | | * sec 8.3.1.2.4 |
281 | | * |
282 | | * @param[in] pu1_src |
283 | | * pointer to the source |
284 | | * |
285 | | * @param[out] pu1_dst |
286 | | * pointer to the destination |
287 | | * |
288 | | * @param[in] src_strd |
289 | | * source stride |
290 | | * |
291 | | * @param[in] dst_strd |
292 | | * destination stride |
293 | | * |
294 | | * @param[in] ngbr_avail |
295 | | * availability of neighbouring pixels |
296 | | * |
297 | | * @returns |
298 | | * |
299 | | * @remarks |
300 | | * none |
301 | | * |
302 | | ******************************************************************************* |
303 | | */ |
304 | | void ih264_intra_pred_luma_4x4_mode_diag_dl(UWORD8 *pu1_src, |
305 | | UWORD8 *pu1_dst, |
306 | | WORD32 src_strd, |
307 | | WORD32 dst_strd, |
308 | | WORD32 ngbr_avail) |
309 | 0 | { |
310 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
311 | 0 | UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h; |
312 | 0 | UWORD8 predicted_pixels[7]; |
313 | |
|
314 | 0 | UNUSED(src_strd); |
315 | 0 | UNUSED(ngbr_avail); |
316 | 0 | pu1_top = pu1_src +BLK_SIZE + 1; |
317 | |
|
318 | 0 | ui4_a = *pu1_top++; |
319 | 0 | ui4_b = *pu1_top++; |
320 | 0 | ui4_c = *pu1_top++; |
321 | 0 | ui4_d = *pu1_top++; |
322 | 0 | ui4_e = *pu1_top++; |
323 | 0 | ui4_f = *pu1_top++; |
324 | 0 | ui4_g = *pu1_top++; |
325 | 0 | ui4_h = *pu1_top; |
326 | |
|
327 | 0 | predicted_pixels[0] = FILT121(ui4_a, ui4_b, ui4_c); |
328 | 0 | predicted_pixels[1] = FILT121(ui4_b, ui4_c, ui4_d); |
329 | 0 | predicted_pixels[2] = FILT121(ui4_c, ui4_d, ui4_e); |
330 | 0 | predicted_pixels[3] = FILT121(ui4_d, ui4_e, ui4_f); |
331 | 0 | predicted_pixels[4] = FILT121(ui4_e, ui4_f, ui4_g); |
332 | 0 | predicted_pixels[5] = FILT121(ui4_f, ui4_g, ui4_h); |
333 | 0 | predicted_pixels[6] = FILT121(ui4_g, ui4_h, ui4_h); |
334 | |
|
335 | 0 | memcpy(pu1_dst, predicted_pixels, 4); |
336 | 0 | memcpy(pu1_dst + dst_strd, predicted_pixels + 1, 4); |
337 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 2, 4); |
338 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 3, 4); |
339 | 0 | } |
340 | | |
341 | | /** |
342 | | ******************************************************************************* |
343 | | * |
344 | | * @brief |
345 | | * Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Right |
346 | | * |
347 | | * @par Description: |
348 | | * Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Right, described in |
349 | | * sec 8.3.1.2.5 |
350 | | * |
351 | | * @param[in] pu1_src |
352 | | * pointer to the source |
353 | | * |
354 | | * @param[out] pu1_dst |
355 | | * pointer to the destination |
356 | | * |
357 | | * @param[in] src_strd |
358 | | * source stride |
359 | | * |
360 | | * @param[in] dst_strd |
361 | | * destination stride |
362 | | * |
363 | | * @param[in] ngbr_avail |
364 | | * availability of neighbouring pixels |
365 | | * |
366 | | * @returns |
367 | | * |
368 | | * @remarks |
369 | | * none |
370 | | * |
371 | | ******************************************************************************* |
372 | | */ |
373 | | void ih264_intra_pred_luma_4x4_mode_diag_dr(UWORD8 *pu1_src, |
374 | | UWORD8 *pu1_dst, |
375 | | WORD32 src_strd, |
376 | | WORD32 dst_strd, |
377 | | WORD32 ngbr_avail) |
378 | 0 | { |
379 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
380 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
381 | 0 | UWORD8 *pu1_topleft = NULL;/* Pointer to top left predictor */ |
382 | 0 | UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_i, ui4_j, ui4_k, ui4_l, ui4_m; |
383 | 0 | UWORD8 predicted_pixels[7]; |
384 | |
|
385 | 0 | UNUSED(src_strd); |
386 | 0 | UNUSED(ngbr_avail); |
387 | 0 | pu1_top = pu1_src + BLK_SIZE + 1; |
388 | 0 | pu1_left = pu1_src + BLK_SIZE - 1; |
389 | 0 | pu1_topleft = pu1_src +BLK_SIZE; |
390 | |
|
391 | 0 | ui4_a = *pu1_top++; |
392 | 0 | ui4_b = *pu1_top++; |
393 | 0 | ui4_c = *pu1_top++; |
394 | 0 | ui4_d = *pu1_top++; |
395 | 0 | ui4_i = *pu1_left--; |
396 | 0 | ui4_j = *pu1_left--; |
397 | 0 | ui4_k = *pu1_left--; |
398 | 0 | ui4_l = *pu1_left; |
399 | 0 | ui4_m = *pu1_topleft; |
400 | |
|
401 | 0 | predicted_pixels[2] = FILT121(ui4_j, ui4_i, ui4_m); |
402 | 0 | predicted_pixels[1] = FILT121(ui4_k, ui4_j, ui4_i); |
403 | 0 | predicted_pixels[0] = FILT121(ui4_l, ui4_k, ui4_j); |
404 | 0 | predicted_pixels[3] = FILT121(ui4_i, ui4_m, ui4_a); |
405 | 0 | predicted_pixels[4] = FILT121(ui4_m, ui4_a, ui4_b); |
406 | 0 | predicted_pixels[5] = FILT121(ui4_a, ui4_b, ui4_c); |
407 | 0 | predicted_pixels[6] = FILT121(ui4_b, ui4_c, ui4_d); |
408 | |
|
409 | 0 | memcpy(pu1_dst, predicted_pixels + 3, 4); |
410 | 0 | memcpy(pu1_dst + dst_strd, predicted_pixels + 2, 4); |
411 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 1, 4); |
412 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels, 4); |
413 | 0 | } |
414 | | |
415 | | /** |
416 | | ******************************************************************************* |
417 | | * |
418 | | * @brief |
419 | | * Perform Intra prediction for luma_4x4 mode:Vertical_Right |
420 | | * |
421 | | * @par Description: |
422 | | * Perform Intra prediction for luma_4x4 mode:Vertical_Right, described in |
423 | | * sec 8.3.1.2.6 |
424 | | * |
425 | | * @param[in] pu1_src |
426 | | * pointer to the source |
427 | | * |
428 | | * @param[out] pu1_dst |
429 | | * pointer to the destination |
430 | | * |
431 | | * @param[in] src_strd |
432 | | * source stride |
433 | | * |
434 | | * @param[in] dst_strd |
435 | | * destination stride |
436 | | * |
437 | | * @param[in] ngbr_avail |
438 | | * availability of neighbouring pixels |
439 | | * |
440 | | * @returns |
441 | | * |
442 | | * @remarks |
443 | | * none |
444 | | * |
445 | | ******************************************************************************* |
446 | | */ |
447 | | void ih264_intra_pred_luma_4x4_mode_vert_r(UWORD8 *pu1_src, |
448 | | UWORD8 *pu1_dst, |
449 | | WORD32 src_strd, |
450 | | WORD32 dst_strd, |
451 | | WORD32 ngbr_avail) |
452 | 0 | { |
453 | |
|
454 | 0 | UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_i, ui4_j, ui4_k, ui4_m; |
455 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
456 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
457 | 0 | UWORD8 *pu1_topleft = NULL;/* Pointer to top left predictor */ |
458 | 0 | UWORD8 predicted_pixels[10]; |
459 | |
|
460 | 0 | UNUSED(src_strd); |
461 | 0 | UNUSED(ngbr_avail); |
462 | 0 | pu1_top = pu1_src +BLK_SIZE + 1; |
463 | 0 | pu1_left = pu1_src + BLK_SIZE - 1; |
464 | 0 | pu1_topleft = pu1_src + BLK_SIZE; |
465 | |
|
466 | 0 | ui4_a = *pu1_top++; |
467 | 0 | ui4_b = *pu1_top++; |
468 | 0 | ui4_c = *pu1_top++; |
469 | 0 | ui4_d = *pu1_top++; |
470 | 0 | ui4_i = *pu1_left--; |
471 | 0 | ui4_j = *pu1_left--; |
472 | 0 | ui4_k = *pu1_left; |
473 | 0 | ui4_m = *pu1_topleft; |
474 | |
|
475 | 0 | predicted_pixels[6] = FILT11(ui4_m, ui4_a); |
476 | 0 | predicted_pixels[7] = FILT11(ui4_a, ui4_b); |
477 | 0 | predicted_pixels[8] = FILT11(ui4_b, ui4_c); |
478 | 0 | predicted_pixels[9] = FILT11(ui4_c, ui4_d); |
479 | 0 | predicted_pixels[1] = FILT121(ui4_i, ui4_m, ui4_a); |
480 | 0 | predicted_pixels[2] = FILT121(ui4_m, ui4_a, ui4_b); |
481 | 0 | predicted_pixels[3] = FILT121(ui4_a, ui4_b, ui4_c); |
482 | 0 | predicted_pixels[4] = FILT121(ui4_b, ui4_c, ui4_d); |
483 | 0 | predicted_pixels[5] = FILT121(ui4_j, ui4_i, ui4_m); |
484 | 0 | predicted_pixels[0] = FILT121(ui4_k, ui4_j, ui4_i); |
485 | |
|
486 | 0 | memcpy(pu1_dst, predicted_pixels + 6, 4); |
487 | 0 | memcpy(pu1_dst + dst_strd, predicted_pixels + 1, 4); |
488 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 5, 4); |
489 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels, 4); |
490 | 0 | } |
491 | | |
492 | | /* |
493 | | ******************************************************************************* |
494 | | * |
495 | | * @brief |
496 | | * Perform Intra prediction for luma_4x4 mode:Horizontal_Down |
497 | | * |
498 | | * @par Description: |
499 | | * Perform Intra prediction for luma_4x4 mode:Horizontal_Down, described in |
500 | | * sec 8.3.1.2.7 |
501 | | * |
502 | | * @param[in] pu1_src |
503 | | * pointer to the source |
504 | | * |
505 | | * @param[out] pu1_dst |
506 | | * pointer to the destination |
507 | | * |
508 | | * @param[in] src_strd |
509 | | * source stride |
510 | | * |
511 | | * @param[in] dst_strd |
512 | | * destination stride |
513 | | * |
514 | | * @param[in] ngbr_avail |
515 | | * availability of neighbouring pixels |
516 | | * |
517 | | * @returns |
518 | | * |
519 | | * @remarks |
520 | | * none |
521 | | * |
522 | | ******************************************************************************* |
523 | | */ |
524 | | void ih264_intra_pred_luma_4x4_mode_horz_d(UWORD8 *pu1_src, |
525 | | UWORD8 *pu1_dst, |
526 | | WORD32 src_strd, |
527 | | WORD32 dst_strd, |
528 | | WORD32 ngbr_avail) |
529 | 0 | { |
530 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
531 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
532 | 0 | UWORD8 *pu1_topleft = NULL;/* Pointer to top left predictor */ |
533 | 0 | UWORD32 ui4_a, ui4_b, ui4_c, ui4_i, ui4_j, ui4_k, ui4_l, ui4_m; |
534 | 0 | UWORD8 predicted_pixels[10]; |
535 | |
|
536 | 0 | UNUSED(src_strd); |
537 | 0 | UNUSED(ngbr_avail); |
538 | 0 | pu1_top = pu1_src + BLK_SIZE + 1; |
539 | 0 | pu1_left = pu1_src + BLK_SIZE - 1; |
540 | 0 | pu1_topleft = pu1_src + BLK_SIZE; |
541 | |
|
542 | 0 | ui4_a = *pu1_top++; |
543 | 0 | ui4_b = *pu1_top++; |
544 | 0 | ui4_c = *pu1_top++; |
545 | 0 | ui4_i = *pu1_left--; |
546 | 0 | ui4_j = *pu1_left--; |
547 | 0 | ui4_k = *pu1_left--; |
548 | 0 | ui4_l = *pu1_left--; |
549 | 0 | ui4_m = *pu1_topleft; |
550 | |
|
551 | 0 | predicted_pixels[6] = FILT11(ui4_i, ui4_m); |
552 | 0 | predicted_pixels[7] = FILT121(ui4_i, ui4_m, ui4_a); |
553 | 0 | predicted_pixels[8] = FILT121(ui4_m, ui4_a, ui4_b); |
554 | 0 | predicted_pixels[9] = FILT121(ui4_a, ui4_b, ui4_c); |
555 | 0 | predicted_pixels[1] = FILT121(ui4_l, ui4_k, ui4_j); |
556 | 0 | predicted_pixels[2] = FILT11(ui4_k, ui4_j); |
557 | 0 | predicted_pixels[3] = FILT121(ui4_k, ui4_j, ui4_i); |
558 | 0 | predicted_pixels[4] = FILT11(ui4_j, ui4_i); |
559 | 0 | predicted_pixels[5] = FILT121(ui4_j, ui4_i, ui4_m); |
560 | 0 | predicted_pixels[0] = FILT11(ui4_l, ui4_k); |
561 | |
|
562 | 0 | memcpy(pu1_dst, predicted_pixels + 6, 4); |
563 | 0 | memcpy(pu1_dst + dst_strd, predicted_pixels + 4, 4); |
564 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 2, 4); |
565 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels, 4); |
566 | 0 | } |
567 | | |
568 | | /** |
569 | | ******************************************************************************* |
570 | | * |
571 | | * @brief |
572 | | * Perform Intra prediction for luma_4x4 mode:Vertical_Left |
573 | | * |
574 | | * @par Description: |
575 | | * Perform Intra prediction for luma_4x4 mode:Vertical_Left, described in |
576 | | * sec 8.3.1.2.8 |
577 | | * |
578 | | * @param[in] pu1_src |
579 | | * pointer to the source |
580 | | * |
581 | | * @param[out] pu1_dst |
582 | | * pointer to the destination |
583 | | * |
584 | | * @param[in] src_strd |
585 | | * source stride |
586 | | * |
587 | | * @param[in] dst_strd |
588 | | * destination stride |
589 | | * |
590 | | * @param[in] ngbr_avail |
591 | | * availability of neighbouring pixels |
592 | | * |
593 | | * @returns |
594 | | * |
595 | | * @remarks |
596 | | * none |
597 | | * |
598 | | ******************************************************************************* |
599 | | */ |
600 | | void ih264_intra_pred_luma_4x4_mode_vert_l(UWORD8 *pu1_src, |
601 | | UWORD8 *pu1_dst, |
602 | | WORD32 src_strd, |
603 | | WORD32 dst_strd, |
604 | | WORD32 ngbr_avail) |
605 | 0 | { |
606 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
607 | 0 | UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g; |
608 | 0 | UWORD8 predicted_pixels[10]; |
609 | |
|
610 | 0 | UNUSED(src_strd); |
611 | 0 | UNUSED(ngbr_avail); |
612 | 0 | pu1_top = pu1_src + BLK_SIZE + 1; |
613 | |
|
614 | 0 | ui4_a = *pu1_top++; |
615 | 0 | ui4_b = *pu1_top++; |
616 | 0 | ui4_c = *pu1_top++; |
617 | 0 | ui4_d = *pu1_top++; |
618 | 0 | ui4_e = *pu1_top++; |
619 | 0 | ui4_f = *pu1_top++; |
620 | 0 | ui4_g = *pu1_top; |
621 | |
|
622 | 0 | predicted_pixels[5] = FILT11(ui4_a, ui4_b); |
623 | 0 | predicted_pixels[6] = FILT11(ui4_b, ui4_c); |
624 | 0 | predicted_pixels[7] = FILT11(ui4_c, ui4_d); |
625 | 0 | predicted_pixels[8] = FILT11(ui4_d, ui4_e); |
626 | 0 | predicted_pixels[0] = FILT121(ui4_a, ui4_b, ui4_c); |
627 | 0 | predicted_pixels[1] = FILT121(ui4_b, ui4_c, ui4_d); |
628 | 0 | predicted_pixels[2] = FILT121(ui4_c, ui4_d, ui4_e); |
629 | 0 | predicted_pixels[3] = FILT121(ui4_d, ui4_e, ui4_f); |
630 | 0 | predicted_pixels[9] = FILT11(ui4_e, ui4_f); |
631 | 0 | predicted_pixels[4] = FILT121(ui4_e, ui4_f, ui4_g); |
632 | |
|
633 | 0 | memcpy(pu1_dst, predicted_pixels + 5, 4); |
634 | 0 | memcpy(pu1_dst + dst_strd, predicted_pixels, 4); |
635 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 6, 4); |
636 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 1, 4); |
637 | 0 | } |
638 | | |
639 | | /** |
640 | | ******************************************************************************* |
641 | | * |
642 | | * @brief |
643 | | * Perform Intra prediction for luma_4x4 mode:Horizontal_Up |
644 | | * |
645 | | * @par Description: |
646 | | * Perform Intra prediction for luma_4x4 mode:Horizontal_Up, described in |
647 | | * sec 8.3.1.2.9 |
648 | | * |
649 | | * @param[in] pu1_src |
650 | | * pointer to the source |
651 | | * |
652 | | * @param[out] pu1_dst |
653 | | * pointer to the destination |
654 | | * |
655 | | * @param[in] src_strd |
656 | | * source stride |
657 | | * |
658 | | * @param[in] dst_strd |
659 | | * destination stride |
660 | | * |
661 | | * @param[in] ngbr_avail |
662 | | * availability of neighbouring pixels |
663 | | * |
664 | | * @returns |
665 | | * |
666 | | * @remarks |
667 | | * none |
668 | | * |
669 | | ******************************************************************************* |
670 | | */ |
671 | | void ih264_intra_pred_luma_4x4_mode_horz_u(UWORD8 *pu1_src, |
672 | | UWORD8 *pu1_dst, |
673 | | WORD32 src_strd, |
674 | | WORD32 dst_strd, |
675 | | WORD32 ngbr_avail) |
676 | 0 | { |
677 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
678 | 0 | UWORD32 ui4_i, ui4_j, ui4_k, ui4_l; |
679 | 0 | UWORD8 predicted_pixels[10]; |
680 | |
|
681 | 0 | UNUSED(src_strd); |
682 | 0 | UNUSED(ngbr_avail); |
683 | 0 | pu1_left = pu1_src + BLK_SIZE - 1; |
684 | |
|
685 | 0 | ui4_i = *pu1_left--; |
686 | 0 | ui4_j = *pu1_left--; |
687 | 0 | ui4_k = *pu1_left--; |
688 | 0 | ui4_l = *pu1_left--; |
689 | |
|
690 | 0 | predicted_pixels[0] = FILT11(ui4_j, ui4_i); |
691 | 0 | predicted_pixels[1] = FILT121(ui4_k, ui4_j, ui4_i); |
692 | 0 | predicted_pixels[2] = FILT11(ui4_k, ui4_j); |
693 | 0 | predicted_pixels[3] = FILT121(ui4_l, ui4_k, ui4_j); |
694 | 0 | predicted_pixels[4] = FILT11(ui4_l, ui4_k); |
695 | 0 | predicted_pixels[5] = FILT121(ui4_l, ui4_l, ui4_k); |
696 | 0 | predicted_pixels[6] = ui4_l; |
697 | 0 | predicted_pixels[7] = ui4_l; |
698 | 0 | predicted_pixels[8] = ui4_l; |
699 | 0 | predicted_pixels[9] = ui4_l; |
700 | |
|
701 | 0 | memcpy(pu1_dst, predicted_pixels, 4); |
702 | 0 | memcpy(pu1_dst + dst_strd, predicted_pixels + 2, 4); |
703 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 4, 4); |
704 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 6, 4); |
705 | 0 | } |
706 | | |
707 | | /** |
708 | | ******************************************************************************* |
709 | | * |
710 | | * @brief |
711 | | * Reference sample filtering process for Intra_8x8 sample prediction |
712 | | * |
713 | | * @par Description: |
714 | | * Perform Reference sample filtering process for Intra_8x8 sample prediction, |
715 | | * described in sec 8.3.2.2.1 |
716 | | * |
717 | | * @param[in] pu1_left |
718 | | * pointer to the left pixel wrt current mb |
719 | | * |
720 | | * @param[in] pu1_topleft |
721 | | * pointer to the topleft pixel wrt current mb |
722 | | * |
723 | | * @param[in] pu1_top |
724 | | * pointer to the top pixel wrt current mb |
725 | | * |
726 | | * @param[out] pu1_dst |
727 | | * pointer to the destination |
728 | | * |
729 | | * @param[in] src_strd |
730 | | * source stride[Not Used] |
731 | | * |
732 | | * @param[in] ngbr_avail |
733 | | * availability of neighbouring pixels |
734 | | * |
735 | | * @returns |
736 | | * |
737 | | * @remarks |
738 | | * none |
739 | | * |
740 | | *******************************************************************************/ |
741 | | void ih264_intra_pred_luma_8x8_mode_ref_filtering(UWORD8 *pu1_left, |
742 | | UWORD8 *pu1_topleft, |
743 | | UWORD8 *pu1_top, |
744 | | UWORD8 *pu1_dst, |
745 | | WORD32 src_strd, |
746 | | WORD32 ngbr_avail) |
747 | 0 | { |
748 | 0 | WORD32 top_avail, left_avail, top_left_avail, top_right_avail; |
749 | |
|
750 | 0 | left_avail = BOOLEAN(ngbr_avail & LEFT_MB_AVAILABLE_MASK); |
751 | 0 | top_avail = BOOLEAN(ngbr_avail & TOP_MB_AVAILABLE_MASK); |
752 | 0 | top_left_avail = BOOLEAN(ngbr_avail & TOP_LEFT_MB_AVAILABLE_MASK); |
753 | 0 | top_right_avail = BOOLEAN(ngbr_avail & TOP_RIGHT_MB_AVAILABLE_MASK); |
754 | |
|
755 | 0 | if(top_avail) |
756 | 0 | { |
757 | 0 | WORD32 i; |
758 | 0 | UWORD32 u4_xm1; |
759 | |
|
760 | 0 | if(!top_right_avail) |
761 | 0 | { |
762 | 0 | memset(pu1_dst + 8 + 1 + 8, pu1_top[7], 8); |
763 | 0 | top_right_avail = 1; |
764 | 0 | } |
765 | 0 | else |
766 | 0 | { |
767 | 0 | memcpy(pu1_dst + 8 + 1 + 8, pu1_top + 8, 8); |
768 | 0 | } |
769 | |
|
770 | 0 | if(top_left_avail) |
771 | 0 | { |
772 | 0 | pu1_dst[8 + 1 + 0] = FILT121((*pu1_topleft), pu1_top[0], |
773 | 0 | pu1_top[1]); |
774 | 0 | } |
775 | 0 | else |
776 | 0 | { |
777 | 0 | pu1_dst[8 + 1] = ((3 * pu1_top[0]) + pu1_top[1] + 2) >> 2; |
778 | 0 | } |
779 | |
|
780 | 0 | for(i = 1; i <= 6; i++) |
781 | 0 | { |
782 | 0 | pu1_dst[8 + 1 + i] = FILT121(pu1_top[i - 1], pu1_top[i], |
783 | 0 | pu1_top[i + 1]); |
784 | 0 | } |
785 | | /* First byte of Top Right input is in pu1_dst[8 + 1 + 8]*/ |
786 | 0 | pu1_dst[8 + 1 + 7] = FILT121(pu1_top[6], pu1_top[7], |
787 | 0 | pu1_dst[8 + 1 + 8]); |
788 | | |
789 | | /* filtered output and source in same buf, to prevent output(x - 1) |
790 | | being over written in process */ |
791 | 0 | u4_xm1 = pu1_top[7]; |
792 | |
|
793 | 0 | for(i = 8; i <= 14; i++) |
794 | 0 | { |
795 | 0 | UWORD32 u4_x; |
796 | 0 | u4_x = (u4_xm1 + (pu1_dst[8 + 1 + i] << 1) + pu1_dst[8 + 1 + i + 1] |
797 | 0 | + 2) >> 2; |
798 | | /* assigning u4_xm1 from the un-filtered values for the next iteration */ |
799 | 0 | u4_xm1 = pu1_dst[8 + 1 + i]; |
800 | 0 | pu1_dst[8 + 1 + i] = u4_x; |
801 | 0 | } |
802 | |
|
803 | 0 | pu1_dst[8 + 1 + 15] = (u4_xm1 + (3 * pu1_dst[8 + 1 + 15]) + 2) >> 2; |
804 | 0 | } |
805 | | |
806 | | /* pu1_topleft is overloaded. It is both: */ |
807 | | /* a. A pointer for the top left pixel */ |
808 | | /* b. An indicator of availability of top left. */ |
809 | | /* If it is null then top left not available */ |
810 | 0 | if(top_left_avail) |
811 | 0 | { |
812 | 0 | if((!top_avail) || (!left_avail)) |
813 | 0 | { |
814 | 0 | if(top_avail) |
815 | 0 | pu1_dst[8] = (3 * pu1_topleft[0] + pu1_top[0] + 2) >> 2; |
816 | 0 | else if(left_avail) |
817 | 0 | pu1_dst[8] = (3 * pu1_topleft[0] + pu1_left[0] + 2) >> 2; |
818 | 0 | } |
819 | 0 | else |
820 | 0 | { |
821 | 0 | pu1_dst[8] = FILT121(pu1_top[0], (*pu1_topleft), pu1_left[0]); |
822 | 0 | } |
823 | 0 | } |
824 | |
|
825 | 0 | if(left_avail) |
826 | 0 | { |
827 | 0 | UWORD32 idx; |
828 | 0 | if(0 != pu1_topleft) |
829 | 0 | { |
830 | 0 | pu1_dst[7] = FILT121((*pu1_topleft), pu1_left[0], |
831 | 0 | pu1_left[src_strd]); |
832 | 0 | } |
833 | 0 | else |
834 | 0 | { |
835 | 0 | pu1_dst[7] = ((3 * pu1_left[0]) + pu1_left[src_strd] + 2) >> 2; |
836 | 0 | } |
837 | |
|
838 | 0 | for(idx = 1; idx <= 6; idx++) |
839 | 0 | { |
840 | 0 | pu1_dst[7 - idx] = FILT121(pu1_left[(idx - 1) * src_strd], |
841 | 0 | pu1_left[idx * src_strd], |
842 | 0 | pu1_left[(idx + 1) * src_strd]); |
843 | |
|
844 | 0 | } |
845 | 0 | pu1_dst[0] = (pu1_left[6 * src_strd] + 3 * pu1_left[7 * src_strd] + 2) |
846 | 0 | >> 2; |
847 | 0 | } |
848 | 0 | } |
849 | | |
850 | | /** |
851 | | ******************************************************************************* |
852 | | * |
853 | | * @brief |
854 | | * Perform Intra prediction for luma_8x8 mode:vertical |
855 | | * |
856 | | * @par Description: |
857 | | * Perform Intra prediction for luma_8x8 mode:vertical, described in |
858 | | * sec 8.3.2.2.2 |
859 | | * |
860 | | * @param[in] pu1_src |
861 | | * pointer to the source |
862 | | * |
863 | | * @param[out] pu1_dst |
864 | | * pointer to the destination |
865 | | * |
866 | | * @param[in] src_strd |
867 | | * source stride |
868 | | * |
869 | | * @param[in] dst_strd |
870 | | * destination stride |
871 | | * |
872 | | * @param[in] ngbr_avail |
873 | | * availability of neighbouring pixels |
874 | | * |
875 | | * @returns |
876 | | * |
877 | | * @remarks |
878 | | * none |
879 | | * |
880 | | ******************************************************************************* |
881 | | */ |
882 | | void ih264_intra_pred_luma_8x8_mode_vert(UWORD8 *pu1_src, |
883 | | UWORD8 *pu1_dst, |
884 | | WORD32 src_strd, |
885 | | WORD32 dst_strd, |
886 | | WORD32 ngbr_avail) |
887 | 0 | { |
888 | 0 | UWORD8 *pu1_top = NULL; |
889 | |
|
890 | 0 | UNUSED(src_strd); |
891 | 0 | UNUSED(ngbr_avail); |
892 | 0 | pu1_top = pu1_src + BLK8x8SIZE + 1; |
893 | |
|
894 | 0 | memcpy(pu1_dst, pu1_top, 8); |
895 | 0 | memcpy(pu1_dst + dst_strd, pu1_top, 8); |
896 | 0 | memcpy(pu1_dst + 2 * dst_strd, pu1_top, 8); |
897 | 0 | memcpy(pu1_dst + 3 * dst_strd, pu1_top, 8); |
898 | 0 | memcpy(pu1_dst + 4 * dst_strd, pu1_top, 8); |
899 | 0 | memcpy(pu1_dst + 5 * dst_strd, pu1_top, 8); |
900 | 0 | memcpy(pu1_dst + 6 * dst_strd, pu1_top, 8); |
901 | 0 | memcpy(pu1_dst + 7 * dst_strd, pu1_top, 8); |
902 | 0 | } |
903 | | |
904 | | /** |
905 | | ******************************************************************************* |
906 | | * |
907 | | * @brief |
908 | | * Perform Intra prediction for luma_8x8 mode:horizontal |
909 | | * |
910 | | * @par Description: |
911 | | * Perform Intra prediction for luma_8x8 mode:horizontal, described in |
912 | | * sec 8.3.2.2.2 |
913 | | * |
914 | | * @param[in] pu1_src |
915 | | * pointer to the source |
916 | | * |
917 | | * @param[out] pu1_dst |
918 | | * pointer to the destination |
919 | | * |
920 | | * @param[in] src_strd |
921 | | * source stride |
922 | | * |
923 | | * @param[in] dst_strd |
924 | | * destination stride |
925 | | * |
926 | | * @param[in] ngbr_avail |
927 | | * availability of neighbouring pixels |
928 | | * |
929 | | * @returns |
930 | | * |
931 | | * @remarks |
932 | | * none |
933 | | * |
934 | | ******************************************************************************* |
935 | | */ |
936 | | void ih264_intra_pred_luma_8x8_mode_horz(UWORD8 *pu1_src, |
937 | | UWORD8 *pu1_dst, |
938 | | WORD32 src_strd, |
939 | | WORD32 dst_strd, |
940 | | WORD32 ngbr_avail) |
941 | 0 | { |
942 | 0 | UWORD8 *pu1_left = pu1_src + BLK8x8SIZE - 1; |
943 | |
|
944 | 0 | UNUSED(src_strd); |
945 | 0 | UNUSED(ngbr_avail); |
946 | 0 | memset(pu1_dst, *pu1_left, 8); |
947 | 0 | memset(pu1_dst + dst_strd, *(pu1_left - 1), 8); |
948 | 0 | memset(pu1_dst + 2 * dst_strd, *(pu1_left - 2), 8); |
949 | 0 | memset(pu1_dst + 3 * dst_strd, *(pu1_left - 3), 8); |
950 | 0 | memset(pu1_dst + 4 * dst_strd, *(pu1_left - 4), 8); |
951 | 0 | memset(pu1_dst + 5 * dst_strd, *(pu1_left - 5), 8); |
952 | 0 | memset(pu1_dst + 6 * dst_strd, *(pu1_left - 6), 8); |
953 | 0 | memset(pu1_dst + 7 * dst_strd, *(pu1_left - 7), 8); |
954 | 0 | } |
955 | | |
956 | | /** |
957 | | ******************************************************************************* |
958 | | * |
959 | | * @brief |
960 | | * Perform Intra prediction for luma_8x8 mode:DC |
961 | | * |
962 | | * @par Description: |
963 | | * Perform Intra prediction for luma_8x8 mode:DC, described in sec 8.3.2.2.4 |
964 | | * |
965 | | * @param[in] pu1_src |
966 | | * pointer to the source |
967 | | * |
968 | | * @param[out] pu1_dst |
969 | | * pointer to the destination |
970 | | * |
971 | | * @param[in] src_strd |
972 | | * source stride |
973 | | * |
974 | | * @param[in] dst_strd |
975 | | * destination stride |
976 | | * |
977 | | * @param[in] ngbr_avail |
978 | | * availability of neighbouring pixels |
979 | | * |
980 | | * @returns |
981 | | * |
982 | | * @remarks |
983 | | * none |
984 | | * |
985 | | ******************************************************************************* |
986 | | */ |
987 | | void ih264_intra_pred_luma_8x8_mode_dc(UWORD8 *pu1_src, |
988 | | UWORD8 *pu1_dst, |
989 | | WORD32 src_strd, |
990 | | WORD32 dst_strd, |
991 | | WORD32 ngbr_avail) |
992 | 0 | { |
993 | 0 | UWORD8 u1_useleft; /* availability of left predictors (only for DC) */ |
994 | 0 | UWORD8 u1_usetop; /* availability of top predictors (only for DC) */ |
995 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
996 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
997 | 0 | WORD32 row; |
998 | 0 | WORD32 val = 0; |
999 | |
|
1000 | 0 | UNUSED(src_strd); |
1001 | 0 | u1_useleft = BOOLEAN(ngbr_avail & LEFT_MB_AVAILABLE_MASK); |
1002 | 0 | u1_usetop = BOOLEAN(ngbr_avail & TOP_MB_AVAILABLE_MASK); |
1003 | 0 | pu1_top = pu1_src + BLK8x8SIZE + 1; |
1004 | 0 | pu1_left = pu1_src + BLK8x8SIZE - 1; |
1005 | |
|
1006 | 0 | if(u1_useleft) |
1007 | 0 | { |
1008 | 0 | for(row = 0; row < BLK8x8SIZE; row++) |
1009 | 0 | val += *(pu1_left - row); |
1010 | 0 | val += 4; |
1011 | 0 | } |
1012 | 0 | if(u1_usetop) |
1013 | 0 | { |
1014 | 0 | for(row = 0; row < BLK8x8SIZE; row++) |
1015 | 0 | val += *(pu1_top + row); |
1016 | 0 | val += 4; |
1017 | 0 | } |
1018 | | |
1019 | | /* Since 4 is added if either left/top pred is there, |
1020 | | val still being zero implies both preds are not there */ |
1021 | 0 | val = (val) ? (val >> (2 + u1_useleft + u1_usetop)) : 128; |
1022 | |
|
1023 | 0 | memset(pu1_dst, val, 8); |
1024 | 0 | memset(pu1_dst + dst_strd, val, 8); |
1025 | 0 | memset(pu1_dst + 2 * dst_strd, val, 8); |
1026 | 0 | memset(pu1_dst + 3 * dst_strd, val, 8); |
1027 | 0 | memset(pu1_dst + 4 * dst_strd, val, 8); |
1028 | 0 | memset(pu1_dst + 5 * dst_strd, val, 8); |
1029 | 0 | memset(pu1_dst + 6 * dst_strd, val, 8); |
1030 | 0 | memset(pu1_dst + 7 * dst_strd, val, 8); |
1031 | 0 | } |
1032 | | |
1033 | | /** |
1034 | | ******************************************************************************* |
1035 | | * |
1036 | | * @brief |
1037 | | * Perform Intra prediction for luma_8x8 mode:Diagonal_Down_Left |
1038 | | * |
1039 | | * @par Description: |
1040 | | * Perform Intra prediction for luma_8x8 mode:Diagonal_Down_Left, described in |
1041 | | * sec 8.3.2.2.5 |
1042 | | * |
1043 | | * @param[in] pu1_src |
1044 | | * pointer to the source |
1045 | | * |
1046 | | * @param[out] pu1_dst |
1047 | | * pointer to the destination |
1048 | | * |
1049 | | * @param[in] src_strd |
1050 | | * source stride |
1051 | | * |
1052 | | * @param[in] dst_strd |
1053 | | * destination stride |
1054 | | * |
1055 | | * @param[in] ngbr_avail |
1056 | | * availability of neighbouring pixels |
1057 | | * |
1058 | | * @returns |
1059 | | * |
1060 | | * @remarks |
1061 | | * none |
1062 | | * |
1063 | | ******************************************************************************* |
1064 | | */ |
1065 | | void ih264_intra_pred_luma_8x8_mode_diag_dl(UWORD8 *pu1_src, |
1066 | | UWORD8 *pu1_dst, |
1067 | | WORD32 src_strd, |
1068 | | WORD32 dst_strd, |
1069 | | WORD32 ngbr_avail) |
1070 | 0 | { |
1071 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
1072 | 0 | UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h; |
1073 | 0 | UWORD32 ui4_i, ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p; |
1074 | 0 | UWORD8 predicted_pixels[15]; |
1075 | |
|
1076 | 0 | UNUSED(src_strd); |
1077 | 0 | UNUSED(ngbr_avail); |
1078 | 0 | pu1_top = pu1_src + BLK8x8SIZE + 1; |
1079 | |
|
1080 | 0 | ui4_a = *pu1_top++; |
1081 | 0 | ui4_b = *pu1_top++; |
1082 | 0 | ui4_c = *pu1_top++; |
1083 | 0 | ui4_d = *pu1_top++; |
1084 | 0 | ui4_e = *pu1_top++; |
1085 | 0 | ui4_f = *pu1_top++; |
1086 | 0 | ui4_g = *pu1_top++; |
1087 | 0 | ui4_h = *pu1_top++; |
1088 | 0 | ui4_i = *pu1_top++; |
1089 | 0 | ui4_j = *pu1_top++; |
1090 | 0 | ui4_k = *pu1_top++; |
1091 | 0 | ui4_l = *pu1_top++; |
1092 | 0 | ui4_m = *pu1_top++; |
1093 | 0 | ui4_n = *pu1_top++; |
1094 | 0 | ui4_o = *pu1_top++; |
1095 | 0 | ui4_p = *pu1_top; |
1096 | |
|
1097 | 0 | predicted_pixels[0] = FILT121(ui4_a, ui4_b, ui4_c); |
1098 | 0 | predicted_pixels[1] = FILT121(ui4_b, ui4_c, ui4_d); |
1099 | 0 | predicted_pixels[2] = FILT121(ui4_c, ui4_d, ui4_e); |
1100 | 0 | predicted_pixels[3] = FILT121(ui4_d, ui4_e, ui4_f); |
1101 | 0 | predicted_pixels[4] = FILT121(ui4_e, ui4_f, ui4_g); |
1102 | 0 | predicted_pixels[5] = FILT121(ui4_f, ui4_g, ui4_h); |
1103 | 0 | predicted_pixels[6] = FILT121(ui4_g, ui4_h, ui4_i); |
1104 | 0 | predicted_pixels[7] = FILT121(ui4_h, ui4_i, ui4_j); |
1105 | 0 | predicted_pixels[8] = FILT121(ui4_i, ui4_j, ui4_k); |
1106 | 0 | predicted_pixels[9] = FILT121(ui4_j, ui4_k, ui4_l); |
1107 | 0 | predicted_pixels[10] = FILT121(ui4_k, ui4_l, ui4_m); |
1108 | 0 | predicted_pixels[11] = FILT121(ui4_l, ui4_m, ui4_n); |
1109 | 0 | predicted_pixels[12] = FILT121(ui4_m, ui4_n, ui4_o); |
1110 | 0 | predicted_pixels[13] = FILT121(ui4_n, ui4_o, ui4_p); |
1111 | 0 | predicted_pixels[14] = FILT121(ui4_o, ui4_p, ui4_p); |
1112 | |
|
1113 | 0 | memcpy(pu1_dst, predicted_pixels, 8); |
1114 | 0 | memcpy(pu1_dst + dst_strd, predicted_pixels + 1, 8); |
1115 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 2, 8); |
1116 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 3, 8); |
1117 | 0 | memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 4, 8); |
1118 | 0 | memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 5, 8); |
1119 | 0 | memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 6, 8); |
1120 | 0 | memcpy(pu1_dst + 7 * dst_strd, predicted_pixels + 7, 8); |
1121 | 0 | } |
1122 | | |
1123 | | /** |
1124 | | ******************************************************************************* |
1125 | | * |
1126 | | * @brief |
1127 | | * Perform Intra prediction for luma_8x8 mode:Diagonal_Down_Right |
1128 | | * |
1129 | | * @par Description: |
1130 | | * Perform Intra prediction for luma_8x8 mode:Diagonal_Down_Right, described |
1131 | | * in sec 8.3.2.2.6 |
1132 | | * |
1133 | | * @param[in] pu1_src |
1134 | | * pointer to the source |
1135 | | * |
1136 | | * @param[out] pu1_dst |
1137 | | * pointer to the destination |
1138 | | * |
1139 | | * @param[in] src_strd |
1140 | | * source stride |
1141 | | * |
1142 | | * @param[in] dst_strd |
1143 | | * destination stride |
1144 | | * |
1145 | | * @param[in] ngbr_avail |
1146 | | * availability of neighbouring pixels |
1147 | | * |
1148 | | * @returns |
1149 | | * |
1150 | | * @remarks |
1151 | | * none |
1152 | | * |
1153 | | ******************************************************************************* |
1154 | | */ |
1155 | | void ih264_intra_pred_luma_8x8_mode_diag_dr(UWORD8 *pu1_src, |
1156 | | UWORD8 *pu1_dst, |
1157 | | WORD32 src_strd, |
1158 | | WORD32 dst_strd, |
1159 | | WORD32 ngbr_avail) |
1160 | 0 | { |
1161 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
1162 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
1163 | 0 | UWORD8 *pu1_topleft = NULL; /* Pointer to start of top left predictors */ |
1164 | 0 | UWORD32 ui4_a; |
1165 | 0 | UWORD32 ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h, ui4_i; |
1166 | 0 | UWORD32 ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p, ui4_q; |
1167 | 0 | UWORD8 predicted_pixels[15]; |
1168 | |
|
1169 | 0 | UNUSED(src_strd); |
1170 | 0 | UNUSED(ngbr_avail); |
1171 | 0 | pu1_top = pu1_src + BLK8x8SIZE + 1; |
1172 | 0 | pu1_left = pu1_src + BLK8x8SIZE - 1; |
1173 | 0 | pu1_topleft = pu1_src + BLK8x8SIZE; |
1174 | |
|
1175 | 0 | ui4_a = *pu1_topleft; |
1176 | 0 | ui4_b = *pu1_top++; |
1177 | 0 | ui4_c = *pu1_top++; |
1178 | 0 | ui4_d = *pu1_top++; |
1179 | 0 | ui4_e = *pu1_top++; |
1180 | 0 | ui4_f = *pu1_top++; |
1181 | 0 | ui4_g = *pu1_top++; |
1182 | 0 | ui4_h = *pu1_top++; |
1183 | 0 | ui4_i = *pu1_top; |
1184 | 0 | ui4_j = *pu1_left--; |
1185 | 0 | ui4_k = *pu1_left--; |
1186 | 0 | ui4_l = *pu1_left--; |
1187 | 0 | ui4_m = *pu1_left--; |
1188 | 0 | ui4_n = *pu1_left--; |
1189 | 0 | ui4_o = *pu1_left--; |
1190 | 0 | ui4_p = *pu1_left--; |
1191 | 0 | ui4_q = *pu1_left; |
1192 | |
|
1193 | 0 | predicted_pixels[6] = FILT121(ui4_a, ui4_j, ui4_k); |
1194 | 0 | predicted_pixels[5] = FILT121(ui4_j, ui4_k, ui4_l); |
1195 | 0 | predicted_pixels[4] = FILT121(ui4_k, ui4_l, ui4_m); |
1196 | 0 | predicted_pixels[3] = FILT121(ui4_l, ui4_m, ui4_n); |
1197 | 0 | predicted_pixels[2] = FILT121(ui4_m, ui4_n, ui4_o); |
1198 | 0 | predicted_pixels[1] = FILT121(ui4_n, ui4_o, ui4_p); |
1199 | 0 | predicted_pixels[0] = FILT121(ui4_o, ui4_p, ui4_q); |
1200 | 0 | predicted_pixels[7] = FILT121(ui4_b, ui4_a, ui4_j); |
1201 | 0 | predicted_pixels[8] = FILT121(ui4_a, ui4_b, ui4_c); |
1202 | 0 | predicted_pixels[9] = FILT121(ui4_b, ui4_c, ui4_d); |
1203 | 0 | predicted_pixels[10] = FILT121(ui4_c, ui4_d, ui4_e); |
1204 | 0 | predicted_pixels[11] = FILT121(ui4_d, ui4_e, ui4_f); |
1205 | 0 | predicted_pixels[12] = FILT121(ui4_e, ui4_f, ui4_g); |
1206 | 0 | predicted_pixels[13] = FILT121(ui4_f, ui4_g, ui4_h); |
1207 | 0 | predicted_pixels[14] = FILT121(ui4_g, ui4_h, ui4_i); |
1208 | |
|
1209 | 0 | memcpy(pu1_dst, predicted_pixels + 7, 8); |
1210 | 0 | memcpy(pu1_dst + dst_strd, predicted_pixels + 6, 8); |
1211 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 5, 8); |
1212 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 4, 8); |
1213 | 0 | memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 3, 8); |
1214 | 0 | memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 2, 8); |
1215 | 0 | memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 1, 8); |
1216 | 0 | memcpy(pu1_dst + 7 * dst_strd, predicted_pixels, 8); |
1217 | 0 | } |
1218 | | |
1219 | | /** |
1220 | | ******************************************************************************* |
1221 | | * |
1222 | | * @brief |
1223 | | * Perform Intra prediction for luma_8x8 mode:Vertical_Right |
1224 | | * |
1225 | | * @par Description: |
1226 | | * Perform Intra prediction for luma_8x8 mode:Vertical_Right, described in |
1227 | | * sec 8.3.2.2.7 |
1228 | | * |
1229 | | * @param[in] pu1_src |
1230 | | * pointer to the source |
1231 | | * |
1232 | | * @param[out] pu1_dst |
1233 | | * pointer to the destination |
1234 | | * |
1235 | | * @param[in] src_strd |
1236 | | * source stride |
1237 | | * |
1238 | | * @param[in] dst_strd |
1239 | | * destination stride |
1240 | | * |
1241 | | * @param[in] ngbr_avail |
1242 | | * availability of neighbouring pixels |
1243 | | * |
1244 | | * @returns |
1245 | | * |
1246 | | * @remarks |
1247 | | * none |
1248 | | * |
1249 | | ******************************************************************************* |
1250 | | */ |
1251 | | void ih264_intra_pred_luma_8x8_mode_vert_r(UWORD8 *pu1_src, |
1252 | | UWORD8 *pu1_dst, |
1253 | | WORD32 src_strd, |
1254 | | WORD32 dst_strd, |
1255 | | WORD32 ngbr_avail) |
1256 | 0 | { |
1257 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
1258 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
1259 | 0 | UWORD8 *pu1_topleft = NULL; /* Pointer to start of top left predictors */ |
1260 | 0 | UWORD32 ui4_a; |
1261 | 0 | UWORD32 ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h, ui4_i; |
1262 | 0 | UWORD32 ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p; |
1263 | 0 | UWORD8 predicted_pixels[22]; |
1264 | |
|
1265 | 0 | UNUSED(src_strd); |
1266 | 0 | UNUSED(ngbr_avail); |
1267 | 0 | pu1_top = pu1_src + BLK8x8SIZE + 1; |
1268 | 0 | pu1_left = pu1_src + BLK8x8SIZE - 1; |
1269 | 0 | pu1_topleft = pu1_src + BLK8x8SIZE; |
1270 | |
|
1271 | 0 | ui4_a = *pu1_topleft; |
1272 | |
|
1273 | 0 | ui4_b = *pu1_top++; |
1274 | 0 | ui4_c = *pu1_top++; |
1275 | 0 | ui4_d = *pu1_top++; |
1276 | 0 | ui4_e = *pu1_top++; |
1277 | 0 | ui4_f = *pu1_top++; |
1278 | 0 | ui4_g = *pu1_top++; |
1279 | 0 | ui4_h = *pu1_top++; |
1280 | 0 | ui4_i = *pu1_top; |
1281 | 0 | ui4_j = *pu1_left--; |
1282 | 0 | ui4_k = *pu1_left--; |
1283 | 0 | ui4_l = *pu1_left--; |
1284 | 0 | ui4_m = *pu1_left--; |
1285 | 0 | ui4_n = *pu1_left--; |
1286 | 0 | ui4_o = *pu1_left--; |
1287 | 0 | ui4_p = *pu1_left--; |
1288 | |
|
1289 | 0 | predicted_pixels[0] = FILT121(ui4_o, ui4_n, ui4_m); |
1290 | 0 | predicted_pixels[1] = FILT121(ui4_m, ui4_l, ui4_k); |
1291 | 0 | predicted_pixels[2] = FILT121(ui4_k, ui4_j, ui4_a); |
1292 | 0 | predicted_pixels[3] = FILT11(ui4_a, ui4_b); |
1293 | 0 | predicted_pixels[4] = FILT11(ui4_b, ui4_c); |
1294 | 0 | predicted_pixels[5] = FILT11(ui4_c, ui4_d); |
1295 | 0 | predicted_pixels[6] = FILT11(ui4_d, ui4_e); |
1296 | 0 | predicted_pixels[7] = FILT11(ui4_e, ui4_f); |
1297 | 0 | predicted_pixels[8] = FILT11(ui4_f, ui4_g); |
1298 | 0 | predicted_pixels[9] = FILT11(ui4_g, ui4_h); |
1299 | 0 | predicted_pixels[10] = FILT11(ui4_h, ui4_i); |
1300 | 0 | predicted_pixels[11] = FILT121(ui4_p, ui4_o, ui4_n); |
1301 | 0 | predicted_pixels[12] = FILT121(ui4_n, ui4_m, ui4_l); |
1302 | 0 | predicted_pixels[13] = FILT121(ui4_l, ui4_k, ui4_j); |
1303 | 0 | predicted_pixels[14] = FILT121(ui4_b, ui4_a, ui4_j); |
1304 | 0 | predicted_pixels[15] = FILT121(ui4_a, ui4_b, ui4_c); |
1305 | 0 | predicted_pixels[16] = FILT121(ui4_b, ui4_c, ui4_d); |
1306 | 0 | predicted_pixels[17] = FILT121(ui4_c, ui4_d, ui4_e); |
1307 | 0 | predicted_pixels[18] = FILT121(ui4_d, ui4_e, ui4_f); |
1308 | 0 | predicted_pixels[19] = FILT121(ui4_e, ui4_f, ui4_g); |
1309 | 0 | predicted_pixels[20] = FILT121(ui4_f, ui4_g, ui4_h); |
1310 | 0 | predicted_pixels[21] = FILT121(ui4_g, ui4_h, ui4_i); |
1311 | |
|
1312 | 0 | memcpy(pu1_dst, predicted_pixels + 3, 8); |
1313 | 0 | memcpy(pu1_dst + 1 * dst_strd, predicted_pixels + 14, 8); |
1314 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 2, 8); |
1315 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 13, 8); |
1316 | 0 | memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 1, 8); |
1317 | 0 | memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 12, 8); |
1318 | 0 | memcpy(pu1_dst + 6 * dst_strd, predicted_pixels, 8); |
1319 | 0 | memcpy(pu1_dst + 7 * dst_strd, predicted_pixels + 11, 8); |
1320 | 0 | } |
1321 | | |
1322 | | /** |
1323 | | ******************************************************************************* |
1324 | | * |
1325 | | * @brief |
1326 | | * Perform Intra prediction for luma_8x8 mode:Horizontal_Down |
1327 | | * |
1328 | | * @par Description: |
1329 | | * Perform Intra prediction for luma_8x8 mode:Horizontal_Down, described in |
1330 | | * sec 8.3.2.2.8 |
1331 | | * |
1332 | | * @param[in] pu1_src |
1333 | | * pointer to the source |
1334 | | * |
1335 | | * @param[out] pu1_dst |
1336 | | * pointer to the destination |
1337 | | * |
1338 | | * @param[in] src_strd |
1339 | | * source stride |
1340 | | * |
1341 | | * @param[in] dst_strd |
1342 | | * destination stride |
1343 | | * |
1344 | | * @param[in] ngbr_avail |
1345 | | * availability of neighbouring pixels |
1346 | | * |
1347 | | * @returns |
1348 | | * |
1349 | | * @remarks |
1350 | | * none |
1351 | | * |
1352 | | ******************************************************************************* |
1353 | | */ |
1354 | | void ih264_intra_pred_luma_8x8_mode_horz_d(UWORD8 *pu1_src, |
1355 | | UWORD8 *pu1_dst, |
1356 | | WORD32 src_strd, |
1357 | | WORD32 dst_strd, |
1358 | | WORD32 ngbr_avail) |
1359 | 0 | { |
1360 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
1361 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
1362 | 0 | UWORD8 *pu1_topleft = NULL; /* Pointer to start of top left predictors */ |
1363 | 0 | UWORD32 ui4_a; |
1364 | 0 | UWORD32 ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h, ui4_i; |
1365 | 0 | UWORD32 ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p; |
1366 | 0 | UWORD8 predicted_pixels[22]; |
1367 | |
|
1368 | 0 | UNUSED(src_strd); |
1369 | 0 | UNUSED(ngbr_avail); |
1370 | 0 | pu1_top = pu1_src + BLK8x8SIZE + 1; |
1371 | 0 | pu1_left = pu1_src + BLK8x8SIZE - 1; |
1372 | 0 | pu1_topleft = pu1_src + BLK8x8SIZE; |
1373 | |
|
1374 | 0 | ui4_a = *pu1_topleft; |
1375 | 0 | ui4_j = *pu1_top++; |
1376 | 0 | ui4_k = *pu1_top++; |
1377 | 0 | ui4_l = *pu1_top++; |
1378 | 0 | ui4_m = *pu1_top++; |
1379 | 0 | ui4_n = *pu1_top++; |
1380 | 0 | ui4_o = *pu1_top++; |
1381 | 0 | ui4_p = *pu1_top++; |
1382 | 0 | ui4_b = *pu1_left--; |
1383 | 0 | ui4_c = *pu1_left--; |
1384 | 0 | ui4_d = *pu1_left--; |
1385 | 0 | ui4_e = *pu1_left--; |
1386 | 0 | ui4_f = *pu1_left--; |
1387 | 0 | ui4_g = *pu1_left--; |
1388 | 0 | ui4_h = *pu1_left--; |
1389 | 0 | ui4_i = *pu1_left; |
1390 | |
|
1391 | 0 | predicted_pixels[0] = FILT11(ui4_h, ui4_i); |
1392 | 0 | predicted_pixels[1] = FILT121(ui4_g, ui4_h, ui4_i); |
1393 | 0 | predicted_pixels[2] = FILT11(ui4_g, ui4_h); |
1394 | 0 | predicted_pixels[3] = FILT121(ui4_f, ui4_g, ui4_h); |
1395 | 0 | predicted_pixels[4] = FILT11(ui4_f, ui4_g); |
1396 | 0 | predicted_pixels[5] = FILT121(ui4_e, ui4_f, ui4_g); |
1397 | 0 | predicted_pixels[6] = FILT11(ui4_e, ui4_f); |
1398 | 0 | predicted_pixels[7] = FILT121(ui4_d, ui4_e, ui4_f); |
1399 | 0 | predicted_pixels[8] = FILT11(ui4_d, ui4_e); |
1400 | 0 | predicted_pixels[9] = FILT121(ui4_c, ui4_d, ui4_e); |
1401 | 0 | predicted_pixels[10] = FILT11(ui4_c, ui4_d); |
1402 | 0 | predicted_pixels[11] = FILT121(ui4_b, ui4_c, ui4_d); |
1403 | 0 | predicted_pixels[12] = FILT11(ui4_b, ui4_c); |
1404 | 0 | predicted_pixels[13] = FILT121(ui4_a, ui4_b, ui4_c); |
1405 | 0 | predicted_pixels[14] = FILT11(ui4_a, ui4_b); |
1406 | 0 | predicted_pixels[15] = FILT121(ui4_j, ui4_a, ui4_b); |
1407 | 0 | predicted_pixels[16] = FILT121(ui4_k, ui4_j, ui4_a); |
1408 | 0 | predicted_pixels[17] = FILT121(ui4_l, ui4_k, ui4_j); |
1409 | 0 | predicted_pixels[18] = FILT121(ui4_m, ui4_l, ui4_k); |
1410 | 0 | predicted_pixels[19] = FILT121(ui4_n, ui4_m, ui4_l); |
1411 | 0 | predicted_pixels[20] = FILT121(ui4_o, ui4_n, ui4_m); |
1412 | 0 | predicted_pixels[21] = FILT121(ui4_p, ui4_o, ui4_n); |
1413 | |
|
1414 | 0 | memcpy(pu1_dst, predicted_pixels + 14, 8); |
1415 | 0 | memcpy(pu1_dst + dst_strd, predicted_pixels + 12, 8); |
1416 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 10, 8); |
1417 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 8, 8); |
1418 | 0 | memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 6, 8); |
1419 | 0 | memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 4, 8); |
1420 | 0 | memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 2, 8); |
1421 | 0 | memcpy(pu1_dst + 7 * dst_strd, predicted_pixels, 8); |
1422 | 0 | } |
1423 | | |
1424 | | /** |
1425 | | ******************************************************************************* |
1426 | | * |
1427 | | * @brief |
1428 | | * Perform Intra prediction for luma_8x8 mode:Vertical_Left |
1429 | | * |
1430 | | * @par Description: |
1431 | | * Perform Intra prediction for luma_8x8 mode:Vertical_Left, described in |
1432 | | * sec 8.3.2.2.9 |
1433 | | * |
1434 | | * @param[in] pu1_src |
1435 | | * pointer to the source |
1436 | | * |
1437 | | * @param[out] pu1_dst |
1438 | | * pointer to the destination |
1439 | | * |
1440 | | * @param[in] src_strd |
1441 | | * source stride |
1442 | | * |
1443 | | * @param[in] dst_strd |
1444 | | * destination stride |
1445 | | * |
1446 | | * @param[in] ngbr_avail |
1447 | | * availability of neighbouring pixels |
1448 | | * |
1449 | | * @returns |
1450 | | * |
1451 | | * @remarks |
1452 | | * none |
1453 | | * |
1454 | | ******************************************************************************* |
1455 | | */ |
1456 | | |
1457 | | void ih264_intra_pred_luma_8x8_mode_vert_l(UWORD8 *pu1_src, |
1458 | | UWORD8 *pu1_dst, |
1459 | | WORD32 src_strd, |
1460 | | WORD32 dst_strd, |
1461 | | WORD32 ngbr_avail) |
1462 | 0 | { |
1463 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
1464 | 0 | UWORD32 ui4_a, ui4_b, ui4_c, ui4_d, ui4_e, ui4_f, ui4_g, ui4_h; |
1465 | 0 | UWORD32 ui4_i, ui4_j, ui4_k, ui4_l, ui4_m; |
1466 | 0 | UWORD8 predicted_pixels[22]; |
1467 | |
|
1468 | 0 | UNUSED(src_strd); |
1469 | 0 | UNUSED(ngbr_avail); |
1470 | 0 | pu1_top = pu1_src + BLK8x8SIZE + 1; |
1471 | |
|
1472 | 0 | ui4_a = *pu1_top++; |
1473 | 0 | ui4_b = *pu1_top++; |
1474 | 0 | ui4_c = *pu1_top++; |
1475 | 0 | ui4_d = *pu1_top++; |
1476 | 0 | ui4_e = *pu1_top++; |
1477 | 0 | ui4_f = *pu1_top++; |
1478 | 0 | ui4_g = *pu1_top++; |
1479 | 0 | ui4_h = *pu1_top++; |
1480 | 0 | ui4_i = *pu1_top++; |
1481 | 0 | ui4_j = *pu1_top++; |
1482 | 0 | ui4_k = *pu1_top++; |
1483 | 0 | ui4_l = *pu1_top++; |
1484 | 0 | ui4_m = *pu1_top++; |
1485 | |
|
1486 | 0 | predicted_pixels[0] = FILT11(ui4_a, ui4_b); |
1487 | 0 | predicted_pixels[1] = FILT11(ui4_b, ui4_c); |
1488 | 0 | predicted_pixels[2] = FILT11(ui4_c, ui4_d); |
1489 | 0 | predicted_pixels[3] = FILT11(ui4_d, ui4_e); |
1490 | 0 | predicted_pixels[4] = FILT11(ui4_e, ui4_f); |
1491 | 0 | predicted_pixels[5] = FILT11(ui4_f, ui4_g); |
1492 | 0 | predicted_pixels[6] = FILT11(ui4_g, ui4_h); |
1493 | 0 | predicted_pixels[7] = FILT11(ui4_h, ui4_i); |
1494 | 0 | predicted_pixels[8] = FILT11(ui4_i, ui4_j); |
1495 | 0 | predicted_pixels[9] = FILT11(ui4_j, ui4_k); |
1496 | 0 | predicted_pixels[10] = FILT11(ui4_k, ui4_l); |
1497 | 0 | predicted_pixels[11] = FILT121(ui4_a, ui4_b, ui4_c); |
1498 | 0 | predicted_pixels[12] = FILT121(ui4_b, ui4_c, ui4_d); |
1499 | 0 | predicted_pixels[13] = FILT121(ui4_c, ui4_d, ui4_e); |
1500 | 0 | predicted_pixels[14] = FILT121(ui4_d, ui4_e, ui4_f); |
1501 | 0 | predicted_pixels[15] = FILT121(ui4_e, ui4_f, ui4_g); |
1502 | 0 | predicted_pixels[16] = FILT121(ui4_f, ui4_g, ui4_h); |
1503 | 0 | predicted_pixels[17] = FILT121(ui4_g, ui4_h, ui4_i); |
1504 | 0 | predicted_pixels[18] = FILT121(ui4_h, ui4_i, ui4_j); |
1505 | 0 | predicted_pixels[19] = FILT121(ui4_i, ui4_j, ui4_k); |
1506 | 0 | predicted_pixels[20] = FILT121(ui4_j, ui4_k, ui4_l); |
1507 | 0 | predicted_pixels[21] = FILT121(ui4_k, ui4_l, ui4_m); |
1508 | |
|
1509 | 0 | memcpy(pu1_dst, predicted_pixels, 8); |
1510 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 1, 8); |
1511 | 0 | memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 2, 8); |
1512 | 0 | memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 3, 8); |
1513 | 0 | memcpy(pu1_dst + 1 * dst_strd, predicted_pixels + 11, 8); |
1514 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 12, 8); |
1515 | 0 | memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 13, 8); |
1516 | 0 | memcpy(pu1_dst + 7 * dst_strd, predicted_pixels + 14, 8); |
1517 | 0 | } |
1518 | | |
1519 | | /** |
1520 | | ******************************************************************************* |
1521 | | * |
1522 | | * @brief |
1523 | | * Perform Intra prediction for luma_8x8 mode:Horizontal_Up |
1524 | | * |
1525 | | * @par Description: |
1526 | | * Perform Intra prediction for luma_8x8 mode:Horizontal_Up, described in |
1527 | | * sec 8.3.2.2.10 |
1528 | | * |
1529 | | * @param[in] pu1_src |
1530 | | * pointer to the source |
1531 | | * |
1532 | | * @param[out] pu1_dst |
1533 | | * pointer to the destination |
1534 | | * |
1535 | | * @param[in] src_strd |
1536 | | * source stride |
1537 | | * |
1538 | | * @param[in] dst_strd |
1539 | | * destination stride |
1540 | | * |
1541 | | * @param[in] ngbr_avail |
1542 | | * availability of neighbouring pixels |
1543 | | * |
1544 | | * @returns |
1545 | | * |
1546 | | * @remarks |
1547 | | * none |
1548 | | * |
1549 | | ******************************************************************************* |
1550 | | */ |
1551 | | void ih264_intra_pred_luma_8x8_mode_horz_u(UWORD8 *pu1_src, |
1552 | | UWORD8 *pu1_dst, |
1553 | | WORD32 src_strd, |
1554 | | WORD32 dst_strd, |
1555 | | WORD32 ngbr_avail) |
1556 | 0 | { |
1557 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
1558 | 0 | UWORD32 ui4_j, ui4_k, ui4_l, ui4_m, ui4_n, ui4_o, ui4_p, ui4_q; |
1559 | 0 | UWORD8 predicted_pixels[22]; |
1560 | |
|
1561 | 0 | UNUSED(src_strd); |
1562 | 0 | UNUSED(ngbr_avail); |
1563 | 0 | pu1_left = pu1_src + BLK8x8SIZE - 1; |
1564 | |
|
1565 | 0 | ui4_j = *pu1_left--; |
1566 | 0 | ui4_k = *pu1_left--; |
1567 | 0 | ui4_l = *pu1_left--; |
1568 | 0 | ui4_m = *pu1_left--; |
1569 | 0 | ui4_n = *pu1_left--; |
1570 | 0 | ui4_o = *pu1_left--; |
1571 | 0 | ui4_p = *pu1_left--; |
1572 | 0 | ui4_q = *pu1_left; |
1573 | |
|
1574 | 0 | pu1_left = pu1_src + BLK8x8SIZE - 1; |
1575 | |
|
1576 | 0 | predicted_pixels[0] = FILT11(ui4_j, ui4_k); |
1577 | 0 | predicted_pixels[1] = FILT121(ui4_j, ui4_k, ui4_l); |
1578 | 0 | predicted_pixels[2] = FILT11(ui4_k, ui4_l); |
1579 | 0 | predicted_pixels[3] = FILT121(ui4_k, ui4_l, ui4_m); |
1580 | 0 | predicted_pixels[4] = FILT11(ui4_l, ui4_m); |
1581 | 0 | predicted_pixels[5] = FILT121(ui4_l, ui4_m, ui4_n); |
1582 | 0 | predicted_pixels[6] = FILT11(ui4_m, ui4_n); |
1583 | 0 | predicted_pixels[7] = FILT121(ui4_m, ui4_n, ui4_o); |
1584 | 0 | predicted_pixels[8] = FILT11(ui4_n, ui4_o); |
1585 | 0 | predicted_pixels[9] = FILT121(ui4_n, ui4_o, ui4_p); |
1586 | 0 | predicted_pixels[10] = FILT11(ui4_o, ui4_p); |
1587 | 0 | predicted_pixels[11] = FILT121(ui4_o, ui4_p, ui4_q); |
1588 | 0 | predicted_pixels[12] = FILT11(ui4_p, ui4_q); |
1589 | 0 | predicted_pixels[13] = FILT121(ui4_p, ui4_q, ui4_q); |
1590 | 0 | memset(predicted_pixels+14,ui4_q,8); |
1591 | |
|
1592 | 0 | memcpy(pu1_dst, predicted_pixels, 8); |
1593 | 0 | memcpy(pu1_dst + 1 * dst_strd, predicted_pixels + 2, 8); |
1594 | 0 | memcpy(pu1_dst + 2 * dst_strd, predicted_pixels + 4, 8); |
1595 | 0 | memcpy(pu1_dst + 3 * dst_strd, predicted_pixels + 6, 8); |
1596 | 0 | memcpy(pu1_dst + 4 * dst_strd, predicted_pixels + 8, 8); |
1597 | 0 | memcpy(pu1_dst + 5 * dst_strd, predicted_pixels + 10, 8); |
1598 | 0 | memcpy(pu1_dst + 6 * dst_strd, predicted_pixels + 12, 8); |
1599 | 0 | memcpy(pu1_dst + 7 * dst_strd, predicted_pixels + 14, 8); |
1600 | 0 | } |
1601 | | |
1602 | | /** |
1603 | | ******************************************************************************* |
1604 | | * |
1605 | | * @brief |
1606 | | * Perform Intra prediction for luma_16x16 mode:Vertical |
1607 | | * |
1608 | | * @par Description: |
1609 | | * Perform Intra prediction for luma_16x16 mode:Vertical, described in |
1610 | | * sec 8.3.3.1 |
1611 | | * |
1612 | | * @param[in] pu1_src |
1613 | | * pointer to the source |
1614 | | * |
1615 | | * @param[out] pu1_dst |
1616 | | * pointer to the destination |
1617 | | * |
1618 | | * @param[in] src_strd |
1619 | | * source stride |
1620 | | * |
1621 | | * @param[in] dst_strd |
1622 | | * destination stride |
1623 | | * |
1624 | | * @param[in] ngbr_avail |
1625 | | * availability of neighbouring pixels |
1626 | | * |
1627 | | * @returns |
1628 | | * |
1629 | | * @remarks |
1630 | | * none |
1631 | | * |
1632 | | ******************************************************************************* |
1633 | | */ |
1634 | | void ih264_intra_pred_luma_16x16_mode_vert(UWORD8 *pu1_src, |
1635 | | UWORD8 *pu1_dst, |
1636 | | WORD32 src_strd, |
1637 | | WORD32 dst_strd, |
1638 | | WORD32 ngbr_avail) |
1639 | 0 | { |
1640 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
1641 | 0 | WORD32 rows; /* loop variables*/ |
1642 | |
|
1643 | 0 | UNUSED(src_strd); |
1644 | 0 | UNUSED(ngbr_avail); |
1645 | 0 | pu1_top = pu1_src + MB_SIZE + 1; |
1646 | 0 | for(rows = 0; rows < 16; rows += 4, pu1_dst += dst_strd) |
1647 | 0 | { |
1648 | 0 | memcpy(pu1_dst, pu1_top, 16); |
1649 | 0 | pu1_dst += dst_strd; |
1650 | 0 | memcpy(pu1_dst, pu1_top, 16); |
1651 | 0 | pu1_dst += dst_strd; |
1652 | 0 | memcpy(pu1_dst, pu1_top, 16); |
1653 | 0 | pu1_dst += dst_strd; |
1654 | 0 | memcpy(pu1_dst, pu1_top, 16); |
1655 | 0 | } |
1656 | 0 | } |
1657 | | |
1658 | | /** |
1659 | | ******************************************************************************* |
1660 | | * |
1661 | | * @brief |
1662 | | * Perform Intra prediction for luma_16x16 mode:Horizontal |
1663 | | * |
1664 | | * @par Description: |
1665 | | * Perform Intra prediction for luma_16x16 mode:Horizontal, described in |
1666 | | * sec 8.3.3.2 |
1667 | | * |
1668 | | * @param[in] pu1_src |
1669 | | * pointer to the source |
1670 | | * |
1671 | | * @param[out] pu1_dst |
1672 | | * pointer to the destination |
1673 | | * |
1674 | | * @param[in] src_strd |
1675 | | * source stride |
1676 | | * |
1677 | | * @param[in] dst_strd |
1678 | | * destination stride |
1679 | | * |
1680 | | * @param[in] ngbr_avail |
1681 | | * availability of neighbouring pixels |
1682 | | * |
1683 | | * @returns |
1684 | | * |
1685 | | * @remarks |
1686 | | * none |
1687 | | * |
1688 | | ******************************************************************************* |
1689 | | */ |
1690 | | void ih264_intra_pred_luma_16x16_mode_horz(UWORD8 *pu1_src, |
1691 | | UWORD8 *pu1_dst, |
1692 | | WORD32 src_strd, |
1693 | | WORD32 dst_strd, |
1694 | | WORD32 ngbr_avail) |
1695 | 0 | { |
1696 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of top predictors */ |
1697 | 0 | WORD32 rows; |
1698 | |
|
1699 | 0 | UNUSED(src_strd); |
1700 | 0 | UNUSED(ngbr_avail); |
1701 | 0 | pu1_left = pu1_src + MB_SIZE - 1; |
1702 | 0 | for(rows = 0; rows < 16; rows += 4, pu1_dst += dst_strd, pu1_left --) |
1703 | 0 | { |
1704 | 0 | memset(pu1_dst, *pu1_left, 16); /* copy the left value to the entire row*/ |
1705 | 0 | pu1_left --; |
1706 | 0 | pu1_dst += dst_strd; |
1707 | 0 | memset(pu1_dst, *pu1_left, 16); |
1708 | 0 | pu1_left --; |
1709 | 0 | pu1_dst += dst_strd; |
1710 | 0 | memset(pu1_dst, *pu1_left, 16); |
1711 | 0 | pu1_left --; |
1712 | 0 | pu1_dst += dst_strd; |
1713 | 0 | memset(pu1_dst, *pu1_left, 16); |
1714 | 0 | } |
1715 | 0 | } |
1716 | | |
1717 | | /** |
1718 | | ******************************************************************************* |
1719 | | * |
1720 | | * @brief |
1721 | | * Perform Intra prediction for luma_16x16 mode:DC |
1722 | | * |
1723 | | * @par Description: |
1724 | | * Perform Intra prediction for luma_16x16 mode:DC, described in sec 8.3.3.3 |
1725 | | * |
1726 | | * @param[in] pu1_src |
1727 | | * pointer to the source |
1728 | | * |
1729 | | * @param[out] pu1_dst |
1730 | | * pointer to the destination |
1731 | | * |
1732 | | * @param[in] src_strd |
1733 | | * source stride |
1734 | | * |
1735 | | * @param[in] dst_strd |
1736 | | * destination stride |
1737 | | * |
1738 | | * @param[in] ngbr_avail |
1739 | | * availability of neighbouring pixels |
1740 | | * |
1741 | | * @returns |
1742 | | * |
1743 | | * @remarks |
1744 | | * none |
1745 | | * |
1746 | | ******************************************************************************* |
1747 | | */ |
1748 | | void ih264_intra_pred_luma_16x16_mode_dc(UWORD8 *pu1_src, |
1749 | | UWORD8 *pu1_dst, |
1750 | | WORD32 src_strd, |
1751 | | WORD32 dst_strd, |
1752 | | WORD32 ngbr_avail) |
1753 | 0 | { |
1754 | 0 | WORD8 u1_useleft; /* availability of left predictors (only for DC) */ |
1755 | 0 | UWORD8 u1_usetop; /* availability of top predictors (only for DC) */ |
1756 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
1757 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
1758 | 0 | WORD32 rows; /* loop variables*/ |
1759 | 0 | WORD32 val = 0; |
1760 | |
|
1761 | 0 | UNUSED(src_strd); |
1762 | 0 | u1_useleft = BOOLEAN(ngbr_avail & LEFT_MB_AVAILABLE_MASK); |
1763 | 0 | u1_usetop = BOOLEAN(ngbr_avail & TOP_MB_AVAILABLE_MASK); |
1764 | 0 | pu1_top = pu1_src + MB_SIZE + 1; |
1765 | 0 | pu1_left = pu1_src + MB_SIZE - 1; |
1766 | 0 | if(u1_useleft) |
1767 | 0 | { |
1768 | 0 | for(rows = 0; rows < 16; rows++) |
1769 | 0 | val += *(pu1_left - rows); |
1770 | 0 | val += 8; |
1771 | 0 | } |
1772 | 0 | if(u1_usetop) |
1773 | 0 | { |
1774 | 0 | for(rows = 0; rows < 16; rows++) |
1775 | 0 | val += *(pu1_top + rows); |
1776 | 0 | val += 8; |
1777 | 0 | } |
1778 | | /* Since 8 is added if either left/top pred is there, |
1779 | | val still being zero implies both preds are not there */ |
1780 | 0 | val = (val) ? (val >> (3 + u1_useleft + u1_usetop)) : 128; |
1781 | |
|
1782 | 0 | for(rows = 0; rows < 16; rows += 4, pu1_dst += dst_strd) |
1783 | 0 | { |
1784 | 0 | memset(pu1_dst, val, 16); |
1785 | 0 | pu1_dst += dst_strd; |
1786 | 0 | memset(pu1_dst, val, 16); |
1787 | 0 | pu1_dst += dst_strd; |
1788 | 0 | memset(pu1_dst, val, 16); |
1789 | 0 | pu1_dst += dst_strd; |
1790 | 0 | memset(pu1_dst, val, 16); |
1791 | 0 | } |
1792 | 0 | } |
1793 | | |
1794 | | /** |
1795 | | ******************************************************************************* |
1796 | | * |
1797 | | * @brief |
1798 | | * Perform Intra prediction for luma_16x16 mode:PLANE |
1799 | | * |
1800 | | * @par Description: |
1801 | | * Perform Intra prediction for luma_16x16 mode:PLANE, described in sec 8.3.3.4 |
1802 | | * |
1803 | | * @param[in] pu1_src |
1804 | | * pointer to the source |
1805 | | * |
1806 | | * @param[out] pu1_dst |
1807 | | * pointer to the destination |
1808 | | * |
1809 | | * @param[in] src_strd |
1810 | | * source stride |
1811 | | * |
1812 | | * @param[in] dst_strd |
1813 | | * destination stride |
1814 | | * |
1815 | | * @param[in] ngbr_avail |
1816 | | * availability of neighbouring pixels |
1817 | | * |
1818 | | * @returns |
1819 | | * |
1820 | | * @remarks |
1821 | | * none |
1822 | | * |
1823 | | ******************************************************************************* |
1824 | | */ |
1825 | | void ih264_intra_pred_luma_16x16_mode_plane(UWORD8 *pu1_src, |
1826 | | UWORD8 *pu1_dst, |
1827 | | WORD32 src_strd, |
1828 | | WORD32 dst_strd, |
1829 | | WORD32 ngbr_avail) |
1830 | 0 | { |
1831 | | /*! Written with no multiplications */ |
1832 | 0 | UWORD8 *pu1_left = NULL; /* Pointer to start of left predictors */ |
1833 | 0 | UWORD8 *pu1_top = NULL; /* Pointer to start of top predictors */ |
1834 | 0 | UWORD8 *pu1_topleft = NULL; |
1835 | 0 | WORD32 a, b, c, tmp; |
1836 | 0 | UWORD8 *pu1_tmp1, *pu1_tmp2; |
1837 | 0 | WORD32 shift; |
1838 | |
|
1839 | 0 | UNUSED(src_strd); |
1840 | 0 | UNUSED(ngbr_avail); |
1841 | 0 | pu1_top = pu1_src + MB_SIZE + 1; |
1842 | 0 | pu1_left = pu1_src + MB_SIZE - 1; |
1843 | 0 | pu1_topleft = pu1_src + MB_SIZE; |
1844 | |
|
1845 | 0 | { |
1846 | 0 | a = (*(pu1_top + 15) + *(pu1_left - 15)) << 4; |
1847 | | |
1848 | | /*! Implement Sum(x*(P((x+7),-1) - P((x-7),-1))) x=1...8 */ |
1849 | 0 | pu1_tmp1 = pu1_top + 8; |
1850 | 0 | pu1_tmp2 = pu1_tmp1 - 2; |
1851 | | |
1852 | | /* Pixel diffs are only 9 bits; |
1853 | | so sign extension allows shifts to be used even for signed */ |
1854 | 0 | b = ((*pu1_tmp1++) - (*pu1_tmp2--)); /* x=1 */ |
1855 | 0 | b += ((*pu1_tmp1++) - (*pu1_tmp2--)) << 1; /* x=2 */ |
1856 | 0 | tmp = ((*pu1_tmp1++) - (*pu1_tmp2--)); |
1857 | 0 | b += (tmp << 1) + tmp; /* x=3 */ |
1858 | 0 | b += ((*pu1_tmp1++) - (*pu1_tmp2--)) << 2; /* x=4 */ |
1859 | |
|
1860 | 0 | tmp = ((*pu1_tmp1++) - (*pu1_tmp2--)); |
1861 | 0 | b += (tmp << 2) + tmp; /* x=5 */ |
1862 | 0 | tmp = ((*pu1_tmp1++) - (*pu1_tmp2--)); |
1863 | 0 | b += (tmp << 2) + (tmp << 1); /* x=6 */ |
1864 | 0 | tmp = ((*pu1_tmp1++) - (*pu1_tmp2--)); |
1865 | 0 | b += (tmp << 3) - tmp; /* x=7 */ |
1866 | 0 | b += ((*pu1_tmp1) - (*pu1_topleft)) << 3; /* x=8 */ |
1867 | |
|
1868 | 0 | b = ((b << 2) + b + 32) >> 6; /*! (5*H + 32)>>6 */ |
1869 | | |
1870 | | /*! Implement Sum(y*(P(-1,(y+7)) - P(-1,(y-7)))) y=1...8 */ |
1871 | 0 | pu1_tmp1 = pu1_left - 8; |
1872 | 0 | pu1_tmp2 = pu1_tmp1 + 2; |
1873 | |
|
1874 | 0 | c = ((*pu1_tmp1) - (*pu1_tmp2)); /* y=1 */ |
1875 | 0 | pu1_tmp1--; |
1876 | 0 | pu1_tmp2++; |
1877 | 0 | c += ((*pu1_tmp1) - (*pu1_tmp2)) << 1; /* y=2 */ |
1878 | 0 | pu1_tmp1--; |
1879 | 0 | pu1_tmp2++; |
1880 | 0 | tmp = ((*pu1_tmp1) - (*pu1_tmp2)); |
1881 | 0 | c += (tmp << 1) + tmp; /* y=3 */ |
1882 | 0 | pu1_tmp1--; |
1883 | 0 | pu1_tmp2++; |
1884 | 0 | c += ((*pu1_tmp1) - (*pu1_tmp2)) << 2; /* y=4 */ |
1885 | 0 | pu1_tmp1--; |
1886 | 0 | pu1_tmp2++; |
1887 | |
|
1888 | 0 | tmp = ((*pu1_tmp1) - (*pu1_tmp2)); |
1889 | 0 | c += (tmp << 2) + tmp; /* y=5 */ |
1890 | 0 | pu1_tmp1--; |
1891 | 0 | pu1_tmp2++; |
1892 | 0 | tmp = ((*pu1_tmp1) - (*pu1_tmp2)); |
1893 | 0 | c += (tmp << 2) + (tmp << 1); /* y=6 */ |
1894 | 0 | pu1_tmp1--; |
1895 | 0 | pu1_tmp2++; |
1896 | 0 | tmp = ((*pu1_tmp1) - (*pu1_tmp2)); |
1897 | 0 | c += (tmp << 3) - tmp; /* y=7 */ |
1898 | 0 | pu1_tmp1--; //pu1_tmp2 ++; |
1899 | | /* Modified to get (-1,-1) location as *(pu1_top - 1) instead of (pu1_left - ui4_stride) */ |
1900 | | //c += ((*pu1_tmp1) - (*(pu1_top - 1)))<<3; /* y=8 */ |
1901 | 0 | c += ((*pu1_tmp1) - (*pu1_topleft)) << 3; /* y=8 */ |
1902 | |
|
1903 | 0 | c = ((c << 2) + c + 32) >> 6; /*! (5*V + 32)>>32 */ |
1904 | 0 | shift = 3; |
1905 | 0 | } |
1906 | | |
1907 | | /*! Now from the plane parameters a, b, and c, |
1908 | | compute the fitted plane values over the block */ |
1909 | 0 | { |
1910 | 0 | WORD32 tmp1, tmpx, tmpx_init, j, i; |
1911 | |
|
1912 | 0 | tmpx_init = -(b << shift); /* -8b */ |
1913 | 0 | tmp = a - (c << shift) + 16; /* a-((4or8)*c)+16 */ |
1914 | 0 | for(i = 0; i < 16; i++) |
1915 | 0 | { |
1916 | 0 | tmp += c; /*increment every time by c to get c*(y-7or3)*/ |
1917 | 0 | tmpx = tmpx_init; /* Init to -8b */ |
1918 | 0 | for(j = 0; j < 16; j++) |
1919 | 0 | { |
1920 | 0 | tmpx += b; /* increment every time by b to get b*(x-7or3) */ |
1921 | 0 | tmp1 = (tmp + tmpx) >> 5; |
1922 | 0 | *pu1_dst++ = CLIP_U8(tmp1); |
1923 | 0 | } |
1924 | 0 | pu1_dst += (dst_strd - 16); |
1925 | 0 | } |
1926 | 0 | } |
1927 | 0 | } |