Coverage Report

Created: 2024-05-11 06:32

/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
}