Coverage Report

Created: 2026-10-28 06:26

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libhevc/encoder/ihevce_recur_bracketing.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
21
/*!
22
******************************************************************************
23
* \file ihevce_recur_bracketing.c
24
*
25
* \brief
26
*    This file contains interface functions of recursive bracketing
27
*    module
28
* \date
29
*    12/02/2012
30
*
31
* \author
32
*    Ittiam
33
*
34
* List of Functions
35
*
36
*
37
******************************************************************************
38
*/
39
40
/*****************************************************************************/
41
/* File Includes                                                             */
42
/*****************************************************************************/
43
/* System include files */
44
#include <stdio.h>
45
#include <string.h>
46
#include <stdlib.h>
47
#include <assert.h>
48
#include <stdarg.h>
49
#include <math.h>
50
51
/* User include files */
52
#include "ihevc_typedefs.h"
53
#include "itt_video_api.h"
54
#include "ihevce_api.h"
55
56
#include "rc_cntrl_param.h"
57
#include "rc_frame_info_collector.h"
58
#include "rc_look_ahead_params.h"
59
60
#include "ihevc_defs.h"
61
#include "ihevc_structs.h"
62
#include "ihevc_platform_macros.h"
63
#include "ihevc_deblk.h"
64
#include "ihevc_itrans_recon.h"
65
#include "ihevc_chroma_itrans_recon.h"
66
#include "ihevc_chroma_intra_pred.h"
67
#include "ihevc_intra_pred.h"
68
#include "ihevc_inter_pred.h"
69
#include "ihevc_mem_fns.h"
70
#include "ihevc_padding.h"
71
#include "ihevc_weighted_pred.h"
72
#include "ihevc_sao.h"
73
#include "ihevc_resi_trans.h"
74
#include "ihevc_quant_iquant_ssd.h"
75
#include "ihevc_cabac_tables.h"
76
77
#include "ihevce_defs.h"
78
#include "ihevce_lap_enc_structs.h"
79
#include "ihevce_multi_thrd_structs.h"
80
#include "ihevce_me_common_defs.h"
81
#include "ihevce_had_satd.h"
82
#include "ihevce_error_codes.h"
83
#include "ihevce_bitstream.h"
84
#include "ihevce_cabac.h"
85
#include "ihevce_rdoq_macros.h"
86
#include "ihevce_function_selector.h"
87
#include "ihevce_enc_structs.h"
88
#include "ihevce_entropy_structs.h"
89
#include "ihevce_cmn_utils_instr_set_router.h"
90
#include "ihevce_enc_loop_structs.h"
91
#include "ihevce_ipe_instr_set_router.h"
92
#include "ihevce_ipe_structs.h"
93
#include "ihevce_ipe_pass.h"
94
#include "ihevce_recur_bracketing.h"
95
#include "ihevce_nbr_avail.h"
96
#include "ihevc_common_tables.h"
97
#include "ihevce_decomp_pre_intra_structs.h"
98
#include "ihevce_decomp_pre_intra_pass.h"
99
100
#include "cast_types.h"
101
#include "osal.h"
102
#include "osal_defaults.h"
103
104
/*****************************************************************************/
105
/* Constant Macros                                                           */
106
/*****************************************************************************/
107
#define IP_DBG_L1_l2 0
108
630k
#define CHILD_BIAS 12
109
110
/*****************************************************************************/
111
/* Globals                                                                   */
112
/*****************************************************************************/
113
extern pf_intra_pred g_apf_lum_ip[10];
114
115
extern WORD32 g_i4_ip_funcs[MAX_NUM_IP_MODES];
116
117
UWORD8 gau1_cu_pos_x[64] = { 0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7,
118
                             6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1,
119
                             2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7 };
120
121
UWORD8 gau1_cu_pos_y[64] = { 0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 0, 0, 1, 1, 0, 0,
122
                             1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 4, 4, 5, 5, 4, 4, 5, 5, 6, 6, 7, 7,
123
                             6, 6, 7, 7, 4, 4, 5, 5, 4, 4, 5, 5, 6, 6, 7, 7, 6, 6, 7, 7 };
124
125
#define RESET_BIT(x, bit) (x = x & ~((WORD32)1 << bit))
126
127
/*****************************************************************************/
128
/* Function Definitions                                                      */
129
/*****************************************************************************/
130
131
/*!
132
******************************************************************************
133
* \if Function name : ihevce_update_cand_list \endif
134
*
135
* \brief
136
*    Final Candidate list population, nbr flag andd nbr mode update function
137
*
138
* \param[in] ps_row_cu : pointer to cu analyse struct
139
* \param[in] ps_cu_node : pointer to cu node info buffer
140
* \param[in] ps_ed_blk_l1 : pointer to level 1 and 2 decision buffer
141
* \param[in] pu1_cand_mode_list  : pointer to candidate list buffer
142
*
143
* \return
144
*    None
145
*
146
* \author
147
*  Ittiam
148
*
149
*****************************************************************************
150
*/
151
void ihevce_update_cand_list(
152
    ihevce_ipe_cu_tree_t *ps_cu_node, ihevce_ed_blk_t *ps_ed_blk_l1, ihevce_ipe_ctxt_t *ps_ctxt)
153
658k
{
154
658k
    WORD32 row, col, x, y, size;
155
156
    /* Candidate mode Update */
157
658k
    (void)ps_ed_blk_l1;
158
    /* Update CTB mode map for the finalised CU */
159
658k
    x = ((ps_cu_node->u2_x0 << 3) >> 2) + 1;
160
658k
    y = ((ps_cu_node->u2_y0 << 3) >> 2) + 1;
161
658k
    size = ps_cu_node->u1_cu_size >> 2;
162
2.88M
    for(row = y; row < (y + size); row++)
163
2.23M
    {
164
12.3M
        for(col = x; col < (x + size); col++)
165
10.1M
        {
166
10.1M
            ps_ctxt->au1_ctb_mode_map[row][col] = ps_cu_node->best_mode;
167
10.1M
        }
168
2.23M
    }
169
658k
    return;
170
658k
}
171
172
/*!
173
******************************************************************************
174
* \if Function name : ihevce_intra_populate_mode_bits_cost_bracketing \endif
175
*
176
* \brief
177
*    Mpm indx calc function based on left and top available modes
178
*
179
* \param[in] top_intra_mode : Top available intra mode
180
* \param[in] left_intra_mode : Left available intra mode
181
* \param[in] available_top : Top availability flag
182
* \param[in] available_left : Left availability flag
183
* \param[in] cu_pos_y : cu position wrt to CTB
184
* \param[in] mode_bits_cost : pointer to mode bits buffer
185
* \param[in] lambda : Lambda value (SAD/SATD)
186
* \param[in] cand_mode_list  : pointer to candidate list buffer
187
*
188
* \return
189
*    None
190
*
191
* \author
192
*  Ittiam
193
*
194
*****************************************************************************
195
*/
196
void ihevce_intra_populate_mode_bits_cost_bracketing(
197
    WORD32 top_intra_mode,
198
    WORD32 left_intra_mode,
199
    WORD32 available_top,
200
    WORD32 available_left,
201
    WORD32 cu_pos_y,
202
    UWORD16 *mode_bits_cost,
203
    UWORD16 *mode_bits,
204
    WORD32 lambda,
205
    WORD32 *cand_mode_list)
206
3.79M
{
207
    /* local variables */
208
3.79M
    WORD32 i;
209
3.79M
    WORD32 cand_intra_pred_mode_left, cand_intra_pred_mode_top;
210
211
3.79M
    UWORD16 one_bits_cost =
212
3.79M
        COMPUTE_RATE_COST_CLIP30(4, lambda, (LAMBDA_Q_SHIFT + 1));  //1.5 * lambda
213
3.79M
    UWORD16 two_bits_cost =
214
3.79M
        COMPUTE_RATE_COST_CLIP30(6, lambda, (LAMBDA_Q_SHIFT + 1));  //2.5 * lambda
215
3.79M
    UWORD16 five_bits_cost =
216
3.79M
        COMPUTE_RATE_COST_CLIP30(12, lambda, (LAMBDA_Q_SHIFT + 1));  //5.5 * lambda
217
218
136M
    for(i = 0; i < 35; i++)
219
132M
    {
220
132M
        mode_bits_cost[i] = five_bits_cost;
221
132M
        mode_bits[i] = 5;
222
132M
    }
223
224
    /* EIID: set availability flag to zero if modes are invalid.
225
       Required since some CU's might be skipped (though available)
226
       and their modes will be set to 255 (-1)*/
227
3.79M
    if(35 < top_intra_mode || 0 > top_intra_mode)
228
0
        available_top = 0;
229
3.79M
    if(35 < left_intra_mode || 0 > left_intra_mode)
230
0
        available_left = 0;
231
232
    /* Calculate cand_intra_pred_mode_N as per sec. 8.4.2 in JCTVC-J1003_d7 */
233
    /* N = top */
234
3.79M
    if(0 == available_top)
235
361k
    {
236
361k
        cand_intra_pred_mode_top = INTRA_DC;
237
361k
    }
238
    /* for neighbour != INTRA, setting DC is done outside */
239
3.43M
    else if(0 == cu_pos_y) /* It's on the CTB boundary */
240
428k
    {
241
428k
        cand_intra_pred_mode_top = INTRA_DC;
242
428k
    }
243
3.00M
    else
244
3.00M
    {
245
3.00M
        cand_intra_pred_mode_top = top_intra_mode;
246
3.00M
    }
247
248
    /* N = left */
249
3.79M
    if(0 == available_left)
250
373k
    {
251
373k
        cand_intra_pred_mode_left = INTRA_DC;
252
        //cand_intra_pred_mode_left = cand_intra_pred_mode_top;
253
373k
    }
254
    /* for neighbour != INTRA, setting DC is done outside */
255
3.41M
    else
256
3.41M
    {
257
3.41M
        cand_intra_pred_mode_left = left_intra_mode;
258
3.41M
    }
259
260
    /* Calculate cand_mode_list as per sec. 8.4.2 in JCTVC-J1003_d7 */
261
3.79M
    if(cand_intra_pred_mode_left == cand_intra_pred_mode_top)
262
1.31M
    {
263
1.31M
        if(cand_intra_pred_mode_left < 2)
264
782k
        {
265
782k
            cand_mode_list[0] = INTRA_PLANAR;
266
782k
            cand_mode_list[1] = INTRA_DC;
267
782k
            cand_mode_list[2] = INTRA_ANGULAR(26); /* angular 26 = Vertical */
268
782k
        }
269
534k
        else
270
534k
        {
271
534k
            cand_mode_list[0] = cand_intra_pred_mode_left;
272
534k
            cand_mode_list[1] = 2 + ((cand_intra_pred_mode_left + 29) % 32);
273
534k
            cand_mode_list[2] = 2 + ((cand_intra_pred_mode_left - 2 + 1) % 32);
274
534k
        }
275
1.31M
    }
276
2.47M
    else
277
2.47M
    {
278
2.47M
        if(0 == available_left)
279
257k
        {
280
257k
            cand_mode_list[0] = cand_intra_pred_mode_top;
281
257k
            cand_mode_list[1] = cand_intra_pred_mode_left;
282
257k
        }
283
2.21M
        else
284
2.21M
        {
285
2.21M
            cand_mode_list[0] = cand_intra_pred_mode_left;
286
2.21M
            cand_mode_list[1] = cand_intra_pred_mode_top;
287
2.21M
        }
288
2.47M
        if((cand_intra_pred_mode_left != INTRA_PLANAR) &&
289
1.99M
           (cand_intra_pred_mode_top != INTRA_PLANAR))
290
1.62M
        {
291
1.62M
            cand_mode_list[2] = INTRA_PLANAR;
292
1.62M
        }
293
849k
        else if((cand_intra_pred_mode_left != INTRA_DC) && (cand_intra_pred_mode_top != INTRA_DC))
294
396k
        {
295
396k
            cand_mode_list[2] = INTRA_DC;
296
396k
        }
297
453k
        else
298
453k
        {
299
453k
            cand_mode_list[2] = INTRA_ANGULAR(26);
300
453k
        }
301
2.47M
    }
302
3.79M
    mode_bits_cost[cand_mode_list[0]] = one_bits_cost;
303
3.79M
    mode_bits_cost[cand_mode_list[1]] = two_bits_cost;
304
3.79M
    mode_bits_cost[cand_mode_list[2]] = two_bits_cost;
305
306
3.79M
    mode_bits[cand_mode_list[0]] = 2;
307
3.79M
    mode_bits[cand_mode_list[1]] = 3;
308
3.79M
    mode_bits[cand_mode_list[2]] = 3;
309
3.79M
}
310
311
/*!
312
******************************************************************************
313
* \if Function name : ihevce_pu_calc_4x4_blk \endif
314
*
315
* \brief
316
*    4x4 pu (8x8 CU) mode decision using step 8421 method
317
*
318
* \param[in] ps_cu_node : pointer to cu node info buffer
319
* \param[in] pu1_src : pointer to src pixels
320
* \param[in] src_stride : frm source stride
321
* \param[in] ref : pointer to reference pixels for prediction
322
* \param[in] cand_mode_list  : pointer to candidate list buffer
323
* \param[in] best_costs_4x4  : pointer to 3 best cost buffer
324
* \param[in] best_modes_4x4  : pointer to 3 best mode buffer
325
*
326
* \return
327
*    None
328
*
329
* \author
330
*  Ittiam
331
*
332
*****************************************************************************
333
*/
334
void ihevce_pu_calc_4x4_blk(
335
    ihevce_ipe_ctxt_t *ps_ctxt,
336
    ihevce_ipe_cu_tree_t *ps_cu_node,
337
    UWORD8 *pu1_src,
338
    WORD32 src_stride,
339
    UWORD8 *ref,
340
    UWORD16 *mode_bits_cost,
341
    WORD32 *best_costs_4x4,
342
    UWORD8 *best_modes_4x4,
343
    func_selector_t *ps_func_selector)
344
1.69M
{
345
1.69M
    WORD16 *pi2_trans_tmp = ps_ctxt->pi2_trans_tmp;
346
1.69M
    WORD16 *pi2_trans_out = ps_ctxt->pi2_trans_out;
347
1.69M
    UWORD8 u1_use_satd = ps_ctxt->u1_use_satd;
348
1.69M
    UWORD8 u1_level_1_refine_on = ps_ctxt->u1_level_1_refine_on;
349
350
1.69M
    WORD32 i, j = 0, i_end;
351
1.69M
    UWORD8 mode, best_amode = 255;
352
1.69M
    UWORD8 pred[16];
353
354
1.69M
    UWORD16 sad;
355
1.69M
    WORD32 sad_cost = 0;
356
1.69M
    WORD32 best_asad_cost = 0xFFFFF;
357
1.69M
    WORD32 temp;
358
1.69M
    UWORD8 modes_to_eval[5];
359
1.69M
    WORD32 costs_4x4[5];
360
1.69M
    UWORD8 modes_4x4[5] = { 0, 1, 2, 3, 4 };
361
362
    /* LO resolution hence low resolution disable */
363
1.69M
    WORD32 u1_low_resol = 0;
364
1.69M
    UWORD8 au1_best_modes[1] = { 0 };
365
1.69M
    WORD32 ai4_best_sad_costs[1] = { 0 };
366
367
1.69M
    WORD16 *pi2_tmp = &pi2_trans_tmp[0];
368
369
1.69M
    ihevce_ipe_optimised_function_list_t *ps_ipe_optimised_function_list =
370
1.69M
        &ps_ctxt->s_ipe_optimised_function_list;
371
372
    //apf_resd_trns[0] = &ihevc_resi_trans_4x4_ttype1;
373
    //apf_resd_trns[0] = &ihevc_HAD_4x4_8bit;
374
375
10.1M
    for(i = 0; i < 5; i++)
376
8.49M
    {
377
8.49M
        costs_4x4[i] = MAX_INTRA_COST_IPE;
378
8.49M
    }
379
380
1.69M
    ps_ipe_optimised_function_list->pf_ed_4x4_find_best_modes(
381
1.69M
        pu1_src,
382
1.69M
        src_stride,
383
1.69M
        ref,
384
1.69M
        mode_bits_cost,
385
1.69M
        au1_best_modes,
386
1.69M
        ai4_best_sad_costs,
387
1.69M
        u1_low_resol,
388
1.69M
        ps_ipe_optimised_function_list->pf_4x4_sad_computer);
389
390
1.69M
    best_amode = au1_best_modes[0];
391
1.69M
    best_asad_cost = ai4_best_sad_costs[0];
392
393
1.69M
    ASSERT(best_amode != 255);
394
    /* Around best level 4 angular mode, search for best level 2 mode */
395
1.69M
    modes_to_eval[0] = best_amode - 2;
396
1.69M
    modes_to_eval[1] = best_amode + 2;
397
1.69M
    i = 0;
398
1.69M
    i_end = 2;
399
1.69M
    if(best_amode == 2)
400
129k
        i = 1;
401
1.56M
    else if(best_amode == 34)
402
74.0k
        i_end = 1;
403
4.89M
    for(; i < i_end; i++)
404
3.19M
    {
405
3.19M
        mode = modes_to_eval[i];
406
407
3.19M
        g_apf_lum_ip[g_i4_ip_funcs[mode]](&ref[0], 0, &pred[0], 4, 4, mode);
408
409
3.19M
        sad = ps_ipe_optimised_function_list->pf_4x4_sad_computer(pu1_src, &pred[0], src_stride, 4);
410
411
3.19M
        sad_cost = sad;
412
3.19M
        sad_cost += mode_bits_cost[mode];
413
414
3.19M
        if(sad_cost < best_asad_cost)
415
239k
        {
416
239k
            best_amode = mode;
417
239k
            best_asad_cost = sad_cost;
418
239k
        }
419
3.19M
    }
420
421
    /* Around best level 2 angular mode, search for best level 1 mode */
422
    /* Also evaluate for non-angular mode */
423
424
1.69M
    i = 0;
425
    /*Level 1 refinement is disabled for ES preset */
426
1.69M
    if(1 == u1_level_1_refine_on)
427
1.69M
    {
428
1.69M
        if(best_amode != 2)
429
1.57M
            modes_to_eval[i++] = best_amode - 1;
430
1.69M
        modes_to_eval[i++] = best_amode;
431
1.69M
    }
432
433
1.69M
    modes_to_eval[i++] = 0;
434
1.69M
    modes_to_eval[i++] = 1;
435
436
1.69M
    if(1 == u1_level_1_refine_on)
437
1.69M
    {
438
1.69M
        if(best_amode != 34)
439
1.63M
            modes_to_eval[i++] = best_amode + 1;
440
1.69M
    }
441
1.69M
    i_end = i;
442
1.69M
    i = 0;
443
444
10.0M
    for(; i < i_end; i++)
445
8.30M
    {
446
8.30M
        mode = modes_to_eval[i];
447
448
8.30M
        g_apf_lum_ip[g_i4_ip_funcs[mode]](&ref[0], 0, &pred[0], 4, 4, mode);
449
450
        /* Hard coding to use SATD */
451
8.30M
        if(u1_use_satd)
452
5.88M
        {
453
5.88M
            ps_func_selector->ihevc_resi_trans_4x4_ttype1_fptr(
454
5.88M
                pu1_src, &pred[0], (WORD32 *)pi2_tmp, pi2_trans_out, src_stride, 4, 4, NULL_PLANE);
455
456
5.88M
            sad = ihevce_ipe_pass_satd(pi2_trans_out, 4, 4);
457
5.88M
        }
458
2.41M
        else
459
2.41M
        {
460
2.41M
            sad = ps_ipe_optimised_function_list->pf_4x4_sad_computer(
461
2.41M
                pu1_src, &pred[0], src_stride, 4);
462
2.41M
        }
463
8.30M
        sad_cost = sad;
464
8.30M
        sad_cost += mode_bits_cost[mode];
465
466
8.30M
        costs_4x4[i] = sad_cost;
467
8.30M
    }
468
469
    /* Arrange the reference array in ascending order */
470
8.30M
    for(i = 0; i < (i_end - 1); i++)
471
6.60M
    {
472
22.8M
        for(j = i + 1; j < i_end; j++)
473
16.2M
        {
474
16.2M
            if(costs_4x4[i] > costs_4x4[j])
475
5.70M
            {
476
5.70M
                temp = costs_4x4[i];
477
5.70M
                costs_4x4[i] = costs_4x4[j];
478
5.70M
                costs_4x4[j] = temp;
479
480
5.70M
                temp = modes_4x4[i];
481
5.70M
                modes_4x4[i] = modes_4x4[j];
482
5.70M
                modes_4x4[j] = temp;
483
5.70M
            }
484
16.2M
        }
485
6.60M
    }
486
6.79M
    for(i = 0; i < 3; i++)
487
5.09M
    {
488
5.09M
        best_costs_4x4[i] = costs_4x4[i];
489
5.09M
        best_modes_4x4[i] = modes_to_eval[modes_4x4[i]];
490
5.09M
    }
491
492
1.69M
    {
493
1.69M
        ps_cu_node->best_mode = best_modes_4x4[0];
494
1.69M
        ps_cu_node->best_cost = best_costs_4x4[0];
495
1.69M
        ps_cu_node->best_satd = best_costs_4x4[0] - mode_bits_cost[ps_cu_node->best_mode];
496
1.69M
    }
497
1.69M
}
498
499
/*!
500
******************************************************************************
501
* \if Function name : ihevce_pu_calc_8x8_blk \endif
502
*
503
* \brief
504
*    4x4 pu (8x8 CU) mode decision loop using step 8421 method
505
*
506
* \param[in] ps_curr_src : pointer to src pixels struct
507
* \param[in] ps_ctxt : pointer to IPE context struct
508
* \param[in] ps_cu_node : pointer to cu node info buffer
509
*
510
* \return
511
*    None
512
*
513
* \author
514
*  Ittiam
515
*
516
*****************************************************************************
517
*/
518
void ihevce_pu_calc_8x8_blk(
519
    iv_enc_yuv_buf_t *ps_curr_src,
520
    ihevce_ipe_ctxt_t *ps_ctxt,
521
    ihevce_ipe_cu_tree_t *ps_cu_node,
522
    func_selector_t *ps_func_selector)
523
424k
{
524
424k
    WORD32 i, j;
525
424k
    WORD32 nbr_flags;
526
424k
    nbr_avail_flags_t s_nbr;
527
424k
    WORD32 trans_size = ps_cu_node->ps_parent->u1_cu_size >> 1;
528
529
424k
    UWORD8 *pu1_src_4x4;
530
424k
    WORD32 xA, xB, yA, yB;
531
    //WORD32 x, y, size;
532
424k
    WORD32 top_intra_mode;
533
424k
    WORD32 left_intra_mode;
534
    //    WORD8 *top_intra_mode_ptr;
535
    //  WORD8 *left_intra_mode_ptr;
536
424k
    UWORD8 *pu1_orig;
537
424k
    WORD32 src_strd = ps_curr_src->i4_y_strd;
538
539
424k
    WORD32 cu_pos_x = ps_cu_node->ps_parent->u2_x0 << 1;
540
424k
    WORD32 cu_pos_y = ps_cu_node->ps_parent->u2_y0 << 1;
541
424k
    ihevc_intra_pred_luma_ref_substitution_ft *ihevc_intra_pred_luma_ref_substitution_fptr;
542
543
424k
    ihevc_intra_pred_luma_ref_substitution_fptr =
544
424k
        ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_ref_substitution_fptr;
545
546
424k
    pu1_orig = (UWORD8 *)(ps_curr_src->pv_y_buf) +
547
424k
               ((ps_cu_node->ps_parent->u2_y0 << 3) * src_strd) +
548
424k
               (ps_cu_node->ps_parent->u2_x0 << 3);
549
1.27M
    for(i = 0; i < 2; i++)
550
849k
    {
551
2.54M
        for(j = 0; j < 2; j++)
552
1.69M
        {
553
1.69M
            WORD32 cand_mode_list[3];
554
1.69M
            pu1_src_4x4 = pu1_orig + (i * trans_size * src_strd) + (j * trans_size);
555
            /* get the neighbour availability flags */
556
1.69M
            nbr_flags = ihevce_get_nbr_intra(
557
1.69M
                &s_nbr,
558
1.69M
                ps_ctxt->pu1_ctb_nbr_map,
559
1.69M
                ps_ctxt->i4_nbr_map_strd,
560
1.69M
                cu_pos_x + ((j) * (trans_size >> 2)),
561
1.69M
                cu_pos_y + ((i) * (trans_size >> 2)),
562
1.69M
                trans_size >> 2);
563
564
            /* call the function which populates sad cost for all the modes */
565
1.69M
            xA = ((ps_cu_node->ps_parent->u2_x0 << 3) >> 2) + j;
566
1.69M
            yA = ((ps_cu_node->ps_parent->u2_y0 << 3) >> 2) + 1 + i;
567
1.69M
            xB = xA + 1;
568
1.69M
            yB = yA - 1;
569
1.69M
            left_intra_mode = ps_ctxt->au1_ctb_mode_map[yA][xA];
570
1.69M
            top_intra_mode = ps_ctxt->au1_ctb_mode_map[yB][xB];
571
572
1.69M
            ihevce_intra_populate_mode_bits_cost_bracketing(
573
1.69M
                top_intra_mode,
574
1.69M
                left_intra_mode,
575
1.69M
                s_nbr.u1_top_avail,
576
1.69M
                s_nbr.u1_left_avail,
577
1.69M
                ps_cu_node->ps_parent->u2_y0,
578
1.69M
                &ps_ctxt->au2_mode_bits_cost_8x8pu[i * 2 + j][0],
579
1.69M
                &ps_ctxt->au2_mode_bits_8x8_pu[0],
580
1.69M
                ps_ctxt->i4_ol_sad_lambda,
581
1.69M
                cand_mode_list);
582
583
            /* call the function which populates ref data for intra predicion */
584
1.69M
            ihevc_intra_pred_luma_ref_substitution_fptr(
585
1.69M
                pu1_src_4x4 - src_strd - 1,
586
1.69M
                pu1_src_4x4 - src_strd,
587
1.69M
                pu1_src_4x4 - 1,
588
1.69M
                src_strd,
589
1.69M
                4,
590
1.69M
                nbr_flags,
591
1.69M
                &ps_ctxt->au1_ref_8x8pu[i * 2 + j][0],
592
1.69M
                0);
593
594
1.69M
            ihevce_pu_calc_4x4_blk(
595
1.69M
                ps_ctxt,
596
1.69M
                ps_cu_node->ps_sub_cu[(i * 2) + j],
597
1.69M
                pu1_src_4x4,
598
1.69M
                src_strd,
599
1.69M
                &ps_ctxt->au1_ref_8x8pu[i * 2 + j][0],
600
1.69M
                &ps_ctxt->au2_mode_bits_cost_8x8pu[i * 2 + j][0],
601
1.69M
                &ps_cu_node->ps_sub_cu[(i * 2) + j]->au4_best_cost_1tu[0],
602
1.69M
                &ps_cu_node->ps_sub_cu[(i * 2) + j]->au1_best_mode_1tu[0],
603
1.69M
                ps_func_selector);
604
605
            /*&au4_cost_4x4[i*2 + j][0],
606
                &au1_modes_4x4[i*2 + j][0]);*/ //TTODO : mode will change for the four partition
607
608
1.69M
            ihevce_set_nbr_map(
609
1.69M
                ps_ctxt->pu1_ctb_nbr_map,
610
1.69M
                ps_ctxt->i4_nbr_map_strd,
611
1.69M
                cu_pos_x + ((j) * (trans_size >> 2)),
612
1.69M
                cu_pos_y + ((i) * (trans_size >> 2)),
613
1.69M
                (trans_size >> 2),
614
1.69M
                1);
615
616
1.69M
            xA = ((ps_cu_node->ps_parent->u2_x0 << 3) >> 2) + 1 + j;
617
1.69M
            yA = ((ps_cu_node->ps_parent->u2_y0 << 3) >> 2) + 1 + i;
618
1.69M
            ps_ctxt->au1_ctb_mode_map[yA][xA] = ps_cu_node->ps_sub_cu[i * 2 + j]->best_mode;
619
1.69M
            ps_cu_node->ps_sub_cu[i * 2 + j]->u2_mode_bits_cost =
620
1.69M
                ps_ctxt->au2_mode_bits_8x8_pu[ps_cu_node->ps_sub_cu[i * 2 + j]->best_mode];
621
1.69M
        }
622
849k
    }
623
424k
}
624
625
/*!
626
******************************************************************************
627
* \if Function name : ihevce_bracketing_analysis \endif
628
*
629
* \brief
630
*    Interface function that evaluates MAX cu and MAX - 1 cu, with MAX cu size
631
*    info decided coarse resolution mode decision. Compares the SATD/SAD cost btwn
632
*    2 CUS and determines the actual CU size and best 3 modes to be given to rdopt
633
*
634
* \param[in] ps_ctxt : pointer to IPE context struct
635
* \param[in] ps_cu_node : pointer to cu node info buffer
636
* \param[in] ps_curr_src : pointer to src pixels struct
637
* \param[in] ps_ctb_out : pointer to ip ctb out struct
638
* \param[in] ps_row_cu : pointer to cu analyse struct
639
* \param[in] ps_ed_l1_ctb : pointer to level 1 early deci struct
640
* \param[in] ps_ed_l2_ctb : pointer to level 2 early deci struct
641
* \param[in] ps_l0_ipe_out_ctb : pointer to ipe_l0_ctb_analyse_for_me_t struct
642
*
643
* \return
644
*    None
645
*
646
* \author
647
*  Ittiam
648
*
649
*****************************************************************************
650
*/
651
void ihevce_bracketing_analysis(
652
    ihevce_ipe_ctxt_t *ps_ctxt,
653
    ihevce_ipe_cu_tree_t *ps_cu_node,
654
    iv_enc_yuv_buf_t *ps_curr_src,
655
    ctb_analyse_t *ps_ctb_out,
656
    //cu_analyse_t         *ps_row_cu,
657
    ihevce_ed_blk_t *ps_ed_l1_ctb,
658
    ihevce_ed_blk_t *ps_ed_l2_ctb,
659
    ihevce_ed_ctb_l1_t *ps_ed_ctb_l1,
660
    ipe_l0_ctb_analyse_for_me_t *ps_l0_ipe_out_ctb)
661
49.9k
{
662
49.9k
    WORD32 cu_pos_x = 0;
663
49.9k
    WORD32 cu_pos_y = 0;
664
665
49.9k
    UWORD8 u1_curr_ctb_wdt = ps_cu_node->u1_width;
666
49.9k
    UWORD8 u1_curr_ctb_hgt = ps_cu_node->u1_height;
667
49.9k
    WORD32 num_8x8_blks_x = (u1_curr_ctb_wdt >> 3);
668
49.9k
    WORD32 num_8x8_blks_y = (u1_curr_ctb_hgt >> 3);
669
670
49.9k
    ihevce_ed_blk_t *ps_ed_blk_l1 = ps_ed_l1_ctb;
671
49.9k
    ihevce_ed_blk_t *ps_ed_blk_l2 = ps_ed_l2_ctb;
672
673
49.9k
    WORD32 i;
674
49.9k
    WORD32 cand_mode_list[3];
675
    //cu_analyse_t *ps_curr_cu = ps_row_cu;
676
49.9k
    WORD32 blk_cnt = 0;
677
49.9k
    WORD32 j = 0;
678
49.9k
    WORD32 merge_32x32_l1, merge_32x32_l2;
679
680
49.9k
    WORD32 i4_skip_intra_eval_32x32_l1;
681
    //EIID: flag indicating number of 16x16 blocks to be skipped for intra evaluation within 32x32 block
682
683
49.9k
    WORD32 parent_cost = 0;
684
49.9k
    WORD32 child_cost[4] = { 0 };
685
49.9k
    WORD32 child_cost_least = 0;
686
49.9k
    WORD32 child_satd[4] = { 0 };
687
49.9k
    WORD32 x, y, size;
688
49.9k
    WORD32 merge_64x64 = 1;
689
49.9k
    UWORD8 au1_best_32x32_modes[4];
690
49.9k
    WORD32 au4_best_32x32_cost[4];
691
49.9k
    WORD32 parent_best_mode;
692
49.9k
    UWORD8 best_mode;
693
694
49.9k
    WORD32 i4_quality_preset = ps_ctxt->i4_quality_preset;
695
    /* flag to control 1CU-4TU modes based on quality preset                */
696
    /* if set 1CU-4TU are explicity evaluated else 1CU-1TU modes are copied */
697
49.9k
    WORD32 i4_enable_1cu_4tu = (i4_quality_preset == IHEVCE_QUALITY_P2) ||
698
45.5k
                               (i4_quality_preset == IHEVCE_QUALITY_P0);
699
700
    /* flag to control 4CU-16TU mode based on quality preset                */
701
    /* if set 4CU-16TU are explicity evaluated else 4CU-4TU modes are copied*/
702
49.9k
    WORD32 i4_enable_4cu_16tu = (i4_quality_preset == IHEVCE_QUALITY_P2) ||
703
45.5k
                                (i4_quality_preset == IHEVCE_QUALITY_P0);
704
705
49.9k
    WORD32 i4_mod_factor_num, i4_mod_factor_den = QP_MOD_FACTOR_DEN;  //2;
706
49.9k
    float f_strength;
707
    /* Accumalte satd */
708
49.9k
    LWORD64 i8_frame_acc_satd_cost = 0, i8_frame_acc_satd_by_modqp_q10 = 0;
709
49.9k
    WORD32 i4_ctb_acc_satd = 0;
710
711
    /* Accumalate Mode bits cost */
712
49.9k
    LWORD64 i8_frame_acc_mode_bits_cost = 0;
713
714
    /* Step2 is bypassed for parent, uses children modes*/
715
49.9k
    WORD32 step2_bypass = 1;
716
717
49.9k
    if(1 == ps_ctxt->u1_disable_child_cu_decide)
718
0
        step2_bypass = 0;
719
720
49.9k
    ps_cu_node->ps_parent = ps_ctxt->ps_ipe_cu_tree;
721
249k
    for(i = 0; i < 4; i++)
722
199k
    {
723
199k
        ps_cu_node->ps_sub_cu[i] = ps_ctxt->ps_ipe_cu_tree + 1 + i;
724
199k
    }
725
726
    /* Loop for all 8x8 block in a CTB */
727
49.9k
    ps_ctb_out->u4_cu_split_flags = 0x1;
728
729
    /* Initialize intra 64x64, 32x32 and 16x16 costs to max value */
730
249k
    for(i = 0; i < (MAX_CU_IN_CTB >> 4); i++)
731
199k
    {
732
199k
        ps_l0_ipe_out_ctb->ai4_best32x32_intra_cost[i] = MAX_INTRA_COST_IPE;
733
199k
    }
734
735
849k
    for(i = 0; i < (MAX_CU_IN_CTB >> 2); i++)
736
799k
    {
737
799k
        ps_l0_ipe_out_ctb->ai4_best16x16_intra_cost[i] = MAX_INTRA_COST_IPE;
738
799k
    }
739
740
3.24M
    for(i = 0; i < (MAX_CU_IN_CTB); i++)
741
3.19M
    {
742
3.19M
        ps_l0_ipe_out_ctb->ai4_best8x8_intra_cost[i] = MAX_INTRA_COST_IPE;
743
3.19M
    }
744
745
49.9k
    ps_l0_ipe_out_ctb->i4_best64x64_intra_cost = MAX_INTRA_COST_IPE;
746
747
    /* by default 64x64 modes are set to default values DC and Planar */
748
49.9k
    ps_l0_ipe_out_ctb->au1_best_modes_32x32_tu[0] = 0;
749
49.9k
    ps_l0_ipe_out_ctb->au1_best_modes_32x32_tu[1] = 1;
750
49.9k
    ps_l0_ipe_out_ctb->au1_best_modes_32x32_tu[2] = 255;
751
752
    /* by default 64x4 split is set to 1 */
753
49.9k
    ps_l0_ipe_out_ctb->u1_split_flag = 1;
754
755
    /* Modulation factor calculated based on spatial variance instead of hardcoded val*/
756
49.9k
    i4_mod_factor_num = ps_ctxt->ai4_mod_factor_derived_by_variance[1];  //16;
757
758
49.9k
    f_strength = ps_ctxt->f_strength;
759
760
    /* ------------------------------------------------ */
761
    /* populate the early decisions done by L1 analysis */
762
    /* ------------------------------------------------ */
763
849k
    for(i = 0; i < (MAX_CU_IN_CTB >> 2); i++)
764
799k
    {
765
799k
        ps_l0_ipe_out_ctb->ai4_best_sad_8x8_l1_ipe[i] = ps_ed_ctb_l1->i4_best_sad_8x8_l1_ipe[i];
766
799k
        ps_l0_ipe_out_ctb->ai4_best_sad_cost_8x8_l1_ipe[i] = ps_ed_ctb_l1->i4_best_sad_cost_8x8_l1_ipe[i];
767
799k
        ps_l0_ipe_out_ctb->ai4_best_sad_8x8_l1_me[i] = ps_ed_ctb_l1->i4_best_sad_8x8_l1_me[i];
768
799k
        ps_l0_ipe_out_ctb->ai4_best_sad_cost_8x8_l1_me[i] = ps_ed_ctb_l1->i4_best_sad_cost_8x8_l1_me[i];
769
799k
    }
770
771
    /* Init CTB level accumalated SATD and MPM bits */
772
49.9k
    ps_l0_ipe_out_ctb->i4_ctb_acc_satd = 0;
773
49.9k
    ps_l0_ipe_out_ctb->i4_ctb_acc_mpm_bits = 0;
774
775
    /* ------------------------------------------------ */
776
    /* Loop over all the blocks in current CTB          */
777
    /* ------------------------------------------------ */
778
49.9k
    {
779
        /* 64 8x8 blocks should be encountered for the do,while loop to exit */
780
49.9k
        do
781
795k
        {
782
795k
            intra32_analyse_t *ps_intra32_analyse;
783
795k
            intra16_analyse_t *ps_intra16_analyse;
784
795k
            WORD32 *pi4_intra_32_cost;
785
795k
            WORD32 *pi4_intra_16_cost;
786
795k
            WORD32 *pi4_intra_8_cost;
787
795k
            WORD32 merge_16x16_l1;
788
789
            /* Given the blk_cnt, get the CU's top-left 8x8 block's x and y positions within the CTB */
790
795k
            cu_pos_x = gau1_cu_pos_x[blk_cnt];
791
795k
            cu_pos_y = gau1_cu_pos_y[blk_cnt];
792
793
            /* default value for 32x32 best mode - blk_cnt increases by 16 for each 32x32 */
794
795k
            au1_best_32x32_modes[blk_cnt >> 4] = 255;
795
796
            /* get the corresponding intra 32 analyse pointer  use (blk_cnt / 16) */
797
            /* blk cnt is in terms of 8x8 units so a 32x32 will have 16 8x8 units */
798
795k
            ps_intra32_analyse = &ps_l0_ipe_out_ctb->as_intra32_analyse[blk_cnt >> 4];
799
800
            /* get the corresponding intra 16 analyse pointer use (blk_cnt & 0xF / 4)*/
801
            /* blk cnt is in terms of 8x8 units so a 16x16 will have 4 8x8 units */
802
795k
            ps_intra16_analyse = &ps_intra32_analyse->as_intra16_analyse[(blk_cnt & 0xF) >> 2];
803
804
            /* Line below assumes min_cu_size of 8 - checks whether CU starts are within picture */
805
795k
            if((cu_pos_x < num_8x8_blks_x) && (cu_pos_y < num_8x8_blks_y))
806
431k
            {
807
                /* Reset to zero for every cu decision */
808
431k
                merge_32x32_l1 = 0;
809
810
431k
                child_cost_least = 0;
811
812
                /* At L2, each 4x4 corresponds to 16x16 at L0. Every 4 16x16 stores a merge_success flag */
813
431k
                ps_ed_blk_l2 = ps_ed_l2_ctb + (blk_cnt >> 2);
814
815
431k
                pi4_intra_32_cost = &ps_l0_ipe_out_ctb->ai4_best32x32_intra_cost[blk_cnt >> 4];
816
817
                /* by default 32x32 modes are set to default values DC and Planar */
818
431k
                ps_intra32_analyse->au1_best_modes_32x32_tu[0] = 0;
819
431k
                ps_intra32_analyse->au1_best_modes_32x32_tu[1] = 1;
820
431k
                ps_intra32_analyse->au1_best_modes_32x32_tu[2] = 255;
821
822
                /* By default 32x32 split is set to 1 */
823
431k
                ps_intra32_analyse->b1_split_flag = 1;
824
825
431k
                ps_intra32_analyse->au1_best_modes_16x16_tu[0] = 0;
826
431k
                ps_intra32_analyse->au1_best_modes_16x16_tu[1] = 1;
827
431k
                ps_intra32_analyse->au1_best_modes_16x16_tu[2] = 255;
828
829
                /* 16x16 cost & 8x8 cost are stored in Raster scan order */
830
                /* stride of 16x16 buffer is MAX_CU_IN_CTB_ROW >> 1      */
831
                /* stride of 8x8 buffer is MAX_CU_IN_CTB_ROW             */
832
431k
                {
833
431k
                    WORD32 pos_x_8x8, pos_y_8x8;
834
835
431k
                    pos_x_8x8 = gau1_cu_pos_x[blk_cnt];
836
431k
                    pos_y_8x8 = gau1_cu_pos_y[blk_cnt];
837
838
431k
                    pi4_intra_16_cost = &ps_l0_ipe_out_ctb->ai4_best16x16_intra_cost[0];
839
840
431k
                    pi4_intra_16_cost +=
841
431k
                        ((pos_x_8x8 >> 1) + ((pos_y_8x8 >> 1) * (MAX_CU_IN_CTB_ROW >> 1)));
842
843
431k
                    pi4_intra_8_cost = &ps_l0_ipe_out_ctb->ai4_best8x8_intra_cost[0];
844
845
431k
                    pi4_intra_8_cost += (pos_x_8x8 + (pos_y_8x8 * MAX_CU_IN_CTB_ROW));
846
431k
                }
847
848
431k
                merge_32x32_l1 = 0;
849
431k
                merge_32x32_l2 = 0;
850
431k
                i4_skip_intra_eval_32x32_l1 = 0;
851
852
                /* Enable 16x16 merge iff sufficient 8x8 blocks remain in the current CTB */
853
431k
                merge_16x16_l1 = 0;
854
431k
                if(((num_8x8_blks_x - cu_pos_x) >= 2) && ((num_8x8_blks_y - cu_pos_y) >= 2))
855
398k
                {
856
398k
#if !ENABLE_UNIFORM_CU_SIZE_8x8
857
398k
                    merge_16x16_l1 = ps_ed_blk_l1->merge_success;
858
#else
859
                    merge_16x16_l1 = 0;
860
#endif
861
398k
                }
862
863
                /* Enable 32x32 merge iff sufficient 8x8 blocks remain in the current CTB */
864
431k
                if(((num_8x8_blks_x - cu_pos_x) >= 4) && ((num_8x8_blks_y - cu_pos_y) >= 4))
865
289k
                {
866
                    /* Check 4 flags of L1(8x8) say merge */
867
1.44M
                    for(i = 0; i < 4; i++)
868
1.15M
                    {
869
1.15M
                        merge_32x32_l1 += (ps_ed_blk_l1 + (i * 4))->merge_success;
870
871
                        //EIDD: num 16x16 blocks for which inter_intra flag says eval only inter, i.e. skip intra eval
872
1.15M
                        i4_skip_intra_eval_32x32_l1 +=
873
1.15M
                            ((ps_ed_blk_l1 + (i * 4))->intra_or_inter == 2) ? 1 : 0;
874
1.15M
                    }
875
876
289k
#if !ENABLE_UNIFORM_CU_SIZE_8x8
877
                    /* Check 1 flag from L2(16x16) say merge */
878
289k
                    merge_32x32_l2 = ps_ed_blk_l2->merge_success;
879
#else
880
                    merge_32x32_l1 = 0;
881
                    merge_32x32_l2 = 0;
882
#endif
883
289k
                }
884
885
431k
#if DISABLE_L2_IPE_IN_PB_L1_IN_B
886
431k
                if((i4_quality_preset == IHEVCE_QUALITY_P6) && (ps_ctxt->i4_slice_type != ISLICE))
887
26.6k
                {
888
26.6k
                    merge_32x32_l2 = 0;
889
26.6k
                    ps_ed_blk_l2->merge_success = 0;
890
26.6k
                }
891
431k
#endif
892
893
431k
                ps_intra32_analyse->b1_valid_cu = 1;
894
895
                /* If Merge success from all 4 L1 and L2, max CU size 32x32 is chosen */
896
                /* EIID: if all blocks to be skipped then skip entire 32x32 for intra eval,
897
                if no blocks to be skipped then eval entire 32x32,
898
                else break the merge and go to 16x16 level eval */
899
431k
                if((merge_32x32_l1 == 4) && merge_32x32_l2 &&
900
95.6k
                   ((i4_skip_intra_eval_32x32_l1 == 0) ||
901
12.1k
                    (i4_skip_intra_eval_32x32_l1 == 4))  //comment this line to disable break-merge
902
431k
                )
903
92.3k
                {
904
#if IP_DBG_L1_l2
905
                    /* Populate params for 32x32 block analysis */
906
                    ps_cu_node->ps_parent->best_cost = MAX_INTRA_COST_IPE;
907
908
                    ps_cu_node->ps_parent->u1_cu_size = 32;
909
                    ps_cu_node->ps_parent->u2_x0 = gau1_cu_pos_x[blk_cnt]; /* Populate properly */
910
                    ps_cu_node->ps_parent->u2_y0 = gau1_cu_pos_y[blk_cnt]; /* Populate properly */
911
                    ps_cu_node->ps_parent->best_mode = ps_ed_blk_l2->best_merge_mode;
912
                    /* CU size 32x32 and fill the final cu params */
913
914
                    ihevce_update_cand_list(ps_cu_node->ps_parent, ps_ed_blk_l1, ps_ctxt);
915
916
                    /* Increment pointers */
917
                    ps_ed_blk_l1 += 16;
918
                    blk_cnt += 16;
919
                    ps_row_cu++;
920
                    merge_64x64 &= 1;
921
#else
922
923
                    /* EIID: dont evaluate if all 4 blocks at L1 said inter is winning*/
924
92.3k
                    if(4 == i4_skip_intra_eval_32x32_l1 && (ps_ctxt->i4_slice_type != ISLICE))
925
8.79k
                    {
926
8.79k
                        WORD32 i4_local_ctr1, i4_local_ctr2;
927
928
8.79k
                        ps_cu_node->ps_parent->best_cost = MAX_INTRA_COST_IPE;
929
930
8.79k
                        ps_cu_node->ps_parent->u1_cu_size = 32;
931
8.79k
                        ps_cu_node->ps_parent->u2_x0 =
932
8.79k
                            gau1_cu_pos_x[blk_cnt]; /* Populate properly */
933
8.79k
                        ps_cu_node->ps_parent->u2_y0 =
934
8.79k
                            gau1_cu_pos_y[blk_cnt]; /* Populate properly */
935
8.79k
                        ps_cu_node->ps_parent->best_mode =
936
8.79k
                            INTRA_DC;  //ps_ed_blk_l2->best_merge_mode;
937
                        /* CU size 32x32 and fill the final cu params */
938
939
                        /* fill in the first modes as invalid */
940
8.79k
                        ps_cu_node->ps_parent->au1_best_mode_1tu[0] = INTRA_DC;
941
8.79k
                        ps_cu_node->ps_parent->au1_best_mode_1tu[1] =
942
8.79k
                            INTRA_DC;  //for safery. Since update_cand_list will set num_modes as 3
943
8.79k
                        ps_cu_node->ps_parent->au1_best_mode_1tu[2] = INTRA_DC;
944
945
8.79k
                        ps_cu_node->ps_parent->au1_best_mode_4tu[0] = INTRA_DC;
946
8.79k
                        ps_cu_node->ps_parent->au1_best_mode_4tu[1] = INTRA_DC;
947
8.79k
                        ps_cu_node->ps_parent->au1_best_mode_4tu[2] = INTRA_DC;
948
949
8.79k
                        ihevce_update_cand_list(ps_cu_node->ps_parent, ps_ed_blk_l1, ps_ctxt);
950
951
                        //ps_row_cu->s_cu_intra_cand.b6_num_intra_cands = 0;
952
                        //ps_row_cu->u1_num_intra_rdopt_cands = 0;
953
954
8.79k
                        ps_intra32_analyse->b1_valid_cu = 0;
955
8.79k
                        ps_intra32_analyse->b1_split_flag = 0;
956
8.79k
                        ps_intra32_analyse->b1_merge_flag = 0;
957
                        /*memset (&ps_intra32_analyse->au1_best_modes_32x32_tu,
958
                        255,
959
                        NUM_BEST_MODES);
960
                        memset (&ps_intra32_analyse->au1_best_modes_16x16_tu,
961
                        255,
962
                        NUM_BEST_MODES);*/
963
                        //set only first mode since if it's 255. it wont go ahead
964
8.79k
                        ps_intra32_analyse->au1_best_modes_32x32_tu[0] = 255;
965
8.79k
                        ps_intra32_analyse->au1_best_modes_16x16_tu[0] = 255;
966
967
8.79k
                        *pi4_intra_32_cost = MAX_INTRA_COST_IPE;
968
969
                        /*since ME will start evaluating from bottom up, set the lower
970
                        cu size data invalid */
971
43.9k
                        for(i4_local_ctr1 = 0; i4_local_ctr1 < 4; i4_local_ctr1++)
972
35.1k
                        {
973
35.1k
                            WORD32 *pi4_intra_8_cost_curr16;
974
975
35.1k
                            ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1]
976
35.1k
                                .au1_best_modes_16x16_tu[0] = 255;
977
35.1k
                            ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1]
978
35.1k
                                .au1_best_modes_8x8_tu[0] = 255;
979
35.1k
                            ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1].b1_merge_flag = 0;
980
35.1k
                            ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1].b1_valid_cu = 0;
981
35.1k
                            ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1].b1_split_flag = 0;
982
983
35.1k
                            pi4_intra_16_cost
984
35.1k
                                [(i4_local_ctr1 & 1) + ((MAX_CU_IN_CTB_ROW >> 1) *
985
35.1k
                                                        (i4_local_ctr1 >> 1))] = MAX_INTRA_COST_IPE;
986
987
35.1k
                            pi4_intra_8_cost_curr16 = pi4_intra_8_cost + ((i4_local_ctr1 & 1) << 1);
988
35.1k
                            pi4_intra_8_cost_curr16 +=
989
35.1k
                                ((i4_local_ctr1 >> 1) << 1) * MAX_CU_IN_CTB_ROW;
990
991
175k
                            for(i4_local_ctr2 = 0; i4_local_ctr2 < 4; i4_local_ctr2++)
992
140k
                            {
993
140k
                                ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1]
994
140k
                                    .as_intra8_analyse[i4_local_ctr2]
995
140k
                                    .au1_4x4_best_modes[0][0] = 255;
996
140k
                                ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1]
997
140k
                                    .as_intra8_analyse[i4_local_ctr2]
998
140k
                                    .au1_4x4_best_modes[1][0] = 255;
999
140k
                                ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1]
1000
140k
                                    .as_intra8_analyse[i4_local_ctr2]
1001
140k
                                    .au1_4x4_best_modes[2][0] = 255;
1002
140k
                                ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1]
1003
140k
                                    .as_intra8_analyse[i4_local_ctr2]
1004
140k
                                    .au1_4x4_best_modes[3][0] = 255;
1005
140k
                                ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1]
1006
140k
                                    .as_intra8_analyse[i4_local_ctr2]
1007
140k
                                    .au1_best_modes_8x8_tu[0] = 255;
1008
140k
                                ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1]
1009
140k
                                    .as_intra8_analyse[i4_local_ctr2]
1010
140k
                                    .au1_best_modes_4x4_tu[0] = 255;
1011
140k
                                ps_intra32_analyse->as_intra16_analyse[i4_local_ctr1]
1012
140k
                                    .as_intra8_analyse[i4_local_ctr2]
1013
140k
                                    .b1_valid_cu = 0;
1014
1015
140k
                                pi4_intra_8_cost_curr16
1016
140k
                                    [(i4_local_ctr2 & 1) +
1017
140k
                                     (MAX_CU_IN_CTB_ROW * (i4_local_ctr2 >> 1))] =
1018
140k
                                        MAX_INTRA_COST_IPE;
1019
140k
                            }
1020
35.1k
                        }
1021
1022
                        /* set neighbours even if intra is not evaluated, since source is always available. */
1023
8.79k
                        ihevce_set_nbr_map(
1024
8.79k
                            ps_ctxt->pu1_ctb_nbr_map,
1025
8.79k
                            ps_ctxt->i4_nbr_map_strd,
1026
8.79k
                            ps_cu_node->ps_parent->u2_x0 << 1,
1027
8.79k
                            ps_cu_node->ps_parent->u2_y0 << 1,
1028
8.79k
                            (ps_cu_node->ps_parent->u1_cu_size >> 2),
1029
8.79k
                            1);
1030
1031
                        /* cost accumalation of best cu size candiate */
1032
                        /*i8_frame_acc_satd_cost += parent_cost;*/
1033
1034
                        /* Mode bits cost accumalation for best cu size and cu mode */
1035
                        /*i8_frame_acc_mode_bits_cost += ps_cu_node->ps_parent->u2_mode_bits_cost;*/
1036
1037
                        /*satd/mod_qp accumulation of best cu */
1038
                        /*i8_frame_acc_satd_by_modqp_q10 += ((LWORD64)ps_cu_node->ps_parent->best_satd << (SATD_BY_ACT_Q_FAC + QSCALE_Q_FAC_3))/i4_q_scale_q3_mod;*/
1039
1040
                        /* Increment pointers */
1041
8.79k
                        ps_ed_blk_l1 += 16;
1042
8.79k
                        blk_cnt += 16;
1043
                        //ps_row_cu++;
1044
8.79k
                        merge_64x64 = 0;
1045
1046
                        /* increment for stat purpose only. Increment is valid only on single thread */
1047
8.79k
                        ps_ctxt->u4_num_16x16_skips_at_L0_IPE += 4;
1048
8.79k
                    }
1049
83.5k
                    else
1050
83.5k
                    {
1051
                        /* Revaluation of 4 16x16 blocks at 8x8 prediction level */
1052
                        //memcpy(ps_ctxt->ai1_ctb_mode_map_temp, ps_ctxt->ai1_ctb_mode_map, sizeof(ps_ctxt->ai1_ctb_mode_map));
1053
1054
83.5k
                        if((ps_ctxt->i4_quality_preset == IHEVCE_QUALITY_P6) &&
1055
7.02k
                           (ps_ctxt->i4_slice_type == PSLICE))
1056
0
                        {
1057
0
                            ps_ctxt->u1_disable_child_cu_decide = 1;
1058
0
                            step2_bypass = 0;
1059
0
                        }
1060
1061
                        /* Based on the flag, Child modes decision can be disabled*/
1062
83.5k
                        if(0 == ps_ctxt->u1_disable_child_cu_decide)
1063
83.5k
                        {
1064
417k
                            for(j = 0; j < 4; j++)
1065
334k
                            {
1066
334k
                                ps_cu_node->ps_sub_cu[j]->u2_x0 =
1067
334k
                                    gau1_cu_pos_x[blk_cnt + (j * 4)]; /* Populate properly */
1068
334k
                                ps_cu_node->ps_sub_cu[j]->u2_y0 =
1069
334k
                                    gau1_cu_pos_y[blk_cnt + (j * 4)]; /* Populate properly */
1070
334k
                                ps_cu_node->ps_sub_cu[j]->u1_cu_size = 16;
1071
1072
334k
                                {
1073
334k
                                    WORD32 best_ang_mode =
1074
334k
                                        (ps_ed_blk_l1 + (j * 4))->best_merge_mode;
1075
1076
334k
                                    if(best_ang_mode < 2)
1077
307k
                                        best_ang_mode = 26;
1078
1079
334k
                                    ihevce_mode_eval_filtering(
1080
334k
                                        ps_cu_node->ps_sub_cu[j],
1081
334k
                                        ps_cu_node,
1082
334k
                                        ps_ctxt,
1083
334k
                                        ps_curr_src,
1084
334k
                                        best_ang_mode,
1085
334k
                                        &ps_cu_node->ps_sub_cu[j]->au4_best_cost_1tu[0],
1086
334k
                                        &ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[0],
1087
334k
                                        !step2_bypass,
1088
334k
                                        1);
1089
1090
334k
                                    if(i4_enable_4cu_16tu)
1091
160k
                                    {
1092
160k
                                        ihevce_mode_eval_filtering(
1093
160k
                                            ps_cu_node->ps_sub_cu[j],
1094
160k
                                            ps_cu_node,
1095
160k
                                            ps_ctxt,
1096
160k
                                            ps_curr_src,
1097
160k
                                            best_ang_mode,
1098
160k
                                            &ps_cu_node->ps_sub_cu[j]->au4_best_cost_4tu[0],
1099
160k
                                            &ps_cu_node->ps_sub_cu[j]->au1_best_mode_4tu[0],
1100
160k
                                            !step2_bypass,
1101
160k
                                            0);
1102
160k
                                    }
1103
173k
                                    else
1104
173k
                                    {
1105
                                        /* 4TU not evaluated :  4tu modes set same as 1tu modes */
1106
173k
                                        memcpy(
1107
173k
                                            &ps_cu_node->ps_sub_cu[j]->au1_best_mode_4tu[0],
1108
173k
                                            &ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[0],
1109
173k
                                            NUM_BEST_MODES);
1110
1111
                                        /* 4TU not evaluated : currently 4tu cost set same as 1tu cost */
1112
173k
                                        memcpy(
1113
173k
                                            &ps_cu_node->ps_sub_cu[j]->au4_best_cost_4tu[0],
1114
173k
                                            &ps_cu_node->ps_sub_cu[j]->au4_best_cost_1tu[0],
1115
173k
                                            NUM_BEST_MODES * sizeof(WORD32));
1116
173k
                                    }
1117
1118
334k
                                    child_cost[j] =
1119
334k
                                        MIN(ps_cu_node->ps_sub_cu[j]->au4_best_cost_4tu[0],
1120
334k
                                            ps_cu_node->ps_sub_cu[j]->au4_best_cost_1tu[0]);
1121
1122
                                    /* Child cost is sum of costs at 16x16 level  */
1123
334k
                                    child_cost_least += child_cost[j];
1124
1125
                                    /* Select the best mode to be populated as top and left nbr depending on the
1126
                                    4tu and 1tu cost */
1127
334k
                                    if(ps_cu_node->ps_sub_cu[j]->au4_best_cost_4tu[0] >
1128
334k
                                       ps_cu_node->ps_sub_cu[j]->au4_best_cost_1tu[0])
1129
6.15k
                                    {
1130
6.15k
                                        ps_cu_node->ps_sub_cu[j]->best_mode =
1131
6.15k
                                            ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[0];
1132
6.15k
                                    }
1133
328k
                                    else
1134
328k
                                    {
1135
328k
                                        ps_cu_node->ps_sub_cu[j]->best_mode =
1136
328k
                                            ps_cu_node->ps_sub_cu[j]->au1_best_mode_4tu[0];
1137
328k
                                    }
1138
1139
334k
                                    { /* Update the CTB nodes only for MAX - 1 CU nodes */
1140
334k
                                        WORD32 xA, yA, row, col;
1141
334k
                                        xA = ((ps_cu_node->ps_sub_cu[j]->u2_x0 << 3) >> 2) + 1;
1142
334k
                                        yA = ((ps_cu_node->ps_sub_cu[j]->u2_y0 << 3) >> 2) + 1;
1143
334k
                                        size = ps_cu_node->ps_sub_cu[j]->u1_cu_size >> 2;
1144
1.67M
                                        for(row = yA; row < (yA + size); row++)
1145
1.33M
                                        {
1146
6.68M
                                            for(col = xA; col < (xA + size); col++)
1147
5.34M
                                            {
1148
5.34M
                                                ps_ctxt->au1_ctb_mode_map[row][col] =
1149
5.34M
                                                    ps_cu_node->ps_sub_cu[j]->best_mode;
1150
5.34M
                                            }
1151
1.33M
                                        }
1152
334k
                                    }
1153
334k
                                }
1154
1155
                                /*Child SATD cost*/
1156
334k
                                child_satd[j] = ps_cu_node->ps_sub_cu[j]->best_satd;
1157
1158
                                /* store the child 16x16 costs */
1159
334k
                                pi4_intra_16_cost[(j & 1) + ((MAX_CU_IN_CTB_ROW >> 1) * (j >> 1))] =
1160
334k
                                    child_cost[j];
1161
1162
                                /* set the CU valid flag */
1163
334k
                                ps_intra16_analyse[j].b1_valid_cu = 1;
1164
1165
                                /* All 16x16 merge is valid, if Cu 32x32 is chosen */
1166
                                /* To be reset, if CU 64x64 is chosen */
1167
334k
                                ps_intra16_analyse[j].b1_merge_flag = 1;
1168
1169
                                /* storing the modes to intra 16 analyse */
1170
                                /* store the best 16x16 modes 8x8 tu */
1171
334k
                                memcpy(
1172
334k
                                    &ps_intra16_analyse[j].au1_best_modes_8x8_tu[0],
1173
334k
                                    &ps_cu_node->ps_sub_cu[j]->au1_best_mode_4tu[0],
1174
334k
                                    sizeof(UWORD8) * (NUM_BEST_MODES));
1175
334k
                                ps_intra16_analyse[j].au1_best_modes_8x8_tu[NUM_BEST_MODES] = 255;
1176
1177
                                /* store the best 16x16 modes 16x16 tu */
1178
334k
                                memcpy(
1179
334k
                                    &ps_intra16_analyse[j].au1_best_modes_16x16_tu[0],
1180
334k
                                    &ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[0],
1181
334k
                                    sizeof(UWORD8) * (NUM_BEST_MODES));
1182
334k
                                ps_intra16_analyse[j].au1_best_modes_16x16_tu[NUM_BEST_MODES] = 255;
1183
1184
                                /* divide the 16x16 costs (pro rating) to 4 8x8 costs */
1185
                                /* store the same 16x16 modes as 4 8x8 child modes    */
1186
334k
                                {
1187
334k
                                    WORD32 idx_8x8;
1188
334k
                                    WORD32 *pi4_intra_8_cost_curr16;
1189
334k
                                    intra8_analyse_t *ps_intra8_analyse;
1190
1191
334k
                                    pi4_intra_8_cost_curr16 = pi4_intra_8_cost + ((j & 1) << 1);
1192
334k
                                    pi4_intra_8_cost_curr16 += ((j >> 1) << 1) * MAX_CU_IN_CTB_ROW;
1193
1194
1.67M
                                    for(idx_8x8 = 0; idx_8x8 < 4; idx_8x8++)
1195
1.33M
                                    {
1196
1.33M
                                        pi4_intra_8_cost_curr16
1197
1.33M
                                            [(idx_8x8 & 1) + (MAX_CU_IN_CTB_ROW * (idx_8x8 >> 1))] =
1198
1.33M
                                                (child_cost[j] + 3) >> 2;
1199
1200
1.33M
                                        ps_intra8_analyse =
1201
1.33M
                                            &ps_intra16_analyse[j].as_intra8_analyse[idx_8x8];
1202
1203
1.33M
                                        ps_intra8_analyse->b1_enable_nxn = 0;
1204
1.33M
                                        ps_intra8_analyse->b1_valid_cu = 1;
1205
1206
                                        /* store the best 8x8 modes 8x8 tu */
1207
1.33M
                                        memcpy(
1208
1.33M
                                            &ps_intra8_analyse->au1_best_modes_8x8_tu[0],
1209
1.33M
                                            &ps_intra16_analyse[j].au1_best_modes_8x8_tu[0],
1210
1.33M
                                            sizeof(UWORD8) * (NUM_BEST_MODES + 1));
1211
1212
                                        /* store the best 8x8 modes 4x4 tu */
1213
1.33M
                                        memcpy(
1214
1.33M
                                            &ps_intra8_analyse->au1_best_modes_4x4_tu[0],
1215
1.33M
                                            &ps_intra16_analyse[j].au1_best_modes_8x8_tu[0],
1216
1.33M
                                            sizeof(UWORD8) * (NUM_BEST_MODES + 1));
1217
1218
                                        /* NXN modes not evaluated hence set to 0 */
1219
1.33M
                                        memset(
1220
1.33M
                                            &ps_intra8_analyse->au1_4x4_best_modes[0][0],
1221
1.33M
                                            255,
1222
1.33M
                                            sizeof(UWORD8) * 4 * (NUM_BEST_MODES + 1));
1223
1.33M
                                    }
1224
334k
                                }
1225
334k
                            }
1226
1227
83.5k
                            ihevce_set_nbr_map(
1228
83.5k
                                ps_ctxt->pu1_ctb_nbr_map,
1229
83.5k
                                ps_ctxt->i4_nbr_map_strd,
1230
83.5k
                                ps_cu_node->ps_sub_cu[0]->u2_x0 << 1,
1231
83.5k
                                ps_cu_node->ps_sub_cu[0]->u2_y0 << 1,
1232
83.5k
                                (ps_cu_node->ps_sub_cu[0]->u1_cu_size >> 1),
1233
83.5k
                                0);
1234
83.5k
                        }
1235
0
#if 1  //DISBLE_CHILD_CU_EVAL_L0_IPE //1
1236
0
                        else
1237
0
                        {
1238
0
                            for(j = 0; j < 4; j++)
1239
0
                            {
1240
0
                                WORD32 idx_8x8;
1241
0
                                intra8_analyse_t *ps_intra8_analyse;
1242
0
                                ps_intra16_analyse[j].au1_best_modes_8x8_tu[0] = 255;
1243
0
                                ps_intra16_analyse[j].au1_best_modes_16x16_tu[0] = 255;
1244
1245
0
                                ps_intra16_analyse[j].b1_valid_cu = 0;
1246
1247
0
                                for(idx_8x8 = 0; idx_8x8 < 4; idx_8x8++)
1248
0
                                {
1249
0
                                    ps_intra8_analyse =
1250
0
                                        &ps_intra16_analyse[j].as_intra8_analyse[idx_8x8];
1251
1252
0
                                    ps_intra8_analyse->au1_best_modes_8x8_tu[0] = 255;
1253
0
                                    ps_intra8_analyse->au1_best_modes_4x4_tu[0] = 255;
1254
1255
0
                                    ps_intra8_analyse->b1_enable_nxn = 0;
1256
0
                                    ps_intra8_analyse->b1_valid_cu = 0;
1257
1258
                                    /* NXN modes not evaluated hence set to 0 */
1259
0
                                    memset(
1260
0
                                        &ps_intra8_analyse->au1_4x4_best_modes[0][0],
1261
0
                                        255,
1262
0
                                        sizeof(UWORD8) * 4 * (NUM_BEST_MODES + 1));
1263
0
                                }
1264
0
                            }
1265
1266
0
                            child_cost_least = MAX_INTRA_COST_IPE;
1267
0
                        }
1268
83.5k
#endif
1269
1270
                        /* Populate params for 32x32 block analysis */
1271
1272
83.5k
                        ps_cu_node->ps_parent->u1_cu_size = 32;
1273
83.5k
                        ps_cu_node->ps_parent->u2_x0 =
1274
83.5k
                            gau1_cu_pos_x[blk_cnt]; /* Populate properly */
1275
83.5k
                        ps_cu_node->ps_parent->u2_y0 =
1276
83.5k
                            gau1_cu_pos_y[blk_cnt]; /* Populate properly */
1277
1278
                        /* Revaluation for 32x32 parent block at 16x16 prediction level */
1279
                        //memcpy(ps_ctxt->ai1_ctb_mode_map_temp, ps_ctxt->ai1_ctb_mode_map, sizeof(ps_ctxt->ai1_ctb_mode_map));
1280
1281
83.5k
                        {
1282
                            /* Eval for TUSize = CuSize */
1283
83.5k
                            ihevce_mode_eval_filtering(
1284
83.5k
                                ps_cu_node->ps_parent,
1285
83.5k
                                ps_cu_node,
1286
83.5k
                                ps_ctxt,
1287
83.5k
                                ps_curr_src,
1288
83.5k
                                26,
1289
83.5k
                                &ps_cu_node->ps_parent->au4_best_cost_1tu[0],
1290
83.5k
                                &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
1291
83.5k
                                step2_bypass,
1292
83.5k
                                1);
1293
1294
83.5k
                            if(i4_enable_1cu_4tu)
1295
40.0k
                            {
1296
                                /* Eval for TUSize = CuSize/2 */
1297
40.0k
                                ihevce_mode_eval_filtering(
1298
40.0k
                                    ps_cu_node->ps_parent,
1299
40.0k
                                    ps_cu_node,
1300
40.0k
                                    ps_ctxt,
1301
40.0k
                                    ps_curr_src,
1302
40.0k
                                    26,
1303
40.0k
                                    &ps_cu_node->ps_parent->au4_best_cost_4tu[0],
1304
40.0k
                                    &ps_cu_node->ps_parent->au1_best_mode_4tu[0],
1305
40.0k
                                    step2_bypass,
1306
40.0k
                                    0);
1307
40.0k
                            }
1308
43.4k
                            else
1309
43.4k
                            {
1310
                                /* 4TU not evaluated :  4tu modes set same as 1tu modes */
1311
43.4k
                                memcpy(
1312
43.4k
                                    &ps_cu_node->ps_parent->au1_best_mode_4tu[0],
1313
43.4k
                                    &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
1314
43.4k
                                    NUM_BEST_MODES);
1315
1316
                                /* 4TU not evaluated : currently 4tu cost set same as 1tu cost */
1317
43.4k
                                memcpy(
1318
43.4k
                                    &ps_cu_node->ps_parent->au4_best_cost_4tu[0],
1319
43.4k
                                    &ps_cu_node->ps_parent->au4_best_cost_1tu[0],
1320
43.4k
                                    NUM_BEST_MODES * sizeof(WORD32));
1321
43.4k
                            }
1322
83.5k
                        }
1323
1324
83.5k
                        ps_ctxt->u1_disable_child_cu_decide = 0;
1325
83.5k
                        step2_bypass = 1;
1326
1327
                        /* Update parent cost */
1328
83.5k
                        parent_cost =
1329
83.5k
                            MIN(ps_cu_node->ps_parent->au4_best_cost_4tu[0],
1330
83.5k
                                ps_cu_node->ps_parent->au4_best_cost_1tu[0]);
1331
1332
                        /* Select the best mode to be populated as top and left nbr depending on the
1333
                        4tu and 1tu cost */
1334
83.5k
                        if(ps_cu_node->ps_parent->au4_best_cost_4tu[0] >
1335
83.5k
                           ps_cu_node->ps_parent->au4_best_cost_1tu[0])
1336
1.82k
                        {
1337
1.82k
                            ps_cu_node->ps_parent->best_mode =
1338
1.82k
                                ps_cu_node->ps_parent->au1_best_mode_1tu[0];
1339
1.82k
                        }
1340
81.7k
                        else
1341
81.7k
                        {
1342
81.7k
                            ps_cu_node->ps_parent->best_mode =
1343
81.7k
                                ps_cu_node->ps_parent->au1_best_mode_4tu[0];
1344
81.7k
                        }
1345
1346
                        /* store the 32x32 cost */
1347
83.5k
                        *pi4_intra_32_cost = parent_cost;
1348
1349
                        /* set the CU valid flag */
1350
83.5k
                        ps_intra32_analyse->b1_valid_cu = 1;
1351
1352
83.5k
                        ps_intra32_analyse->b1_merge_flag = 1;
1353
1354
                        /* storing the modes to intra 32 analyse */
1355
83.5k
                        {
1356
                            /* store the best 32x32 modes 16x16 tu */
1357
83.5k
                            memcpy(
1358
83.5k
                                &ps_intra32_analyse->au1_best_modes_16x16_tu[0],
1359
83.5k
                                &ps_cu_node->ps_parent->au1_best_mode_4tu[0],
1360
83.5k
                                sizeof(UWORD8) * (NUM_BEST_MODES));
1361
83.5k
                            ps_intra32_analyse->au1_best_modes_16x16_tu[NUM_BEST_MODES] = 255;
1362
1363
                            /* store the best 32x32 modes 32x32 tu */
1364
83.5k
                            memcpy(
1365
83.5k
                                &ps_intra32_analyse->au1_best_modes_32x32_tu[0],
1366
83.5k
                                &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
1367
83.5k
                                sizeof(UWORD8) * (NUM_BEST_MODES));
1368
83.5k
                            ps_intra32_analyse->au1_best_modes_32x32_tu[NUM_BEST_MODES] = 255;
1369
83.5k
                        }
1370
83.5k
                        parent_best_mode = ps_cu_node->ps_parent->best_mode;
1371
83.5k
                        if((parent_cost <=
1372
83.5k
                            child_cost_least + (ps_ctxt->i4_ol_satd_lambda * CHILD_BIAS >>
1373
83.5k
                                                LAMBDA_Q_SHIFT)))  //|| identical_modes)
1374
73.7k
                        {
1375
73.7k
                            WORD32 i4_q_scale_q3_mod;
1376
73.7k
                            UWORD8 u1_cu_possible_qp;
1377
73.7k
                            WORD32 i4_act_factor;
1378
1379
                            /* CU size 32x32 and fill the final cu params */
1380
1381
73.7k
                            ihevce_update_cand_list(ps_cu_node->ps_parent, ps_ed_blk_l1, ps_ctxt);
1382
1383
73.7k
                            if((IHEVCE_QUALITY_P3 > i4_quality_preset))
1384
34.7k
                            {
1385
173k
                                for(i = 0; i < 4; i++)
1386
139k
                                {
1387
139k
                                    intra8_analyse_t *ps_intra8_analyse;
1388
139k
                                    ps_intra8_analyse = &ps_intra16_analyse->as_intra8_analyse[i];
1389
695k
                                    for(j = 0; j < 4; j++)
1390
556k
                                    {
1391
                                        /* Populate best 3 nxn modes */
1392
556k
                                        ps_intra8_analyse->au1_4x4_best_modes[j][0] =
1393
556k
                                            ps_cu_node->ps_sub_cu[i]->au1_best_mode_4tu[0];
1394
556k
                                        ps_intra8_analyse->au1_4x4_best_modes[j][1] =
1395
556k
                                            ps_cu_node->ps_sub_cu[i]
1396
556k
                                                ->au1_best_mode_4tu[1];  //(ps_ed + 1)->best_mode;
1397
556k
                                        ps_intra8_analyse->au1_4x4_best_modes[j][2] =
1398
556k
                                            ps_cu_node->ps_sub_cu[i]
1399
556k
                                                ->au1_best_mode_4tu[2];  //(ps_ed + 2)->best_mode;
1400
556k
                                        ps_intra8_analyse->au1_4x4_best_modes[j][3] = 255;
1401
556k
                                    }
1402
139k
                                }
1403
34.7k
                            }
1404
                            /* store the 32x32 non split flag */
1405
73.7k
                            ps_intra32_analyse->b1_split_flag = 0;
1406
73.7k
                            ps_intra32_analyse->as_intra16_analyse[0].b1_split_flag = 0;
1407
73.7k
                            ps_intra32_analyse->as_intra16_analyse[1].b1_split_flag = 0;
1408
73.7k
                            ps_intra32_analyse->as_intra16_analyse[2].b1_split_flag = 0;
1409
73.7k
                            ps_intra32_analyse->as_intra16_analyse[3].b1_split_flag = 0;
1410
1411
73.7k
                            au1_best_32x32_modes[blk_cnt >> 4] =
1412
73.7k
                                ps_cu_node->ps_parent->au1_best_mode_1tu[0];
1413
1414
73.7k
                            au4_best_32x32_cost[blk_cnt >> 4] =
1415
73.7k
                                ps_cu_node->ps_parent->au4_best_cost_1tu[0];
1416
                            /*As 32*32 has won, pick L2 8x8 qp which maps
1417
                            to L0 32x32 Qp*/
1418
73.7k
                            ASSERT(((blk_cnt >> 4) & 3) == (blk_cnt >> 4));
1419
73.7k
                            ASSERT(ps_ed_ctb_l1->i4_16x16_satd[blk_cnt >> 4][0] != -2);
1420
73.7k
                            u1_cu_possible_qp = ihevce_cu_level_qp_mod(
1421
73.7k
                                ps_ctxt->i4_qscale,
1422
73.7k
                                ps_ed_ctb_l1->i4_16x16_satd[blk_cnt >> 4][0],
1423
73.7k
                                ps_ctxt->ld_curr_frame_16x16_log_avg[0],
1424
73.7k
                                f_strength,
1425
73.7k
                                &i4_act_factor,
1426
73.7k
                                &i4_q_scale_q3_mod,
1427
73.7k
                                ps_ctxt->ps_rc_quant_ctxt);
1428
                            /* cost accumalation of best cu size candiate */
1429
73.7k
                            i8_frame_acc_satd_cost += parent_cost;
1430
1431
                            /* satd and mpm bits accumalation of best cu size candiate */
1432
73.7k
                            i4_ctb_acc_satd += ps_cu_node->ps_parent->best_satd;
1433
1434
                            /* Mode bits cost accumalation for best cu size and cu mode */
1435
73.7k
                            i8_frame_acc_mode_bits_cost += ps_cu_node->ps_parent->u2_mode_bits_cost;
1436
1437
                            /*satd/mod_qp accumulation of best cu */
1438
73.7k
                            i8_frame_acc_satd_by_modqp_q10 +=
1439
73.7k
                                ((LWORD64)ps_cu_node->ps_parent->best_satd
1440
73.7k
                                 << (SATD_BY_ACT_Q_FAC + QSCALE_Q_FAC_3)) /
1441
73.7k
                                i4_q_scale_q3_mod;
1442
1443
                            /* Increment pointers */
1444
73.7k
                            ps_ed_blk_l1 += 16;
1445
73.7k
                            blk_cnt += 16;
1446
                            //ps_row_cu++;
1447
73.7k
                            merge_64x64 &= 1;
1448
73.7k
                        }
1449
9.79k
                        else
1450
9.79k
                        {
1451
                            /* store the 32x32 split flag */
1452
9.79k
                            ps_intra32_analyse->b1_split_flag = 1;
1453
1454
                            /* CU size 16x16 and fill the final cu params for all 4 blocks */
1455
48.9k
                            for(j = 0; j < 4; j++)
1456
39.1k
                            {
1457
39.1k
                                WORD32 i4_q_scale_q3_mod;
1458
39.1k
                                UWORD8 u1_cu_possible_qp;
1459
39.1k
                                WORD32 i4_act_factor;
1460
1461
                                /* Set CU split flag */
1462
39.1k
                                ASSERT(blk_cnt % 4 == 0);
1463
1464
39.1k
                                ihevce_update_cand_list(
1465
39.1k
                                    ps_cu_node->ps_sub_cu[j], ps_ed_blk_l1, ps_ctxt);
1466
1467
                                /* store the 16x16 non split flag  */
1468
39.1k
                                ps_intra16_analyse[j].b1_split_flag = 0;
1469
1470
39.1k
                                ASSERT(((blk_cnt >> 2) & 0xF) == (blk_cnt >> 2));
1471
39.1k
                                ASSERT(ps_ed_ctb_l1->i4_8x8_satd[blk_cnt >> 2][0] != -2);
1472
                                /*As 16*16 has won, pick L1 8x8 qp which maps
1473
                                to L0 16x16 Qp*/
1474
39.1k
                                u1_cu_possible_qp = ihevce_cu_level_qp_mod(
1475
39.1k
                                    ps_ctxt->i4_qscale,
1476
39.1k
                                    ps_ed_ctb_l1->i4_8x8_satd[blk_cnt >> 2][0],
1477
39.1k
                                    ps_ctxt->ld_curr_frame_8x8_log_avg[0],
1478
39.1k
                                    f_strength,
1479
39.1k
                                    &i4_act_factor,
1480
39.1k
                                    &i4_q_scale_q3_mod,
1481
39.1k
                                    ps_ctxt->ps_rc_quant_ctxt);
1482
1483
                                /*accum satd/qp for all child block*/
1484
39.1k
                                i8_frame_acc_satd_by_modqp_q10 +=
1485
39.1k
                                    ((LWORD64)child_satd[j]
1486
39.1k
                                     << (SATD_BY_ACT_Q_FAC + QSCALE_Q_FAC_3)) /
1487
39.1k
                                    i4_q_scale_q3_mod;
1488
1489
                                /* Accumalate mode bits for all child blocks */
1490
39.1k
                                i8_frame_acc_mode_bits_cost +=
1491
39.1k
                                    ps_cu_node->ps_sub_cu[j]->u2_mode_bits_cost;
1492
1493
                                /* satd and mpm bits accumalation of best cu size candiate */
1494
39.1k
                                i4_ctb_acc_satd += child_satd[j];
1495
1496
                                /* Increment pointers */
1497
                                //ps_row_cu++;
1498
39.1k
                                ps_ed_blk_l1 += 4;
1499
39.1k
                                blk_cnt += 4;
1500
39.1k
                            }
1501
1502
                            /* cost accumalation of best cu size candiate */
1503
9.79k
                            i8_frame_acc_satd_cost += child_cost_least;
1504
1505
                            /* 64x64 merge is not possible */
1506
9.79k
                            merge_64x64 = 0;
1507
9.79k
                        }
1508
1509
                        //ps_ed_blk_l2 += 4;
1510
1511
83.5k
                    }  //end of EIID's else
1512
92.3k
#endif
1513
92.3k
                }
1514
                /* If Merge success for L1 max CU size 16x16 is chosen */
1515
338k
                else if(merge_16x16_l1)
1516
197k
                {
1517
#if IP_DBG_L1_l2
1518
                    ps_cu_node->ps_parent->u1_cu_size = 16;
1519
                    ps_cu_node->ps_parent->u2_x0 = gau1_cu_pos_x[blk_cnt]; /* Populate properly */
1520
                    ps_cu_node->ps_parent->u2_y0 = gau1_cu_pos_y[blk_cnt]; /* Populate properly */
1521
                    ps_cu_node->ps_parent->best_mode = ps_ed_blk_l1->best_merge_mode;
1522
                    ihevce_update_cand_list(ps_cu_node->ps_parent, ps_ed_blk_l1, ps_ctxt);
1523
1524
                    blk_cnt += 4;
1525
                    ps_ed_blk_l1 += 4;
1526
                    ps_row_cu++;
1527
                    merge_64x64 = 0;
1528
#else
1529
1530
                    /*EIID: evaluate only if L1 early-inter-intra decision is not favouring inter*/
1531
                    /* enable this only in B pictures */
1532
197k
                    if(ps_ed_blk_l1->intra_or_inter == 2 && (ps_ctxt->i4_slice_type != ISLICE))
1533
75.9k
                    {
1534
75.9k
                        WORD32 i4_q_scale_q3_mod, i4_local_ctr;
1535
75.9k
                        WORD8 i1_cu_possible_qp;
1536
75.9k
                        WORD32 i4_act_factor;
1537
                        /* make cost infinity. */
1538
                        /* make modes invalid */
1539
                        /* update loop variables */
1540
                        /* set other output variales */
1541
                        /* dont set neighbour flag so that next blocks wont access this cu */
1542
                        /* what happens to ctb_mode_map?? */
1543
1544
75.9k
                        ps_cu_node->ps_parent->u1_cu_size = 16;
1545
75.9k
                        ps_cu_node->ps_parent->u2_x0 =
1546
75.9k
                            gau1_cu_pos_x[blk_cnt]; /* Populate properly */
1547
75.9k
                        ps_cu_node->ps_parent->u2_y0 =
1548
75.9k
                            gau1_cu_pos_y[blk_cnt]; /* Populate properly */
1549
75.9k
                        ps_cu_node->ps_parent->best_mode =
1550
75.9k
                            INTRA_DC;  //ps_ed_blk_l1->best_merge_mode;
1551
1552
                        /* fill in the first modes as invalid */
1553
1554
75.9k
                        ps_cu_node->ps_parent->au1_best_mode_1tu[0] = INTRA_DC;
1555
75.9k
                        ps_cu_node->ps_parent->au1_best_mode_1tu[1] =
1556
75.9k
                            INTRA_DC;  //for safery. Since update_cand_list will set num_modes as 3
1557
75.9k
                        ps_cu_node->ps_parent->au1_best_mode_1tu[2] = INTRA_DC;
1558
1559
75.9k
                        ps_cu_node->ps_parent->au1_best_mode_4tu[0] = INTRA_DC;
1560
75.9k
                        ps_cu_node->ps_parent->au1_best_mode_4tu[1] = INTRA_DC;
1561
75.9k
                        ps_cu_node->ps_parent->au1_best_mode_4tu[2] = INTRA_DC;
1562
1563
75.9k
                        ihevce_update_cand_list(ps_cu_node->ps_parent, ps_ed_blk_l1, ps_ctxt);
1564
1565
                        //ps_row_cu->s_cu_intra_cand.b6_num_intra_cands = 0;
1566
                        //ps_row_cu->u1_num_intra_rdopt_cands = 0;
1567
1568
75.9k
                        ps_intra32_analyse->b1_split_flag = 1;
1569
75.9k
                        ps_intra32_analyse->b1_merge_flag = 0;
1570
1571
75.9k
                        ps_intra16_analyse->b1_valid_cu = 0;
1572
75.9k
                        ps_intra16_analyse->b1_split_flag = 0;
1573
75.9k
                        ps_intra16_analyse->b1_merge_flag = 1;
1574
                        //memset (&ps_intra16_analyse->au1_best_modes_16x16_tu,
1575
                        //  255,
1576
                        //  NUM_BEST_MODES);
1577
                        //memset (&ps_intra16_analyse->au1_best_modes_8x8_tu,
1578
                        //  255,
1579
                        //  NUM_BEST_MODES);
1580
                        //set only first mode since if it's 255. it wont go ahead
1581
75.9k
                        ps_intra16_analyse->au1_best_modes_16x16_tu[0] = 255;
1582
75.9k
                        ps_intra16_analyse->au1_best_modes_8x8_tu[0] = 255;
1583
75.9k
                        *pi4_intra_16_cost = MAX_INTRA_COST_IPE;
1584
1585
                        /*since ME will start evaluating from bottom up, set the lower
1586
                        cu size data invalid */
1587
379k
                        for(i4_local_ctr = 0; i4_local_ctr < 4; i4_local_ctr++)
1588
303k
                        {
1589
303k
                            ps_intra16_analyse->as_intra8_analyse[i4_local_ctr]
1590
303k
                                .au1_4x4_best_modes[0][0] = 255;
1591
303k
                            ps_intra16_analyse->as_intra8_analyse[i4_local_ctr]
1592
303k
                                .au1_4x4_best_modes[1][0] = 255;
1593
303k
                            ps_intra16_analyse->as_intra8_analyse[i4_local_ctr]
1594
303k
                                .au1_4x4_best_modes[2][0] = 255;
1595
303k
                            ps_intra16_analyse->as_intra8_analyse[i4_local_ctr]
1596
303k
                                .au1_4x4_best_modes[3][0] = 255;
1597
303k
                            ps_intra16_analyse->as_intra8_analyse[i4_local_ctr]
1598
303k
                                .au1_best_modes_8x8_tu[0] = 255;
1599
303k
                            ps_intra16_analyse->as_intra8_analyse[i4_local_ctr]
1600
303k
                                .au1_best_modes_4x4_tu[0] = 255;
1601
1602
303k
                            pi4_intra_8_cost
1603
303k
                                [(i4_local_ctr & 1) + (MAX_CU_IN_CTB_ROW * (i4_local_ctr >> 1))] =
1604
303k
                                    MAX_INTRA_COST_IPE;
1605
303k
                        }
1606
1607
                        /* set neighbours even if intra is not evaluated, since source is always available. */
1608
75.9k
                        ihevce_set_nbr_map(
1609
75.9k
                            ps_ctxt->pu1_ctb_nbr_map,
1610
75.9k
                            ps_ctxt->i4_nbr_map_strd,
1611
75.9k
                            ps_cu_node->ps_parent->u2_x0 << 1,
1612
75.9k
                            ps_cu_node->ps_parent->u2_y0 << 1,
1613
75.9k
                            (ps_cu_node->ps_parent->u1_cu_size >> 2),
1614
75.9k
                            1);
1615
1616
                        //what happends to RC variables??
1617
                        /* run only constant Qp */
1618
75.9k
                        ASSERT(((blk_cnt >> 2) & 0xF) == (blk_cnt >> 2));
1619
75.9k
                        ASSERT(ps_ed_ctb_l1->i4_8x8_satd[blk_cnt >> 2][0] != -2);
1620
75.9k
                        i1_cu_possible_qp = ihevce_cu_level_qp_mod(
1621
75.9k
                            ps_ctxt->i4_qscale,
1622
75.9k
                            ps_ed_ctb_l1->i4_8x8_satd[blk_cnt >> 2][0],
1623
75.9k
                            ps_ctxt->ld_curr_frame_8x8_log_avg[0],
1624
75.9k
                            f_strength,
1625
75.9k
                            &i4_act_factor,
1626
75.9k
                            &i4_q_scale_q3_mod,
1627
75.9k
                            ps_ctxt->ps_rc_quant_ctxt);
1628
1629
                        /* cost accumalation of best cu size candiate */
1630
75.9k
                        i8_frame_acc_satd_cost += 0;  //parent_cost;  //incorrect accumulation
1631
1632
                        /*satd/mod_qp accumulation of best cu */
1633
75.9k
                        i8_frame_acc_satd_by_modqp_q10 += 0;  //incorrect accumulation
1634
                        //((LWORD64)ps_cu_node->ps_parent->best_satd << SATD_BY_ACT_Q_FAC)/i4_q_scale_q3_mod;
1635
1636
                        /* Accumalate mode bits for all child blocks */
1637
75.9k
                        i8_frame_acc_mode_bits_cost +=
1638
75.9k
                            0;  //ps_cu_node->ps_parent->u2_mode_bits_cost;
1639
                        //incoorect accumulation
1640
1641
75.9k
                        blk_cnt += 4;
1642
75.9k
                        ps_ed_blk_l1 += 4;
1643
                        //ps_row_cu++;
1644
75.9k
                        merge_64x64 = 0;
1645
1646
                        /* increment for stat purpose only. Increment is valid only on single thread */
1647
75.9k
                        ps_ctxt->u4_num_16x16_skips_at_L0_IPE += 1;
1648
75.9k
                    }
1649
122k
                    else
1650
122k
                    {
1651
                        /* 64x64 merge is not possible */
1652
122k
                        merge_64x64 = 0;
1653
1654
                        /* set the 32x32 split flag to 1 */
1655
122k
                        ps_intra32_analyse->b1_split_flag = 1;
1656
1657
122k
                        ps_intra32_analyse->b1_merge_flag = 0;
1658
1659
122k
                        ps_intra16_analyse->b1_merge_flag = 1;
1660
1661
122k
                        if((ps_ctxt->i4_quality_preset == IHEVCE_QUALITY_P6) &&
1662
18.0k
                           (ps_ctxt->i4_slice_type == PSLICE))
1663
11.7k
                        {
1664
11.7k
                            ps_ctxt->u1_disable_child_cu_decide = 1;
1665
11.7k
                            step2_bypass = 0;
1666
11.7k
                        }
1667
                        //memcpy(ps_ctxt->ai1_ctb_mode_map_temp, ps_ctxt->ai1_ctb_mode_map, sizeof(ps_ctxt->ai1_ctb_mode_map));
1668
                        /* Based on the flag, Child modes decision can be disabled*/
1669
122k
                        if(0 == ps_ctxt->u1_disable_child_cu_decide)
1670
110k
                        {
1671
551k
                            for(j = 0; j < 4; j++)
1672
440k
                            {
1673
440k
                                intra8_analyse_t *ps_intra8_analyse;
1674
440k
                                WORD32 best_ang_mode = (ps_ed_blk_l1 + j)->best_mode;
1675
1676
440k
                                if(best_ang_mode < 2)
1677
319k
                                    best_ang_mode = 26;
1678
1679
                                //ps_cu_node->ps_sub_cu[j]->best_cost = MAX_INTRA_COST_IPE;
1680
                                //ps_cu_node->ps_sub_cu[j]->best_mode = (ps_ed_blk_l1 + j)->best_mode;
1681
1682
440k
                                ps_cu_node->ps_sub_cu[j]->u2_x0 =
1683
440k
                                    gau1_cu_pos_x[blk_cnt + j]; /* Populate properly */
1684
440k
                                ps_cu_node->ps_sub_cu[j]->u2_y0 =
1685
440k
                                    gau1_cu_pos_y[blk_cnt + j]; /* Populate properly */
1686
440k
                                ps_cu_node->ps_sub_cu[j]->u1_cu_size = 8;
1687
1688
440k
                                ihevce_mode_eval_filtering(
1689
440k
                                    ps_cu_node->ps_sub_cu[j],
1690
440k
                                    ps_cu_node,
1691
440k
                                    ps_ctxt,
1692
440k
                                    ps_curr_src,
1693
440k
                                    best_ang_mode,
1694
440k
                                    &ps_cu_node->ps_sub_cu[j]->au4_best_cost_1tu[0],
1695
440k
                                    &ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[0],
1696
440k
                                    !step2_bypass,
1697
440k
                                    1);
1698
1699
440k
                                if(i4_enable_4cu_16tu)
1700
201k
                                {
1701
201k
                                    ihevce_mode_eval_filtering(
1702
201k
                                        ps_cu_node->ps_sub_cu[j],
1703
201k
                                        ps_cu_node,
1704
201k
                                        ps_ctxt,
1705
201k
                                        ps_curr_src,
1706
201k
                                        best_ang_mode,
1707
201k
                                        &ps_cu_node->ps_sub_cu[j]->au4_best_cost_4tu[0],
1708
201k
                                        &ps_cu_node->ps_sub_cu[j]->au1_best_mode_4tu[0],
1709
201k
                                        !step2_bypass,
1710
201k
                                        0);
1711
201k
                                }
1712
239k
                                else
1713
239k
                                {
1714
                                    /* 4TU not evaluated :  4tu modes set same as 1tu modes */
1715
239k
                                    memcpy(
1716
239k
                                        &ps_cu_node->ps_sub_cu[j]->au1_best_mode_4tu[0],
1717
239k
                                        &ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[0],
1718
239k
                                        NUM_BEST_MODES);
1719
1720
                                    /* 4TU not evaluated : currently 4tu cost set same as 1tu cost */
1721
239k
                                    memcpy(
1722
239k
                                        &ps_cu_node->ps_sub_cu[j]->au4_best_cost_4tu[0],
1723
239k
                                        &ps_cu_node->ps_sub_cu[j]->au4_best_cost_1tu[0],
1724
239k
                                        NUM_BEST_MODES * sizeof(WORD32));
1725
239k
                                }
1726
1727
440k
                                child_cost[j] =
1728
440k
                                    MIN(ps_cu_node->ps_sub_cu[j]->au4_best_cost_4tu[0],
1729
440k
                                        ps_cu_node->ps_sub_cu[j]->au4_best_cost_1tu[0]);
1730
1731
440k
                                child_cost_least += child_cost[j];
1732
1733
                                /* Select the best mode to be populated as top and left nbr depending on the
1734
                                4tu and 1tu cost */
1735
440k
                                if(ps_cu_node->ps_sub_cu[j]->au4_best_cost_4tu[0] >
1736
440k
                                   ps_cu_node->ps_sub_cu[j]->au4_best_cost_1tu[0])
1737
29.8k
                                {
1738
29.8k
                                    ps_cu_node->ps_sub_cu[j]->best_mode =
1739
29.8k
                                        ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[0];
1740
29.8k
                                }
1741
411k
                                else
1742
411k
                                {
1743
411k
                                    ps_cu_node->ps_sub_cu[j]->best_mode =
1744
411k
                                        ps_cu_node->ps_sub_cu[j]->au1_best_mode_4tu[0];
1745
411k
                                }
1746
440k
                                { /* Update the CTB nodes only for MAX - 1 CU nodes */
1747
440k
                                    WORD32 xA, yA, row, col;
1748
440k
                                    xA = ((ps_cu_node->ps_sub_cu[j]->u2_x0 << 3) >> 2) + 1;
1749
440k
                                    yA = ((ps_cu_node->ps_sub_cu[j]->u2_y0 << 3) >> 2) + 1;
1750
440k
                                    size = ps_cu_node->ps_sub_cu[j]->u1_cu_size >> 2;
1751
1.32M
                                    for(row = yA; row < (yA + size); row++)
1752
881k
                                    {
1753
2.64M
                                        for(col = xA; col < (xA + size); col++)
1754
1.76M
                                        {
1755
1.76M
                                            ps_ctxt->au1_ctb_mode_map[row][col] =
1756
1.76M
                                                ps_cu_node->ps_sub_cu[j]->best_mode;
1757
1.76M
                                        }
1758
881k
                                    }
1759
440k
                                }
1760
1761
                                /*collect individual child satd for final SATD/qp accum*/
1762
440k
                                child_satd[j] = ps_cu_node->ps_sub_cu[j]->best_satd;
1763
1764
440k
                                ps_intra8_analyse = &ps_intra16_analyse->as_intra8_analyse[j];
1765
1766
                                /* store the child 8x8 costs */
1767
440k
                                pi4_intra_8_cost[(j & 1) + (MAX_CU_IN_CTB_ROW * (j >> 1))] =
1768
440k
                                    child_cost[j];
1769
1770
                                /* set the CU valid flag */
1771
440k
                                ps_intra8_analyse->b1_valid_cu = 1;
1772
440k
                                ps_intra8_analyse->b1_enable_nxn = 0;
1773
1774
                                /* storing the modes to intra8  analyse */
1775
1776
                                /* store the best 8x8 modes 8x8 tu */
1777
440k
                                memcpy(
1778
440k
                                    &ps_intra8_analyse->au1_best_modes_8x8_tu[0],
1779
440k
                                    &ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[0],
1780
440k
                                    sizeof(UWORD8) * (NUM_BEST_MODES));
1781
440k
                                ps_intra8_analyse->au1_best_modes_8x8_tu[NUM_BEST_MODES] = 255;
1782
1783
                                /* store the best 8x8 modes 4x4 tu */
1784
440k
                                memcpy(
1785
440k
                                    &ps_intra8_analyse->au1_best_modes_4x4_tu[0],
1786
440k
                                    &ps_cu_node->ps_sub_cu[j]->au1_best_mode_4tu[0],
1787
440k
                                    sizeof(UWORD8) * (NUM_BEST_MODES));
1788
440k
                                ps_intra8_analyse->au1_best_modes_4x4_tu[NUM_BEST_MODES] = 255;
1789
1790
                                /* NXN modes not evaluated hence set to 255 */
1791
440k
                                memset(
1792
440k
                                    &ps_intra8_analyse->au1_4x4_best_modes[0][0],
1793
440k
                                    255,
1794
440k
                                    sizeof(UWORD8) * 4 * (NUM_BEST_MODES + 1));
1795
440k
                            }
1796
1797
110k
                            ihevce_set_nbr_map(
1798
110k
                                ps_ctxt->pu1_ctb_nbr_map,
1799
110k
                                ps_ctxt->i4_nbr_map_strd,
1800
110k
                                ps_cu_node->ps_sub_cu[0]->u2_x0 << 1,
1801
110k
                                ps_cu_node->ps_sub_cu[0]->u2_y0 << 1,
1802
110k
                                (ps_cu_node->ps_sub_cu[0]->u1_cu_size >> 1),
1803
110k
                                0);
1804
110k
                        }
1805
11.7k
#if 1  //DISBLE_CHILD_CU_EVAL_L0_IPE //1
1806
11.7k
                        else
1807
11.7k
                        {
1808
58.9k
                            for(j = 0; j < 4; j++)
1809
47.1k
                            {
1810
47.1k
                                intra8_analyse_t *ps_intra8_analyse;
1811
47.1k
                                ps_intra8_analyse = &ps_intra16_analyse->as_intra8_analyse[j];
1812
47.1k
                                ps_intra8_analyse->au1_best_modes_8x8_tu[0] = 255;
1813
47.1k
                                ps_intra8_analyse->au1_best_modes_4x4_tu[0] = 255;
1814
                                /* NXN modes not evaluated hence set to 255 */
1815
47.1k
                                memset(
1816
47.1k
                                    &ps_intra8_analyse->au1_4x4_best_modes[0][0],
1817
47.1k
                                    255,
1818
47.1k
                                    sizeof(UWORD8) * 4 * (NUM_BEST_MODES + 1));
1819
1820
47.1k
                                ps_intra8_analyse->b1_valid_cu = 0;
1821
47.1k
                                ps_intra8_analyse->b1_enable_nxn = 0;
1822
47.1k
                            }
1823
11.7k
                            child_cost_least = MAX_INTRA_COST_IPE;
1824
11.7k
                        }
1825
122k
#endif
1826
                        //ps_cu_node->ps_parent->best_mode = ps_ed_blk_l1->best_mode;
1827
                        //ps_cu_node->ps_parent->best_cost = MAX_INTRA_COST_IPE;
1828
1829
122k
                        ps_cu_node->ps_parent->u1_cu_size = 16;
1830
122k
                        ps_cu_node->ps_parent->u2_x0 =
1831
122k
                            gau1_cu_pos_x[blk_cnt]; /* Populate properly */
1832
122k
                        ps_cu_node->ps_parent->u2_y0 =
1833
122k
                            gau1_cu_pos_y[blk_cnt]; /* Populate properly */
1834
1835
                        //memcpy(ps_ctxt->ai1_ctb_mode_map_temp, ps_ctxt->ai1_ctb_mode_map, sizeof(ps_ctxt->ai1_ctb_mode_map));
1836
1837
                        /* Eval for TUSize = CuSize */
1838
122k
                        ihevce_mode_eval_filtering(
1839
122k
                            ps_cu_node->ps_parent,
1840
122k
                            ps_cu_node,
1841
122k
                            ps_ctxt,
1842
122k
                            ps_curr_src,
1843
122k
                            26,
1844
122k
                            &ps_cu_node->ps_parent->au4_best_cost_1tu[0],
1845
122k
                            &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
1846
122k
                            step2_bypass,
1847
122k
                            1);
1848
1849
122k
                        if(i4_enable_1cu_4tu)
1850
50.3k
                        {
1851
                            /* Eval for TUSize = CuSize/2 */
1852
50.3k
                            ihevce_mode_eval_filtering(
1853
50.3k
                                ps_cu_node->ps_parent,
1854
50.3k
                                ps_cu_node,
1855
50.3k
                                ps_ctxt,
1856
50.3k
                                ps_curr_src,
1857
50.3k
                                26,
1858
50.3k
                                &ps_cu_node->ps_parent->au4_best_cost_4tu[0],
1859
50.3k
                                &ps_cu_node->ps_parent->au1_best_mode_4tu[0],
1860
50.3k
                                step2_bypass,
1861
50.3k
                                0);
1862
50.3k
                        }
1863
71.6k
                        else
1864
71.6k
                        {
1865
                            /* 4TU not evaluated :  4tu modes set same as 1tu modes */
1866
71.6k
                            memcpy(
1867
71.6k
                                &ps_cu_node->ps_parent->au1_best_mode_4tu[0],
1868
71.6k
                                &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
1869
71.6k
                                NUM_BEST_MODES);
1870
1871
                            /* 4TU not evaluated : currently 4tu cost set same as 1tu cost */
1872
71.6k
                            memcpy(
1873
71.6k
                                &ps_cu_node->ps_parent->au4_best_cost_4tu[0],
1874
71.6k
                                &ps_cu_node->ps_parent->au4_best_cost_1tu[0],
1875
71.6k
                                NUM_BEST_MODES * sizeof(WORD32));
1876
71.6k
                        }
1877
1878
122k
                        ps_ctxt->u1_disable_child_cu_decide = 0;
1879
122k
                        step2_bypass = 1;
1880
1881
                        /* Update parent cost */
1882
122k
                        parent_cost =
1883
122k
                            MIN(ps_cu_node->ps_parent->au4_best_cost_4tu[0],
1884
122k
                                ps_cu_node->ps_parent->au4_best_cost_1tu[0]);
1885
1886
                        /* Select the best mode to be populated as top and left nbr depending on the
1887
                        4tu and 1tu cost */
1888
122k
                        if(ps_cu_node->ps_parent->au4_best_cost_4tu[0] >
1889
122k
                           ps_cu_node->ps_parent->au4_best_cost_1tu[0])
1890
8.96k
                        {
1891
8.96k
                            ps_cu_node->ps_parent->best_mode =
1892
8.96k
                                ps_cu_node->ps_parent->au1_best_mode_1tu[0];
1893
8.96k
                        }
1894
113k
                        else
1895
113k
                        {
1896
113k
                            ps_cu_node->ps_parent->best_mode =
1897
113k
                                ps_cu_node->ps_parent->au1_best_mode_4tu[0];
1898
113k
                        }
1899
1900
                        /* store the 16x16 cost */
1901
122k
                        *pi4_intra_16_cost = parent_cost;
1902
1903
                        /* accumulate the 32x32 cost */
1904
122k
                        if(MAX_INTRA_COST_IPE == *pi4_intra_32_cost)
1905
29.1k
                        {
1906
29.1k
                            *pi4_intra_32_cost = parent_cost;
1907
29.1k
                        }
1908
92.8k
                        else
1909
92.8k
                        {
1910
92.8k
                            *pi4_intra_32_cost += parent_cost;
1911
92.8k
                        }
1912
1913
                        /* set the CU valid flag */
1914
122k
                        ps_intra16_analyse->b1_valid_cu = 1;
1915
1916
                        /* storing the modes to intra 16 analyse */
1917
122k
                        {
1918
                            /* store the best 16x16 modes 16x16 tu */
1919
122k
                            memcpy(
1920
122k
                                &ps_intra16_analyse->au1_best_modes_16x16_tu[0],
1921
122k
                                &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
1922
122k
                                sizeof(UWORD8) * NUM_BEST_MODES);
1923
122k
                            ps_intra16_analyse->au1_best_modes_16x16_tu[NUM_BEST_MODES] = 255;
1924
1925
                            /* store the best 16x16 modes 8x8 tu */
1926
122k
                            memcpy(
1927
122k
                                &ps_intra16_analyse->au1_best_modes_8x8_tu[0],
1928
122k
                                &ps_cu_node->ps_parent->au1_best_mode_4tu[0],
1929
122k
                                sizeof(UWORD8) * NUM_BEST_MODES);
1930
122k
                            ps_intra16_analyse->au1_best_modes_8x8_tu[NUM_BEST_MODES] = 255;
1931
122k
                        }
1932
1933
122k
                        parent_best_mode = ps_cu_node->ps_parent->best_mode;
1934
122k
                        if(parent_cost <=
1935
122k
                           child_cost_least + (ps_ctxt->i4_ol_satd_lambda * CHILD_BIAS >>
1936
122k
                                               LAMBDA_Q_SHIFT))  //|| identical_modes)
1937
94.6k
                        {
1938
94.6k
                            WORD32 i4_q_scale_q3_mod;
1939
94.6k
                            WORD8 i1_cu_possible_qp;
1940
94.6k
                            WORD32 i4_act_factor;
1941
                            //choose parent CU
1942
1943
94.6k
                            ihevce_update_cand_list(ps_cu_node->ps_parent, ps_ed_blk_l1, ps_ctxt);
1944
1945
                            /* set the 16x16 non split flag */
1946
94.6k
                            ps_intra16_analyse->b1_split_flag = 0;
1947
1948
                            /*As 16*16 has won, pick L1 8x8 qp which maps
1949
                            to L0 16x16 Qp*/
1950
94.6k
                            ASSERT(((blk_cnt >> 4) & 3) == (blk_cnt >> 4));
1951
94.6k
                            ASSERT(ps_ed_ctb_l1->i4_16x16_satd[blk_cnt >> 4][0] != -2);
1952
94.6k
                            i1_cu_possible_qp = ihevce_cu_level_qp_mod(
1953
94.6k
                                ps_ctxt->i4_qscale,
1954
94.6k
                                ps_ed_ctb_l1->i4_16x16_satd[blk_cnt >> 4][0],
1955
94.6k
                                ps_ctxt->ld_curr_frame_8x8_log_avg[0],
1956
94.6k
                                f_strength,
1957
94.6k
                                &i4_act_factor,
1958
94.6k
                                &i4_q_scale_q3_mod,
1959
94.6k
                                ps_ctxt->ps_rc_quant_ctxt);
1960
1961
                            /* cost accumalation of best cu size candiate */
1962
94.6k
                            i8_frame_acc_satd_cost += parent_cost;
1963
1964
                            /* satd and mpm bits accumalation of best cu size candiate */
1965
94.6k
                            i4_ctb_acc_satd += ps_cu_node->ps_parent->best_satd;
1966
1967
                            /*satd/mod_qp accumulation of best cu */
1968
94.6k
                            i8_frame_acc_satd_by_modqp_q10 +=
1969
94.6k
                                ((LWORD64)ps_cu_node->ps_parent->best_satd
1970
94.6k
                                 << (SATD_BY_ACT_Q_FAC + QSCALE_Q_FAC_3)) /
1971
94.6k
                                i4_q_scale_q3_mod;
1972
1973
                            /* Accumalate mode bits for all child blocks */
1974
94.6k
                            i8_frame_acc_mode_bits_cost += ps_cu_node->ps_parent->u2_mode_bits_cost;
1975
1976
94.6k
                            blk_cnt += 4;
1977
94.6k
                            ps_ed_blk_l1 += 4;
1978
                            //ps_row_cu++;
1979
94.6k
                        }
1980
27.4k
                        else
1981
27.4k
                        {
1982
                            //choose child CU
1983
27.4k
                            WORD8 i1_cu_possible_qp;
1984
27.4k
                            WORD32 i4_act_factor;
1985
27.4k
                            WORD32 i4_q_scale_q3_mod;
1986
1987
27.4k
                            ASSERT(((blk_cnt >> 2) & 0xF) == (blk_cnt >> 2));
1988
27.4k
                            ASSERT(ps_ed_ctb_l1->i4_8x8_satd[blk_cnt >> 2][1] != -2);
1989
27.4k
                            i1_cu_possible_qp = ihevce_cu_level_qp_mod(
1990
27.4k
                                ps_ctxt->i4_qscale,
1991
27.4k
                                ps_ed_ctb_l1->i4_8x8_satd[blk_cnt >> 2][1],
1992
27.4k
                                ps_ctxt->ld_curr_frame_8x8_log_avg[1],
1993
27.4k
                                f_strength,
1994
27.4k
                                &i4_act_factor,
1995
27.4k
                                &i4_q_scale_q3_mod,
1996
27.4k
                                ps_ctxt->ps_rc_quant_ctxt);
1997
1998
                            /* set the 16x16 split flag */
1999
27.4k
                            ps_intra16_analyse->b1_split_flag = 1;
2000
2001
137k
                            for(j = 0; j < 4; j++)
2002
109k
                            {
2003
109k
                                ihevce_update_cand_list(
2004
109k
                                    ps_cu_node->ps_sub_cu[j], ps_ed_blk_l1, ps_ctxt);
2005
2006
109k
                                if((IHEVCE_QUALITY_P3 > i4_quality_preset))
2007
55.3k
                                {
2008
55.3k
                                    WORD32 k;
2009
55.3k
                                    intra8_analyse_t *ps_intra8_analyse;
2010
55.3k
                                    ps_intra8_analyse = &ps_intra16_analyse->as_intra8_analyse[j];
2011
2012
276k
                                    for(k = 0; k < 4; k++)
2013
221k
                                    {
2014
                                        /* Populate best 3 nxn modes */
2015
221k
                                        ps_intra8_analyse->au1_4x4_best_modes[k][0] =
2016
221k
                                            ps_cu_node->ps_sub_cu[j]->au1_best_mode_4tu[0];
2017
221k
                                        ps_intra8_analyse->au1_4x4_best_modes[k][1] =
2018
221k
                                            ps_cu_node->ps_sub_cu[j]
2019
221k
                                                ->au1_best_mode_4tu[1];  //(ps_ed + 1)->best_mode;
2020
221k
                                        ps_intra8_analyse->au1_4x4_best_modes[k][2] =
2021
221k
                                            ps_cu_node->ps_sub_cu[j]
2022
221k
                                                ->au1_best_mode_4tu[2];  //(ps_ed + 2)->best_mode;
2023
221k
                                        ps_intra8_analyse->au1_4x4_best_modes[k][3] = 255;
2024
221k
                                    }
2025
55.3k
                                }
2026
                                /*accum satd/qp for all child block*/
2027
109k
                                i8_frame_acc_satd_by_modqp_q10 +=
2028
109k
                                    ((LWORD64)child_satd[j]
2029
109k
                                     << (SATD_BY_ACT_Q_FAC + QSCALE_Q_FAC_3)) /
2030
109k
                                    i4_q_scale_q3_mod;
2031
2032
                                /* Accumalate mode bits for all child blocks */
2033
109k
                                i8_frame_acc_mode_bits_cost +=
2034
109k
                                    ps_cu_node->ps_sub_cu[j]->u2_mode_bits_cost;
2035
2036
                                /* satd and mpm bits accumalation of best cu size candiate */
2037
109k
                                i4_ctb_acc_satd += child_satd[j];
2038
2039
109k
                                blk_cnt += 1;
2040
109k
                                ps_ed_blk_l1 += 1;
2041
                                //ps_row_cu++;
2042
109k
                            }
2043
2044
                            /* cost accumalation of best cu size candiate */
2045
27.4k
                            i8_frame_acc_satd_cost += child_cost_least;
2046
27.4k
                        }
2047
2048
122k
                    }  //else of EIID
2049
197k
#endif
2050
197k
                }  // if(merge_16x16_l1)
2051
                /* MAX CU SIZE 8x8 */
2052
140k
                else
2053
140k
                {
2054
#if IP_DBG_L1_l2
2055
                    for(i = 0; i < 4; i++)
2056
                    {
2057
                        ps_cu_node->ps_parent->u1_cu_size = 8;
2058
                        ps_cu_node->ps_parent->u2_x0 =
2059
                            gau1_cu_pos_x[blk_cnt]; /* Populate properly */
2060
                        ps_cu_node->ps_parent->u2_y0 =
2061
                            gau1_cu_pos_y[blk_cnt]; /* Populate properly */
2062
                        ps_cu_node->ps_parent->best_mode = ps_ed_blk_l1->best_mode;
2063
2064
                        ihevce_update_cand_list(ps_cu_node->ps_parent, ps_ed_blk_l1, ps_ctxt);
2065
                        blk_cnt++;
2066
                        ps_ed_blk_l1++;
2067
                        ps_row_cu++;
2068
                        merge_64x64 = 0;
2069
                    }
2070
#else
2071
2072
                    /* EIID: Skip all 4 8x8 block if L1 decisions says skip intra */
2073
140k
                    if(ps_ed_blk_l1->intra_or_inter == 2 && (ps_ctxt->i4_slice_type != ISLICE))
2074
19.8k
                    {
2075
19.8k
                        WORD32 i4_q_scale_q3_mod;
2076
19.8k
                        WORD8 i1_cu_possible_qp;
2077
19.8k
                        WORD32 i4_act_factor;
2078
2079
19.8k
                        merge_64x64 = 0;
2080
2081
19.8k
                        ps_intra32_analyse->b1_merge_flag = 0;
2082
2083
19.8k
                        ps_intra16_analyse->au1_best_modes_8x8_tu[0] = 255;
2084
19.8k
                        ps_intra16_analyse->au1_best_modes_8x8_tu[1] = 255;
2085
19.8k
                        ps_intra16_analyse->au1_best_modes_8x8_tu[2] = 255;
2086
2087
19.8k
                        ps_intra16_analyse->au1_best_modes_16x16_tu[0] = 255;
2088
19.8k
                        ps_intra16_analyse->au1_best_modes_16x16_tu[1] = 255;
2089
19.8k
                        ps_intra16_analyse->au1_best_modes_16x16_tu[2] = 255;
2090
19.8k
                        ps_intra16_analyse->b1_split_flag = 1;
2091
19.8k
                        ps_intra16_analyse->b1_valid_cu = 0;
2092
19.8k
                        ps_intra16_analyse->b1_merge_flag = 0;
2093
2094
99.3k
                        for(i = 0; i < 4; i++)
2095
79.4k
                        {
2096
79.4k
                            intra8_analyse_t *ps_intra8_analyse;
2097
79.4k
                            WORD32 ctr_sub_cu;
2098
2099
79.4k
                            cu_pos_x = gau1_cu_pos_x[blk_cnt];
2100
79.4k
                            cu_pos_y = gau1_cu_pos_y[blk_cnt];
2101
2102
79.4k
                            if((cu_pos_x < num_8x8_blks_x) && (cu_pos_y < num_8x8_blks_y))
2103
73.3k
                            {
2104
73.3k
                                ps_intra8_analyse = &ps_intra16_analyse->as_intra8_analyse[i];
2105
2106
73.3k
                                ps_intra8_analyse->b1_valid_cu = 0;
2107
73.3k
                                ps_intra8_analyse->b1_enable_nxn = 0;
2108
73.3k
                                ps_intra8_analyse->au1_4x4_best_modes[0][0] = 255;
2109
73.3k
                                ps_intra8_analyse->au1_4x4_best_modes[1][0] = 255;
2110
73.3k
                                ps_intra8_analyse->au1_4x4_best_modes[2][0] = 255;
2111
73.3k
                                ps_intra8_analyse->au1_4x4_best_modes[3][0] = 255;
2112
73.3k
                                ps_intra8_analyse->au1_best_modes_4x4_tu[0] = 255;
2113
73.3k
                                ps_intra8_analyse->au1_best_modes_8x8_tu[0] = 255;
2114
2115
73.3k
                                ps_cu_node->ps_parent->u1_cu_size = 8;
2116
73.3k
                                ps_cu_node->ps_parent->u2_x0 =
2117
73.3k
                                    gau1_cu_pos_x[blk_cnt]; /* Populate properly */
2118
73.3k
                                ps_cu_node->ps_parent->u2_y0 =
2119
73.3k
                                    gau1_cu_pos_y[blk_cnt]; /* Populate properly */
2120
73.3k
                                ps_cu_node->ps_parent->best_mode =
2121
73.3k
                                    INTRA_DC;  //ps_ed_blk_l1->best_mode;
2122
2123
                                /* fill in the first modes as invalid */
2124
2125
73.3k
                                ps_cu_node->ps_parent->au1_best_mode_1tu[0] = INTRA_DC;
2126
73.3k
                                ps_cu_node->ps_parent->au1_best_mode_1tu[1] =
2127
73.3k
                                    INTRA_DC;  //for safery. Since update_cand_list will set num_modes as 3
2128
73.3k
                                ps_cu_node->ps_parent->au1_best_mode_1tu[2] = INTRA_DC;
2129
2130
73.3k
                                ps_cu_node->ps_parent->au1_best_mode_4tu[0] = INTRA_DC;
2131
73.3k
                                ps_cu_node->ps_parent->au1_best_mode_4tu[1] = INTRA_DC;
2132
73.3k
                                ps_cu_node->ps_parent->au1_best_mode_4tu[2] = INTRA_DC;
2133
2134
73.3k
                                ihevce_update_cand_list(
2135
73.3k
                                    ps_cu_node->ps_parent, ps_ed_blk_l1, ps_ctxt);
2136
2137
                                //ps_row_cu->s_cu_intra_cand.b6_num_intra_cands = 0;
2138
                                //ps_row_cu->u1_num_intra_rdopt_cands = 0;
2139
2140
366k
                                for(ctr_sub_cu = 0; ctr_sub_cu < 4; ctr_sub_cu++)
2141
293k
                                {
2142
293k
                                    ps_cu_node->ps_sub_cu[ctr_sub_cu]->au1_best_mode_1tu[0] =
2143
293k
                                        INTRA_DC;
2144
293k
                                    ps_cu_node->ps_sub_cu[ctr_sub_cu]->au1_best_mode_4tu[0] =
2145
293k
                                        INTRA_DC;
2146
293k
                                    ps_cu_node->ps_sub_cu[ctr_sub_cu]->au4_best_cost_1tu[0] =
2147
293k
                                        MAX_INTRA_COST_IPE;
2148
2149
293k
                                    ps_cu_node->ps_sub_cu[ctr_sub_cu]->au4_best_cost_4tu[0] =
2150
293k
                                        MAX_INTRA_COST_IPE;
2151
293k
                                    ps_cu_node->ps_sub_cu[ctr_sub_cu]->best_cost =
2152
293k
                                        MAX_INTRA_COST_IPE;
2153
293k
                                }
2154
2155
73.3k
                                pi4_intra_8_cost[(i & 1) + (MAX_CU_IN_CTB_ROW * (i >> 1))] =
2156
73.3k
                                    MAX_INTRA_COST_IPE;
2157
2158
73.3k
                                ASSERT(((blk_cnt >> 2) & 0xF) == (blk_cnt >> 2));
2159
73.3k
                                ASSERT(ps_ed_ctb_l1->i4_8x8_satd[(blk_cnt >> 2)][1] != -2);
2160
73.3k
                                i1_cu_possible_qp = ihevce_cu_level_qp_mod(
2161
73.3k
                                    ps_ctxt->i4_qscale,
2162
73.3k
                                    ps_ed_ctb_l1->i4_8x8_satd[(blk_cnt >> 2)][1],
2163
73.3k
                                    ps_ctxt->ld_curr_frame_8x8_log_avg[1],
2164
73.3k
                                    f_strength,
2165
73.3k
                                    &i4_act_factor,
2166
73.3k
                                    &i4_q_scale_q3_mod,
2167
73.3k
                                    ps_ctxt->ps_rc_quant_ctxt);
2168
2169
                                /* set neighbours even if intra is not evaluated, since source is always available. */
2170
73.3k
                                ihevce_set_nbr_map(
2171
73.3k
                                    ps_ctxt->pu1_ctb_nbr_map,
2172
73.3k
                                    ps_ctxt->i4_nbr_map_strd,
2173
73.3k
                                    ps_cu_node->ps_parent->u2_x0 << 1,
2174
73.3k
                                    ps_cu_node->ps_parent->u2_y0 << 1,
2175
73.3k
                                    (ps_cu_node->ps_parent->u1_cu_size >> 2),
2176
73.3k
                                    1);
2177
2178
                                //ps_row_cu++;
2179
73.3k
                            }
2180
79.4k
                            blk_cnt++;
2181
79.4k
                            ps_ed_blk_l1++;
2182
79.4k
                        }
2183
19.8k
                    }
2184
121k
                    else
2185
121k
                    {
2186
                        //cu_intra_cand_t *ps_cu_intra_cand;
2187
121k
                        WORD8 i1_cu_possible_qp;
2188
121k
                        WORD32 i4_act_factor;
2189
121k
                        WORD32 i4_q_scale_q3_mod;
2190
2191
121k
                        ASSERT(((blk_cnt >> 2) & 0xF) == (blk_cnt >> 2));
2192
121k
                        ASSERT(ps_ed_ctb_l1->i4_8x8_satd[(blk_cnt >> 2)][1] != -2);
2193
121k
                        i1_cu_possible_qp = ihevce_cu_level_qp_mod(
2194
121k
                            ps_ctxt->i4_qscale,
2195
121k
                            ps_ed_ctb_l1->i4_8x8_satd[(blk_cnt >> 2)][1],
2196
121k
                            ps_ctxt->ld_curr_frame_8x8_log_avg[1],
2197
121k
                            f_strength,
2198
121k
                            &i4_act_factor,
2199
121k
                            &i4_q_scale_q3_mod,
2200
121k
                            ps_ctxt->ps_rc_quant_ctxt);
2201
2202
                        /* 64x64 merge is not possible */
2203
121k
                        merge_64x64 = 0;
2204
2205
121k
                        ps_intra32_analyse->b1_merge_flag = 0;
2206
2207
121k
                        ps_intra16_analyse->b1_merge_flag = 0;
2208
2209
                        /* by default 16x16 modes are set to default values DC and Planar */
2210
121k
                        ps_intra16_analyse->au1_best_modes_8x8_tu[0] = 0;
2211
121k
                        ps_intra16_analyse->au1_best_modes_8x8_tu[1] = 1;
2212
121k
                        ps_intra16_analyse->au1_best_modes_8x8_tu[2] = 255;
2213
2214
121k
                        ps_intra16_analyse->au1_best_modes_16x16_tu[0] = 0;
2215
121k
                        ps_intra16_analyse->au1_best_modes_16x16_tu[1] = 1;
2216
121k
                        ps_intra16_analyse->au1_best_modes_16x16_tu[2] = 255;
2217
121k
                        ps_intra16_analyse->b1_split_flag = 1;
2218
121k
                        ps_intra16_analyse->b1_valid_cu = 1;
2219
2220
605k
                        for(i = 0; i < 4; i++)
2221
484k
                        {
2222
484k
                            intra8_analyse_t *ps_intra8_analyse;
2223
484k
                            cu_pos_x = gau1_cu_pos_x[blk_cnt];
2224
484k
                            cu_pos_y = gau1_cu_pos_y[blk_cnt];
2225
484k
                            if((cu_pos_x < num_8x8_blks_x) && (cu_pos_y < num_8x8_blks_y))
2226
424k
                            {
2227
                                //ps_cu_intra_cand = &ps_row_cu->s_cu_intra_cand;
2228
                                //ps_cu_node->ps_parent->best_cost = MAX_INTRA_COST_IPE;
2229
2230
                                //ps_cu_node->ps_parent->best_mode = ps_ed_blk_l1->best_mode;
2231
2232
424k
                                child_cost_least = 0;
2233
2234
424k
                                ps_intra8_analyse = &ps_intra16_analyse->as_intra8_analyse[i];
2235
424k
                                ps_cu_node->ps_parent->u1_cu_size = 8;
2236
424k
                                ps_cu_node->ps_parent->u2_x0 =
2237
424k
                                    gau1_cu_pos_x[blk_cnt]; /* Populate properly */
2238
424k
                                ps_cu_node->ps_parent->u2_y0 =
2239
424k
                                    gau1_cu_pos_y[blk_cnt]; /* Populate properly */
2240
2241
                                //memcpy(ps_ctxt->ai1_ctb_mode_map_temp, ps_ctxt->ai1_ctb_mode_map, sizeof(ps_ctxt->ai1_ctb_mode_map));
2242
2243
                                /*EARLY DECISION 8x8 block */
2244
424k
                                ihevce_pu_calc_8x8_blk(
2245
424k
                                    ps_curr_src, ps_ctxt, ps_cu_node, ps_ctxt->ps_func_selector);
2246
2.12M
                                for(j = 0; j < 4; j++)
2247
1.69M
                                {
2248
1.69M
                                    child_cost_least += ps_cu_node->ps_sub_cu[j]->best_cost;
2249
1.69M
                                    child_satd[j] = ps_cu_node->ps_sub_cu[j]->best_satd;
2250
1.69M
                                }
2251
2252
                                /* Based on the flag, CU = 4TU modes decision can be disabled, CU = 4PU is retained */
2253
424k
                                if(0 == ps_ctxt->u1_disable_child_cu_decide)
2254
424k
                                {
2255
424k
                                    ihevce_set_nbr_map(
2256
424k
                                        ps_ctxt->pu1_ctb_nbr_map,
2257
424k
                                        ps_ctxt->i4_nbr_map_strd,
2258
424k
                                        ps_cu_node->ps_parent->u2_x0 << 1,
2259
424k
                                        ps_cu_node->ps_parent->u2_y0 << 1,
2260
424k
                                        (ps_cu_node->ps_parent->u1_cu_size >> 2),
2261
424k
                                        0);
2262
2263
                                    //memcpy(ps_ctxt->ai1_ctb_mode_map_temp, ps_ctxt->ai1_ctb_mode_map, sizeof(ps_ctxt->ai1_ctb_mode_map));
2264
2265
                                    /* Eval for TUSize = CuSize */
2266
424k
                                    ihevce_mode_eval_filtering(
2267
424k
                                        ps_cu_node->ps_parent,
2268
424k
                                        ps_cu_node,
2269
424k
                                        ps_ctxt,
2270
424k
                                        ps_curr_src,
2271
424k
                                        26,
2272
424k
                                        &ps_cu_node->ps_parent->au4_best_cost_1tu[0],
2273
424k
                                        &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
2274
424k
                                        step2_bypass,
2275
424k
                                        1);
2276
2277
424k
                                    if(i4_enable_1cu_4tu)
2278
234k
                                    {
2279
                                        /* Eval for TUSize = CuSize/2 */
2280
234k
                                        ihevce_mode_eval_filtering(
2281
234k
                                            ps_cu_node->ps_parent,
2282
234k
                                            ps_cu_node,
2283
234k
                                            ps_ctxt,
2284
234k
                                            ps_curr_src,
2285
234k
                                            26,
2286
234k
                                            &ps_cu_node->ps_parent->au4_best_cost_4tu[0],
2287
234k
                                            &ps_cu_node->ps_parent->au1_best_mode_4tu[0],
2288
234k
                                            step2_bypass,
2289
234k
                                            0);
2290
234k
                                    }
2291
190k
                                    else
2292
190k
                                    {
2293
                                        /* 4TU not evaluated :  4tu modes set same as 1tu modes */
2294
190k
                                        memcpy(
2295
190k
                                            &ps_cu_node->ps_parent->au1_best_mode_4tu[0],
2296
190k
                                            &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
2297
190k
                                            NUM_BEST_MODES);
2298
2299
                                        /* 4TU not evaluated : currently 4tu cost set same as 1tu cost */
2300
190k
                                        memcpy(
2301
190k
                                            &ps_cu_node->ps_parent->au4_best_cost_4tu[0],
2302
190k
                                            &ps_cu_node->ps_parent->au4_best_cost_1tu[0],
2303
190k
                                            NUM_BEST_MODES * sizeof(WORD32));
2304
190k
                                    }
2305
2306
                                    /* Update parent cost */
2307
424k
                                    parent_cost =
2308
424k
                                        MIN(ps_cu_node->ps_parent->au4_best_cost_4tu[0],
2309
424k
                                            ps_cu_node->ps_parent->au4_best_cost_1tu[0]);
2310
2311
                                    /* Select the best mode to be populated as top and left nbr depending on the
2312
                            4tu and 1tu cost */
2313
424k
                                    if(ps_cu_node->ps_parent->au4_best_cost_4tu[0] >
2314
424k
                                       ps_cu_node->ps_parent->au4_best_cost_1tu[0])
2315
56.7k
                                    {
2316
56.7k
                                        ps_cu_node->ps_parent->best_mode =
2317
56.7k
                                            ps_cu_node->ps_parent->au1_best_mode_1tu[0];
2318
56.7k
                                    }
2319
367k
                                    else
2320
367k
                                    {
2321
367k
                                        ps_cu_node->ps_parent->best_mode =
2322
367k
                                            ps_cu_node->ps_parent->au1_best_mode_4tu[0];
2323
367k
                                    }
2324
424k
                                }
2325
2326
                                /* set the CU valid flag */
2327
424k
                                ps_intra8_analyse->b1_valid_cu = 1;
2328
424k
                                ps_intra8_analyse->b1_enable_nxn = 0;
2329
2330
                                /* storing the modes to intra 8 analyse */
2331
2332
                                /* store the best 8x8 modes 8x8 tu */
2333
424k
                                memcpy(
2334
424k
                                    &ps_intra8_analyse->au1_best_modes_8x8_tu[0],
2335
424k
                                    &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
2336
424k
                                    sizeof(UWORD8) * (NUM_BEST_MODES));
2337
424k
                                ps_intra8_analyse->au1_best_modes_8x8_tu[NUM_BEST_MODES] = 255;
2338
2339
                                /* store the best 8x8 modes 4x4 tu */
2340
424k
                                memcpy(
2341
424k
                                    &ps_intra8_analyse->au1_best_modes_4x4_tu[0],
2342
424k
                                    &ps_cu_node->ps_parent->au1_best_mode_4tu[0],
2343
424k
                                    sizeof(UWORD8) * (NUM_BEST_MODES));
2344
424k
                                ps_intra8_analyse->au1_best_modes_4x4_tu[NUM_BEST_MODES] = 255;
2345
2346
                                /*As 8*8 has won, pick L1 4x4 qp which is equal to
2347
                                L1 8x8 Qp*/
2348
                                //ps_row_cu->u1_cu_possible_qp[0] = u1_cu_possible_qp;
2349
                                //ps_row_cu->i4_act_factor[0][1] = i4_act_factor;
2350
2351
424k
                                parent_best_mode = ps_cu_node->ps_parent->best_mode;
2352
424k
                                if(parent_cost <=
2353
424k
                                   child_cost_least +
2354
424k
                                       (ps_ctxt->i4_ol_satd_lambda * CHILD_BIAS >> LAMBDA_Q_SHIFT))
2355
182k
                                {
2356
                                    /*CU = 4TU */
2357
182k
                                    ihevce_update_cand_list(
2358
182k
                                        ps_cu_node->ps_parent, ps_ed_blk_l1, ps_ctxt);
2359
2360
                                    /* store the child 8x8 costs */
2361
182k
                                    pi4_intra_8_cost[(i & 1) + (MAX_CU_IN_CTB_ROW * (i >> 1))] =
2362
182k
                                        parent_cost;
2363
2364
                                    /* cost accumalation of best cu size candiate */
2365
182k
                                    i8_frame_acc_satd_cost += parent_cost;
2366
2367
                                    /*satd/mod_qp accumulation of best cu */
2368
182k
                                    i8_frame_acc_satd_by_modqp_q10 +=
2369
182k
                                        ((LWORD64)ps_cu_node->ps_parent->best_satd
2370
182k
                                         << (SATD_BY_ACT_Q_FAC + QSCALE_Q_FAC_3)) /
2371
182k
                                        i4_q_scale_q3_mod;
2372
2373
                                    /* Accumalate mode bits for all child blocks */
2374
182k
                                    i8_frame_acc_mode_bits_cost +=
2375
182k
                                        ps_cu_node->ps_parent->u2_mode_bits_cost;
2376
2377
                                    /* satd and mpm bits accumalation of best cu size candiate */
2378
182k
                                    i4_ctb_acc_satd += ps_cu_node->ps_parent->best_satd;
2379
2380
                                    /* accumulate the 16x16 cost*/
2381
182k
                                    if(MAX_INTRA_COST_IPE == *pi4_intra_16_cost)
2382
47.4k
                                    {
2383
47.4k
                                        *pi4_intra_16_cost = parent_cost;
2384
47.4k
                                    }
2385
135k
                                    else
2386
135k
                                    {
2387
135k
                                        *pi4_intra_16_cost += parent_cost;
2388
135k
                                    }
2389
2390
                                    /* accumulate the 32x32 cost*/
2391
182k
                                    if(MAX_INTRA_COST_IPE == *pi4_intra_32_cost)
2392
18.7k
                                    {
2393
18.7k
                                        *pi4_intra_32_cost = parent_cost;
2394
18.7k
                                    }
2395
164k
                                    else
2396
164k
                                    {
2397
164k
                                        *pi4_intra_32_cost += parent_cost;
2398
164k
                                    }
2399
182k
                                }
2400
241k
                                else
2401
241k
                                {
2402
                                    /*CU = 4PU*/
2403
                                    //ps_row_cu->b3_cu_pos_x = (UWORD8) ps_cu_node->ps_parent->u2_x0;
2404
                                    //ps_row_cu->b3_cu_pos_y = (UWORD8) ps_cu_node->ps_parent->u2_y0;
2405
                                    //ps_row_cu->u1_cu_size  = ps_cu_node->ps_parent->u1_cu_size;
2406
2407
                                    /* store the child 8x8 costs woth 4x4 pu summed cost */
2408
241k
                                    pi4_intra_8_cost[(i & 1) + (MAX_CU_IN_CTB_ROW * (i >> 1))] =
2409
241k
                                        (child_cost_least);
2410
2411
                                    /* accumulate the 16x16 cost*/
2412
241k
                                    if(MAX_INTRA_COST_IPE == *pi4_intra_16_cost)
2413
73.6k
                                    {
2414
73.6k
                                        *pi4_intra_16_cost = child_cost_least;
2415
73.6k
                                    }
2416
167k
                                    else
2417
167k
                                    {
2418
167k
                                        *pi4_intra_16_cost += child_cost_least;
2419
167k
                                    }
2420
2421
                                    /* cost accumalation of best cu size candiate */
2422
241k
                                    i8_frame_acc_satd_cost += child_cost_least;
2423
2424
1.20M
                                    for(j = 0; j < 4; j++)
2425
966k
                                    {
2426
                                        /*satd/qp accumualtion*/
2427
966k
                                        i8_frame_acc_satd_by_modqp_q10 +=
2428
966k
                                            ((LWORD64)child_satd[j]
2429
966k
                                             << (SATD_BY_ACT_Q_FAC + QSCALE_Q_FAC_3)) /
2430
966k
                                            i4_q_scale_q3_mod;
2431
2432
                                        /* Accumalate mode bits for all child blocks */
2433
966k
                                        i8_frame_acc_mode_bits_cost +=
2434
966k
                                            ps_cu_node->ps_sub_cu[j]->u2_mode_bits_cost;
2435
2436
                                        /* satd and mpm bits accumalation of best cu size candiate */
2437
966k
                                        i4_ctb_acc_satd += child_satd[j];
2438
966k
                                    }
2439
2440
                                    /* accumulate the 32x32 cost*/
2441
241k
                                    if(MAX_INTRA_COST_IPE == *pi4_intra_32_cost)
2442
26.2k
                                    {
2443
26.2k
                                        *pi4_intra_32_cost = child_cost_least;
2444
26.2k
                                    }
2445
215k
                                    else
2446
215k
                                    {
2447
215k
                                        *pi4_intra_32_cost += child_cost_least;
2448
215k
                                    }
2449
2450
241k
                                    ps_intra8_analyse->b1_enable_nxn = 1;
2451
2452
                                    /* Insert the best 8x8 modes unconditionally */
2453
2454
241k
                                    x = ((ps_cu_node->u2_x0 << 3) >> 2) + 1;
2455
241k
                                    y = ((ps_cu_node->u2_y0 << 3) >> 2) + 1;
2456
241k
                                    size = ps_cu_node->u1_cu_size >> 2;
2457
2458
241k
                                    ps_ctxt->au1_ctb_mode_map[y][x] =
2459
241k
                                        ps_cu_node->ps_sub_cu[0]->best_mode;
2460
241k
                                    ps_ctxt->au1_ctb_mode_map[y][x + 1] =
2461
241k
                                        ps_cu_node->ps_sub_cu[1]->best_mode;
2462
241k
                                    ps_ctxt->au1_ctb_mode_map[y + 1][x] =
2463
241k
                                        ps_cu_node->ps_sub_cu[2]->best_mode;
2464
241k
                                    ps_ctxt->au1_ctb_mode_map[y + 1][x + 1] =
2465
241k
                                        ps_cu_node->ps_sub_cu[3]->best_mode;
2466
241k
                                }
2467
                                /* NXN mode population */
2468
2.12M
                                for(j = 0; j < 4; j++)
2469
1.69M
                                {
2470
1.69M
                                    cand_mode_list[0] =
2471
1.69M
                                        ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[0];
2472
1.69M
                                    cand_mode_list[1] =
2473
1.69M
                                        ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[1];
2474
1.69M
                                    cand_mode_list[2] =
2475
1.69M
                                        ps_cu_node->ps_sub_cu[j]->au1_best_mode_1tu[2];
2476
2477
1.69M
                                    if(1)
2478
1.69M
                                    {
2479
                                        /* Populate best 3 nxn modes */
2480
1.69M
                                        ps_intra8_analyse->au1_4x4_best_modes[j][0] =
2481
1.69M
                                            cand_mode_list[0];
2482
1.69M
                                        ps_intra8_analyse->au1_4x4_best_modes[j][1] =
2483
1.69M
                                            cand_mode_list[1];  //(ps_ed + 1)->best_mode;
2484
1.69M
                                        ps_intra8_analyse->au1_4x4_best_modes[j][2] =
2485
1.69M
                                            cand_mode_list[2];  //(ps_ed + 2)->best_mode;
2486
1.69M
                                        ps_intra8_analyse->au1_4x4_best_modes[j][3] = 255;
2487
2488
                                        //memcpy(ps_intra8_analyse->au1_4x4_best_modes[j], ps_row_cu->s_cu_intra_cand.au1_intra_luma_modes_nxn[j], 4);
2489
1.69M
                                    }
2490
                                    /* For HQ, all 35 modes to be used for RDOPT, removed from here for memory clean-up */
2491
2492
0
                                    else /* IHEVCE_QUALITY_P0 == i4_quality_preset */
2493
0
                                    {
2494
                                        /* To indicate to enc loop that NXN is enabled in HIGH QUALITY fior CU 8x8*/
2495
0
                                        ps_intra8_analyse->au1_4x4_best_modes[j][0] = 0;
2496
0
                                    }
2497
2498
1.69M
                                    ps_intra8_analyse
2499
1.69M
                                        ->au1_4x4_best_modes[j][MAX_INTRA_CU_CANDIDATES] = 255;
2500
1.69M
                                }
2501
2502
                                //ps_row_cu++;
2503
424k
                            }
2504
59.8k
                            else
2505
59.8k
                            {
2506
                                /* For Incomplete CTB, 16x16 is not valid */
2507
59.8k
                                ps_intra16_analyse->b1_valid_cu = 0;
2508
59.8k
                            }
2509
484k
                            blk_cnt++;
2510
484k
                            ps_ed_blk_l1++;
2511
484k
                        }
2512
                        //ps_ed_blk_l2 ++;
2513
121k
                    }  //else of EIID
2514
140k
#endif
2515
140k
                }
2516
431k
            }
2517
364k
            else
2518
364k
            {
2519
                /* For incomplete CTB, init valid CU to 0 */
2520
364k
                ps_ed_blk_l1++;
2521
364k
                ps_intra32_analyse->b1_valid_cu = 0;
2522
364k
                ps_intra16_analyse[0].b1_valid_cu = 0;
2523
364k
                blk_cnt++;
2524
364k
                merge_64x64 = 0;
2525
364k
            }
2526
795k
        } while(blk_cnt != MAX_CTB_SIZE);
2527
        /* if 64x64 merge is possible then check for 32x32 having same best modes */
2528
49.9k
        if(1 == merge_64x64)
2529
5.18k
        {
2530
5.18k
            WORD32 act_mode = au1_best_32x32_modes[0];
2531
2532
5.18k
            ps_ed_blk_l2 = ps_ed_l2_ctb;
2533
5.18k
            best_mode = ps_ed_blk_l2->best_mode;
2534
5.18k
            merge_64x64 =
2535
5.18k
                ((act_mode == au1_best_32x32_modes[0]) + (act_mode == au1_best_32x32_modes[1]) +
2536
5.18k
                     (act_mode == au1_best_32x32_modes[2]) +
2537
5.18k
                     (act_mode == au1_best_32x32_modes[3]) ==
2538
5.18k
                 4);
2539
5.18k
            if(merge_64x64 == 1)
2540
4.55k
                best_mode = au1_best_32x32_modes[0];
2541
635
            else
2542
635
                best_mode = ps_ed_blk_l2->best_mode;
2543
            /* All 32x32 costs are accumalated to 64x64 cost */
2544
5.18k
            ps_l0_ipe_out_ctb->i4_best64x64_intra_cost = 0;
2545
25.9k
            for(i = 0; i < 4; i++)
2546
20.7k
            {
2547
20.7k
                ps_l0_ipe_out_ctb->i4_best64x64_intra_cost +=
2548
20.7k
                    ps_l0_ipe_out_ctb->ai4_best32x32_intra_cost[i];
2549
20.7k
            }
2550
2551
            /* If all modes of 32x32 block is not same */
2552
5.18k
            if(0 == merge_64x64)
2553
635
            {
2554
                /*Compute CHILD cost for 32x32 */
2555
635
                WORD32 child_cost_64x64 = au4_best_32x32_cost[0] + au4_best_32x32_cost[1] +
2556
635
                                          au4_best_32x32_cost[2] + au4_best_32x32_cost[3];
2557
635
                WORD32 cost = MAX_INTRA_COST_IPE;
2558
2559
635
                WORD32 best_mode_temp = 0;
2560
                /*Compute 64x64 cost for each mode of 32x32*/
2561
3.17k
                for(i = 0; i < 4; i++)
2562
2.54k
                {
2563
2.54k
                    WORD32 mode = au1_best_32x32_modes[i];
2564
2.54k
                    if(mode < 2)
2565
1.43k
                        mode = 26;
2566
2.54k
                    ps_cu_node->ps_parent->u1_cu_size = 64;
2567
2.54k
                    ps_cu_node->ps_parent->u2_x0 = gau1_cu_pos_x[0]; /* Populate properly */
2568
2.54k
                    ps_cu_node->ps_parent->u2_y0 = gau1_cu_pos_y[0]; /* Populate properly */
2569
2570
2.54k
                    ihevce_set_nbr_map(
2571
2.54k
                        ps_ctxt->pu1_ctb_nbr_map,
2572
2.54k
                        ps_ctxt->i4_nbr_map_strd,
2573
2.54k
                        (ps_cu_node->ps_parent->u2_x0 << 1),
2574
2.54k
                        (ps_cu_node->ps_parent->u2_y0 << 1),
2575
2.54k
                        (ps_cu_node->ps_parent->u1_cu_size >> 2),
2576
2.54k
                        0);
2577
2578
2.54k
                    ihevce_mode_eval_filtering(
2579
2.54k
                        ps_cu_node->ps_parent,
2580
2.54k
                        ps_cu_node,
2581
2.54k
                        ps_ctxt,
2582
2.54k
                        ps_curr_src,
2583
2.54k
                        mode,
2584
2.54k
                        &ps_cu_node->ps_parent->au4_best_cost_1tu[0],
2585
2.54k
                        &ps_cu_node->ps_parent->au1_best_mode_1tu[0],
2586
2.54k
                        !step2_bypass,
2587
2.54k
                        0);
2588
2589
2.54k
                    parent_cost = ps_cu_node->ps_parent->best_cost;
2590
2.54k
                    if(cost > parent_cost)
2591
669
                    {
2592
669
                        cost = parent_cost;
2593
669
                        best_mode_temp = ps_cu_node->ps_parent->best_mode;
2594
669
                    }
2595
2.54k
                }
2596
635
                if(cost < child_cost_64x64)
2597
389
                {
2598
389
                    merge_64x64 = 1;
2599
389
                    best_mode = best_mode_temp;
2600
2601
                    /* Update 64x64 cost if CU 64x64 is chosen  */
2602
389
                    ps_l0_ipe_out_ctb->i4_best64x64_intra_cost = cost;
2603
2604
                    /* Accumalate the least cost for CU 64x64 */
2605
389
                    i8_frame_acc_satd_cost = cost;
2606
389
                    i8_frame_acc_mode_bits_cost = ps_cu_node->ps_parent->u2_mode_bits_cost;
2607
2608
                    /* satd and mpm bits accumalation of best cu size candiate */
2609
389
                    i4_ctb_acc_satd = ps_cu_node->ps_parent->best_satd;
2610
389
                }
2611
635
            }
2612
5.18k
        }
2613
2614
49.9k
        if(merge_64x64)
2615
4.93k
        {
2616
4.93k
            WORD32 i, j;
2617
4.93k
            intra32_analyse_t *ps_intra32_analyse;
2618
4.93k
            intra16_analyse_t *ps_intra16_analyse;
2619
4.93k
            WORD32 row, col;
2620
4.93k
            WORD32 i4_q_scale_q3_mod;
2621
4.93k
            WORD8 i1_cu_possible_qp;
2622
4.93k
            WORD32 i4_act_factor;
2623
            //ps_row_cu = ps_curr_cu;
2624
4.93k
            ps_ctb_out->u4_cu_split_flags = 0x0;
2625
4.93k
            ps_ed_blk_l1 = ps_ed_l1_ctb;
2626
4.93k
            ps_ed_blk_l2 = ps_ed_l2_ctb;
2627
2628
4.93k
            ps_l0_ipe_out_ctb->u1_split_flag = 0;
2629
2630
            /* If CU size of 64x64 is chosen, disbale all the 16x16 flag*/
2631
24.6k
            for(i = 0; i < 4; i++)
2632
19.7k
            {
2633
                /* get the corresponding intra 32 analyse pointer  use (blk_cnt / 16) */
2634
                /* blk cnt is in terms of 8x8 units so a 32x32 will have 16 8x8 units */
2635
19.7k
                ps_intra32_analyse = &ps_l0_ipe_out_ctb->as_intra32_analyse[i];
2636
2637
98.7k
                for(j = 0; j < 4; j++)
2638
79.0k
                {
2639
                    /* get the corresponding intra 16 analyse pointer use (blk_cnt & 0xF / 4)*/
2640
                    /* blk cnt is in terms of 8x8 units so a 16x16 will have 4 8x8 units */
2641
79.0k
                    ps_intra16_analyse = &ps_intra32_analyse->as_intra16_analyse[j];
2642
79.0k
                    ps_intra16_analyse->b1_merge_flag = 0;
2643
79.0k
                }
2644
19.7k
            }
2645
2646
            /* CU size 64x64 and fill the final cu params */
2647
            //ps_row_cu->b3_cu_pos_x = gau1_cu_pos_x[0];
2648
            //ps_row_cu->b3_cu_pos_y = gau1_cu_pos_y[0];
2649
            //ps_row_cu->u1_cu_size  = 64;
2650
2651
            /* Candidate mode Update */
2652
4.93k
            cand_mode_list[0] = best_mode;
2653
4.93k
            if(cand_mode_list[0] > 1)
2654
1.53k
            {
2655
1.53k
                if(cand_mode_list[0] == 2)
2656
13
                {
2657
13
                    cand_mode_list[1] = 34;
2658
13
                    cand_mode_list[2] = 3;
2659
13
                }
2660
1.52k
                else if(cand_mode_list[0] == 34)
2661
7
                {
2662
7
                    cand_mode_list[1] = 2;
2663
7
                    cand_mode_list[2] = 33;
2664
7
                }
2665
1.51k
                else
2666
1.51k
                {
2667
1.51k
                    cand_mode_list[1] = cand_mode_list[0] - 1;
2668
1.51k
                    cand_mode_list[2] = cand_mode_list[0] + 1;
2669
1.51k
                }
2670
                //cand_mode_list[1] = ps_ed_blk_l1->nang_attr.best_mode;
2671
                //cand_mode_list[2] = ps_ed_blk_l1->ang_attr.best_mode;
2672
1.53k
            }
2673
3.40k
            else
2674
3.40k
            {
2675
3.40k
                cand_mode_list[0] = 0;
2676
3.40k
                cand_mode_list[1] = 1;
2677
3.40k
                cand_mode_list[2] = 26;
2678
                //cand_mode_list[2] = ps_ed_blk_l1->nang_attr.best_mode;
2679
3.40k
            }
2680
2681
            /* All 32x32 costs are accumalated to 64x64 cost */
2682
4.93k
            ps_l0_ipe_out_ctb->i4_best64x64_intra_cost = 0;
2683
24.6k
            for(i = 0; i < 4; i++)
2684
19.7k
            {
2685
19.7k
                ps_l0_ipe_out_ctb->i4_best64x64_intra_cost +=
2686
19.7k
                    ps_l0_ipe_out_ctb->ai4_best32x32_intra_cost[i];
2687
19.7k
            }
2688
            /* by default 64x64 modes are set to default values DC and Planar */
2689
4.93k
            ps_l0_ipe_out_ctb->au1_best_modes_32x32_tu[0] = cand_mode_list[0];
2690
4.93k
            ps_l0_ipe_out_ctb->au1_best_modes_32x32_tu[1] = cand_mode_list[1];
2691
4.93k
            ps_l0_ipe_out_ctb->au1_best_modes_32x32_tu[2] = cand_mode_list[2];
2692
4.93k
            ps_l0_ipe_out_ctb->au1_best_modes_32x32_tu[3] = 255;
2693
2694
            /* Update CTB mode map for the finalised CU */
2695
4.93k
            x = ((ps_cu_node->u2_x0 << 3) >> 2) + 1;
2696
4.93k
            y = ((ps_cu_node->u2_y0 << 3) >> 2) + 1;
2697
4.93k
            size = ps_cu_node->u1_cu_size >> 2;
2698
2699
47.5k
            for(row = y; row < (y + size); row++)
2700
42.6k
            {
2701
433k
                for(col = x; col < (x + size); col++)
2702
390k
                {
2703
390k
                    ps_ctxt->au1_ctb_mode_map[row][col] = best_mode;
2704
390k
                }
2705
42.6k
            }
2706
2707
4.93k
            ihevce_set_nbr_map(
2708
4.93k
                ps_ctxt->pu1_ctb_nbr_map,
2709
4.93k
                ps_ctxt->i4_nbr_map_strd,
2710
4.93k
                (ps_cu_node->u2_x0 << 1),
2711
4.93k
                (ps_cu_node->u2_y0 << 1),
2712
4.93k
                (ps_cu_node->u1_cu_size >> 2),
2713
4.93k
                1);
2714
2715
            /*As 64*64 has won, pick L1 32x32 qp*/
2716
            //ASSERT(((blk_cnt>>6) & 0xF) == (blk_cnt>>6));
2717
            //ASSERT((blk_cnt>>6) == 0);
2718
4.93k
            ASSERT(ps_ed_ctb_l1->i4_32x32_satd[0][0] != -2);
2719
4.93k
            i1_cu_possible_qp = ihevce_cu_level_qp_mod(
2720
4.93k
                ps_ctxt->i4_qscale,
2721
4.93k
                ps_ed_ctb_l1->i4_32x32_satd[0][0],
2722
4.93k
                ps_ctxt->ld_curr_frame_32x32_log_avg[0],
2723
4.93k
                f_strength,
2724
4.93k
                &i4_act_factor,
2725
4.93k
                &i4_q_scale_q3_mod,
2726
4.93k
                ps_ctxt->ps_rc_quant_ctxt);
2727
2728
4.93k
            i8_frame_acc_satd_by_modqp_q10 =
2729
4.93k
                (i8_frame_acc_satd_cost << (SATD_BY_ACT_Q_FAC + QSCALE_Q_FAC_3)) /
2730
4.93k
                i4_q_scale_q3_mod;
2731
            /* Increment pointers */
2732
4.93k
            ps_ed_blk_l1 += 64;
2733
4.93k
            ps_ed_blk_l2 += 16;
2734
            //ps_row_cu++;
2735
4.93k
        }
2736
49.9k
    }
2737
2738
    //ps_ctb_out->u1_num_cus_in_ctb = (UWORD8)(ps_row_cu - ps_curr_cu);
2739
2740
49.9k
    {
2741
49.9k
        WORD32 i4_i, i4_j;
2742
49.9k
        WORD32 dummy;
2743
49.9k
        WORD8 i1_cu_qp;
2744
49.9k
        (void)i1_cu_qp;
2745
        /*MAM_VAR_L1*/
2746
149k
        for(i4_j = 0; i4_j < 2; i4_j++)
2747
99.9k
        {
2748
99.9k
            i4_mod_factor_num = ps_ctxt->ai4_mod_factor_derived_by_variance[i4_j];
2749
99.9k
            f_strength = ps_ctxt->f_strength;
2750
2751
            //i4_mod_factor_num = 4;
2752
2753
99.9k
            ps_ed_blk_l1 = ps_ed_l1_ctb;
2754
99.9k
            ps_ed_blk_l2 = ps_ed_l2_ctb;
2755
            //ps_row_cu = ps_curr_cu;
2756
2757
            /*Valid only for complete CTB */
2758
99.9k
            if((64 == u1_curr_ctb_wdt) && (64 == u1_curr_ctb_hgt))
2759
79.2k
            {
2760
79.2k
                ASSERT(ps_ed_ctb_l1->i4_32x32_satd[0][0] != -2);
2761
79.2k
                ASSERT(ps_ed_ctb_l1->i4_32x32_satd[0][1] != -2);
2762
79.2k
                ASSERT(ps_ed_ctb_l1->i4_32x32_satd[0][2] != -2);
2763
79.2k
                ASSERT(ps_ed_ctb_l1->i4_32x32_satd[0][3] != -2);
2764
2765
79.2k
                i1_cu_qp = ihevce_cu_level_qp_mod(
2766
79.2k
                    ps_ctxt->i4_qscale,
2767
79.2k
                    ps_ed_ctb_l1->i4_32x32_satd[0][0],
2768
79.2k
                    ps_ctxt->ld_curr_frame_32x32_log_avg[0],
2769
79.2k
                    f_strength,
2770
79.2k
                    &ps_l0_ipe_out_ctb->i4_64x64_act_factor[0][i4_j],
2771
79.2k
                    &dummy,
2772
79.2k
                    ps_ctxt->ps_rc_quant_ctxt);
2773
2774
79.2k
                i1_cu_qp = ihevce_cu_level_qp_mod(
2775
79.2k
                    ps_ctxt->i4_qscale,
2776
79.2k
                    ps_ed_ctb_l1->i4_32x32_satd[0][1],
2777
79.2k
                    ps_ctxt->ld_curr_frame_32x32_log_avg[1],
2778
79.2k
                    f_strength,
2779
79.2k
                    &ps_l0_ipe_out_ctb->i4_64x64_act_factor[1][i4_j],
2780
79.2k
                    &dummy,
2781
79.2k
                    ps_ctxt->ps_rc_quant_ctxt);
2782
79.2k
                i1_cu_qp = ihevce_cu_level_qp_mod(
2783
79.2k
                    ps_ctxt->i4_qscale,
2784
79.2k
                    ps_ed_ctb_l1->i4_32x32_satd[0][2],
2785
79.2k
                    ps_ctxt->ld_curr_frame_32x32_log_avg[2],
2786
79.2k
                    f_strength,
2787
79.2k
                    &ps_l0_ipe_out_ctb->i4_64x64_act_factor[2][i4_j],
2788
79.2k
                    &dummy,
2789
79.2k
                    ps_ctxt->ps_rc_quant_ctxt);
2790
2791
79.2k
                i1_cu_qp = ihevce_cu_level_qp_mod(
2792
79.2k
                    ps_ctxt->i4_qscale,
2793
79.2k
                    ps_ed_ctb_l1->i4_32x32_satd[0][3],
2794
79.2k
                    2.0 + ps_ctxt->ld_curr_frame_16x16_log_avg[0],
2795
79.2k
                    f_strength,
2796
79.2k
                    &ps_l0_ipe_out_ctb->i4_64x64_act_factor[3][i4_j],
2797
79.2k
                    &dummy,
2798
79.2k
                    ps_ctxt->ps_rc_quant_ctxt);
2799
2800
79.2k
                ASSERT(ps_l0_ipe_out_ctb->i4_64x64_act_factor[3][i4_j] > 0);
2801
79.2k
            }
2802
20.6k
            else
2803
20.6k
            {
2804
20.6k
                ps_l0_ipe_out_ctb->i4_64x64_act_factor[0][i4_j] = 1024;
2805
20.6k
                ps_l0_ipe_out_ctb->i4_64x64_act_factor[1][i4_j] = 1024;
2806
20.6k
                ps_l0_ipe_out_ctb->i4_64x64_act_factor[2][i4_j] = 1024;
2807
20.6k
                ps_l0_ipe_out_ctb->i4_64x64_act_factor[3][i4_j] = 1024;
2808
20.6k
            }
2809
2810
            /*Store the 8x8 Qps from L2 (in raster order) as output of intra prediction
2811
            for the usage by ME*/
2812
2813
99.9k
            {
2814
99.9k
                WORD32 pos_x_32, pos_y_32, pos;
2815
                //WORD32 i4_incomplete_ctb_val_8;
2816
99.9k
                pos_x_32 = u1_curr_ctb_wdt / 16;
2817
99.9k
                pos_y_32 = u1_curr_ctb_hgt / 16;
2818
2819
99.9k
                pos = (pos_x_32 < pos_y_32) ? pos_x_32 : pos_y_32;
2820
2821
499k
                for(i4_i = 0; i4_i < 4; i4_i++)
2822
399k
                {
2823
399k
                    if(i4_i < pos)
2824
338k
                    {
2825
338k
                        ASSERT(ps_ed_ctb_l1->i4_16x16_satd[i4_i][0] != -2);
2826
338k
                        ASSERT(ps_ed_ctb_l1->i4_16x16_satd[i4_i][1] != -2);
2827
338k
                        ASSERT(ps_ed_ctb_l1->i4_16x16_satd[i4_i][2] != -2);
2828
338k
                        i1_cu_qp = ihevce_cu_level_qp_mod(
2829
338k
                            ps_ctxt->i4_qscale,
2830
338k
                            ps_ed_ctb_l1->i4_16x16_satd[i4_i][0],
2831
338k
                            ps_ctxt->ld_curr_frame_16x16_log_avg[0],
2832
338k
                            f_strength,
2833
338k
                            &ps_l0_ipe_out_ctb->i4_32x32_act_factor[i4_i][0][i4_j],
2834
338k
                            &dummy,
2835
338k
                            ps_ctxt->ps_rc_quant_ctxt);
2836
338k
                        i1_cu_qp = ihevce_cu_level_qp_mod(
2837
338k
                            ps_ctxt->i4_qscale,
2838
338k
                            ps_ed_ctb_l1->i4_16x16_satd[i4_i][1],
2839
338k
                            ps_ctxt->ld_curr_frame_16x16_log_avg[1],
2840
338k
                            f_strength,
2841
338k
                            &ps_l0_ipe_out_ctb->i4_32x32_act_factor[i4_i][1][i4_j],
2842
338k
                            &dummy,
2843
338k
                            ps_ctxt->ps_rc_quant_ctxt);
2844
338k
                        i1_cu_qp = ihevce_cu_level_qp_mod(
2845
338k
                            ps_ctxt->i4_qscale,
2846
338k
                            ps_ed_ctb_l1->i4_16x16_satd[i4_i][2],
2847
338k
                            ps_ctxt->ld_curr_frame_16x16_log_avg[2],
2848
338k
                            f_strength,
2849
338k
                            &ps_l0_ipe_out_ctb->i4_32x32_act_factor[i4_i][2][i4_j],
2850
338k
                            &dummy,
2851
338k
                            ps_ctxt->ps_rc_quant_ctxt);
2852
338k
                    }
2853
61.0k
                    else
2854
61.0k
                    {
2855
                        /*For incomplete CTB */
2856
61.0k
                        ps_l0_ipe_out_ctb->i4_32x32_act_factor[i4_i][0][i4_j] = 1024;
2857
61.0k
                        ps_l0_ipe_out_ctb->i4_32x32_act_factor[i4_i][1][i4_j] = 1024;
2858
61.0k
                        ps_l0_ipe_out_ctb->i4_32x32_act_factor[i4_i][2][i4_j] = 1024;
2859
61.0k
                    }
2860
399k
                }
2861
99.9k
            }
2862
2863
            /*Store the 8x8 Qps from L1 (in raster order) as output of intra prediction
2864
            for the usage by ME*/
2865
99.9k
            {
2866
99.9k
                WORD32 pos_x_16, pos_y_16, pos;
2867
                //WORD32 i4_incomplete_ctb_val_8;
2868
99.9k
                pos_x_16 = u1_curr_ctb_wdt / 4;
2869
99.9k
                pos_y_16 = u1_curr_ctb_hgt / 4;
2870
2871
99.9k
                pos = (pos_x_16 < pos_y_16) ? pos_x_16 : pos_y_16;
2872
1.69M
                for(i4_i = 0; i4_i < 16; i4_i++)
2873
1.59M
                {
2874
1.59M
                    if(i4_i < pos)
2875
1.38M
                    {
2876
1.38M
                        ASSERT(ps_ed_ctb_l1->i4_8x8_satd[i4_i][0] != -2);
2877
1.38M
                        ASSERT(ps_ed_ctb_l1->i4_8x8_satd[i4_i][1] != -2);
2878
1.38M
                        i1_cu_qp = ihevce_cu_level_qp_mod(
2879
1.38M
                            ps_ctxt->i4_qscale,
2880
1.38M
                            ps_ed_ctb_l1->i4_8x8_satd[i4_i][0],
2881
1.38M
                            ps_ctxt->ld_curr_frame_8x8_log_avg[0],
2882
1.38M
                            f_strength,
2883
1.38M
                            &ps_l0_ipe_out_ctb->i4_16x16_act_factor[i4_i][0][i4_j],
2884
1.38M
                            &dummy,
2885
1.38M
                            ps_ctxt->ps_rc_quant_ctxt);
2886
1.38M
                        i1_cu_qp = ihevce_cu_level_qp_mod(
2887
1.38M
                            ps_ctxt->i4_qscale,
2888
1.38M
                            ps_ed_ctb_l1->i4_8x8_satd[i4_i][1],
2889
1.38M
                            ps_ctxt->ld_curr_frame_8x8_log_avg[1],
2890
1.38M
                            f_strength,
2891
1.38M
                            &ps_l0_ipe_out_ctb->i4_16x16_act_factor[i4_i][1][i4_j],
2892
1.38M
                            &dummy,
2893
1.38M
                            ps_ctxt->ps_rc_quant_ctxt);
2894
1.38M
                    }
2895
210k
                    else
2896
210k
                    {
2897
                        /*For incomplete CTB */
2898
210k
                        ps_l0_ipe_out_ctb->i4_16x16_act_factor[i4_i][0][i4_j] = 1024;
2899
210k
                        ps_l0_ipe_out_ctb->i4_16x16_act_factor[i4_i][1][i4_j] = 1024;
2900
210k
                    }
2901
1.59M
                }
2902
99.9k
            }
2903
99.9k
        }  //for loop
2904
2905
        /* Accumalate the cost of ctb to the total cost */
2906
49.9k
        ps_ctxt->i8_frame_acc_satd_cost += i8_frame_acc_satd_cost;
2907
49.9k
        ps_ctxt->i8_frame_acc_satd_by_modqp_q10 += i8_frame_acc_satd_by_modqp_q10;
2908
2909
49.9k
        ps_ctxt->i8_frame_acc_mode_bits_cost += i8_frame_acc_mode_bits_cost;
2910
2911
        /* satd and mpm bits accumalation of best cu size candiate for the ctb */
2912
49.9k
        ps_l0_ipe_out_ctb->i4_ctb_acc_satd = i4_ctb_acc_satd;
2913
49.9k
        ps_l0_ipe_out_ctb->i4_ctb_acc_mpm_bits = i8_frame_acc_mode_bits_cost;
2914
2915
49.9k
        ps_ctxt->i8_frame_acc_satd += i4_ctb_acc_satd;
2916
49.9k
    }
2917
2918
49.9k
    {
2919
49.9k
        WORD32 ctr_8x8;
2920
849k
        for(ctr_8x8 = 0; ctr_8x8 < (MAX_CU_IN_CTB >> 2); ctr_8x8++)
2921
799k
        {
2922
            /*Accumalate activity factor for Intra and Inter*/
2923
799k
            if(ps_l0_ipe_out_ctb->ai4_best_sad_cost_8x8_l1_ipe[ctr_8x8] <
2924
799k
               ps_ed_ctb_l1->i4_sad_me_for_ref[ctr_8x8])
2925
55.2k
            {
2926
55.2k
                ps_l0_ipe_out_ctb->ai4_8x8_act_factor[ctr_8x8] =
2927
55.2k
                    ps_l0_ipe_out_ctb->i4_16x16_act_factor[ctr_8x8][1][0];
2928
55.2k
            }
2929
744k
            else
2930
744k
            {
2931
744k
                ps_l0_ipe_out_ctb->ai4_8x8_act_factor[ctr_8x8] =
2932
744k
                    ps_l0_ipe_out_ctb->i4_16x16_act_factor[ctr_8x8][1][0];
2933
744k
            }
2934
2935
            /*Accumalate activity factor at frame level*/
2936
799k
            ps_ctxt->i8_frame_acc_act_factor += ps_l0_ipe_out_ctb->ai4_8x8_act_factor[ctr_8x8];
2937
799k
        }
2938
49.9k
    }
2939
49.9k
    return;
2940
49.9k
}
2941
2942
WORD32 ihevce_nxn_sad_computer(
2943
    UWORD8 *pu1_inp, WORD32 i4_inp_stride, UWORD8 *pu1_ref, WORD32 i4_ref_stride, WORD32 trans_size)
2944
866k
{
2945
866k
    WORD32 wd, ht, i, j;
2946
866k
    WORD32 sad = 0;
2947
2948
866k
    wd = trans_size;
2949
866k
    ht = trans_size;
2950
2951
10.5M
    for(i = 0; i < ht; i++)
2952
9.63M
    {
2953
144M
        for(j = 0; j < wd; j++)
2954
135M
        {
2955
135M
            sad += (ABS(((WORD32)pu1_inp[j] - (WORD32)pu1_ref[j])));
2956
135M
        }
2957
9.63M
        pu1_inp += i4_inp_stride;
2958
9.63M
        pu1_ref += i4_ref_stride;
2959
9.63M
    }
2960
2961
866k
    return sad;
2962
866k
}
2963
2964
/*!
2965
******************************************************************************
2966
* \if Function name : ihevce_mode_eval_filtering \endif
2967
*
2968
* \brief
2969
*    Evaluates best 3 modes for the given CU size with probable modes from,
2970
*    early decision structure, mpm candidates and dc, planar mode
2971
*
2972
* \param[in] ps_cu_node : pointer to MAX cu node info buffer
2973
* \param[in] ps_child_cu_node : pointer to (MAX - 1) cu node info buffer
2974
* \param[in] ps_ctxt : pointer to IPE context struct
2975
* \param[in] ps_curr_src : pointer to src pixels struct
2976
* \param[in] best_amode : best angular mode from l1 layer or
2977
                            from (MAX - 1) CU mode
2978
* \param[in] best_costs_4x4  : pointer to 3 best cost buffer
2979
* \param[in] best_modes_4x4  : pointer to 3 best mode buffer
2980
* \param[in] step2_bypass : if 0, (MAX - 1) CU is evaluated
2981
*                           if 1, (MAX CU) sugested is evaluated
2982
* \param[in] tu_eq_cu     : indicates if tu size is same as cu or cu/2
2983
*
2984
* \return
2985
*    None
2986
*
2987
* \author
2988
*  Ittiam
2989
*
2990
*****************************************************************************
2991
*/
2992
void ihevce_mode_eval_filtering(
2993
    ihevce_ipe_cu_tree_t *ps_cu_node,
2994
    ihevce_ipe_cu_tree_t *ps_child_cu_node,
2995
    ihevce_ipe_ctxt_t *ps_ctxt,
2996
    iv_enc_yuv_buf_t *ps_curr_src,
2997
    WORD32 best_amode,
2998
    WORD32 *best_costs_4x4,
2999
    UWORD8 *best_modes_4x4,
3000
    WORD32 step2_bypass,
3001
    WORD32 tu_eq_cu)
3002
2.09M
{
3003
2.09M
    UWORD8 *pu1_origin, *pu1_orig;
3004
2.09M
    WORD32 src_strd = ps_curr_src->i4_y_strd;
3005
2.09M
    WORD32 nbr_flags;
3006
2.09M
    nbr_avail_flags_t s_nbr;
3007
2.09M
    WORD32 trans_size = tu_eq_cu ? ps_cu_node->u1_cu_size : ps_cu_node->u1_cu_size >> 1;
3008
2.09M
    WORD32 num_tu_in_x = tu_eq_cu ? 1 : 2;
3009
2.09M
    WORD32 num_tu_in_y = tu_eq_cu ? 1 : 2;
3010
2.09M
    UWORD8 mode;
3011
3012
2.09M
    WORD32 cost_ang_mode = MAX_INTRA_COST_IPE;
3013
2.09M
    WORD32 filter_flag;
3014
2.09M
    WORD32 cost_amode_step2[7] = { 0 };
3015
    /*WORD32 best_sad[5];  // NOTE_A01: Not getting consumed at present */
3016
2.09M
    WORD32 sad = 0;
3017
2.09M
    WORD32 cu_pos_x, cu_pos_y;
3018
2.09M
    WORD32 temp;
3019
2.09M
    WORD32 i = 0, j, k, i_end, z;
3020
    //WORD32 row, col, size;
3021
2.09M
    UWORD8 *pu1_ref;
3022
2.09M
    WORD32 xA, yA, xB, yB;
3023
2.09M
    WORD32 top_intra_mode;
3024
2.09M
    WORD32 left_intra_mode;
3025
2.09M
    UWORD8 *pu1_ref_orig = &ps_ctxt->au1_ref_samples[0];
3026
2.09M
    UWORD8 *pu1_ref_filt = &ps_ctxt->au1_filt_ref_samples[0];
3027
3028
2.09M
    UWORD8 modes_4x4[5] = { 0, 1, 2, 3, 4 };
3029
2.09M
    WORD32 count;
3030
3031
2.09M
    pf_ipe_res_trans_had apf_resd_trns_had[4];
3032
3033
2.09M
    WORD32 cand_mode_satd_list[3];
3034
2.09M
    ihevc_intra_pred_luma_ref_substitution_ft *ihevc_intra_pred_luma_ref_substitution_fptr;
3035
3036
2.09M
    ihevc_intra_pred_luma_ref_substitution_fptr =
3037
2.09M
        ps_ctxt->ps_func_selector->ihevc_intra_pred_luma_ref_substitution_fptr;
3038
3039
2.09M
    apf_resd_trns_had[0] = ps_ctxt->s_cmn_opt_func.pf_HAD_4x4_8bit;
3040
2.09M
    apf_resd_trns_had[1] = ps_ctxt->s_cmn_opt_func.pf_HAD_8x8_8bit;
3041
2.09M
    apf_resd_trns_had[2] = ps_ctxt->s_cmn_opt_func.pf_HAD_16x16_8bit;
3042
2.09M
    apf_resd_trns_had[3] = ps_ctxt->s_cmn_opt_func.pf_HAD_32x32_8bit;
3043
3044
    /* initialize modes_to_eval as zero */
3045
2.09M
    memset(&ps_ctxt->au1_modes_to_eval, 0, MAX_NUM_IP_MODES);
3046
3047
    /* Compute the Parent Cost */
3048
3049
    /* Pointer to top-left of the CU - y0,x0 in 8x8 granularity */
3050
2.09M
    pu1_orig = (UWORD8 *)(ps_curr_src->pv_y_buf) + ((ps_cu_node->u2_y0 << 3) * src_strd) +
3051
2.09M
               (ps_cu_node->u2_x0 << 3);
3052
3053
    /* Get position of CU within CTB at 4x4 granularity */
3054
2.09M
    cu_pos_x = ps_cu_node->u2_x0 << 1;
3055
2.09M
    cu_pos_y = ps_cu_node->u2_y0 << 1;
3056
3057
    /* get the neighbour availability flags */
3058
2.09M
    ihevce_get_only_nbr_flag(
3059
2.09M
        &s_nbr,
3060
2.09M
        ps_ctxt->pu1_ctb_nbr_map,
3061
2.09M
        ps_ctxt->i4_nbr_map_strd,
3062
2.09M
        cu_pos_x,
3063
2.09M
        cu_pos_y,
3064
2.09M
        trans_size >> 2,
3065
2.09M
        trans_size >> 2);
3066
3067
    /* Traverse for all 4 child blocks in the parent block */
3068
2.09M
    xA = (ps_cu_node->u2_x0 << 3) >> 2;
3069
2.09M
    yA = ((ps_cu_node->u2_y0 << 3) >> 2) + 1;
3070
2.09M
    xB = xA + 1;
3071
2.09M
    yB = yA - 1;
3072
2.09M
    left_intra_mode = ps_ctxt->au1_ctb_mode_map[yA][xA];
3073
2.09M
    top_intra_mode = ps_ctxt->au1_ctb_mode_map[yB][xB];
3074
    /* call the function which populates sad cost for all the modes */
3075
3076
2.09M
    ihevce_intra_populate_mode_bits_cost_bracketing(
3077
2.09M
        top_intra_mode,
3078
2.09M
        left_intra_mode,
3079
2.09M
        s_nbr.u1_top_avail,
3080
2.09M
        s_nbr.u1_left_avail,
3081
2.09M
        ps_cu_node->u2_y0,
3082
2.09M
        &ps_ctxt->au2_mode_bits_satd_cost[0],
3083
2.09M
        &ps_ctxt->au2_mode_bits_satd[0],
3084
2.09M
        ps_ctxt->i4_ol_satd_lambda,
3085
2.09M
        cand_mode_satd_list);
3086
3087
4.87M
    for(k = 0; k < num_tu_in_y; k++)
3088
2.78M
    {
3089
6.94M
        for(j = 0; j < num_tu_in_x; j++)
3090
4.16M
        {
3091
            /* get the neighbour availability flags */
3092
4.16M
            nbr_flags = ihevce_get_nbr_intra(
3093
4.16M
                &s_nbr,
3094
4.16M
                ps_ctxt->pu1_ctb_nbr_map,
3095
4.16M
                ps_ctxt->i4_nbr_map_strd,
3096
4.16M
                cu_pos_x + ((j) * (trans_size >> 2)),
3097
4.16M
                cu_pos_y + ((k) * (trans_size >> 2)),
3098
4.16M
                trans_size >> 2);
3099
3100
4.16M
            pu1_origin = pu1_orig + (k * trans_size * src_strd) + (j * trans_size);
3101
3102
            /* Create reference samples array */
3103
4.16M
            ihevc_intra_pred_luma_ref_substitution_fptr(
3104
4.16M
                pu1_origin - src_strd - 1,
3105
4.16M
                pu1_origin - src_strd,
3106
4.16M
                pu1_origin - 1,
3107
4.16M
                src_strd,
3108
4.16M
                trans_size,
3109
4.16M
                nbr_flags,
3110
4.16M
                pu1_ref_orig,
3111
4.16M
                0);
3112
3113
            /* Perform reference samples filtering */
3114
4.16M
            ihevce_intra_pred_ref_filtering(pu1_ref_orig, trans_size, pu1_ref_filt);
3115
3116
4.16M
            ihevce_set_nbr_map(
3117
4.16M
                ps_ctxt->pu1_ctb_nbr_map,
3118
4.16M
                ps_ctxt->i4_nbr_map_strd,
3119
4.16M
                cu_pos_x + ((j) * (trans_size >> 2)),
3120
4.16M
                cu_pos_y + ((k) * (trans_size >> 2)),
3121
4.16M
                (trans_size >> 2),
3122
4.16M
                1);
3123
3124
4.16M
            pu1_ref_orig += (4 * MAX_CTB_SIZE + 1);
3125
4.16M
            pu1_ref_filt += (4 * MAX_CTB_SIZE + 1);
3126
4.16M
        }
3127
2.78M
    }
3128
3129
    /* Revaluation for angular mode */
3130
    //if(ps_ed_blk->ang_attr.mode_present == 1)
3131
    //if(((best_amode & 0x1) != 1))
3132
3133
2.09M
    {
3134
2.09M
        WORD32 u1_trans_idx = trans_size >> 3;
3135
2.09M
        if(trans_size == 32)
3136
86.0k
            u1_trans_idx = 3;
3137
        //best_amode = ps_ed_blk->ang_attr.best_mode;
3138
3139
2.09M
        i = 0;
3140
2.09M
        if(!step2_bypass)
3141
1.15M
        {
3142
            /* Around best level 4 angular mode, search for best level 2 mode */
3143
1.15M
            ASSERT((best_amode >= 2) && (best_amode <= 34));
3144
3145
1.15M
            if(ps_ctxt->i4_quality_preset <= IHEVCE_QUALITY_P3)
3146
842k
            {
3147
842k
                if(best_amode >= 4)
3148
830k
                    ps_ctxt->au1_modes_to_eval_temp[i++] = best_amode - 2;
3149
842k
            }
3150
3151
1.15M
            ps_ctxt->au1_modes_to_eval_temp[i++] = best_amode;
3152
3153
1.15M
            if(ps_ctxt->i4_quality_preset <= IHEVCE_QUALITY_P3)
3154
842k
            {
3155
842k
                if(best_amode <= 32)
3156
834k
                    ps_ctxt->au1_modes_to_eval_temp[i++] = best_amode + 2;
3157
842k
            }
3158
1.15M
        }
3159
943k
        else
3160
943k
        {
3161
943k
            ps_ctxt->au1_modes_to_eval_temp[i++] = ps_child_cu_node->ps_sub_cu[0]->best_mode;
3162
943k
            ps_ctxt->au1_modes_to_eval_temp[i++] = ps_child_cu_node->ps_sub_cu[1]->best_mode;
3163
943k
            ps_ctxt->au1_modes_to_eval_temp[i++] = ps_child_cu_node->ps_sub_cu[2]->best_mode;
3164
943k
            ps_ctxt->au1_modes_to_eval_temp[i++] = ps_child_cu_node->ps_sub_cu[3]->best_mode;
3165
943k
        }
3166
3167
        /* Add the left and top MPM modes for computation*/
3168
3169
2.09M
        ps_ctxt->au1_modes_to_eval_temp[i++] = cand_mode_satd_list[0];
3170
2.09M
        ps_ctxt->au1_modes_to_eval_temp[i++] = cand_mode_satd_list[1];
3171
3172
2.09M
        i_end = i;
3173
2.09M
        count = 0;
3174
3175
        /*Remove duplicate modes from modes_to_eval_temp[] */
3176
12.8M
        for(j = 0; j < i_end; j++)
3177
10.7M
        {
3178
22.7M
            for(k = 0; k < count; k++)
3179
13.6M
            {
3180
13.6M
                if(ps_ctxt->au1_modes_to_eval_temp[j] == ps_ctxt->au1_modes_to_eval[k])
3181
1.68M
                    break;
3182
13.6M
            }
3183
10.7M
            if((k == count) && (ps_ctxt->au1_modes_to_eval_temp[j] > 1))
3184
5.32M
            {
3185
5.32M
                ps_ctxt->au1_modes_to_eval[count] = ps_ctxt->au1_modes_to_eval_temp[j];
3186
5.32M
                count++;
3187
5.32M
            }
3188
10.7M
        }
3189
2.09M
        i_end = count;
3190
2.09M
        if(count == 0)
3191
155k
        {
3192
155k
            ps_ctxt->au1_modes_to_eval[0] = 26;
3193
155k
            i_end = 1;
3194
155k
        }
3195
3196
7.57M
        for(i = 0; i < i_end; i++)
3197
5.47M
        {
3198
5.47M
            pu1_ref_orig = &ps_ctxt->au1_ref_samples[0];
3199
5.47M
            pu1_ref_filt = &ps_ctxt->au1_filt_ref_samples[0];
3200
3201
5.47M
            mode = ps_ctxt->au1_modes_to_eval[i];
3202
5.47M
            ASSERT((mode >= 2) && (mode <= 34));
3203
5.47M
            cost_amode_step2[i] = ps_ctxt->au2_mode_bits_satd_cost[mode];
3204
5.47M
            filter_flag = gau1_intra_pred_ref_filter[mode] & (1 << (CTZ(trans_size) - 2));
3205
3206
12.9M
            for(k = 0; k < num_tu_in_y; k++)
3207
7.50M
            {
3208
19.0M
                for(j = 0; j < num_tu_in_x; j++)
3209
11.5M
                {
3210
11.5M
                    pu1_origin = pu1_orig + (k * trans_size * src_strd) + (j * trans_size);
3211
3212
11.5M
                    if(0 == filter_flag)
3213
10.7M
                        pu1_ref = pu1_ref_orig;
3214
804k
                    else
3215
804k
                        pu1_ref = pu1_ref_filt;
3216
3217
11.5M
                    g_apf_lum_ip[g_i4_ip_funcs[mode]](
3218
11.5M
                        pu1_ref, 0, &ps_ctxt->au1_pred_samples[0], trans_size, trans_size, mode);
3219
3220
11.5M
                    if(ps_ctxt->u1_use_satd)
3221
10.6M
                    {
3222
10.6M
                        sad = apf_resd_trns_had[u1_trans_idx](
3223
10.6M
                            pu1_origin,
3224
10.6M
                            ps_curr_src->i4_y_strd,
3225
10.6M
                            &ps_ctxt->au1_pred_samples[0],
3226
10.6M
                            trans_size,
3227
10.6M
                            NULL,
3228
10.6M
                            0
3229
3230
10.6M
                        );
3231
10.6M
                    }
3232
866k
                    else
3233
866k
                    {
3234
866k
                        sad = ps_ctxt->s_ipe_optimised_function_list.pf_nxn_sad_computer(
3235
866k
                            pu1_origin,
3236
866k
                            ps_curr_src->i4_y_strd,
3237
866k
                            &ps_ctxt->au1_pred_samples[0],
3238
866k
                            trans_size,
3239
866k
                            trans_size);
3240
866k
                    }
3241
3242
11.5M
                    cost_amode_step2[i] += sad;
3243
3244
11.5M
                    pu1_ref_orig += (4 * MAX_CTB_SIZE + 1);
3245
11.5M
                    pu1_ref_filt += (4 * MAX_CTB_SIZE + 1);
3246
11.5M
                }
3247
7.50M
            }
3248
5.47M
        }
3249
2.09M
        best_amode = ps_ctxt->au1_modes_to_eval[0];
3250
        /*Init cost indx */
3251
2.09M
        cost_ang_mode = MAX_INTRA_COST_IPE;  //cost_amode_step2[0];
3252
7.57M
        for(z = 0; z < i_end; z++)
3253
5.47M
        {
3254
            /* Least cost of all 3 angles are stored in cost_amode_step2[0] and corr. mode*/
3255
5.47M
            if(cost_ang_mode >= cost_amode_step2[z])
3256
3.70M
            {
3257
3.70M
                if(cost_ang_mode == cost_amode_step2[z])
3258
392k
                {
3259
392k
                    if(best_amode > ps_ctxt->au1_modes_to_eval[z])
3260
8.26k
                        best_amode = ps_ctxt->au1_modes_to_eval[z];
3261
392k
                }
3262
3.31M
                else
3263
3.31M
                {
3264
3.31M
                    best_amode = ps_ctxt->au1_modes_to_eval[z];
3265
3.31M
                }
3266
3.70M
                cost_ang_mode = cost_amode_step2[z];
3267
3.70M
            }
3268
5.47M
        }
3269
3270
        /*Modify mode bits for the angular modes */
3271
2.09M
    }
3272
3273
2.09M
    {
3274
        /* Step - I modification */
3275
2.09M
        ASSERT((best_amode >= 2) && (best_amode <= 34));
3276
2.09M
        i_end = 0;
3277
2.09M
        z = 0;
3278
3279
        /* Around best level 3 angular mode, search for best level 1 mode */
3280
2.09M
        ps_ctxt->au1_modes_to_eval[i_end++] = 0;
3281
2.09M
        ps_ctxt->au1_modes_to_eval[i_end++] = 1;
3282
3283
2.09M
        if(best_amode != 2)
3284
2.01M
            ps_ctxt->au1_modes_to_eval[i_end++] = best_amode - 1;
3285
3286
2.09M
        ps_ctxt->au1_modes_to_eval[i_end++] = best_amode;
3287
3288
2.09M
        if(best_amode != 34)
3289
2.04M
            ps_ctxt->au1_modes_to_eval[i_end++] = best_amode + 1;
3290
3291
        /* Inserting step_2's best mode at last to avoid
3292
        recalculation of it's SATD cost */
3293
3294
        //ps_ctxt->au1_modes_to_eval[i_end] = best_amode; //Bugfix: HSAD compared with SAD
3295
        //cost_amode_step2[i_end] = cost_ang_mode;
3296
3297
        /*best_sad[i_end] = cost_ang_mode
3298
                - mode_bits_satd_cost[best_amode]; //See NOTE_A01 above */
3299
3300
2.09M
        cost_ang_mode = MAX_INTRA_COST_IPE; /* Init cost */
3301
3302
12.4M
        for(i = 0; i < i_end; i++)
3303
10.3M
        {
3304
10.3M
            WORD32 u1_trans_idx = trans_size >> 3;
3305
10.3M
            if(trans_size == 32)
3306
427k
                u1_trans_idx = 3;
3307
10.3M
            pu1_ref_orig = &ps_ctxt->au1_ref_samples[0];
3308
10.3M
            pu1_ref_filt = &ps_ctxt->au1_filt_ref_samples[0];
3309
3310
            /*best_sad[i] = 0; //See NOTE_A01 above */
3311
10.3M
            mode = ps_ctxt->au1_modes_to_eval[i];
3312
10.3M
            cost_amode_step2[i] = ps_ctxt->au2_mode_bits_satd_cost[mode];
3313
10.3M
            filter_flag = gau1_intra_pred_ref_filter[mode] & (1 << (CTZ(trans_size) - 2));
3314
3315
24.0M
            for(k = 0; k < num_tu_in_y; k++)
3316
13.7M
            {
3317
34.3M
                for(j = 0; j < num_tu_in_x; j++)
3318
20.5M
                {
3319
20.5M
                    pu1_origin = pu1_orig + (k * trans_size * src_strd) + (j * trans_size);
3320
3321
20.5M
                    if(0 == filter_flag)
3322
17.5M
                        pu1_ref = pu1_ref_orig;
3323
3.04M
                    else
3324
3.04M
                        pu1_ref = pu1_ref_filt;
3325
3326
20.5M
                    g_apf_lum_ip[g_i4_ip_funcs[mode]](
3327
20.5M
                        pu1_ref, 0, &ps_ctxt->au1_pred_samples[0], trans_size, trans_size, mode);
3328
3329
                    //if(trans_size != 4)
3330
20.5M
                    {
3331
20.5M
                        sad = apf_resd_trns_had[u1_trans_idx](
3332
20.5M
                            pu1_origin,
3333
20.5M
                            ps_curr_src->i4_y_strd,
3334
20.5M
                            &ps_ctxt->au1_pred_samples[0],
3335
20.5M
                            trans_size,
3336
20.5M
                            NULL,
3337
20.5M
                            0);
3338
20.5M
                    }
3339
3340
                    /*accumualting SATD though name says it is sad*/
3341
20.5M
                    cost_amode_step2[i] += sad;
3342
                    /*best_sad[i] +=sad; //See NOTE_A01 above */
3343
20.5M
                    pu1_ref_orig += (4 * MAX_CTB_SIZE + 1);
3344
20.5M
                    pu1_ref_filt += (4 * MAX_CTB_SIZE + 1);
3345
20.5M
                }
3346
13.7M
            }
3347
10.3M
        }
3348
        /* Updating i_end for the step_2's inserted mode*/
3349
        //        i_end++;
3350
3351
        /* Arrange the reference array in ascending order */
3352
3353
10.3M
        for(i = 0; i < (i_end - 1); i++)
3354
8.25M
        {
3355
28.6M
            for(j = i + 1; j < i_end; j++)
3356
20.4M
            {
3357
20.4M
                if(cost_amode_step2[i] > cost_amode_step2[j])
3358
6.52M
                {
3359
6.52M
                    temp = cost_amode_step2[i];
3360
6.52M
                    cost_amode_step2[i] = cost_amode_step2[j];
3361
6.52M
                    cost_amode_step2[j] = temp;
3362
3363
6.52M
                    temp = modes_4x4[i];
3364
6.52M
                    modes_4x4[i] = modes_4x4[j];
3365
6.52M
                    modes_4x4[j] = temp;
3366
6.52M
                }
3367
20.4M
            }
3368
8.25M
        }
3369
3370
        /* Least cost of all 3 angles are stored in cost_amode_step2[0] and corr. mode*/
3371
2.09M
        best_amode = ps_ctxt->au1_modes_to_eval[modes_4x4[0]];
3372
2.09M
        cost_ang_mode = cost_amode_step2[0];
3373
2.09M
        ps_cu_node->best_satd = cost_ang_mode - ps_ctxt->au2_mode_bits_satd_cost[best_amode];
3374
2.09M
        ps_cu_node->best_cost = cost_amode_step2[0];
3375
2.09M
        ps_cu_node->best_mode = ps_ctxt->au1_modes_to_eval[modes_4x4[0]];
3376
2.09M
        ps_cu_node->best_satd =
3377
2.09M
            ps_cu_node->best_cost - ps_ctxt->au2_mode_bits_satd_cost[ps_cu_node->best_mode];
3378
3379
        /*Accumalate best mode bits cost for RC*/
3380
2.09M
        ps_cu_node->u2_mode_bits_cost = ps_ctxt->au2_mode_bits_satd[ps_cu_node->best_mode];
3381
3382
        /* Store the best three candidates */
3383
8.37M
        for(i = 0; i < 3; i++)
3384
6.28M
        {
3385
6.28M
            best_costs_4x4[i] = cost_amode_step2[i];
3386
6.28M
            best_modes_4x4[i] = ps_ctxt->au1_modes_to_eval[modes_4x4[i]];
3387
6.28M
        }
3388
2.09M
    }
3389
3390
2.09M
    return;
3391
2.09M
}