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