Coverage Report

Created: 2025-07-18 07:02

/src/libhevc/encoder/ihevce_memory_init.c
Line
Count
Source (jump to first uncovered line)
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_memory_init.c
24
*
25
* \brief
26
*    This file contains functions which perform memory requirement gathering
27
*    and freeing of memories of encoder at the end
28
*
29
* \date
30
*    18/09/2012
31
*
32
* \author
33
*    Ittiam
34
*
35
* List of Functions
36
*    <TODO: TO BE ADDED>
37
*
38
******************************************************************************
39
*/
40
41
/*****************************************************************************/
42
/* File Includes                                                             */
43
/*****************************************************************************/
44
/* System include files */
45
#include <stdio.h>
46
#include <string.h>
47
#include <stdlib.h>
48
#include <assert.h>
49
#include <stdarg.h>
50
#include <math.h>
51
52
/* User include files */
53
#include "ihevc_typedefs.h"
54
#include "itt_video_api.h"
55
#include "ihevce_api.h"
56
57
#include "rc_cntrl_param.h"
58
#include "rc_frame_info_collector.h"
59
#include "rc_look_ahead_params.h"
60
61
#include "ihevc_defs.h"
62
#include "ihevc_macros.h"
63
#include "ihevc_debug.h"
64
#include "ihevc_structs.h"
65
#include "ihevc_platform_macros.h"
66
#include "ihevc_deblk.h"
67
#include "ihevc_itrans_recon.h"
68
#include "ihevc_chroma_itrans_recon.h"
69
#include "ihevc_chroma_intra_pred.h"
70
#include "ihevc_intra_pred.h"
71
#include "ihevc_inter_pred.h"
72
#include "ihevc_mem_fns.h"
73
#include "ihevc_padding.h"
74
#include "ihevc_weighted_pred.h"
75
#include "ihevc_sao.h"
76
#include "ihevc_resi_trans.h"
77
#include "ihevc_quant_iquant_ssd.h"
78
#include "ihevc_cabac_tables.h"
79
#include "ihevc_common_tables.h"
80
81
#include "ihevce_defs.h"
82
#include "ihevce_hle_interface.h"
83
#include "ihevce_lap_enc_structs.h"
84
#include "ihevce_lap_interface.h"
85
#include "ihevce_multi_thrd_structs.h"
86
#include "ihevce_multi_thrd_funcs.h"
87
#include "ihevce_me_common_defs.h"
88
#include "ihevce_had_satd.h"
89
#include "ihevce_error_codes.h"
90
#include "ihevce_bitstream.h"
91
#include "ihevce_cabac.h"
92
#include "ihevce_rdoq_macros.h"
93
#include "ihevce_function_selector.h"
94
#include "ihevce_enc_structs.h"
95
#include "ihevce_entropy_structs.h"
96
#include "ihevce_cmn_utils_instr_set_router.h"
97
#include "ihevce_ipe_instr_set_router.h"
98
#include "ihevce_decomp_pre_intra_structs.h"
99
#include "ihevce_decomp_pre_intra_pass.h"
100
#include "ihevce_enc_loop_structs.h"
101
#include "ihevce_nbr_avail.h"
102
#include "ihevce_enc_loop_utils.h"
103
#include "ihevce_sub_pic_rc.h"
104
#include "ihevce_global_tables.h"
105
#include "ihevce_bs_compute_ctb.h"
106
#include "ihevce_cabac_rdo.h"
107
#include "ihevce_deblk.h"
108
#include "ihevce_entropy_interface.h"
109
#include "ihevce_frame_process.h"
110
#include "ihevce_ipe_pass.h"
111
#include "ihevce_rc_enc_structs.h"
112
#include "ihevce_rc_interface.h"
113
#include "hme_datatype.h"
114
#include "hme_interface.h"
115
#include "hme_common_defs.h"
116
#include "hme_defs.h"
117
#include "ihevce_me_instr_set_router.h"
118
#include "ihevce_enc_subpel_gen.h"
119
#include "ihevce_inter_pred.h"
120
#include "ihevce_mv_pred.h"
121
#include "ihevce_mv_pred_merge.h"
122
#include "ihevce_enc_loop_inter_mode_sifter.h"
123
#include "ihevce_me_pass.h"
124
#include "ihevce_coarse_me_pass.h"
125
#include "ihevce_enc_cu_recursion.h"
126
#include "ihevce_enc_loop_pass.h"
127
#include "ihevce_common_utils.h"
128
#include "ihevce_buffer_que_interface.h"
129
#include "ihevce_dep_mngr_interface.h"
130
#include "ihevce_sao.h"
131
#include "ihevce_tile_interface.h"
132
133
#include "cast_types.h"
134
#include "osal.h"
135
#include "osal_defaults.h"
136
137
/*****************************************************************************/
138
/* Function Definitions                                                      */
139
/*****************************************************************************/
140
141
/*!
142
******************************************************************************
143
* \if Function name : ihevce_mem_manager_init \endif
144
*
145
* \brief
146
*    Encoder Memory init function
147
*
148
* \param[in] Processing interface context pointer
149
*
150
* \return
151
*    None
152
*
153
* \author
154
*  Ittiam
155
*
156
*****************************************************************************
157
*/
158
55.6k
#define MAX_QUEUE 40
159
void ihevce_mem_manager_init(enc_ctxt_t *ps_enc_ctxt, ihevce_hle_ctxt_t *ps_intrf_ctxt)
160
8.22k
{
161
    /* local variables */
162
8.22k
    WORD32 total_memtabs_req = 0;
163
8.22k
    WORD32 total_memtabs_used = 0;
164
8.22k
    WORD32 total_system_memtabs = 0;
165
8.22k
    WORD32 ctr;
166
8.22k
    WORD32 buf_size;
167
8.22k
    WORD32 num_ctb_horz;
168
8.22k
    WORD32 num_ctb_vert;
169
8.22k
    WORD32 num_cu_in_ctb;
170
8.22k
    WORD32 num_pu_in_ctb;
171
8.22k
    WORD32 num_tu_in_ctb;
172
8.22k
    WORD32 ctb_size;
173
8.22k
    WORD32 min_cu_size;
174
8.22k
    WORD32 max_num_ref_pics;
175
8.22k
    WORD32 mem_alloc_ctrl_flag;
176
8.22k
    WORD32 space_for_mem_in_enc_grp = 0;
177
8.22k
    WORD32 space_for_mem_in_pre_enc_grp = 0;
178
8.22k
    WORD32 mv_bank_size;
179
8.22k
    WORD32 ref_idx_bank_size;
180
8.22k
    WORD32 a_wd[MAX_NUM_HME_LAYERS], a_ht[MAX_NUM_HME_LAYERS];
181
8.22k
    WORD32 a_disp_wd[MAX_NUM_HME_LAYERS], a_disp_ht[MAX_NUM_HME_LAYERS];
182
8.22k
    WORD32 a_ctb_align_wd[MAX_NUM_HME_LAYERS], a_ctb_align_ht[MAX_NUM_HME_LAYERS];
183
8.22k
    WORD32 n_enc_layers = 1, n_tot_layers;
184
8.22k
    WORD32 num_bufs_preenc_me_que, num_bufs_L0_ipe_enc, max_delay_preenc_l0_que;
185
8.22k
    WORD32 i, i4_resolution_id = ps_enc_ctxt->i4_resolution_id;  //counter
186
8.22k
    WORD32 i4_num_bitrate_inst;
187
8.22k
    iv_mem_rec_t *ps_memtab;
188
8.22k
    WORD32 i4_field_pic, i4_total_queues = 0;
189
190
8.22k
    recon_pic_buf_t **pps_pre_enc_pic_bufs;
191
8.22k
    frm_proc_ent_cod_ctxt_t **pps_frm_proc_ent_cod_bufs[IHEVCE_MAX_NUM_BITRATES];
192
8.22k
    pre_enc_me_ctxt_t **pps_pre_enc_bufs;
193
8.22k
    me_enc_rdopt_ctxt_t **pps_me_enc_bufs;
194
8.22k
    pre_enc_L0_ipe_encloop_ctxt_t **pps_L0_ipe_enc_bufs;
195
    /*get number of input buffer required based on requirement from each stage*/
196
8.22k
    ihevce_lap_enc_buf_t **pps_lap_enc_input_bufs;
197
8.22k
    WORD32 i4_num_enc_loop_frm_pllel;
198
8.22k
    WORD32 i4_num_me_frm_pllel;
199
    /*msr: These are parameters required to allocate input buffer,
200
    encoder needs to be initilized before getting requirements hence filled once static params are initilized*/
201
8.22k
    WORD32 num_input_buf_per_queue, i4_yuv_min_size, i4_luma_min_size;
202
203
8.22k
    i4_num_bitrate_inst = ps_enc_ctxt->i4_num_bitrates;
204
8.22k
    i4_field_pic = ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_field_pic;
205
8.22k
    ps_intrf_ctxt->i4_gpu_mem_size = 0;
206
207
    /*Initialize the thrd id flag and all deafult values for sub pic rc */
208
8.22k
    {
209
8.22k
        WORD32 i, j, k;
210
211
16.4k
        for(i = 0; i < MAX_NUM_ENC_LOOP_PARALLEL; i++)
212
8.22k
        {
213
16.4k
            for(j = 0; j < IHEVCE_MAX_NUM_BITRATES; j++)
214
8.22k
            {
215
8.22k
                ps_enc_ctxt->s_multi_thrd.ai4_acc_ctb_ctr[i][j] = 0;
216
8.22k
                ps_enc_ctxt->s_multi_thrd.ai4_ctb_ctr[i][j] = 0;
217
218
8.22k
                ps_enc_ctxt->s_multi_thrd.ai4_threshold_reached[i][j] = 0;
219
220
8.22k
                ps_enc_ctxt->s_multi_thrd.ai4_curr_qp_acc[i][j] = 0;
221
222
8.22k
                ps_enc_ctxt->s_multi_thrd.af_acc_hdr_bits_scale_err[i][j] = 0;
223
224
74.0k
                for(k = 0; k < MAX_NUM_FRM_PROC_THRDS_ENC; k++)
225
65.8k
                {
226
65.8k
                    ps_enc_ctxt->s_multi_thrd.ai4_thrd_id_valid_flag[i][j][k] = -1;
227
65.8k
                }
228
8.22k
            }
229
8.22k
        }
230
8.22k
    }
231
232
8.22k
#define ENABLE_FRM_PARALLEL
233
8.22k
#ifdef ENABLE_FRM_PARALLEL
234
8.22k
    i4_num_enc_loop_frm_pllel = MAX_NUM_ENC_LOOP_PARALLEL;
235
8.22k
    i4_num_me_frm_pllel = MAX_NUM_ME_PARALLEL;
236
#else
237
    i4_num_enc_loop_frm_pllel = 1;
238
    i4_num_me_frm_pllel = 1;
239
#endif
240
241
8.22k
    ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel = i4_num_enc_loop_frm_pllel;
242
8.22k
    ps_enc_ctxt->i4_max_fr_enc_loop_parallel_rc = i4_num_enc_loop_frm_pllel;
243
8.22k
    ps_enc_ctxt->s_multi_thrd.i4_num_me_frm_pllel = i4_num_me_frm_pllel;
244
8.22k
    ps_enc_ctxt->s_multi_thrd.i4_force_end_flag = 0;
245
246
8.22k
    ps_enc_ctxt->i4_ref_mbr_id = 0;
247
    /* get the ctb size from max cu size */
248
8.22k
    ctb_size = ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_max_log2_cu_size;
249
250
    /* get the min cu size from config params */
251
8.22k
    min_cu_size = ps_enc_ctxt->ps_stat_prms->s_config_prms.i4_min_log2_cu_size;
252
253
    /* convert to actual width */
254
8.22k
    ctb_size = 1 << ctb_size;
255
8.22k
    min_cu_size = 1 << min_cu_size;
256
257
    /* Get the width and heights of different decomp layers */
258
8.22k
    *a_wd =
259
8.22k
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
260
8.22k
            .i4_width +
261
8.22k
        SET_CTB_ALIGN(
262
8.22k
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
263
8.22k
                .i4_width,
264
8.22k
            min_cu_size);
265
8.22k
    *a_ht =
266
8.22k
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
267
8.22k
            .i4_height +
268
8.22k
        SET_CTB_ALIGN(
269
8.22k
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
270
8.22k
                .i4_height,
271
8.22k
            min_cu_size);
272
273
8.22k
    n_tot_layers = hme_derive_num_layers(n_enc_layers, a_wd, a_ht, a_disp_wd, a_disp_ht);
274
8.22k
    hme_coarse_get_layer1_mv_bank_ref_idx_size(
275
8.22k
        n_tot_layers,
276
8.22k
        a_wd,
277
8.22k
        a_ht,
278
8.22k
        ((ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames == -1)
279
8.22k
             ? ((DEFAULT_MAX_REFERENCE_PICS) << i4_field_pic)
280
8.22k
             : ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames),
281
8.22k
        (S32 *)(&mv_bank_size),
282
8.22k
        (S32 *)(&ref_idx_bank_size));
283
8.22k
    if(n_tot_layers < 3)
284
0
    {
285
0
        WORD32 error_code;
286
0
        error_code = IHEVCE_NUM_DECOMP_LYRS_NOT_SUPPORTED;
287
0
        ps_intrf_ctxt->i4_error_code = IHEVCE_SETUNSUPPORTEDINPUT(error_code);
288
0
        return;
289
0
    }
290
291
    /* calculate num cu,pu,tu in ctb */
292
8.22k
    num_cu_in_ctb = ctb_size / MIN_CU_SIZE;
293
8.22k
    num_cu_in_ctb *= num_cu_in_ctb;
294
295
8.22k
    num_pu_in_ctb = ctb_size / MIN_PU_SIZE;
296
8.22k
    num_pu_in_ctb *= num_pu_in_ctb;
297
298
8.22k
    num_tu_in_ctb = ctb_size / MIN_PU_SIZE;
299
8.22k
    num_tu_in_ctb *= num_tu_in_ctb;
300
301
    /* calcuate the number of ctb horizontally*/
302
8.22k
    num_ctb_horz =
303
8.22k
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
304
8.22k
            .i4_width +
305
8.22k
        SET_CTB_ALIGN(
306
8.22k
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
307
8.22k
                .i4_width,
308
8.22k
            ctb_size);
309
8.22k
    num_ctb_horz = num_ctb_horz / ctb_size;
310
311
    /* calcuate the number of ctb vertically*/
312
8.22k
    num_ctb_vert =
313
8.22k
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
314
8.22k
            .i4_height +
315
8.22k
        SET_CTB_ALIGN(
316
8.22k
            ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ps_enc_ctxt->i4_resolution_id]
317
8.22k
                .i4_height,
318
8.22k
            ctb_size);
319
8.22k
    num_ctb_vert = num_ctb_vert / ctb_size;
320
321
    /* align all the decomp layer dimensions to CTB alignment */
322
33.7k
    for(ctr = 0; ctr < n_tot_layers; ctr++)
323
25.5k
    {
324
25.5k
        a_ctb_align_wd[ctr] = a_wd[ctr] + SET_CTB_ALIGN(a_wd[ctr], ctb_size);
325
326
25.5k
        a_ctb_align_ht[ctr] = a_ht[ctr] + SET_CTB_ALIGN(a_ht[ctr], ctb_size);
327
25.5k
    }
328
329
    /* SEI related parametert initialization */
330
331
8.22k
    ps_enc_ctxt->u4_cur_pic_encode_cnt = 0;
332
333
    /* store the frame level ctb parameters which will be constant for the session */
334
8.22k
    ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size = ctb_size;
335
8.22k
    ps_enc_ctxt->s_frm_ctb_prms.i4_min_cu_size = min_cu_size;
336
8.22k
    ps_enc_ctxt->s_frm_ctb_prms.i4_num_cus_in_ctb = num_cu_in_ctb;
337
8.22k
    ps_enc_ctxt->s_frm_ctb_prms.i4_num_pus_in_ctb = num_pu_in_ctb;
338
8.22k
    ps_enc_ctxt->s_frm_ctb_prms.i4_num_tus_in_ctb = num_tu_in_ctb;
339
340
    /* intialize cra poc to default value */
341
8.22k
    ps_enc_ctxt->i4_cra_poc = 0;
342
343
    /* initialise the memory alloc control flag */
344
8.22k
    mem_alloc_ctrl_flag = ps_enc_ctxt->ps_stat_prms->s_multi_thrd_prms.i4_memory_alloc_ctrl_flag;
345
346
    /* decide the memory space for enc_grp and pre_enc_grp based on control flag */
347
8.22k
    if(0 == mem_alloc_ctrl_flag)
348
8.22k
    {
349
        /* normal memory */
350
8.22k
        space_for_mem_in_enc_grp = IV_EXT_CACHEABLE_NORMAL_MEM;
351
8.22k
        space_for_mem_in_pre_enc_grp = IV_EXT_CACHEABLE_NORMAL_MEM;
352
8.22k
    }
353
0
    else if(1 == mem_alloc_ctrl_flag)
354
0
    {
355
        /* only NUMA Node 0 memory allocation */
356
0
        space_for_mem_in_enc_grp = IV_EXT_CACHEABLE_NUMA_NODE0_MEM;
357
0
        space_for_mem_in_pre_enc_grp = IV_EXT_CACHEABLE_NUMA_NODE0_MEM;
358
0
    }
359
0
    else if(2 == mem_alloc_ctrl_flag)
360
0
    {
361
        /* Both NUMA Node 0 & Node 1 memory allocation */
362
0
        space_for_mem_in_enc_grp = IV_EXT_CACHEABLE_NUMA_NODE0_MEM;
363
0
        space_for_mem_in_pre_enc_grp = IV_EXT_CACHEABLE_NUMA_NODE1_MEM;
364
0
    }
365
0
    else
366
0
    {
367
        /* should not enter here */
368
0
        ASSERT(0);
369
0
    }
370
371
8.22k
    {
372
8.22k
        if(ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel > 1)
373
0
        {
374
0
            num_bufs_preenc_me_que = MIN_L1_L0_STAGGER_NON_SEQ +
375
0
                                     ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics +
376
0
                                     (MAX_L0_IPE_ENC_STAGGER - 1) + NUM_BUFS_DECOMP_HME;
377
0
        }
378
8.22k
        else
379
8.22k
        {
380
8.22k
            num_bufs_preenc_me_que = MIN_L1_L0_STAGGER_NON_SEQ +
381
8.22k
                                     ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics +
382
8.22k
                                     (MIN_L0_IPE_ENC_STAGGER - 1) + NUM_BUFS_DECOMP_HME;
383
8.22k
        }
384
385
        /*The number of buffers to support stagger between L0 IPE, ME and enc loop. This is a separate queue to store L0 IPE
386
        output to save memory since this is not used in L1 stage*/
387
8.22k
        if(ps_enc_ctxt->s_multi_thrd.i4_num_enc_loop_frm_pllel > 1)
388
0
        {
389
0
            num_bufs_L0_ipe_enc = MAX_L0_IPE_ENC_STAGGER;
390
0
        }
391
8.22k
        else
392
8.22k
        {
393
8.22k
            num_bufs_L0_ipe_enc = MIN_L0_IPE_ENC_STAGGER;
394
8.22k
        }
395
396
8.22k
        max_delay_preenc_l0_que = MIN_L1_L0_STAGGER_NON_SEQ +
397
8.22k
                                  ps_enc_ctxt->ps_stat_prms->s_lap_prms.i4_rc_look_ahead_pics + 1;
398
8.22k
    }
399
400
    /* ------------ popluate the lap static parameters ------------- */
401
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_max_closed_gop_period =
402
8.22k
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_closed_gop_period;
403
404
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_min_closed_gop_period =
405
8.22k
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_min_closed_gop_period;
406
407
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_max_cra_open_gop_period =
408
8.22k
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_cra_open_gop_period;
409
410
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_max_i_open_gop_period =
411
8.22k
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_i_open_gop_period;
412
413
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_max_reference_frames =
414
8.22k
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames;
415
416
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_max_temporal_layers =
417
8.22k
        ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_temporal_layers;
418
419
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_width = ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_width;
420
421
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_height = ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_height;
422
423
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_enable_logo = ps_enc_ctxt->ps_stat_prms->i4_enable_logo;
424
425
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_src_interlace_field =
426
8.22k
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_field_pic;
427
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_frame_rate =
428
8.22k
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_frm_rate_num /
429
8.22k
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_frm_rate_denom;
430
431
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_blu_ray_spec = ps_enc_ctxt->i4_blu_ray_spec;
432
433
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_internal_bit_depth =
434
8.22k
        ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth;
435
436
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_input_bit_depth =
437
8.22k
        ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_input_bit_depth;
438
439
8.22k
    ps_enc_ctxt->s_lap_stat_prms.u1_chroma_array_type =
440
8.22k
        (ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV) ? 2 : 1;
441
442
8.22k
    ps_enc_ctxt->s_lap_stat_prms.i4_rc_pass_num = ps_enc_ctxt->ps_stat_prms->s_pass_prms.i4_pass;
443
444
8.22k
    if(0 == i4_resolution_id)
445
8.22k
    {
446
16.4k
        for(ctr = 0; ctr < ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_num_res_layers; ctr++)
447
8.22k
        {
448
8.22k
            ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[ctr] =
449
8.22k
                ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[ctr].i4_quality_preset;
450
451
8.22k
            if(ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[ctr] == IHEVCE_QUALITY_P7)
452
392
            {
453
392
                ps_enc_ctxt->s_lap_stat_prms.ai4_quality_preset[ctr] = IHEVCE_QUALITY_P6;
454
392
            }
455
8.22k
        }
456
8.22k
    }
457
8.22k
    memcpy(
458
8.22k
        &ps_enc_ctxt->s_lap_stat_prms.s_lap_params,
459
8.22k
        &ps_enc_ctxt->ps_stat_prms->s_lap_prms,
460
8.22k
        sizeof(ihevce_lap_params_t));
461
462
    /* copy the create prms as runtime prms */
463
8.22k
    memcpy(
464
8.22k
        &ps_enc_ctxt->s_runtime_src_prms,
465
8.22k
        &ps_enc_ctxt->ps_stat_prms->s_src_prms,
466
8.22k
        sizeof(ihevce_src_params_t));
467
    /*Copy the target params*/
468
8.22k
    memcpy(
469
8.22k
        &ps_enc_ctxt->s_runtime_tgt_params,
470
8.22k
        &ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id],
471
8.22k
        sizeof(ihevce_tgt_params_t));
472
8.22k
    ps_enc_ctxt->s_lap_stat_prms.e_arch_type = ps_enc_ctxt->ps_stat_prms->e_arch_type;
473
8.22k
    ps_enc_ctxt->s_lap_stat_prms.u1_is_popcnt_available = ps_enc_ctxt->u1_is_popcnt_available;
474
475
    /* copy the create prms as runtime prms */
476
8.22k
    memcpy(
477
8.22k
        &ps_enc_ctxt->s_runtime_src_prms,
478
8.22k
        &ps_enc_ctxt->ps_stat_prms->s_src_prms,
479
8.22k
        sizeof(ihevce_src_params_t));
480
    /*Copy the target params*/
481
8.22k
    memcpy(
482
8.22k
        &ps_enc_ctxt->s_runtime_tgt_params,
483
8.22k
        &ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id],
484
8.22k
        sizeof(ihevce_tgt_params_t));
485
486
    /* copy the run time coding parameters */
487
8.22k
    memcpy(
488
8.22k
        &ps_enc_ctxt->s_runtime_coding_prms,
489
8.22k
        &ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms,
490
8.22k
        sizeof(ihevce_coding_params_t));
491
    /*change in run time parameter*/
492
8.22k
    if(ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames == -1)
493
8.22k
    {
494
8.22k
        ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames = (DEFAULT_MAX_REFERENCE_PICS)
495
8.22k
                                                                     << i4_field_pic;
496
8.22k
        ps_enc_ctxt->s_lap_stat_prms.i4_max_reference_frames =
497
8.22k
            ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames;
498
8.22k
    }
499
8.22k
    ASSERT(i4_num_enc_loop_frm_pllel == i4_num_me_frm_pllel);
500
501
8.22k
    if((1 == i4_num_enc_loop_frm_pllel) && (1 == i4_num_me_frm_pllel))
502
8.22k
    {
503
8.22k
        max_num_ref_pics = ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames;
504
8.22k
    }
505
0
    else
506
0
    {
507
0
        max_num_ref_pics =
508
0
            ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames * i4_num_enc_loop_frm_pllel;
509
0
    }
510
    /* --------------------------------------------------------------------- */
511
    /* --------------  Collating the number of memtabs required ------------ */
512
    /* --------------------------------------------------------------------- */
513
514
    /* Memtabs for syntactical tiles */
515
8.22k
    total_memtabs_req += ihevce_tiles_get_num_mem_recs();
516
517
    /* ---------- Enc loop Memtabs --------- */
518
8.22k
    total_memtabs_req +=
519
8.22k
        ihevce_enc_loop_get_num_mem_recs(i4_num_bitrate_inst, i4_num_enc_loop_frm_pllel);
520
    /* ---------- ME Memtabs --------------- */
521
8.22k
    total_memtabs_req += ihevce_me_get_num_mem_recs(i4_num_me_frm_pllel);
522
523
    /* ---------- Coarse ME Memtabs --------------- */
524
8.22k
    total_memtabs_req += ihevce_coarse_me_get_num_mem_recs();
525
    /* ---------- IPE Memtabs -------------- */
526
8.22k
    total_memtabs_req += ihevce_ipe_get_num_mem_recs();
527
528
    /* ---------- ECD Memtabs -------------- */
529
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
530
8.22k
    {
531
8.22k
        total_memtabs_req += ihevce_entropy_get_num_mem_recs();
532
8.22k
    }
533
8.22k
    if(0 == ps_enc_ctxt->i4_resolution_id)
534
8.22k
    {
535
        /* ---------- LAP Memtabs--------------- */
536
8.22k
        total_memtabs_req += ihevce_lap_get_num_mem_recs();
537
8.22k
    }
538
    /* ---------- Decomp Pre Intra Memtabs--------------- */
539
8.22k
    total_memtabs_req += ihevce_decomp_pre_intra_get_num_mem_recs();
540
541
    /* ---------- RC memtabs --------------- */
542
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
543
8.22k
    {
544
8.22k
        total_memtabs_req += ihevce_rc_get_num_mem_recs(); /*HEVC_RC*/
545
8.22k
    }
546
547
    /* ---------- System Memtabs ----------- */
548
8.22k
    total_memtabs_req += TOTAL_SYSTEM_MEM_RECS;  //increment this based on final requirement
549
550
    /* -----Frameproc Entcod Que Memtabs --- */
551
    /* one queue for each bit-rate is used */
552
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
553
8.22k
    {
554
8.22k
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
555
8.22k
    }
556
    /* mrs:memtab for one queue for encoder owned input queue, This is only request for memtab, currently more than
557
    required memtabs are allocated. Hence my change of using memtab for yuv buffers is surviving. Only memtab
558
    usage and initialization needs to be exact sync*/
559
8.22k
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
560
561
    /* ---Pre-encode Encode Que Mem requests -- */
562
8.22k
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
563
564
    /* -----ME / Enc-RD opt Que Mem requests --- */
565
8.22k
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
566
567
    /* ----Pre-encode L0 IPE to enc Que Mem requests -- */
568
8.22k
    total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
569
570
    /* --- ME-EncLoop Dep Mngr Row-Row Mem requests -- */
571
8.22k
    total_memtabs_req += NUM_ME_ENC_BUFS * ihevce_dmgr_get_num_mem_recs();
572
573
    /* --- Prev. frame EncLoop Done Dep Mngr Frm-Frm Mem requests -- */
574
8.22k
    total_memtabs_req += i4_num_enc_loop_frm_pllel * ihevce_dmgr_get_num_mem_recs();
575
576
    /* --- Prev. frame EncLoop Done for re-encode Dep Mngr Frm-Frm Mem requests -- */
577
8.22k
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
578
579
    /* --- Prev. frame ME Done Dep Mngr Frm-Frm Mem requests -- */
580
8.22k
    total_memtabs_req += i4_num_me_frm_pllel * ihevce_dmgr_get_num_mem_recs();
581
582
    /* --- Prev. frame PreEnc L1 Done Dep Mngr Frm-Frm Mem requests -- */
583
8.22k
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
584
585
    /* --- Prev. frame PreEnc HME Done Dep Mngr Frm-Frm Mem requests -- */
586
8.22k
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
587
588
    /* --- Prev. frame PreEnc L0 Done Dep Mngr Frm-Frm Mem requests -- */
589
8.22k
    total_memtabs_req += ihevce_dmgr_get_num_mem_recs();
590
591
    /* --- ME-Prev Recon Dep Mngr Row-Frm Mem requests -- */
592
8.22k
    total_memtabs_req +=
593
8.22k
        (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) * ihevce_dmgr_get_num_mem_recs();
594
595
    /* ----- allocate memomry for memtabs --- */
596
8.22k
    {
597
8.22k
        iv_mem_rec_t s_memtab;
598
599
8.22k
        s_memtab.i4_size = sizeof(iv_mem_rec_t);
600
8.22k
        s_memtab.i4_mem_size = total_memtabs_req * sizeof(iv_mem_rec_t);
601
8.22k
        s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
602
8.22k
        s_memtab.i4_mem_alignment = 4;
603
604
8.22k
        ps_intrf_ctxt->ihevce_mem_alloc(
605
8.22k
            ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->ps_stat_prms->s_sys_api, &s_memtab);
606
8.22k
        if(s_memtab.pv_base == NULL)
607
0
        {
608
0
            ps_intrf_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
609
0
            return;
610
0
        }
611
612
8.22k
        ps_memtab = (iv_mem_rec_t *)s_memtab.pv_base;
613
8.22k
    }
614
615
    /* --------------------------------------------------------------------- */
616
    /* ------------------  Collating memory requirements ------------------- */
617
    /* --------------------------------------------------------------------- */
618
619
    /* ----------- Tiles mem requests -------------*/
620
0
    total_memtabs_used += ihevce_tiles_get_mem_recs(
621
8.22k
        &ps_memtab[total_memtabs_used],
622
8.22k
        ps_enc_ctxt->ps_stat_prms,
623
8.22k
        &ps_enc_ctxt->s_frm_ctb_prms,
624
8.22k
        i4_resolution_id,
625
8.22k
        space_for_mem_in_enc_grp);
626
627
    /* ---------- Enc loop Mem requests --------- */
628
8.22k
    total_memtabs_used += ihevce_enc_loop_get_mem_recs(
629
8.22k
        &ps_memtab[total_memtabs_used],
630
8.22k
        ps_enc_ctxt->ps_stat_prms,
631
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
632
8.22k
        i4_num_bitrate_inst,
633
8.22k
        i4_num_enc_loop_frm_pllel,
634
8.22k
        space_for_mem_in_enc_grp,
635
8.22k
        i4_resolution_id);
636
    /* ---------- ME Mem requests --------------- */
637
8.22k
    total_memtabs_used += ihevce_me_get_mem_recs(
638
8.22k
        &ps_memtab[total_memtabs_used],
639
8.22k
        ps_enc_ctxt->ps_stat_prms,
640
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
641
8.22k
        space_for_mem_in_enc_grp,
642
8.22k
        i4_resolution_id,
643
8.22k
        i4_num_me_frm_pllel);
644
645
    /* ---------- Coarse ME Mem requests --------------- */
646
8.22k
    total_memtabs_used += ihevce_coarse_me_get_mem_recs(
647
8.22k
        &ps_memtab[total_memtabs_used],
648
8.22k
        ps_enc_ctxt->ps_stat_prms,
649
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
650
8.22k
        space_for_mem_in_pre_enc_grp,
651
8.22k
        i4_resolution_id);
652
    /* ---------- IPE Mem requests -------------- */
653
8.22k
    total_memtabs_used += ihevce_ipe_get_mem_recs(
654
8.22k
        &ps_memtab[total_memtabs_used],
655
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
656
8.22k
        space_for_mem_in_pre_enc_grp);
657
    /* ---------- ECD Mem requests -------------- */
658
8.22k
    i4_num_bitrate_inst = ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
659
8.22k
                              .i4_num_bitrate_instances;
660
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
661
8.22k
    {
662
8.22k
        total_memtabs_used += ihevce_entropy_get_mem_recs(
663
8.22k
            &ps_memtab[total_memtabs_used],
664
8.22k
            ps_enc_ctxt->ps_stat_prms,
665
8.22k
            space_for_mem_in_pre_enc_grp,
666
8.22k
            i4_resolution_id);
667
8.22k
    }
668
669
8.22k
    if(0 == i4_resolution_id)
670
8.22k
    {
671
        /* ---------- LAP Mem requests--------------- */
672
8.22k
        total_memtabs_used +=
673
8.22k
            ihevce_lap_get_mem_recs(&ps_memtab[total_memtabs_used], space_for_mem_in_pre_enc_grp);
674
8.22k
    }
675
676
    /* -------- DECOMPOSITION PRE INTRA Mem requests-------- */
677
8.22k
    total_memtabs_used += ihevce_decomp_pre_intra_get_mem_recs(
678
8.22k
        &ps_memtab[total_memtabs_used],
679
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
680
8.22k
        space_for_mem_in_pre_enc_grp);
681
682
    /* ---------- RC Mem requests --------------- */
683
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
684
8.22k
    {
685
8.22k
        total_memtabs_used += ihevce_rc_get_mem_recs(
686
8.22k
            &ps_memtab[total_memtabs_used],
687
8.22k
            ps_enc_ctxt->ps_stat_prms,
688
8.22k
            space_for_mem_in_pre_enc_grp,
689
8.22k
            &ps_enc_ctxt->ps_stat_prms->s_sys_api);
690
8.22k
    }
691
692
    /* ---------- System Mem requests ----------- */
693
694
    /* allocate memory for pps tile */
695
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
696
697
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
698
699
8.22k
    if(1 == ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_tiles_enabled_flag)
700
0
    {
701
0
        ps_memtab[total_memtabs_used].i4_mem_size =
702
0
            (ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_num_tile_cols *
703
0
             ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_num_tile_rows) *
704
0
            (sizeof(tile_t));
705
0
    }
706
8.22k
    else
707
8.22k
    {
708
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size = sizeof(tile_t);
709
8.22k
    }
710
711
    /* increment the memtab counter */
712
8.22k
    total_memtabs_used++;
713
8.22k
    total_system_memtabs++;
714
715
    /* recon picture buffer pointer array */
716
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
717
8.22k
    {
718
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
719
720
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
721
722
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
723
8.22k
            (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) * (sizeof(recon_pic_buf_t *));
724
725
        /* increment the memtab counter */
726
8.22k
        total_memtabs_used++;
727
8.22k
        total_system_memtabs++;
728
8.22k
    }
729
730
    /* recon picture buffers structures */
731
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
732
8.22k
    {
733
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
734
735
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
736
737
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
738
8.22k
            (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) * (sizeof(recon_pic_buf_t));
739
740
        /* increment the memtab counter */
741
8.22k
        total_memtabs_used++;
742
8.22k
        total_system_memtabs++;
743
8.22k
    }
744
745
    /* reference/recon picture buffers */
746
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
747
8.22k
    {
748
8.22k
        WORD32 i4_chroma_buf_size_shift =
749
8.22k
            -(ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth <= 8) +
750
8.22k
            (ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV);
751
752
8.22k
        buf_size = ((num_ctb_horz * ctb_size) + (PAD_HORZ << 1));
753
8.22k
        buf_size = buf_size * ((num_ctb_vert * ctb_size) + (PAD_VERT << 1));
754
8.22k
        buf_size = buf_size * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS);
755
756
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
757
758
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
759
760
        /* If HBD, both 8bit and 16 bit luma buffers are required, whereas only 16bit chroma buffers are required */
761
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
762
            /* Luma */
763
8.22k
            (buf_size * ((ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth > 8)
764
8.22k
                             ? BUFFER_SIZE_MULTIPLIER_IF_HBD
765
8.22k
                             : 1)) +
766
            /* Chroma */
767
8.22k
            (SHL_NEG(buf_size, i4_chroma_buf_size_shift));
768
769
        /* increment the memtab counter */
770
8.22k
        total_memtabs_used++;
771
8.22k
        total_system_memtabs++;
772
8.22k
    }
773
    /* reference/recon picture subpel planes */
774
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
775
776
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
777
778
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size =
779
8.22k
        buf_size * (3 + L0ME_IN_OPENLOOP_MODE); /* 3 planes */
780
781
    /* increment the memtab counter */
782
8.22k
    total_memtabs_used++;
783
8.22k
    total_system_memtabs++;
784
    /* reference colocated MV bank */
785
    /* Keep memory for an extra CTB at the right and bottom of frame.
786
    This extra space is needed by dist-encoding and unused in non-dist-encoding */
787
8.22k
    buf_size = (num_ctb_horz + 1) * (num_ctb_vert + 1) * num_pu_in_ctb;
788
8.22k
    buf_size = buf_size * sizeof(pu_col_mv_t) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
789
8.22k
               i4_num_bitrate_inst;
790
791
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
792
793
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
794
795
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
796
797
    /* increment the memtab counter */
798
8.22k
    total_memtabs_used++;
799
8.22k
    total_system_memtabs++;
800
801
    /* reference colocated MV bank map */
802
    /* Keep memory for an extra CTB at the right and bottom of frame.
803
    This extra space is needed by dist-encoding and unused in non-dist-encoding */
804
8.22k
    buf_size = (num_ctb_horz + 1) * (num_ctb_vert + 1) * num_pu_in_ctb;
805
8.22k
    buf_size = buf_size * sizeof(UWORD8) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
806
8.22k
               i4_num_bitrate_inst;
807
808
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
809
810
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
811
812
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
813
814
    /* increment the memtab counter */
815
8.22k
    total_memtabs_used++;
816
8.22k
    total_system_memtabs++;
817
818
    /* reference collocated MV bank map offsets map */
819
8.22k
    buf_size = num_ctb_horz * num_ctb_vert;
820
8.22k
    buf_size = buf_size * sizeof(UWORD16) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
821
8.22k
               i4_num_bitrate_inst;
822
823
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
824
825
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
826
827
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
828
829
    /* increment the memtab counter */
830
8.22k
    total_memtabs_used++;
831
8.22k
    total_system_memtabs++;
832
833
    /* reference colocated MV bank ctb offset */
834
8.22k
    buf_size = num_ctb_horz;
835
8.22k
    buf_size = buf_size * num_ctb_vert;
836
8.22k
    buf_size = buf_size * sizeof(UWORD32) * (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS) *
837
8.22k
               i4_num_bitrate_inst;
838
839
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
840
841
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
842
843
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
844
845
    /* increment the memtab counter */
846
8.22k
    total_memtabs_used++;
847
8.22k
    total_system_memtabs++;
848
849
    /* recon picture buffer pointer array for pre enc group */
850
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
851
852
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
853
854
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size =
855
8.22k
        (max_num_ref_pics + 1) * (sizeof(recon_pic_buf_t *));
856
857
    /* increment the memtab counter */
858
8.22k
    total_memtabs_used++;
859
8.22k
    total_system_memtabs++;
860
861
    /* recon picture buffers structures for pre enc group */
862
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
863
864
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
865
866
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = (max_num_ref_pics + 1) * (sizeof(recon_pic_buf_t));
867
868
    /* increment the memtab counter */
869
8.22k
    total_memtabs_used++;
870
8.22k
    total_system_memtabs++;
871
8.22k
    {
872
8.22k
        num_input_buf_per_queue = ihevce_lap_get_num_ip_bufs(&ps_enc_ctxt->s_lap_stat_prms);
873
8.22k
        {
874
8.22k
            WORD32 i4_count_temp = 0, i4_last_queue_length;
875
876
            /*First allocate the memory for the buffer based on resolution*/
877
8.22k
            WORD32 ctb_align_pic_wd = ps_enc_ctxt->s_runtime_tgt_params.i4_width +
878
8.22k
                                      SET_CTB_ALIGN(
879
8.22k
                                          ps_enc_ctxt->s_runtime_tgt_params.i4_width,
880
8.22k
                                          ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size);
881
882
8.22k
            WORD32 ctb_align_pic_ht = ps_enc_ctxt->s_runtime_tgt_params.i4_height +
883
8.22k
                                      SET_CTB_ALIGN(
884
8.22k
                                          ps_enc_ctxt->s_runtime_tgt_params.i4_height,
885
8.22k
                                          ps_enc_ctxt->s_frm_ctb_prms.i4_ctb_size);
886
887
8.22k
            i4_last_queue_length = (num_input_buf_per_queue % MAX_QUEUE);
888
889
8.22k
            if((num_input_buf_per_queue % MAX_QUEUE) == 0)
890
0
                i4_last_queue_length = MAX_QUEUE;
891
892
8.22k
            ps_enc_ctxt->i4_num_input_buf_per_queue = num_input_buf_per_queue;
893
8.22k
            i4_yuv_min_size =
894
8.22k
                (ctb_align_pic_wd * ctb_align_pic_ht) +
895
8.22k
                ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
896
8.22k
                     ? (ctb_align_pic_wd * ctb_align_pic_ht)
897
8.22k
                     : ((ctb_align_pic_wd * ctb_align_pic_ht) >> 1));
898
8.22k
            i4_luma_min_size = (ctb_align_pic_wd * ctb_align_pic_ht);
899
900
            /*Inorder to allocate memory for the large buffer sizes overflowing WORD32 we are splitting the memtabs using i4_total_hbd_queues and MAX_HBD_QUEUE*/
901
8.22k
            i4_total_queues = num_input_buf_per_queue / MAX_QUEUE;
902
903
8.22k
            if((num_input_buf_per_queue % MAX_QUEUE) != 0)
904
8.22k
            {
905
8.22k
                i4_total_queues++;
906
8.22k
            }
907
908
8.22k
            ASSERT(i4_total_queues < 5);
909
910
16.4k
            for(i4_count_temp = 0; i4_count_temp < i4_total_queues; i4_count_temp++)
911
8.22k
            {
912
8.22k
                ps_memtab[total_memtabs_used].i4_mem_alignment = 32;
913
914
8.22k
                ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
915
                /*Memory size for yuv buffer of one frame * num of input required to stored in the queue*/
916
8.22k
                if((i4_count_temp < (i4_total_queues - 1)))
917
0
                    ps_memtab[total_memtabs_used].i4_mem_size = i4_yuv_min_size * MAX_QUEUE;
918
8.22k
                else
919
8.22k
                    ps_memtab[total_memtabs_used].i4_mem_size =
920
8.22k
                        (i4_yuv_min_size)*i4_last_queue_length;
921
922
                /* increment the memtab counter */
923
8.22k
                total_memtabs_used++;
924
8.22k
                total_system_memtabs++;
925
8.22k
            }
926
8.22k
        }
927
        /*memory for input buffer structure*/
928
0
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
929
930
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
931
932
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
933
8.22k
            (num_input_buf_per_queue) * (sizeof(ihevce_lap_enc_buf_t *));
934
935
        /* increment the memtab counter */
936
8.22k
        total_memtabs_used++;
937
8.22k
        total_system_memtabs++;
938
939
        /* frame process/entropy coding buffer structures */
940
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
941
942
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
943
944
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
945
8.22k
            (num_input_buf_per_queue) * (sizeof(ihevce_lap_enc_buf_t));
946
        /* increment the memtab counter */
947
8.22k
        total_memtabs_used++;
948
8.22k
        total_system_memtabs++;
949
950
        /*input synch ctrl command*/
951
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
952
953
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
954
955
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
956
8.22k
            (num_input_buf_per_queue) * (ENC_COMMAND_BUFF_SIZE);
957
958
8.22k
        total_memtabs_used++;
959
8.22k
        total_system_memtabs++;
960
8.22k
    }
961
962
    /* Pre-encode/encode coding buffer pointer array */
963
0
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
964
965
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
966
967
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size =
968
8.22k
        (num_bufs_preenc_me_que) * (sizeof(pre_enc_me_ctxt_t *));
969
970
    /* increment the memtab counter */
971
8.22k
    total_memtabs_used++;
972
8.22k
    total_system_memtabs++;
973
974
    /* frame process/entropy coding buffer structures */
975
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
976
977
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
978
979
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size =
980
8.22k
        (num_bufs_preenc_me_que) * (sizeof(pre_enc_me_ctxt_t));
981
982
    /* increment the memtab counter */
983
8.22k
    total_memtabs_used++;
984
8.22k
    total_system_memtabs++;
985
986
    /* Pre-encode L0 IPE output to ME buffer pointer*/
987
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
988
989
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
990
991
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size =
992
8.22k
        (num_bufs_L0_ipe_enc) * (sizeof(pre_enc_L0_ipe_encloop_ctxt_t *));
993
994
    /* increment the memtab counter */
995
8.22k
    total_memtabs_used++;
996
8.22k
    total_system_memtabs++;
997
998
    /* Pre-encode L0 IPE output to ME buffer */
999
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1000
1001
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1002
1003
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size =
1004
8.22k
        (num_bufs_L0_ipe_enc) * (sizeof(pre_enc_L0_ipe_encloop_ctxt_t));
1005
1006
    /* increment the memtab counter */
1007
8.22k
    total_memtabs_used++;
1008
8.22k
    total_system_memtabs++;
1009
1010
    /* CTB analyse Frame level  */
1011
8.22k
    buf_size = num_ctb_horz;
1012
8.22k
    buf_size = buf_size * num_ctb_vert;
1013
8.22k
    buf_size = buf_size * sizeof(ctb_analyse_t) * num_bufs_preenc_me_que;
1014
1015
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1016
1017
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1018
1019
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1020
1021
    /* increment the memtab counter */
1022
8.22k
    total_memtabs_used++;
1023
8.22k
    total_system_memtabs++;
1024
1025
    /* ME layer ctxt pointer */
1026
8.22k
    buf_size = sizeof(layer_ctxt_t) * num_bufs_preenc_me_que;
1027
1028
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1029
1030
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1031
1032
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1033
1034
    /* increment the memtab counter */
1035
8.22k
    total_memtabs_used++;
1036
8.22k
    total_system_memtabs++;
1037
1038
    /* ME layer MV bank ctxt pointer */
1039
8.22k
    buf_size = sizeof(layer_mv_t) * num_bufs_preenc_me_que;
1040
1041
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1042
1043
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1044
1045
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1046
1047
    /* increment the memtab counter */
1048
8.22k
    total_memtabs_used++;
1049
8.22k
    total_system_memtabs++;
1050
1051
    /* ME layer MV bank pointer */
1052
8.22k
    buf_size = mv_bank_size * num_bufs_preenc_me_que;
1053
1054
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1055
1056
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1057
1058
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1059
1060
    /* increment the memtab counter */
1061
8.22k
    total_memtabs_used++;
1062
8.22k
    total_system_memtabs++;
1063
1064
    /* ME layer ref idx bank pointer */
1065
8.22k
    buf_size = ref_idx_bank_size * num_bufs_preenc_me_que;
1066
1067
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1068
1069
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1070
1071
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1072
1073
    /* increment the memtab counter */
1074
8.22k
    total_memtabs_used++;
1075
8.22k
    total_system_memtabs++;
1076
    /* Frame level array to store 8x8 intra cost */
1077
8.22k
    buf_size = (num_ctb_horz * ctb_size) >> 3;
1078
8.22k
    buf_size *= ((num_ctb_vert * ctb_size) >> 3);
1079
8.22k
    buf_size *= sizeof(double) * num_bufs_preenc_me_que;
1080
1081
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1082
1083
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1084
1085
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1086
1087
    /* increment the memtab counter */
1088
8.22k
    total_memtabs_used++;
1089
8.22k
    total_system_memtabs++;
1090
1091
    /* Frame level array to store ctb intra cost and modes */
1092
8.22k
    buf_size = (num_ctb_horz * num_ctb_vert);
1093
8.22k
    buf_size *= sizeof(ipe_l0_ctb_analyse_for_me_t) * num_bufs_L0_ipe_enc;
1094
1095
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1096
1097
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1098
1099
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1100
1101
    /* increment the memtab counter */
1102
8.22k
    total_memtabs_used++;
1103
8.22k
    total_system_memtabs++;
1104
1105
    /*
1106
    * Layer early decision buffer L1 buf.Since the pre intra analysis always
1107
    * expects memory for ihevce_ed_blk_t for complete ctbs, align the width and
1108
    * height in layer to mutiple of 32.
1109
    */
1110
8.22k
    buf_size = (a_ctb_align_wd[1] >> 5) * (a_ctb_align_ht[1] >> 5) * sizeof(ihevce_ed_ctb_l1_t) *
1111
8.22k
               num_bufs_preenc_me_que;
1112
1113
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1114
1115
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_pre_enc_grp;
1116
1117
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1118
1119
    /* increment the memtab counter */
1120
8.22k
    total_memtabs_used++;
1121
8.22k
    total_system_memtabs++;
1122
1123
    /*
1124
    * Layer early decision buffer L1 buf.Since the pre intra analysis always
1125
    * expects memory for ihevce_ed_blk_t for complete ctbs, align the width and
1126
    * height in layer to mutiple of 32.
1127
    */
1128
8.22k
    buf_size = (a_ctb_align_wd[1] >> 2) * (a_ctb_align_ht[1] >> 2) * sizeof(ihevce_ed_blk_t) *
1129
8.22k
               num_bufs_preenc_me_que;
1130
1131
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1132
1133
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_pre_enc_grp;
1134
1135
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1136
1137
    /* increment the memtab counter */
1138
8.22k
    total_memtabs_used++;
1139
8.22k
    total_system_memtabs++;
1140
1141
    /*
1142
    * Layer early decision buffer L2 buf.Since the pre intra analysis always
1143
    * expects memory for ihevce_ed_blk_t for complete ctbs, align the width and
1144
    * height in layer to mutiple of 16.
1145
    */
1146
8.22k
    buf_size = (a_ctb_align_wd[2] >> 2) * (a_ctb_align_ht[2] >> 2) * sizeof(ihevce_ed_blk_t) *
1147
8.22k
               num_bufs_preenc_me_que;
1148
1149
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1150
1151
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_pre_enc_grp;
1152
1153
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1154
1155
    /* increment the memtab counter */
1156
8.22k
    total_memtabs_used++;
1157
8.22k
    total_system_memtabs++;
1158
1159
    /* following is the buffer requirement of
1160
    que between me and enc*/
1161
1162
    /* me/enc que buffer pointer array */
1163
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1164
1165
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1166
1167
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = (NUM_ME_ENC_BUFS) * (sizeof(me_enc_rdopt_ctxt_t *));
1168
1169
    /* increment the memtab counter */
1170
8.22k
    total_memtabs_used++;
1171
8.22k
    total_system_memtabs++;
1172
1173
    /* fme/enc que buffer structures */
1174
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1175
1176
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1177
1178
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = (NUM_ME_ENC_BUFS) * (sizeof(me_enc_rdopt_ctxt_t));
1179
1180
    /* increment the memtab counter */
1181
8.22k
    total_memtabs_used++;
1182
8.22k
    total_system_memtabs++;
1183
1184
    /* Job Queue related memory                            */
1185
    /* max num ctb rows is doubled to take care worst case */
1186
    /* requirements because of HME layers                  */
1187
8.22k
    buf_size = (MAX_NUM_VERT_UNITS_FRM) * (NUM_ENC_JOBS_QUES)*NUM_ME_ENC_BUFS;  //PING_PONG_BUF;
1188
    /* In tile case, based on the number of column tiles,
1189
    we will have  separate jobQ per column tile        */
1190
8.22k
    if(1 == ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_tiles_enabled_flag)
1191
0
    {
1192
0
        buf_size *= ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_num_tile_cols;
1193
0
    }
1194
8.22k
    buf_size *= sizeof(job_queue_t);
1195
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1196
1197
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1198
1199
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1200
1201
    /* increment the memtab counter */
1202
8.22k
    total_memtabs_used++;
1203
8.22k
    total_system_memtabs++;
1204
1205
    /* cur_ctb_cu_tree_t Frame level  */
1206
8.22k
    buf_size = num_ctb_horz * MAX_NUM_NODES_CU_TREE;
1207
8.22k
    buf_size = buf_size * num_ctb_vert;
1208
1209
    /* ps_cu_analyse_inter buffer is used to popualte outputs form ME after using cu analyse form IPE */
1210
8.22k
    buf_size = buf_size * sizeof(cur_ctb_cu_tree_t) * NUM_ME_ENC_BUFS;
1211
1212
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1213
1214
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1215
1216
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1217
1218
    /* increment the memtab counter */
1219
8.22k
    total_memtabs_used++;
1220
8.22k
    total_system_memtabs++;
1221
1222
    /* me_ctb_data_t Frame level  */
1223
8.22k
    buf_size = num_ctb_horz * num_ctb_vert;
1224
1225
    /* This buffer is used to */
1226
8.22k
    buf_size = buf_size * sizeof(me_ctb_data_t) * NUM_ME_ENC_BUFS;
1227
1228
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1229
1230
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1231
1232
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1233
1234
    /* increment the memtab counter */
1235
8.22k
    total_memtabs_used++;
1236
8.22k
    total_system_memtabs++;
1237
1238
    /* following is for each bit-rate */
1239
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
1240
8.22k
    {
1241
        /* frame process/entropy coding buffer pointer array */
1242
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1243
1244
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1245
1246
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
1247
8.22k
            (NUM_FRMPROC_ENTCOD_BUFS) * (sizeof(frm_proc_ent_cod_ctxt_t *));
1248
1249
        /* increment the memtab counter */
1250
8.22k
        total_memtabs_used++;
1251
8.22k
        total_system_memtabs++;
1252
1253
        /* frame process/entropy coding buffer structures */
1254
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1255
1256
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1257
1258
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
1259
8.22k
            (NUM_FRMPROC_ENTCOD_BUFS) * (sizeof(frm_proc_ent_cod_ctxt_t));
1260
1261
        /* increment the memtab counter */
1262
8.22k
        total_memtabs_used++;
1263
8.22k
        total_system_memtabs++;
1264
1265
        /* CTB enc loop Frame level  */
1266
8.22k
        buf_size = num_ctb_horz;
1267
8.22k
        buf_size = buf_size * num_ctb_vert;
1268
8.22k
        buf_size = buf_size * sizeof(ctb_enc_loop_out_t) * NUM_FRMPROC_ENTCOD_BUFS;
1269
1270
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1271
1272
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1273
1274
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1275
1276
        /* increment the memtab counter */
1277
8.22k
        total_memtabs_used++;
1278
8.22k
        total_system_memtabs++;
1279
1280
        /* CU enc loop Frame level  */
1281
8.22k
        buf_size = num_ctb_horz * num_cu_in_ctb;
1282
8.22k
        buf_size = buf_size * num_ctb_vert;
1283
8.22k
        buf_size = buf_size * sizeof(cu_enc_loop_out_t) * NUM_FRMPROC_ENTCOD_BUFS;
1284
1285
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1286
1287
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1288
1289
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1290
1291
        /* increment the memtab counter */
1292
8.22k
        total_memtabs_used++;
1293
8.22k
        total_system_memtabs++;
1294
1295
        /* TU enc loop Frame level  */
1296
8.22k
        buf_size = num_ctb_horz * num_tu_in_ctb;
1297
8.22k
        buf_size = buf_size * num_ctb_vert;
1298
8.22k
        buf_size = buf_size * sizeof(tu_enc_loop_out_t) * NUM_FRMPROC_ENTCOD_BUFS;
1299
1300
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1301
1302
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1303
1304
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1305
1306
        /* increment the memtab counter */
1307
8.22k
        total_memtabs_used++;
1308
8.22k
        total_system_memtabs++;
1309
1310
        /* PU enc loop Frame level  */
1311
8.22k
        buf_size = num_ctb_horz * num_pu_in_ctb;
1312
8.22k
        buf_size = buf_size * num_ctb_vert;
1313
8.22k
        buf_size = buf_size * sizeof(pu_t) * NUM_FRMPROC_ENTCOD_BUFS;
1314
1315
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1316
1317
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1318
1319
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1320
1321
        /* increment the memtab counter */
1322
8.22k
        total_memtabs_used++;
1323
8.22k
        total_system_memtabs++;
1324
1325
        /* Coeffs Frame level  */
1326
8.22k
        buf_size =
1327
8.22k
            num_ctb_horz * ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
1328
8.22k
                                ? (num_tu_in_ctb << 1)
1329
8.22k
                                : ((num_tu_in_ctb * 3) >> 1));
1330
8.22k
        buf_size = buf_size * num_ctb_vert;
1331
8.22k
        buf_size = buf_size * sizeof(UWORD8) * MAX_SCAN_COEFFS_BYTES_4x4 * NUM_FRMPROC_ENTCOD_BUFS;
1332
1333
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1334
1335
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1336
1337
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1338
1339
        /* increment the memtab counter */
1340
8.22k
        total_memtabs_used++;
1341
8.22k
        total_system_memtabs++;
1342
1343
8.22k
#ifndef DISABLE_SEI
1344
        /* SEI Payload Data */
1345
8.22k
        buf_size = sizeof(UWORD8) * MAX_NUMBER_OF_SEI_PAYLOAD * MAX_SEI_PAYLOAD_PER_TLV *
1346
8.22k
                   NUM_FRMPROC_ENTCOD_BUFS;
1347
1348
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1349
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1350
1351
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1352
1353
        /* increment the memtab counter */
1354
8.22k
        total_memtabs_used++;
1355
8.22k
        total_system_memtabs++;
1356
8.22k
#endif
1357
8.22k
    }
1358
1359
    /* ------ Working mem frame level -------*/
1360
8.22k
    buf_size = ((num_ctb_horz * ctb_size) + 16);
1361
8.22k
    buf_size *= ((num_ctb_vert * ctb_size) + 23);
1362
8.22k
    buf_size *= sizeof(WORD16);
1363
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1364
1365
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1366
1367
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1368
1369
    /* increment the memtab counter */
1370
8.22k
    total_memtabs_used++;
1371
8.22k
    total_system_memtabs++;
1372
    /* Job Queue related memory                            */
1373
    /* max num ctb rows is doubled to take care worst case */
1374
    /* requirements because of HME layers                  */
1375
8.22k
    buf_size = (MAX_NUM_VERT_UNITS_FRM) * (NUM_PRE_ENC_JOBS_QUES) * (max_delay_preenc_l0_que);
1376
8.22k
    buf_size *= sizeof(job_queue_t);
1377
1378
8.22k
    ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
1379
1380
8.22k
    ps_memtab[total_memtabs_used].e_mem_type = (IV_MEM_TYPE_T)space_for_mem_in_enc_grp;
1381
1382
8.22k
    ps_memtab[total_memtabs_used].i4_mem_size = buf_size;
1383
1384
    /* increment the memtab counter */
1385
8.22k
    total_memtabs_used++;
1386
8.22k
    total_system_memtabs++;
1387
1388
    /* check on the system memtabs */
1389
8.22k
    ASSERT(total_system_memtabs <= TOTAL_SYSTEM_MEM_RECS);
1390
1391
    /* -----Frameproc Entcod Que Mem requests --- */
1392
    /*  derive for each bit-rate */
1393
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
1394
8.22k
    {
1395
8.22k
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
1396
8.22k
            &ps_memtab[total_memtabs_used], NUM_FRMPROC_ENTCOD_BUFS, space_for_mem_in_enc_grp);
1397
8.22k
    }
1398
    /*mrs: Request memory for the input yuv queue*/
1399
8.22k
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1400
8.22k
        &ps_memtab[total_memtabs_used], num_input_buf_per_queue, space_for_mem_in_enc_grp);
1401
    /*------ The encoder owned input buffer queue*/
1402
    /* -----Pre-encode Encode Que Mem requests --- */
1403
8.22k
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1404
8.22k
        &ps_memtab[total_memtabs_used], num_bufs_preenc_me_que, space_for_mem_in_enc_grp);
1405
1406
    /* -----ME / Enc-RD opt Que Mem requests --- */
1407
8.22k
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1408
8.22k
        &ps_memtab[total_memtabs_used], NUM_ME_ENC_BUFS, space_for_mem_in_enc_grp);
1409
1410
    /* -----Pre-encode L0 IPE to enc Que Mem requests --- */
1411
8.22k
    total_memtabs_used += ihevce_buff_que_get_mem_recs(
1412
8.22k
        &ps_memtab[total_memtabs_used], num_bufs_L0_ipe_enc, space_for_mem_in_enc_grp);
1413
1414
    /* ---------- Dependency Manager allocations -------- */
1415
8.22k
    {
1416
        /* --- ME-EncLoop Dep Mngr Row-Row Mem requests -- */
1417
16.4k
        for(ctr = 0; ctr < NUM_ME_ENC_BUFS; ctr++)
1418
8.22k
        {
1419
8.22k
            total_memtabs_used += ihevce_dmgr_get_mem_recs(
1420
8.22k
                &ps_memtab[total_memtabs_used],
1421
8.22k
                DEP_MNGR_ROW_ROW_SYNC,
1422
8.22k
                (a_ctb_align_ht[0] / ctb_size),
1423
8.22k
                ps_enc_ctxt->ps_stat_prms->s_app_tile_params
1424
8.22k
                    .i4_num_tile_cols, /* Number of Col Tiles */
1425
8.22k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1426
8.22k
                space_for_mem_in_enc_grp);
1427
8.22k
        }
1428
1429
16.4k
        for(ctr = 0; ctr < i4_num_enc_loop_frm_pllel; ctr++)
1430
8.22k
        {
1431
            /* --- Prev. frame EncLoop Done Dep Mngr Frm-Frm Mem requests -- */
1432
8.22k
            total_memtabs_used += ihevce_dmgr_get_mem_recs(
1433
8.22k
                &ps_memtab[total_memtabs_used],
1434
8.22k
                DEP_MNGR_FRM_FRM_SYNC,
1435
8.22k
                (a_ctb_align_ht[0] / ctb_size),
1436
8.22k
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
1437
8.22k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1438
8.22k
                space_for_mem_in_enc_grp);
1439
8.22k
        }
1440
        /* --- Prev. frame EncLoop Done for re-encode Dep Mngr Frm-Frm Mem requests -- */
1441
8.22k
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1442
8.22k
            &ps_memtab[total_memtabs_used],
1443
8.22k
            DEP_MNGR_FRM_FRM_SYNC,
1444
8.22k
            (a_ctb_align_ht[0] / ctb_size),
1445
8.22k
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1446
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1447
8.22k
            space_for_mem_in_enc_grp);
1448
16.4k
        for(ctr = 0; ctr < i4_num_me_frm_pllel; ctr++)
1449
8.22k
        {
1450
            /* --- Prev. frame ME Done Dep Mngr Frm-Frm Mem requests -- */
1451
8.22k
            total_memtabs_used += ihevce_dmgr_get_mem_recs(
1452
8.22k
                &ps_memtab[total_memtabs_used],
1453
8.22k
                DEP_MNGR_FRM_FRM_SYNC,
1454
8.22k
                (a_ctb_align_ht[0] / ctb_size),
1455
8.22k
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
1456
8.22k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1457
8.22k
                space_for_mem_in_enc_grp);
1458
8.22k
        }
1459
1460
        /* --- Prev. frame PreEnc L1 Done Dep Mngr Frm-Frm Mem requests -- */
1461
8.22k
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1462
8.22k
            &ps_memtab[total_memtabs_used],
1463
8.22k
            DEP_MNGR_FRM_FRM_SYNC,
1464
8.22k
            (a_ctb_align_ht[0] / ctb_size),
1465
8.22k
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1466
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1467
8.22k
            space_for_mem_in_enc_grp);
1468
1469
        /* --- Prev. frame PreEnc HME Done Dep Mngr Frm-Frm Mem requests -- */
1470
8.22k
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1471
8.22k
            &ps_memtab[total_memtabs_used],
1472
8.22k
            DEP_MNGR_FRM_FRM_SYNC,
1473
8.22k
            (a_ctb_align_ht[0] / ctb_size),
1474
8.22k
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1475
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1476
8.22k
            space_for_mem_in_enc_grp);
1477
1478
        /* --- Prev. frame PreEnc L0 Done Dep Mngr Frm-Frm Mem requests -- */
1479
8.22k
        total_memtabs_used += ihevce_dmgr_get_mem_recs(
1480
8.22k
            &ps_memtab[total_memtabs_used],
1481
8.22k
            DEP_MNGR_FRM_FRM_SYNC,
1482
8.22k
            (a_ctb_align_ht[0] / ctb_size),
1483
8.22k
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
1484
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1485
8.22k
            space_for_mem_in_enc_grp);
1486
1487
        /* --- ME-Prev Recon Dep Mngr Row-Frm Mem requests -- */
1488
49.3k
        for(ctr = 0; ctr < (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS); ctr++)
1489
41.1k
        {
1490
41.1k
            WORD32 i4_num_units = num_ctb_horz * num_ctb_vert;
1491
1492
41.1k
            total_memtabs_used += ihevce_dmgr_map_get_mem_recs(
1493
41.1k
                &ps_memtab[total_memtabs_used],
1494
41.1k
                i4_num_units,
1495
41.1k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1496
41.1k
                space_for_mem_in_enc_grp);
1497
41.1k
        }
1498
8.22k
    }
1499
1500
    /* ----- allocate memory as per requests ---- */
1501
1502
    /* check on memtabs requested v/s memtabs used */
1503
    //ittiam : should put an assert
1504
1505
    //ASSERT(total_memtabs_used == total_memtabs_req);
1506
1507
7.24M
    for(ctr = 0; ctr < total_memtabs_used; ctr++)
1508
7.23M
    {
1509
7.23M
        UWORD8 *pu1_mem = NULL;
1510
7.23M
        ps_intrf_ctxt->ihevce_mem_alloc(
1511
7.23M
            ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->ps_stat_prms->s_sys_api, &ps_memtab[ctr]);
1512
1513
7.23M
        pu1_mem = (UWORD8 *)ps_memtab[ctr].pv_base;
1514
1515
7.23M
        if(NULL == pu1_mem)
1516
0
        {
1517
0
            ps_intrf_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
1518
0
            return;
1519
0
        }
1520
7.23M
    }
1521
1522
    /* --------------------------------------------------------------------- */
1523
    /* --------- Initialisation of Modules & System memory ----------------- */
1524
    /* --------------------------------------------------------------------- */
1525
1526
    /* store the final allocated memtabs */
1527
8.22k
    ps_enc_ctxt->s_mem_mngr.i4_num_create_memtabs = total_memtabs_used;
1528
8.22k
    ps_enc_ctxt->s_mem_mngr.ps_create_memtab = ps_memtab;
1529
1530
    /* ---------- Tiles Mem init --------- */
1531
8.22k
    ps_enc_ctxt->ps_tile_params_base = (ihevce_tile_params_t *)ihevce_tiles_mem_init(
1532
8.22k
        ps_memtab, ps_enc_ctxt->ps_stat_prms, ps_enc_ctxt, i4_resolution_id);
1533
1534
8.22k
    ps_memtab += ihevce_tiles_get_num_mem_recs();
1535
1536
    /* ---------- Enc loop Mem init --------- */
1537
8.22k
    ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt = ihevce_enc_loop_init(
1538
8.22k
        ps_memtab,
1539
8.22k
        ps_enc_ctxt->ps_stat_prms,
1540
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1541
8.22k
        ps_intrf_ctxt->pv_osal_handle,
1542
8.22k
        &ps_enc_ctxt->s_func_selector,
1543
8.22k
        &ps_enc_ctxt->s_rc_quant,
1544
8.22k
        ps_enc_ctxt->ps_tile_params_base,
1545
8.22k
        i4_resolution_id,
1546
8.22k
        i4_num_enc_loop_frm_pllel,
1547
8.22k
        ps_enc_ctxt->u1_is_popcnt_available);
1548
1549
8.22k
    ps_memtab += ihevce_enc_loop_get_num_mem_recs(i4_num_bitrate_inst, i4_num_enc_loop_frm_pllel);
1550
    /* ---------- ME Mem init --------------- */
1551
8.22k
    ps_enc_ctxt->s_module_ctxt.pv_me_ctxt = ihevce_me_init(
1552
8.22k
        ps_memtab,
1553
8.22k
        ps_enc_ctxt->ps_stat_prms,
1554
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
1555
8.22k
        ps_intrf_ctxt->pv_osal_handle,
1556
8.22k
        &ps_enc_ctxt->s_rc_quant,
1557
8.22k
        (void *)ps_enc_ctxt->ps_tile_params_base,
1558
8.22k
        i4_resolution_id,
1559
8.22k
        i4_num_me_frm_pllel,
1560
8.22k
        ps_enc_ctxt->u1_is_popcnt_available);
1561
1562
8.22k
    ps_memtab += ihevce_me_get_num_mem_recs(i4_num_me_frm_pllel);
1563
1564
    /* ---------- Coarse ME Mem init --------------- */
1565
8.22k
    ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt = ihevce_coarse_me_init(
1566
8.22k
        ps_memtab,
1567
8.22k
        ps_enc_ctxt->ps_stat_prms,
1568
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1569
8.22k
        ps_intrf_ctxt->pv_osal_handle,
1570
8.22k
        i4_resolution_id,
1571
8.22k
        ps_enc_ctxt->u1_is_popcnt_available);
1572
1573
8.22k
    ps_memtab += ihevce_coarse_me_get_num_mem_recs();
1574
    /* ---------- IPE Mem init -------------- */
1575
8.22k
    ps_enc_ctxt->s_module_ctxt.pv_ipe_ctxt = ihevce_ipe_init(
1576
8.22k
        ps_memtab,
1577
8.22k
        ps_enc_ctxt->ps_stat_prms,
1578
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1579
8.22k
        ps_enc_ctxt->i4_ref_mbr_id,
1580
8.22k
        &ps_enc_ctxt->s_func_selector,
1581
8.22k
        &ps_enc_ctxt->s_rc_quant,
1582
8.22k
        i4_resolution_id,
1583
8.22k
        ps_enc_ctxt->u1_is_popcnt_available);
1584
1585
8.22k
    ps_memtab += ihevce_ipe_get_num_mem_recs();
1586
1587
8.22k
    ps_enc_ctxt->s_rc_quant.i2_max_qp = 51;
1588
8.22k
    ps_enc_ctxt->s_rc_quant.i2_min_qp = 0;
1589
8.22k
    ps_enc_ctxt->s_rc_quant.i1_qp_offset = 0;
1590
8.22k
    ps_enc_ctxt->s_rc_quant.i2_max_qscale =
1591
8.22k
        228 << 3;  // Q3 format is mantained for accuarate calc at lower qp
1592
8.22k
    ps_enc_ctxt->s_rc_quant.i2_min_qscale = 1;
1593
1594
    /* ---------- ECD Mem init -------------- */
1595
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
1596
8.22k
    {
1597
8.22k
        ps_enc_ctxt->s_module_ctxt.apv_ent_cod_ctxt[i] = ihevce_entropy_init(
1598
8.22k
            ps_memtab,
1599
8.22k
            ps_enc_ctxt->ps_stat_prms,
1600
8.22k
            (void *)ps_enc_ctxt->ps_tile_params_base,
1601
8.22k
            i4_resolution_id);
1602
1603
8.22k
        ps_memtab += ihevce_entropy_get_num_mem_recs();
1604
8.22k
    }
1605
1606
    /* ---------- LAP Mem init--------------- */
1607
8.22k
    if(i4_resolution_id == 0)
1608
8.22k
    {
1609
8.22k
        ps_enc_ctxt->s_module_ctxt.pv_lap_ctxt =
1610
8.22k
            ihevce_lap_init(ps_memtab, &ps_enc_ctxt->s_lap_stat_prms, ps_enc_ctxt->ps_stat_prms);
1611
1612
8.22k
        ps_memtab += ihevce_lap_get_num_mem_recs();
1613
8.22k
    }
1614
    /*-----------DECOMPOSITION PRE INTRA init----*/
1615
8.22k
    ps_enc_ctxt->s_module_ctxt.pv_decomp_pre_intra_ctxt = ihevce_decomp_pre_intra_init(
1616
8.22k
        ps_memtab,
1617
8.22k
        ps_enc_ctxt->ps_stat_prms,
1618
8.22k
        ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
1619
8.22k
        &ps_enc_ctxt->s_func_selector,
1620
8.22k
        i4_resolution_id,
1621
8.22k
        ps_enc_ctxt->u1_is_popcnt_available);
1622
1623
8.22k
    ps_memtab += ihevce_decomp_pre_intra_get_num_mem_recs();
1624
1625
    /* ---------- RC Mem init --------------- */
1626
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
1627
8.22k
    {
1628
        /*swaping of buf_id for 0th and reference bitrate location, as encoder
1629
        assumes always 0th loc for reference bitrate and app must receive in
1630
        the configured order*/
1631
8.22k
        if(i == 0)
1632
8.22k
        {
1633
8.22k
            ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i] = ihevce_rc_mem_init(
1634
8.22k
                ps_memtab,
1635
8.22k
                ps_enc_ctxt->ps_stat_prms,
1636
8.22k
                ps_enc_ctxt->i4_ref_mbr_id,
1637
8.22k
                &ps_enc_ctxt->s_rc_quant,
1638
8.22k
                ps_enc_ctxt->i4_resolution_id,
1639
8.22k
                ps_enc_ctxt->i4_look_ahead_frames_in_first_pass);
1640
8.22k
        }
1641
0
        else if(i == ps_enc_ctxt->i4_ref_mbr_id)
1642
0
        {
1643
0
            ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i] = ihevce_rc_mem_init(
1644
0
                ps_memtab,
1645
0
                ps_enc_ctxt->ps_stat_prms,
1646
0
                0,
1647
0
                &ps_enc_ctxt->s_rc_quant,
1648
0
                ps_enc_ctxt->i4_resolution_id,
1649
0
                ps_enc_ctxt->i4_look_ahead_frames_in_first_pass);
1650
0
        }
1651
0
        else
1652
0
        {
1653
0
            ps_enc_ctxt->s_module_ctxt.apv_rc_ctxt[i] = ihevce_rc_mem_init(
1654
0
                ps_memtab,
1655
0
                ps_enc_ctxt->ps_stat_prms,
1656
0
                i,
1657
0
                &ps_enc_ctxt->s_rc_quant,
1658
0
                ps_enc_ctxt->i4_resolution_id,
1659
0
                ps_enc_ctxt->i4_look_ahead_frames_in_first_pass);
1660
0
        }
1661
8.22k
        ps_memtab += ihevce_rc_get_num_mem_recs();
1662
8.22k
    }
1663
1664
    /* ---------- System Mem init ----------- */
1665
8.22k
    {
1666
8.22k
        recon_pic_buf_t **pps_pic_bufs[IHEVCE_MAX_NUM_BITRATES];
1667
8.22k
        recon_pic_buf_t *ps_pic_bufs[IHEVCE_MAX_NUM_BITRATES];
1668
8.22k
        void *pv_recon_buf[IHEVCE_MAX_NUM_BITRATES];
1669
8.22k
#if(SRC_PADDING_FOR_TRAQO || ENABLE_SSD_CALC_RC)
1670
8.22k
        void *pv_recon_buf_source[IHEVCE_MAX_NUM_BITRATES] = { NULL };
1671
8.22k
#endif
1672
8.22k
        void *pv_uv_recon_buf[IHEVCE_MAX_NUM_BITRATES];
1673
8.22k
        UWORD8 *pu1_subpel_buf;
1674
8.22k
        pu_col_mv_t *ps_col_mv;
1675
8.22k
        UWORD8 *pu1_col_mv_map;
1676
8.22k
        UWORD16 *pu2_col_num_pu_map;
1677
8.22k
        UWORD32 *pu4_col_mv_off;
1678
8.22k
        WORD32 luma_frm_size;
1679
8.22k
        WORD32 recon_stride; /* stride for Y and UV(interleave) */
1680
8.22k
        WORD32 luma_frm_height; /* including padding    */
1681
8.22k
        WORD32 num_pu_in_frm;
1682
1683
        /* pps tile memory */
1684
16.4k
        for(i = 0; i < i4_num_bitrate_inst; i++)
1685
8.22k
        {
1686
8.22k
            ps_enc_ctxt->as_pps[i].ps_tile = (tile_t *)ps_memtab->pv_base;
1687
8.22k
        }
1688
1689
8.22k
        ps_memtab++; /* increment the memtabs */
1690
1691
        /* recon picture buffer pointer array */
1692
16.4k
        for(i = 0; i < i4_num_bitrate_inst; i++)
1693
8.22k
        {
1694
8.22k
            pps_pic_bufs[i] = (recon_pic_buf_t **)ps_memtab->pv_base;
1695
8.22k
            ps_memtab++; /* increment the memtabs */
1696
8.22k
        }
1697
1698
        /* recon picture buffers structures */
1699
16.4k
        for(i = 0; i < i4_num_bitrate_inst; i++)
1700
8.22k
        {
1701
8.22k
            ps_pic_bufs[i] = (recon_pic_buf_t *)ps_memtab->pv_base;
1702
8.22k
            ps_memtab++; /* increment the memtabs */
1703
8.22k
        }
1704
1705
        /* reference/recon picture buffers */
1706
16.4k
        for(i = 0; i < i4_num_bitrate_inst; i++)
1707
8.22k
        {
1708
8.22k
            pv_recon_buf[i] = ps_memtab->pv_base;
1709
8.22k
            ps_memtab++; /* increment the memtabs */
1710
8.22k
        }
1711
        /* reference/recon picture subpel planes */
1712
8.22k
        pu1_subpel_buf = (UWORD8 *)ps_memtab->pv_base;
1713
        /* increment the memtabs */
1714
8.22k
        ps_memtab++;
1715
        /* reference colocated MV bank */
1716
8.22k
        ps_col_mv = (pu_col_mv_t *)ps_memtab->pv_base;
1717
        /* increment the memtabs */
1718
8.22k
        ps_memtab++;
1719
1720
        /* reference colocated MV bank map */
1721
8.22k
        pu1_col_mv_map = (UWORD8 *)ps_memtab->pv_base;
1722
        /* increment the memtabs */
1723
8.22k
        ps_memtab++;
1724
1725
        /* reference collocated MV bank map offsets map */
1726
8.22k
        pu2_col_num_pu_map = (UWORD16 *)ps_memtab->pv_base;
1727
        /* increment the memtabs */
1728
8.22k
        ps_memtab++;
1729
1730
        /* reference colocated MV bank ctb offset */
1731
8.22k
        pu4_col_mv_off = (UWORD32 *)ps_memtab->pv_base;
1732
        /* increment the memtabs */
1733
8.22k
        ps_memtab++;
1734
1735
        /* compute the stride and frame height after accounting for padding */
1736
8.22k
        recon_stride = ((num_ctb_horz * ctb_size) + (PAD_HORZ << 1));
1737
8.22k
        luma_frm_height = ((num_ctb_vert * ctb_size) + (PAD_VERT << 1));
1738
8.22k
        luma_frm_size = recon_stride * luma_frm_height;
1739
        /* The subpel buffer is also incremented to take care of padding */
1740
        /* Both luma and subpel buffer use same stride                   */
1741
8.22k
        pu1_subpel_buf += (recon_stride * PAD_VERT);
1742
8.22k
        pu1_subpel_buf += PAD_HORZ;
1743
1744
        /* Keep memory for an extra CTB at the right and bottom of frame.
1745
        This extra space is needed by dist-encoding and unused in non-dist-encoding */
1746
8.22k
        num_pu_in_frm = (num_ctb_horz + 1) * num_pu_in_ctb * (num_ctb_vert + 1);
1747
1748
16.4k
        for(i = 0; i < i4_num_bitrate_inst; i++)
1749
8.22k
        {
1750
8.22k
            pv_uv_recon_buf[i] = pv_recon_buf[i];
1751
1752
            /* increment the recon buffer to take care of padding */
1753
8.22k
            pv_recon_buf[i] = (UWORD8 *)pv_recon_buf[i] + (recon_stride * PAD_VERT) + PAD_HORZ;
1754
1755
            /* chroma buffer starts at the end of luma buffer */
1756
8.22k
            pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + luma_frm_size;
1757
8.22k
            if(ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.i4_internal_bit_depth == 8)
1758
8.22k
            {
1759
                /* increment the chroma recon buffer to take care of padding    */
1760
                /* vert padding halved but horiz is same due to uv interleave   */
1761
8.22k
                pv_uv_recon_buf[i] =
1762
8.22k
                    (UWORD8 *)pv_uv_recon_buf[i] + (recon_stride * (PAD_VERT >> 1)) +
1763
8.22k
                    ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
1764
8.22k
                         ? (recon_stride * (PAD_VERT >> 1))
1765
8.22k
                         : 0);
1766
8.22k
                pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + PAD_HORZ;
1767
8.22k
            }
1768
1769
            /* loop to initialise all the memories */
1770
            /* initialize recon buffers */
1771
            /* only YUV buffers are allocated for each bit-rate instnaces.
1772
            Subpel buffers and col buffers are made NULL for auxiliary bit-rate instances,
1773
            since ME and IPE happens only for reference bit-rate instnace */
1774
49.3k
            for(ctr = 0; ctr < (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS); ctr++)
1775
41.1k
            {
1776
41.1k
                pps_pic_bufs[i][ctr] =
1777
41.1k
                    ps_pic_bufs[i];  //check the index of pps [i] should be first or last index?!!
1778
1779
41.1k
                ps_pic_bufs[i]->s_yuv_buf_desc.i4_size = sizeof(iv_enc_yuv_buf_t);
1780
41.1k
                ps_pic_bufs[i]->s_yuv_buf_desc.pv_y_buf = pv_recon_buf[i];
1781
41.1k
                ps_pic_bufs[i]->s_yuv_buf_desc.pv_v_buf = NULL;
1782
41.1k
                {
1783
41.1k
                    ps_pic_bufs[i]->s_yuv_buf_desc.pv_u_buf = pv_uv_recon_buf[i];
1784
41.1k
                }
1785
41.1k
                ps_pic_bufs[i]->apu1_y_sub_pel_planes[0] = ((i == 0) ? pu1_subpel_buf : NULL);
1786
41.1k
                ps_pic_bufs[i]->apu1_y_sub_pel_planes[1] =
1787
41.1k
                    ((i == 0) ? (pu1_subpel_buf + luma_frm_size) : NULL);
1788
41.1k
                ps_pic_bufs[i]->apu1_y_sub_pel_planes[2] =
1789
41.1k
                    ((i == 0) ? (pu1_subpel_buf + (luma_frm_size * 2)) : NULL);
1790
41.1k
                ps_pic_bufs[i]->ps_frm_col_mv = ps_col_mv;
1791
41.1k
                ps_pic_bufs[i]->pu1_frm_pu_map = pu1_col_mv_map;
1792
41.1k
                ps_pic_bufs[i]->pu2_num_pu_map = pu2_col_num_pu_map;
1793
41.1k
                ps_pic_bufs[i]->pu4_pu_off = pu4_col_mv_off;
1794
41.1k
                ps_pic_bufs[i]->i4_is_free = 1;
1795
41.1k
                ps_pic_bufs[i]->i4_poc = -1;
1796
41.1k
                ps_pic_bufs[i]->i4_display_num = -1;
1797
41.1k
                ps_pic_bufs[i]->i4_buf_id = ctr;
1798
1799
                /* frame level buff increments */
1800
41.1k
                ps_col_mv += num_pu_in_frm;
1801
41.1k
                pu1_col_mv_map += num_pu_in_frm;
1802
41.1k
                pu2_col_num_pu_map += (num_ctb_horz * num_ctb_vert);
1803
41.1k
                pu4_col_mv_off += (num_ctb_horz * num_ctb_vert);
1804
1805
41.1k
                if(ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
1806
0
                {
1807
0
                    pv_recon_buf[i] = (UWORD8 *)pv_recon_buf[i] + (luma_frm_size << 1);
1808
0
                    pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + (luma_frm_size << 1);
1809
0
                }
1810
41.1k
                else
1811
41.1k
                {
1812
41.1k
                    pv_recon_buf[i] = (UWORD8 *)pv_recon_buf[i] + ((3 * luma_frm_size) >> 1);
1813
41.1k
                    pv_uv_recon_buf[i] = (UWORD8 *)pv_uv_recon_buf[i] + ((3 * luma_frm_size) >> 1);
1814
41.1k
                }
1815
41.1k
                pu1_subpel_buf += ((3 + L0ME_IN_OPENLOOP_MODE) * luma_frm_size); /* 3 planes */
1816
41.1k
                ps_pic_bufs[i]++;
1817
41.1k
            }  //ctr ends
1818
1819
            /* store the queue pointer and num buffs to context */
1820
8.22k
            ps_enc_ctxt->pps_recon_buf_q[i] = pps_pic_bufs[i];
1821
8.22k
            ps_enc_ctxt->ai4_num_buf_recon_q[i] = (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS);
1822
1823
8.22k
        }  //bitrate ctr ends
1824
1825
8.22k
    }  //end of system memory init
1826
1827
    /* Pre encode group recon buffer  containier NO Buffers will be allocated / used */
1828
8.22k
    {
1829
8.22k
        recon_pic_buf_t *ps_pic_bufs;
1830
1831
        /* recon picture buffer pointer array */
1832
8.22k
        pps_pre_enc_pic_bufs = (recon_pic_buf_t **)ps_memtab->pv_base;
1833
        /* increment the memtabs */
1834
8.22k
        ps_memtab++;
1835
1836
        /* recon picture buffers structures */
1837
8.22k
        ps_pic_bufs = (recon_pic_buf_t *)ps_memtab->pv_base;
1838
        /* increment the memtabs */
1839
8.22k
        ps_memtab++;
1840
1841
        /* loop to initialise all the memories */
1842
49.3k
        for(ctr = 0; ctr < (max_num_ref_pics + 1); ctr++)
1843
41.1k
        {
1844
41.1k
            pps_pre_enc_pic_bufs[ctr] = ps_pic_bufs;
1845
1846
41.1k
            ps_pic_bufs->s_yuv_buf_desc.i4_size = sizeof(iv_enc_yuv_buf_t);
1847
41.1k
            ps_pic_bufs->s_yuv_buf_desc.pv_y_buf = NULL;
1848
41.1k
            ps_pic_bufs->s_yuv_buf_desc.pv_u_buf = NULL;
1849
41.1k
            ps_pic_bufs->s_yuv_buf_desc.pv_v_buf = NULL;
1850
41.1k
            ps_pic_bufs->apu1_y_sub_pel_planes[0] = NULL;
1851
41.1k
            ps_pic_bufs->apu1_y_sub_pel_planes[1] = NULL;
1852
41.1k
            ps_pic_bufs->apu1_y_sub_pel_planes[2] = NULL;
1853
41.1k
            ps_pic_bufs->ps_frm_col_mv = NULL;
1854
41.1k
            ps_pic_bufs->pu1_frm_pu_map = NULL;
1855
41.1k
            ps_pic_bufs->pu2_num_pu_map = NULL;
1856
41.1k
            ps_pic_bufs->pu4_pu_off = NULL;
1857
41.1k
            ps_pic_bufs->i4_is_free = 1;
1858
41.1k
            ps_pic_bufs->i4_poc = -1;
1859
41.1k
            ps_pic_bufs->i4_buf_id = ctr;
1860
1861
            /* frame level buff increments */
1862
41.1k
            ps_pic_bufs++;
1863
41.1k
        }
1864
1865
        /* store the queue pointer and num buffs to context */
1866
8.22k
        ps_enc_ctxt->pps_pre_enc_recon_buf_q = pps_pre_enc_pic_bufs;
1867
8.22k
        ps_enc_ctxt->i4_pre_enc_num_buf_recon_q = (max_num_ref_pics + 1);
1868
8.22k
    }
1869
1870
    /* Frame level buffers and Que between pre-encode & encode */
1871
8.22k
    {
1872
8.22k
        pre_enc_me_ctxt_t *ps_pre_enc_bufs;
1873
8.22k
        pre_enc_L0_ipe_encloop_ctxt_t *ps_L0_ipe_enc_bufs;
1874
8.22k
        ihevce_lap_enc_buf_t *ps_lap_enc_input_buf;
1875
8.22k
        ctb_analyse_t *ps_ctb_analyse;
1876
8.22k
        UWORD8 *pu1_me_lyr_ctxt;
1877
8.22k
        UWORD8 *pu1_me_lyr_bank_ctxt;
1878
8.22k
        UWORD8 *pu1_mv_bank;
1879
8.22k
        UWORD8 *pu1_ref_idx_bank;
1880
8.22k
        double *plf_intra_8x8_cost;
1881
8.22k
        ipe_l0_ctb_analyse_for_me_t *ps_ipe_analyse_ctb;
1882
8.22k
        ihevce_ed_ctb_l1_t *ps_ed_ctb_l1;
1883
8.22k
        ihevce_ed_blk_t *ps_layer1_buf;
1884
8.22k
        ihevce_ed_blk_t *ps_layer2_buf;
1885
8.22k
        UWORD8 *pu1_lap_input_yuv_buf[4];
1886
8.22k
        UWORD8 *pu1_input_synch_ctrl_cmd;
1887
8.22k
        WORD32 i4_count = 0;
1888
        /*initialize the memory for input buffer*/
1889
8.22k
        {
1890
16.4k
            for(i4_count = 0; i4_count < i4_total_queues; i4_count++)
1891
8.22k
            {
1892
8.22k
                pu1_lap_input_yuv_buf[i4_count] = (UWORD8 *)ps_memtab->pv_base;
1893
                /* increment the memtabs */
1894
8.22k
                ps_memtab++;
1895
8.22k
            }
1896
8.22k
            pps_lap_enc_input_bufs = (ihevce_lap_enc_buf_t **)ps_memtab->pv_base;
1897
            /* increment the memtabs */
1898
8.22k
            ps_memtab++;
1899
1900
            /*memory for the input buffer structure*/
1901
8.22k
            ps_lap_enc_input_buf = (ihevce_lap_enc_buf_t *)ps_memtab->pv_base;
1902
8.22k
            ps_memtab++;
1903
1904
8.22k
            pu1_input_synch_ctrl_cmd = (UWORD8 *)ps_memtab->pv_base;
1905
8.22k
            ps_memtab++;
1906
8.22k
        }
1907
        /* pre encode /encode coding buffer pointer array */
1908
8.22k
        pps_pre_enc_bufs = (pre_enc_me_ctxt_t **)ps_memtab->pv_base;
1909
        /* increment the memtabs */
1910
8.22k
        ps_memtab++;
1911
1912
        /* pre encode /encode buffer structure */
1913
8.22k
        ps_pre_enc_bufs = (pre_enc_me_ctxt_t *)ps_memtab->pv_base;
1914
        /* increment the memtabs */
1915
8.22k
        ps_memtab++;
1916
1917
        /*  Pre-encode L0 IPE output to ME buffer pointer */
1918
8.22k
        pps_L0_ipe_enc_bufs = (pre_enc_L0_ipe_encloop_ctxt_t **)ps_memtab->pv_base;
1919
        /* increment the memtabs */
1920
8.22k
        ps_memtab++;
1921
1922
        /* Pre-encode L0 IPE output to ME buffer */
1923
8.22k
        ps_L0_ipe_enc_bufs = (pre_enc_L0_ipe_encloop_ctxt_t *)ps_memtab->pv_base;
1924
        /* increment the memtabs */
1925
8.22k
        ps_memtab++;
1926
1927
        /* CTB analyse Frame level  */
1928
8.22k
        ps_ctb_analyse = (ctb_analyse_t *)ps_memtab->pv_base;
1929
        /* increment the memtabs */
1930
8.22k
        ps_memtab++;
1931
1932
        /* ME layer ctxt Frame level  */
1933
8.22k
        pu1_me_lyr_ctxt = (UWORD8 *)ps_memtab->pv_base;
1934
        /* increment the memtabs */
1935
8.22k
        ps_memtab++;
1936
1937
        /* ME layer bank ctxt Frame level  */
1938
8.22k
        pu1_me_lyr_bank_ctxt = (UWORD8 *)ps_memtab->pv_base;
1939
        /* increment the memtabs */
1940
8.22k
        ps_memtab++;
1941
1942
        /* ME layer MV bank Frame level  */
1943
8.22k
        pu1_mv_bank = (UWORD8 *)ps_memtab->pv_base;
1944
        /* increment the memtabs */
1945
8.22k
        ps_memtab++;
1946
1947
        /* ME layer ref idx bank Frame level  */
1948
8.22k
        pu1_ref_idx_bank = (UWORD8 *)ps_memtab->pv_base;
1949
        /* increment the memtabs */
1950
8.22k
        ps_memtab++;
1951
        /* 8x8 intra costs for entire frame */
1952
8.22k
        plf_intra_8x8_cost = (double *)ps_memtab->pv_base;
1953
8.22k
        ps_memtab++;
1954
1955
        /* ctb intra costs and modes for entire frame */
1956
8.22k
        ps_ipe_analyse_ctb = (ipe_l0_ctb_analyse_for_me_t *)ps_memtab->pv_base;
1957
8.22k
        ps_memtab++;
1958
1959
        /*Contains ctb level information at pre-intra stage */
1960
8.22k
        ps_ed_ctb_l1 = (ihevce_ed_ctb_l1_t *)ps_memtab->pv_base;
1961
8.22k
        ps_memtab++;
1962
1963
        /* Layer L1 buf */
1964
8.22k
        ps_layer1_buf = (ihevce_ed_blk_t *)ps_memtab->pv_base;
1965
        /* increment the memtabs */
1966
8.22k
        ps_memtab++;
1967
1968
        /* Layer2 buf */
1969
8.22k
        ps_layer2_buf = (ihevce_ed_blk_t *)ps_memtab->pv_base;
1970
        /* increment the memtabs */
1971
8.22k
        ps_memtab++;
1972
1973
        /* loop to initialise all the memories*/
1974
        /*mrs: assign individual input yuv frame pointers here*/
1975
1976
8.22k
        i4_count = 0;
1977
        /* loop to initialise the buffer pointer */
1978
31.0k
        for(ctr = 0; ctr < num_input_buf_per_queue; ctr++)
1979
22.7k
        {
1980
22.7k
            pps_lap_enc_input_bufs[ctr] = &ps_lap_enc_input_buf[ctr];
1981
1982
22.7k
            pps_lap_enc_input_bufs[ctr]->s_input_buf.i4_size = sizeof(iv_input_data_ctrl_buffs_t);
1983
1984
22.7k
            pps_lap_enc_input_bufs[ctr]->s_input_buf.pv_synch_ctrl_bufs = pu1_input_synch_ctrl_cmd;
1985
1986
22.7k
            pps_lap_enc_input_bufs[ctr]->s_input_buf.s_input_buf.i4_size = sizeof(iv_yuv_buf_t);
1987
1988
22.7k
            pu1_input_synch_ctrl_cmd += ENC_COMMAND_BUFF_SIZE;
1989
            /*pointer to i/p buf initialised to null in case of run time allocation*/
1990
1991
22.7k
            {
1992
22.7k
                pps_lap_enc_input_bufs[ctr]->s_lap_out.s_input_buf.pv_y_buf =
1993
22.7k
                    pu1_lap_input_yuv_buf[i4_count];
1994
1995
22.7k
                pps_lap_enc_input_bufs[ctr]->s_lap_out.s_input_buf.pv_u_buf =
1996
22.7k
                    pu1_lap_input_yuv_buf[i4_count] + i4_luma_min_size;
1997
1998
22.7k
                pps_lap_enc_input_bufs[ctr]->s_lap_out.s_input_buf.pv_v_buf =
1999
22.7k
                    NULL; /*since yuv 420 format*/
2000
2001
22.7k
                pu1_lap_input_yuv_buf[i4_count] += i4_yuv_min_size;
2002
2003
22.7k
                if(((ctr + 1) % MAX_QUEUE) == 0)
2004
0
                    i4_count++;
2005
22.7k
            }
2006
22.7k
        }
2007
24.6k
        for(ctr = 0; ctr < num_bufs_preenc_me_que; ctr++)
2008
16.4k
        {
2009
16.4k
            pps_pre_enc_bufs[ctr] = ps_pre_enc_bufs;
2010
2011
16.4k
            ps_pre_enc_bufs->ps_ctb_analyse = ps_ctb_analyse;
2012
16.4k
            ps_pre_enc_bufs->pv_me_lyr_ctxt = (void *)pu1_me_lyr_ctxt;
2013
16.4k
            ps_pre_enc_bufs->pv_me_lyr_bnk_ctxt = (void *)pu1_me_lyr_bank_ctxt;
2014
16.4k
            ps_pre_enc_bufs->pv_me_mv_bank = (void *)pu1_mv_bank;
2015
16.4k
            ps_pre_enc_bufs->pv_me_ref_idx = (void *)pu1_ref_idx_bank;
2016
16.4k
            ps_pre_enc_bufs->ps_layer1_buf = ps_layer1_buf;
2017
16.4k
            ps_pre_enc_bufs->ps_layer2_buf = ps_layer2_buf;
2018
16.4k
            ps_pre_enc_bufs->ps_ed_ctb_l1 = ps_ed_ctb_l1;
2019
16.4k
            ps_pre_enc_bufs->plf_intra_8x8_cost = plf_intra_8x8_cost;
2020
2021
16.4k
            ps_ctb_analyse += num_ctb_horz * num_ctb_vert;
2022
16.4k
            pu1_me_lyr_ctxt += sizeof(layer_ctxt_t);
2023
16.4k
            pu1_me_lyr_bank_ctxt += sizeof(layer_mv_t);
2024
16.4k
            pu1_mv_bank += mv_bank_size;
2025
16.4k
            pu1_ref_idx_bank += ref_idx_bank_size;
2026
16.4k
            plf_intra_8x8_cost +=
2027
16.4k
                (((num_ctb_horz * ctb_size) >> 3) * ((num_ctb_vert * ctb_size) >> 3));
2028
16.4k
            ps_ed_ctb_l1 += (a_ctb_align_wd[1] >> 5) * (a_ctb_align_ht[1] >> 5);
2029
16.4k
            ps_layer1_buf += (a_ctb_align_wd[1] >> 2) * (a_ctb_align_ht[1] >> 2);
2030
16.4k
            ps_layer2_buf += (a_ctb_align_wd[2] >> 2) * (a_ctb_align_ht[2] >> 2);
2031
16.4k
            ps_pre_enc_bufs++;
2032
16.4k
        }
2033
2034
16.4k
        for(ctr = 0; ctr < num_bufs_L0_ipe_enc; ctr++)
2035
8.22k
        {
2036
8.22k
            pps_L0_ipe_enc_bufs[ctr] = ps_L0_ipe_enc_bufs;
2037
8.22k
            ps_L0_ipe_enc_bufs->ps_ipe_analyse_ctb = ps_ipe_analyse_ctb;
2038
8.22k
            ps_ipe_analyse_ctb += num_ctb_horz * num_ctb_vert;
2039
8.22k
            ps_L0_ipe_enc_bufs++;
2040
8.22k
        }
2041
8.22k
    }
2042
2043
    /* Frame level que between ME and Enc rd-opt */
2044
8.22k
    {
2045
8.22k
        me_enc_rdopt_ctxt_t *ps_me_enc_bufs;
2046
8.22k
        job_queue_t *ps_job_q_enc;
2047
8.22k
        me_ctb_data_t *ps_cur_ctb_me_data;
2048
8.22k
        cur_ctb_cu_tree_t *ps_cur_ctb_cu_tree;
2049
2050
        /* pre encode /encode coding buffer pointer array */
2051
8.22k
        pps_me_enc_bufs = (me_enc_rdopt_ctxt_t **)ps_memtab->pv_base;
2052
        /* increment the memtabs */
2053
8.22k
        ps_memtab++;
2054
2055
        /* pre encode /encode buffer structure */
2056
8.22k
        ps_me_enc_bufs = (me_enc_rdopt_ctxt_t *)ps_memtab->pv_base;
2057
        /* increment the memtabs */
2058
8.22k
        ps_memtab++;
2059
2060
        /*me and enc job queue memory */
2061
8.22k
        ps_job_q_enc = (job_queue_t *)ps_memtab->pv_base;
2062
        /* increment the memtabs */
2063
8.22k
        ps_memtab++;
2064
2065
        /*ctb me data memory*/
2066
8.22k
        ps_cur_ctb_cu_tree = (cur_ctb_cu_tree_t *)ps_memtab->pv_base;
2067
        /* increment the memtabs */
2068
8.22k
        ps_memtab++;
2069
2070
        /*ctb me data memory*/
2071
8.22k
        ps_cur_ctb_me_data = (me_ctb_data_t *)ps_memtab->pv_base;
2072
        /* increment the memtabs */
2073
8.22k
        ps_memtab++;
2074
2075
        /* loop to initialise all the memories */
2076
16.4k
        for(ctr = 0; ctr < NUM_ME_ENC_BUFS; ctr++)
2077
8.22k
        {
2078
8.22k
            pps_me_enc_bufs[ctr] = ps_me_enc_bufs;
2079
2080
8.22k
            ps_me_enc_bufs->ps_job_q_enc = ps_job_q_enc;
2081
8.22k
            ps_me_enc_bufs->ps_cur_ctb_cu_tree = ps_cur_ctb_cu_tree;
2082
8.22k
            ps_me_enc_bufs->ps_cur_ctb_me_data = ps_cur_ctb_me_data;
2083
2084
8.22k
            ps_job_q_enc += (MAX_NUM_VERT_UNITS_FRM * NUM_ENC_JOBS_QUES);
2085
            /* In tile case, based on the number of column tiles,
2086
            increment jobQ per column tile        */
2087
8.22k
            if(1 == ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_tiles_enabled_flag)
2088
0
            {
2089
0
                WORD32 col_tile_ctr;
2090
0
                for(col_tile_ctr = 1;
2091
0
                    col_tile_ctr < ps_enc_ctxt->ps_stat_prms->s_app_tile_params.i4_num_tile_cols;
2092
0
                    col_tile_ctr++)
2093
0
                {
2094
0
                    ps_job_q_enc += (MAX_NUM_VERT_UNITS_FRM * NUM_ENC_JOBS_QUES);
2095
0
                }
2096
0
            }
2097
2098
8.22k
            ps_cur_ctb_cu_tree += (num_ctb_horz * MAX_NUM_NODES_CU_TREE * num_ctb_vert);
2099
8.22k
            ps_cur_ctb_me_data += (num_ctb_horz * num_ctb_vert);
2100
2101
8.22k
            ps_me_enc_bufs++;
2102
8.22k
        }
2103
8.22k
    }
2104
    /* Frame level Que between frame process & entropy */
2105
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
2106
8.22k
    {
2107
8.22k
        frm_proc_ent_cod_ctxt_t *ps_frmp_ent_bufs;
2108
8.22k
        ctb_enc_loop_out_t *ps_ctb;
2109
8.22k
        cu_enc_loop_out_t *ps_cu;
2110
8.22k
        tu_enc_loop_out_t *ps_tu;
2111
8.22k
        pu_t *ps_pu;
2112
8.22k
        UWORD8 *pu1_coeffs;
2113
8.22k
        WORD32 num_ctb_in_frm;
2114
8.22k
        WORD32 coeff_size;
2115
2116
        /* frame process/entropy coding buffer pointer array */
2117
8.22k
        pps_frm_proc_ent_cod_bufs[i] = (frm_proc_ent_cod_ctxt_t **)ps_memtab->pv_base;
2118
        /* increment the memtabs */
2119
8.22k
        ps_memtab++;
2120
2121
        /* frame process/entropy coding buffer structure */
2122
8.22k
        ps_frmp_ent_bufs = (frm_proc_ent_cod_ctxt_t *)ps_memtab->pv_base;
2123
        /* increment the memtabs */
2124
8.22k
        ps_memtab++;
2125
2126
        /* CTB enc loop Frame level  */
2127
8.22k
        ps_ctb = (ctb_enc_loop_out_t *)ps_memtab->pv_base;
2128
        /* increment the memtabs */
2129
8.22k
        ps_memtab++;
2130
2131
        /* CU enc loop Frame level  */
2132
8.22k
        ps_cu = (cu_enc_loop_out_t *)ps_memtab->pv_base;
2133
        /* increment the memtabs */
2134
8.22k
        ps_memtab++;
2135
2136
        /* TU enc loop Frame level  */
2137
8.22k
        ps_tu = (tu_enc_loop_out_t *)ps_memtab->pv_base;
2138
        /* increment the memtabs */
2139
8.22k
        ps_memtab++;
2140
2141
        /* PU enc loop Frame level  */
2142
8.22k
        ps_pu = (pu_t *)ps_memtab->pv_base;
2143
        /* increment the memtabs */
2144
8.22k
        ps_memtab++;
2145
2146
        /* Coeffs Frame level  */
2147
8.22k
        pu1_coeffs = (UWORD8 *)ps_memtab->pv_base;
2148
        /* increment the memtabs */
2149
8.22k
        ps_memtab++;
2150
2151
8.22k
#ifndef DISABLE_SEI
2152
        /* CC User Data  */
2153
8.22k
        UWORD8 *pu1_sei_payload;
2154
8.22k
        pu1_sei_payload = (UWORD8 *)ps_memtab->pv_base;
2155
8.22k
        ps_memtab++;
2156
8.22k
#endif
2157
2158
8.22k
        num_ctb_in_frm = num_ctb_horz * num_ctb_vert;
2159
2160
        /* calculate the coeff size */
2161
8.22k
        coeff_size =
2162
8.22k
            num_ctb_horz * ((ps_enc_ctxt->ps_stat_prms->s_src_prms.i4_chr_format == IV_YUV_422SP_UV)
2163
8.22k
                                ? (num_tu_in_ctb << 1)
2164
8.22k
                                : ((num_tu_in_ctb * 3) >> 1));
2165
8.22k
        coeff_size = coeff_size * num_ctb_vert * MAX_SCAN_COEFFS_BYTES_4x4;
2166
        /* loop to initialise all the memories */
2167
16.4k
        for(ctr = 0; ctr < NUM_FRMPROC_ENTCOD_BUFS; ctr++)
2168
8.22k
        {
2169
8.22k
            pps_frm_proc_ent_cod_bufs[i][ctr] = ps_frmp_ent_bufs;
2170
2171
8.22k
            ps_frmp_ent_bufs->ps_frm_ctb_data = ps_ctb;
2172
8.22k
            ps_frmp_ent_bufs->ps_frm_cu_data = ps_cu;
2173
8.22k
            ps_frmp_ent_bufs->ps_frm_pu_data = ps_pu;
2174
8.22k
            ps_frmp_ent_bufs->ps_frm_tu_data = ps_tu;
2175
8.22k
            ps_frmp_ent_bufs->pv_coeff_data = pu1_coeffs;
2176
2177
            /* memset the slice headers and buffer to keep track */
2178
8.22k
            memset(&ps_frmp_ent_bufs->s_slice_hdr, 0, sizeof(slice_header_t));
2179
2180
            /*PIC_INFO*/
2181
8.22k
            memset(&ps_frmp_ent_bufs->s_pic_level_info, 0, sizeof(s_pic_level_acc_info_t));
2182
2183
8.22k
            ps_ctb += num_ctb_in_frm;
2184
8.22k
            ps_cu += num_ctb_in_frm * num_cu_in_ctb;
2185
8.22k
            ps_pu += num_ctb_in_frm * num_pu_in_ctb;
2186
8.22k
            ps_tu += num_ctb_in_frm * num_tu_in_ctb;
2187
2188
8.22k
            pu1_coeffs += coeff_size;
2189
2190
8.22k
#ifndef DISABLE_SEI
2191
90.4k
            for(WORD32 num_sei = 0; num_sei < MAX_NUMBER_OF_SEI_PAYLOAD; num_sei++)
2192
82.2k
            {
2193
82.2k
                ps_frmp_ent_bufs->as_sei_payload[num_sei].pu1_sei_payload = pu1_sei_payload;
2194
82.2k
                ps_frmp_ent_bufs->as_sei_payload[num_sei].u4_payload_type = 0;
2195
82.2k
                ps_frmp_ent_bufs->as_sei_payload[num_sei].u4_payload_length = 0;
2196
82.2k
                pu1_sei_payload += MAX_SEI_PAYLOAD_PER_TLV;
2197
82.2k
            }
2198
2199
8.22k
#endif
2200
8.22k
            ps_frmp_ent_bufs++;
2201
8.22k
        }
2202
8.22k
    }
2203
2204
    /* Working memory for encoder */
2205
8.22k
    ps_enc_ctxt->pu1_frm_lvl_wkg_mem = (UWORD8 *)ps_memtab->pv_base;
2206
8.22k
    ps_memtab++;
2207
2208
    /* Job Que memory */
2209
    /* Job que memory distribution is as follows                                                 _______
2210
    enc_group_ping -> MAX_NUM_VERT_UNITS_FRM for all the passes (NUM_ENC_JOBS_QUES)------------>|_______|
2211
    enc_group_pong -> MAX_NUM_VERT_UNITS_FRM for all the passes (NUM_ENC_JOBS_QUES)------------>|_______|
2212
    pre_enc_group_ping -> MAX_NUM_VERT_UNITS_FRM for all the passes (NUM_PRE_ENC_JOBS_QUES)---->|_______|
2213
    pre_enc_group_ping -> MAX_NUM_VERT_UNITS_FRM for all the passes (NUM_PRE_ENC_JOBS_QUES)---->|_______|
2214
    */
2215
2216
8.22k
    ps_enc_ctxt->s_multi_thrd.aps_job_q_pre_enc[0] = (job_queue_t *)ps_memtab->pv_base;
2217
16.4k
    for(ctr = 1; ctr < max_delay_preenc_l0_que; ctr++)
2218
8.22k
    {
2219
8.22k
        ps_enc_ctxt->s_multi_thrd.aps_job_q_pre_enc[ctr] =
2220
8.22k
            ps_enc_ctxt->s_multi_thrd.aps_job_q_pre_enc[0] +
2221
8.22k
            (MAX_NUM_VERT_UNITS_FRM * NUM_PRE_ENC_JOBS_QUES * ctr);
2222
8.22k
    }
2223
8.22k
    ps_memtab++;
2224
2225
    /* -----Frameproc Entcod Que mem_init --- */
2226
    /* init ptrs for each bit-rate */
2227
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
2228
8.22k
    {
2229
8.22k
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_FRM_PRS_ENT_COD_Q + i] = ihevce_buff_que_init(
2230
8.22k
            ps_memtab, NUM_FRMPROC_ENTCOD_BUFS, (void **)pps_frm_proc_ent_cod_bufs[i]);
2231
8.22k
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2232
8.22k
    }
2233
    /*mrs*/
2234
    /* ----Encoder owned input buffer queue init----*/
2235
8.22k
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_ENC_INPUT_Q] =
2236
8.22k
        ihevce_buff_que_init(ps_memtab, num_input_buf_per_queue, (void **)pps_lap_enc_input_bufs);
2237
8.22k
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2238
2239
    /* -----Pre-Encode / Encode Que mem_init --- */
2240
8.22k
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_PRE_ENC_ME_Q] =
2241
8.22k
        ihevce_buff_que_init(ps_memtab, num_bufs_preenc_me_que, (void **)pps_pre_enc_bufs);
2242
2243
8.22k
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2244
2245
    /* -----ME / Enc-RD opt Que mem_init --- */
2246
8.22k
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_ME_ENC_RDOPT_Q] =
2247
8.22k
        ihevce_buff_que_init(ps_memtab, NUM_ME_ENC_BUFS, (void **)pps_me_enc_bufs);
2248
2249
8.22k
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2250
2251
    /* -----Pre-Encode L0 IPE to enc queue --- */
2252
8.22k
    ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_L0_IPE_ENC_Q] =
2253
8.22k
        ihevce_buff_que_init(ps_memtab, num_bufs_L0_ipe_enc, (void **)pps_L0_ipe_enc_bufs);
2254
2255
8.22k
    ps_memtab += ihevce_buff_que_get_num_mem_recs();
2256
2257
    /* ---------- Dependency Manager allocations -------- */
2258
8.22k
    {
2259
8.22k
        osal_sem_attr_t attr = OSAL_DEFAULT_SEM_ATTR;
2260
8.22k
        WORD32 i1_is_sem_enabled;
2261
2262
8.22k
        if(ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
2263
8.22k
               .i4_quality_preset >= IHEVCE_QUALITY_P4)
2264
2.42k
        {
2265
2.42k
            i1_is_sem_enabled = 0;
2266
2.42k
        }
2267
5.79k
        else
2268
5.79k
        {
2269
5.79k
            i1_is_sem_enabled = 1;
2270
5.79k
        }
2271
2272
        /* allocate semaphores for all the threads in pre-enc and enc */
2273
16.4k
        for(ctr = 0; ctr < ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds; ctr++)
2274
8.22k
        {
2275
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle[ctr] =
2276
8.22k
                osal_sem_create(ps_intrf_ctxt->pv_osal_handle, &attr);
2277
8.22k
            if(NULL == ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle[ctr])
2278
0
            {
2279
0
                ps_intrf_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
2280
0
                return;
2281
0
            }
2282
8.22k
        }
2283
2284
16.4k
        for(ctr = 0; ctr < ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds; ctr++)
2285
8.22k
        {
2286
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle[ctr] =
2287
8.22k
                osal_sem_create(ps_intrf_ctxt->pv_osal_handle, &attr);
2288
8.22k
            if(NULL == ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle[ctr])
2289
0
            {
2290
0
                ps_intrf_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
2291
0
                return;
2292
0
            }
2293
8.22k
        }
2294
2295
        /* --- ME-EncLoop Dep Mngr Row-Row Init -- */
2296
16.4k
        for(ctr = 0; ctr < NUM_ME_ENC_BUFS; ctr++)
2297
8.22k
        {
2298
8.22k
            me_enc_rdopt_ctxt_t *ps_me_enc_bufs = pps_me_enc_bufs[ctr];
2299
2300
8.22k
            ps_me_enc_bufs->pv_dep_mngr_encloop_dep_me = ihevce_dmgr_init(
2301
8.22k
                ps_memtab,
2302
8.22k
                ps_intrf_ctxt->pv_osal_handle,
2303
8.22k
                DEP_MNGR_ROW_ROW_SYNC,
2304
8.22k
                (a_ctb_align_ht[0] / ctb_size),
2305
8.22k
                (a_ctb_align_wd[0] / ctb_size),
2306
8.22k
                ps_enc_ctxt->ps_tile_params_base->i4_num_tile_cols, /* Number of Col Tiles */
2307
8.22k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2308
8.22k
                i1_is_sem_enabled /*Sem Disabled/Enabled*/
2309
8.22k
            );
2310
8.22k
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2311
2312
            /* Register Enc group semaphore handles */
2313
8.22k
            ihevce_dmgr_reg_sem_hdls(
2314
8.22k
                ps_me_enc_bufs->pv_dep_mngr_encloop_dep_me,
2315
8.22k
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2316
8.22k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2317
2318
            /* Register the handle in multithread ctxt also for free purpose */
2319
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_encloop_dep_me[ctr] =
2320
8.22k
                ps_me_enc_bufs->pv_dep_mngr_encloop_dep_me;
2321
8.22k
        }
2322
2323
16.4k
        for(ctr = 0; ctr < i4_num_enc_loop_frm_pllel; ctr++)
2324
8.22k
        {
2325
            /* --- Prev. frame EncLoop Done Dep Mngr Frm-Frm Mem Init -- */
2326
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_done[ctr] = ihevce_dmgr_init(
2327
8.22k
                ps_memtab,
2328
8.22k
                ps_intrf_ctxt->pv_osal_handle,
2329
8.22k
                DEP_MNGR_FRM_FRM_SYNC,
2330
8.22k
                (a_ctb_align_ht[0] / ctb_size),
2331
8.22k
                (a_ctb_align_wd[0] / ctb_size),
2332
8.22k
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
2333
8.22k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2334
8.22k
                1 /*Sem Enabled*/
2335
8.22k
            );
2336
8.22k
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2337
2338
            /* Register Enc group semaphore handles */
2339
8.22k
            ihevce_dmgr_reg_sem_hdls(
2340
8.22k
                ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_done[ctr],
2341
8.22k
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2342
8.22k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2343
8.22k
        }
2344
        /* --- Prev. frame EncLoop Done Dep Mngr  for re-encode  Frm-Frm Mem Init -- */
2345
8.22k
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_enc_done_for_reenc = ihevce_dmgr_init(
2346
8.22k
            ps_memtab,
2347
8.22k
            ps_intrf_ctxt->pv_osal_handle,
2348
8.22k
            DEP_MNGR_FRM_FRM_SYNC,
2349
8.22k
            (a_ctb_align_ht[0] / ctb_size),
2350
8.22k
            (a_ctb_align_wd[0] / ctb_size),
2351
8.22k
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2352
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2353
8.22k
            1 /*Sem Enabled*/
2354
8.22k
        );
2355
8.22k
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2356
2357
        /* Register Enc group semaphore handles */
2358
8.22k
        ihevce_dmgr_reg_sem_hdls(
2359
8.22k
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_enc_done_for_reenc,
2360
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2361
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2362
16.4k
        for(ctr = 0; ctr < i4_num_me_frm_pllel; ctr++)
2363
8.22k
        {
2364
            /* --- Prev. frame ME Done Dep Mngr Frm-Frm Mem Init -- */
2365
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_me_done[ctr] = ihevce_dmgr_init(
2366
8.22k
                ps_memtab,
2367
8.22k
                ps_intrf_ctxt->pv_osal_handle,
2368
8.22k
                DEP_MNGR_FRM_FRM_SYNC,
2369
8.22k
                (a_ctb_align_ht[0] / ctb_size),
2370
8.22k
                (a_ctb_align_wd[0] / ctb_size),
2371
8.22k
                1, /* Number of Col Tiles : Don't care for FRM_FRM */
2372
8.22k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2373
8.22k
                1 /*Sem Enabled*/
2374
8.22k
            );
2375
8.22k
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2376
2377
            /* Register Enc group semaphore handles */
2378
8.22k
            ihevce_dmgr_reg_sem_hdls(
2379
8.22k
                ps_enc_ctxt->s_multi_thrd.apv_dep_mngr_prev_frame_me_done[ctr],
2380
8.22k
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2381
8.22k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2382
8.22k
        }
2383
        /* --- Prev. frame PreEnc L1 Done Dep Mngr Frm-Frm Mem Init -- */
2384
8.22k
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l1 = ihevce_dmgr_init(
2385
8.22k
            ps_memtab,
2386
8.22k
            ps_intrf_ctxt->pv_osal_handle,
2387
8.22k
            DEP_MNGR_FRM_FRM_SYNC,
2388
8.22k
            (a_ctb_align_ht[0] / ctb_size),
2389
8.22k
            (a_ctb_align_wd[0] / ctb_size),
2390
8.22k
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2391
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
2392
8.22k
            1 /*Sem Enabled*/
2393
8.22k
        );
2394
8.22k
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2395
2396
        /* Register Pre-Enc group semaphore handles */
2397
8.22k
        ihevce_dmgr_reg_sem_hdls(
2398
8.22k
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l1,
2399
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2400
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds);
2401
2402
        /* --- Prev. frame PreEnc HME Done Dep Mngr Frm-Frm Mem Init -- */
2403
8.22k
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_coarse_me = ihevce_dmgr_init(
2404
8.22k
            ps_memtab,
2405
8.22k
            ps_intrf_ctxt->pv_osal_handle,
2406
8.22k
            DEP_MNGR_FRM_FRM_SYNC,
2407
8.22k
            (a_ctb_align_ht[0] / ctb_size),
2408
8.22k
            (a_ctb_align_wd[0] / ctb_size),
2409
8.22k
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2410
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
2411
8.22k
            1 /*Sem Enabled*/
2412
8.22k
        );
2413
8.22k
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2414
2415
        /* Register Pre-Enc group semaphore handles */
2416
8.22k
        ihevce_dmgr_reg_sem_hdls(
2417
8.22k
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_coarse_me,
2418
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2419
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds);
2420
2421
        /* --- Prev. frame PreEnc L0 Done Dep Mngr Frm-Frm Mem Init -- */
2422
8.22k
        ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l0 = ihevce_dmgr_init(
2423
8.22k
            ps_memtab,
2424
8.22k
            ps_intrf_ctxt->pv_osal_handle,
2425
8.22k
            DEP_MNGR_FRM_FRM_SYNC,
2426
8.22k
            (a_ctb_align_ht[0] / ctb_size),
2427
8.22k
            (a_ctb_align_wd[0] / ctb_size),
2428
8.22k
            1, /* Number of Col Tiles : Don't care for FRM_FRM */
2429
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds,
2430
8.22k
            1 /*Sem Enabled*/
2431
8.22k
        );
2432
8.22k
        ps_memtab += ihevce_dmgr_get_num_mem_recs();
2433
2434
        /* Register Pre-Enc group semaphore handles */
2435
8.22k
        ihevce_dmgr_reg_sem_hdls(
2436
8.22k
            ps_enc_ctxt->s_multi_thrd.pv_dep_mngr_prev_frame_pre_enc_l0,
2437
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2438
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds);
2439
2440
        /* --- ME-Prev Recon Dep Mngr Row-Frm Mem init -- */
2441
49.3k
        for(ctr = 0; ctr < (max_num_ref_pics + 1 + NUM_EXTRA_RECON_BUFS); ctr++)
2442
41.1k
        {
2443
41.1k
            WORD32 ai4_tile_xtra_ctb[4] = { 0 };
2444
2445
41.1k
            ps_enc_ctxt->pps_recon_buf_q[0][ctr]->pv_dep_mngr_recon = ihevce_dmgr_map_init(
2446
41.1k
                ps_memtab,
2447
41.1k
                num_ctb_vert,
2448
41.1k
                num_ctb_horz,
2449
41.1k
                i1_is_sem_enabled, /*Sem Disabled/Enabled*/
2450
41.1k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds,
2451
41.1k
                ai4_tile_xtra_ctb);
2452
2453
41.1k
            ps_memtab += ihevce_dmgr_get_num_mem_recs();
2454
2455
            /* Register Enc group semaphore handles */
2456
41.1k
            ihevce_dmgr_reg_sem_hdls(
2457
41.1k
                ps_enc_ctxt->pps_recon_buf_q[0][ctr]->pv_dep_mngr_recon,
2458
41.1k
                ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2459
41.1k
                ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2460
41.1k
        }
2461
2462
        /* ------ Module level register semaphores -------- */
2463
8.22k
        ihevce_coarse_me_reg_thrds_sem(
2464
8.22k
            ps_enc_ctxt->s_module_ctxt.pv_coarse_me_ctxt,
2465
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_pre_enc_thrd_sem_handle,
2466
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_pre_enc_proc_thrds);
2467
2468
8.22k
        ihevce_enc_loop_reg_sem_hdls(
2469
8.22k
            ps_enc_ctxt->s_module_ctxt.pv_enc_loop_ctxt,
2470
8.22k
            ps_enc_ctxt->s_multi_thrd.apv_enc_thrd_sem_handle,
2471
8.22k
            ps_enc_ctxt->s_multi_thrd.i4_num_enc_proc_thrds);
2472
8.22k
    }
2473
2474
    /* copy the run time source parameters from create time prms */
2475
0
    memcpy(
2476
8.22k
        &ps_enc_ctxt->s_runtime_src_prms,
2477
8.22k
        &ps_enc_ctxt->ps_stat_prms->s_src_prms,
2478
8.22k
        sizeof(ihevce_src_params_t));
2479
2480
8.22k
    memcpy(
2481
8.22k
        &ps_enc_ctxt->s_runtime_tgt_params,
2482
8.22k
        &ps_enc_ctxt->ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id],
2483
8.22k
        sizeof(ihevce_tgt_params_t));
2484
2485
    /* copy the run time coding parameters from create time prms */
2486
8.22k
    memcpy(
2487
8.22k
        &ps_enc_ctxt->s_runtime_coding_prms,
2488
8.22k
        &ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms,
2489
8.22k
        sizeof(ihevce_coding_params_t));
2490
2491
    /*change in run time parameter*/
2492
8.22k
    if(ps_enc_ctxt->ps_stat_prms->s_coding_tools_prms.i4_max_reference_frames == -1)
2493
8.22k
    {
2494
8.22k
        ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames = (DEFAULT_MAX_REFERENCE_PICS)
2495
8.22k
                                                                     << i4_field_pic;
2496
2497
8.22k
        ps_enc_ctxt->s_lap_stat_prms.i4_max_reference_frames =
2498
8.22k
            ps_enc_ctxt->s_runtime_coding_prms.i4_max_reference_frames;
2499
8.22k
    }
2500
2501
    /* populate the frame level ctb parameters based on run time params */
2502
8.22k
    ihevce_set_pre_enc_prms(ps_enc_ctxt);
2503
2504
8.22k
    return;
2505
8.22k
}
2506
2507
/*!
2508
******************************************************************************
2509
* \if Function name : ihevce_mem_manager_que_init \endif
2510
*
2511
* \brief
2512
*    Encoder Que memory init function
2513
*
2514
* \param[in] Encoder context pointer
2515
* \param[in] High level Encoder context pointer
2516
* \param[in] Buffer descriptors
2517
*
2518
* \return
2519
*    None
2520
*
2521
* \author
2522
*  Ittiam
2523
*
2524
*****************************************************************************
2525
*/
2526
void ihevce_mem_manager_que_init(
2527
    enc_ctxt_t *ps_enc_ctxt,
2528
    ihevce_hle_ctxt_t *ps_hle_ctxt,
2529
    iv_input_data_ctrl_buffs_desc_t *ps_input_data_ctrl_buffs_desc,
2530
    iv_input_asynch_ctrl_buffs_desc_t *ps_input_asynch_ctrl_buffs_desc,
2531
    iv_output_data_buffs_desc_t *ps_output_data_buffs_desc,
2532
    iv_recon_data_buffs_desc_t *ps_recon_data_buffs_desc)
2533
8.22k
{
2534
    /* local variables */
2535
8.22k
    WORD32 total_memtabs_req = 0;
2536
8.22k
    WORD32 total_memtabs_used = 0;
2537
8.22k
    WORD32 ctr;
2538
8.22k
    iv_mem_rec_t *ps_memtab;
2539
8.22k
    WORD32 i;  //counter variable
2540
8.22k
    iv_output_data_buffs_desc_t *ps_out_desc;
2541
8.22k
    iv_recon_data_buffs_desc_t *ps_rec_desc;
2542
8.22k
    WORD32 i4_num_bitrate_inst;  //number of bit-rate instance
2543
    /* storing 0th instance's pointer. This will be used for assigning buffer queue handles for input/output queues */
2544
8.22k
    enc_ctxt_t *ps_enc_ctxt_base = (enc_ctxt_t *)ps_hle_ctxt->apv_enc_hdl[0];
2545
2546
8.22k
    i4_num_bitrate_inst = ps_enc_ctxt->i4_num_bitrates;
2547
    //ps_hle_ctxt->ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[0].i4_num_bitrate_instances;
2548
2549
    /* --------------------------------------------------------------------- */
2550
    /* --------------  Collating the number of memtabs required ------------ */
2551
    /* --------------------------------------------------------------------- */
2552
2553
    /* ------ Input Data Que Memtab -------- */
2554
8.22k
    if(0 == ps_enc_ctxt->i4_resolution_id)
2555
8.22k
    {
2556
        /* array of pointers for input */
2557
8.22k
        total_memtabs_req++;
2558
2559
        /* pointers for input desc */
2560
8.22k
        total_memtabs_req++;
2561
2562
        /* que manager buffer requirements */
2563
8.22k
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2564
2565
        /* ------ Input Control Que memtab ----- */
2566
        /* array of pointers for input control */
2567
8.22k
        total_memtabs_req++;
2568
2569
        /* pointers for input control desc */
2570
8.22k
        total_memtabs_req++;
2571
2572
        /* que manager buffer requirements */
2573
8.22k
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2574
8.22k
    }
2575
2576
    /* ------ Output Data Que Memtab -------- */
2577
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
2578
8.22k
    {
2579
        /* array of pointers for output */
2580
8.22k
        total_memtabs_req++;
2581
2582
        /* pointers for output desc */
2583
8.22k
        total_memtabs_req++;
2584
2585
        /* que manager buffer requirements */
2586
8.22k
        total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2587
8.22k
    }
2588
2589
    /* ------ Recon Data Que Memtab -------- */
2590
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
2591
8.22k
    {
2592
8.22k
        if(ps_hle_ctxt->ps_static_cfg_prms->i4_save_recon)
2593
0
        {
2594
            /* array of pointers for input */
2595
0
            total_memtabs_req++;
2596
2597
            /* pointers for input desc */
2598
0
            total_memtabs_req++;
2599
2600
            /* que manager buffer requirements */
2601
0
            total_memtabs_req += ihevce_buff_que_get_num_mem_recs();
2602
0
        }
2603
8.22k
    }
2604
2605
    /* ----- allocate memomry for memtabs --- */
2606
8.22k
    {
2607
8.22k
        iv_mem_rec_t s_memtab;
2608
2609
8.22k
        s_memtab.i4_size = sizeof(iv_mem_rec_t);
2610
8.22k
        s_memtab.i4_mem_size = total_memtabs_req * sizeof(iv_mem_rec_t);
2611
8.22k
        s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2612
8.22k
        s_memtab.i4_mem_alignment = 4;
2613
2614
8.22k
        ps_hle_ctxt->ihevce_mem_alloc(
2615
8.22k
            ps_hle_ctxt->pv_mem_mgr_hdl, &ps_hle_ctxt->ps_static_cfg_prms->s_sys_api, &s_memtab);
2616
8.22k
        if(s_memtab.pv_base == NULL)
2617
0
        {
2618
0
            ps_hle_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
2619
0
            return;
2620
0
        }
2621
8.22k
        ps_memtab = (iv_mem_rec_t *)s_memtab.pv_base;
2622
8.22k
    }
2623
2624
    /* --------------------------------------------------------------------- */
2625
    /* ------------------  Collating memory requirements ------------------- */
2626
    /* --------------------------------------------------------------------- */
2627
8.22k
    if(0 == ps_enc_ctxt->i4_resolution_id)
2628
8.22k
    {
2629
        /* ------ Input Data Que memory requests -------- */
2630
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2631
2632
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2633
2634
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
2635
8.22k
            ((ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs) * (sizeof(ihevce_lap_enc_buf_t *)));
2636
2637
        /* increment the memtab counter */
2638
8.22k
        total_memtabs_used++;
2639
2640
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2641
2642
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2643
2644
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
2645
8.22k
            ((ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs) * (sizeof(ihevce_lap_enc_buf_t)));
2646
2647
        /* increment the memtab counter */
2648
8.22k
        total_memtabs_used++;
2649
2650
        /* call the Que manager get mem recs */
2651
8.22k
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
2652
8.22k
            &ps_memtab[total_memtabs_used],
2653
8.22k
            ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs,
2654
8.22k
            IV_EXT_CACHEABLE_NORMAL_MEM);
2655
2656
        /* ------ Input Control Que memory requests -------- */
2657
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2658
2659
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2660
2661
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
2662
8.22k
            ((ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs) *
2663
8.22k
             (sizeof(iv_input_ctrl_buffs_t *)));
2664
2665
        /* increment the memtab counter */
2666
8.22k
        total_memtabs_used++;
2667
2668
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2669
2670
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2671
2672
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
2673
8.22k
            ((ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs) *
2674
8.22k
             (sizeof(iv_input_ctrl_buffs_t)));
2675
2676
        /* increment the memtab counter */
2677
8.22k
        total_memtabs_used++;
2678
2679
        /* call the Que manager get mem recs */
2680
8.22k
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
2681
8.22k
            &ps_memtab[total_memtabs_used],
2682
8.22k
            ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs,
2683
8.22k
            IV_EXT_CACHEABLE_NORMAL_MEM);
2684
8.22k
    }
2685
2686
    /* ------ Output data Que memory requests -------- */
2687
8.22k
    ps_out_desc = ps_output_data_buffs_desc;
2688
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
2689
8.22k
    {
2690
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2691
2692
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2693
2694
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
2695
8.22k
            ((ps_out_desc->i4_num_bitstream_bufs) * (sizeof(iv_output_data_buffs_t *)));
2696
2697
        /* increment the memtab counter */
2698
8.22k
        total_memtabs_used++;
2699
2700
8.22k
        ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2701
2702
8.22k
        ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2703
2704
8.22k
        ps_memtab[total_memtabs_used].i4_mem_size =
2705
8.22k
            ((ps_out_desc->i4_num_bitstream_bufs) * (sizeof(iv_output_data_buffs_t)));
2706
2707
        /* increment the memtab counter */
2708
8.22k
        total_memtabs_used++;
2709
2710
        /* call the Que manager get mem recs */
2711
8.22k
        total_memtabs_used += ihevce_buff_que_get_mem_recs(
2712
8.22k
            &ps_memtab[total_memtabs_used],
2713
8.22k
            ps_out_desc->i4_num_bitstream_bufs,
2714
8.22k
            IV_EXT_CACHEABLE_NORMAL_MEM);
2715
8.22k
        ps_out_desc++;
2716
8.22k
    }
2717
2718
    //recon_dump
2719
    /* ------ Recon Data Que memory requests -------- */
2720
8.22k
    ps_rec_desc = ps_recon_data_buffs_desc;
2721
8.22k
    if(ps_hle_ctxt->ps_static_cfg_prms->i4_save_recon)
2722
0
    {
2723
0
        for(i = 0; i < i4_num_bitrate_inst; i++)
2724
0
        {
2725
0
            ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2726
2727
0
            ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2728
2729
0
            ps_memtab[total_memtabs_used].i4_mem_size =
2730
0
                ((ps_rec_desc->i4_num_recon_bufs) * (sizeof(iv_enc_recon_data_buffs_t *)));
2731
2732
            /* increment the memtab counter */
2733
0
            total_memtabs_used++;
2734
2735
0
            ps_memtab[total_memtabs_used].i4_mem_alignment = 8;
2736
2737
0
            ps_memtab[total_memtabs_used].e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
2738
2739
0
            ps_memtab[total_memtabs_used].i4_mem_size =
2740
0
                ((ps_rec_desc->i4_num_recon_bufs) * (sizeof(iv_enc_recon_data_buffs_t)));
2741
2742
            /* increment the memtab counter */
2743
0
            total_memtabs_used++;
2744
2745
            /* call the Que manager get mem recs */
2746
0
            total_memtabs_used += ihevce_buff_que_get_mem_recs(
2747
0
                &ps_memtab[total_memtabs_used],
2748
0
                ps_rec_desc->i4_num_recon_bufs,
2749
0
                IV_EXT_CACHEABLE_NORMAL_MEM);
2750
2751
0
            ps_rec_desc++;
2752
0
        }
2753
0
    }
2754
2755
    /* ----- allocate memory as per requests ---- */
2756
2757
    /* check on memtabs requested v/s memtabs used */
2758
    //ittiam : should put an assert
2759
8.22k
    ASSERT(total_memtabs_req == total_memtabs_used);
2760
180k
    for(ctr = 0; ctr < total_memtabs_used; ctr++)
2761
172k
    {
2762
172k
        UWORD8 *pu1_mem = NULL;
2763
172k
        ps_hle_ctxt->ihevce_mem_alloc(
2764
172k
            ps_hle_ctxt->pv_mem_mgr_hdl,
2765
172k
            &ps_hle_ctxt->ps_static_cfg_prms->s_sys_api,
2766
172k
            &ps_memtab[ctr]);
2767
2768
172k
        pu1_mem = (UWORD8 *)ps_memtab[ctr].pv_base;
2769
2770
172k
        if(NULL == pu1_mem)
2771
0
        {
2772
0
            ps_hle_ctxt->i4_error_code = IHEVCE_CANNOT_ALLOCATE_MEMORY;
2773
0
            return;
2774
0
        }
2775
172k
    }
2776
2777
    /* store the final allocated memtabs */
2778
8.22k
    ps_enc_ctxt->s_mem_mngr.i4_num_q_memtabs = total_memtabs_used;
2779
8.22k
    ps_enc_ctxt->s_mem_mngr.ps_q_memtab = ps_memtab;
2780
2781
    /* --------------------------------------------------------------------- */
2782
    /* -------------- Initialisation of Queues memory ---------------------- */
2783
    /* --------------------------------------------------------------------- */
2784
2785
    /* ---------- Input Data Que Mem init --------------- */
2786
8.22k
    if(0 == ps_enc_ctxt->i4_resolution_id)
2787
8.22k
    {
2788
8.22k
        ihevce_lap_enc_buf_t **pps_inp_bufs;
2789
8.22k
        ihevce_lap_enc_buf_t *ps_inp_bufs;
2790
2791
8.22k
        pps_inp_bufs = (ihevce_lap_enc_buf_t **)ps_memtab->pv_base;
2792
8.22k
        ps_memtab++;
2793
2794
8.22k
        ps_inp_bufs = (ihevce_lap_enc_buf_t *)ps_memtab->pv_base;
2795
8.22k
        ps_memtab++;
2796
2797
        /* loop to initialise the buffer pointer */
2798
31.0k
        for(ctr = 0; ctr < ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs; ctr++)
2799
22.7k
        {
2800
22.7k
            pps_inp_bufs[ctr] = &ps_inp_bufs[ctr];
2801
2802
22.7k
            pps_inp_bufs[ctr]->s_input_buf.i4_size = sizeof(iv_input_data_ctrl_buffs_t);
2803
2804
22.7k
            pps_inp_bufs[ctr]->s_input_buf.s_input_buf.i4_size = sizeof(iv_yuv_buf_t);
2805
2806
            /*pointer to i/p buf initialised to null in case of run time allocation*/
2807
22.7k
            if(ps_hle_ctxt->i4_create_time_input_allocation == 1)
2808
22.7k
            {
2809
22.7k
                pps_inp_bufs[ctr]->s_input_buf.pv_synch_ctrl_bufs =
2810
22.7k
                    ps_input_data_ctrl_buffs_desc->ppv_synch_ctrl_bufs[ctr];
2811
2812
22.7k
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_y_buf =
2813
22.7k
                    ps_input_data_ctrl_buffs_desc->ppv_y_buf[ctr];
2814
2815
22.7k
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_u_buf =
2816
22.7k
                    ps_input_data_ctrl_buffs_desc->ppv_u_buf[ctr];
2817
2818
22.7k
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_v_buf =
2819
22.7k
                    ps_input_data_ctrl_buffs_desc->ppv_v_buf[ctr];
2820
22.7k
            }
2821
0
            else
2822
0
            {
2823
0
                pps_inp_bufs[ctr]->s_input_buf.pv_synch_ctrl_bufs = NULL;
2824
2825
0
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_y_buf = NULL;
2826
2827
0
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_u_buf = NULL;
2828
2829
0
                pps_inp_bufs[ctr]->s_input_buf.s_input_buf.pv_v_buf = NULL;
2830
0
            }
2831
22.7k
        }
2832
2833
        /* Get the input data buffer Q handle */
2834
8.22k
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_DATA_CTRL_Q] = ihevce_buff_que_init(
2835
8.22k
            ps_memtab, ps_input_data_ctrl_buffs_desc->i4_num_yuv_bufs, (void **)pps_inp_bufs);
2836
2837
        /* increment the memtab pointer */
2838
8.22k
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2839
8.22k
    }
2840
0
    else
2841
0
    {
2842
        /* Get the input data buffer Q handle from 0th instance */
2843
0
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_DATA_CTRL_Q] =
2844
0
            ps_enc_ctxt_base->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_DATA_CTRL_Q];
2845
0
    }
2846
2847
    /* ---------- Input control Que Mem init --------------- */
2848
8.22k
    if(0 == ps_enc_ctxt->i4_resolution_id)
2849
8.22k
    {
2850
8.22k
        iv_input_ctrl_buffs_t **pps_inp_bufs;
2851
8.22k
        iv_input_ctrl_buffs_t *ps_inp_bufs;
2852
2853
8.22k
        pps_inp_bufs = (iv_input_ctrl_buffs_t **)ps_memtab->pv_base;
2854
8.22k
        ps_memtab++;
2855
2856
8.22k
        ps_inp_bufs = (iv_input_ctrl_buffs_t *)ps_memtab->pv_base;
2857
8.22k
        ps_memtab++;
2858
2859
        /* loop to initialise the buffer pointer */
2860
41.1k
        for(ctr = 0; ctr < ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs; ctr++)
2861
32.9k
        {
2862
32.9k
            pps_inp_bufs[ctr] = &ps_inp_bufs[ctr];
2863
2864
32.9k
            pps_inp_bufs[ctr]->i4_size = sizeof(iv_input_ctrl_buffs_t);
2865
2866
32.9k
            pps_inp_bufs[ctr]->pv_asynch_ctrl_bufs =
2867
32.9k
                ps_input_asynch_ctrl_buffs_desc->ppv_asynch_ctrl_bufs[ctr];
2868
32.9k
        }
2869
2870
        /* Get the input control buffer Q handle */
2871
8.22k
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_ASYNCH_CTRL_Q] = ihevce_buff_que_init(
2872
8.22k
            ps_memtab,
2873
8.22k
            ps_input_asynch_ctrl_buffs_desc->i4_num_asynch_ctrl_bufs,
2874
8.22k
            (void **)pps_inp_bufs);
2875
2876
        /* increment the memtab pointer */
2877
8.22k
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2878
8.22k
    }
2879
0
    else
2880
0
    {
2881
        /* Get the input control buffer Q handle from 0th instance */
2882
0
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_ASYNCH_CTRL_Q] =
2883
0
            ps_enc_ctxt_base->s_enc_ques.apv_q_hdl[IHEVCE_INPUT_ASYNCH_CTRL_Q];
2884
0
    }
2885
2886
    /* ---------- Output data Que Mem init --------------- */
2887
8.22k
    ps_out_desc = ps_output_data_buffs_desc;
2888
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
2889
8.22k
    {
2890
8.22k
        iv_output_data_buffs_t **pps_out_bufs;
2891
8.22k
        iv_output_data_buffs_t *ps_out_bufs;
2892
2893
8.22k
        pps_out_bufs = (iv_output_data_buffs_t **)ps_memtab->pv_base;
2894
8.22k
        ps_memtab++;
2895
2896
8.22k
        ps_out_bufs = (iv_output_data_buffs_t *)ps_memtab->pv_base;
2897
8.22k
        ps_memtab++;
2898
2899
        /* loop to initialise the buffer pointer */
2900
41.1k
        for(ctr = 0; ctr < ps_out_desc->i4_num_bitstream_bufs; ctr++)
2901
32.9k
        {
2902
32.9k
            pps_out_bufs[ctr] = &ps_out_bufs[ctr];
2903
2904
32.9k
            pps_out_bufs[ctr]->i4_size = sizeof(iv_output_data_buffs_t);
2905
2906
32.9k
            pps_out_bufs[ctr]->i4_bitstream_buf_size = ps_out_desc->i4_size_bitstream_buf;
2907
2908
            /*pointer to o/p buf initialised to null in case of run time allocation*/
2909
32.9k
            if(ps_hle_ctxt->i4_create_time_output_allocation == 1)
2910
0
            {
2911
0
                pps_out_bufs[ctr]->pv_bitstream_bufs = ps_out_desc->ppv_bitstream_bufs[ctr];
2912
0
            }
2913
32.9k
            else
2914
32.9k
            {
2915
32.9k
                pps_out_bufs[ctr]->pv_bitstream_bufs = NULL;
2916
32.9k
            }
2917
32.9k
        }
2918
2919
        /* Get the output data buffer Q handle */
2920
8.22k
        ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_OUTPUT_DATA_Q + i] = ihevce_buff_que_init(
2921
8.22k
            ps_memtab, ps_out_desc->i4_num_bitstream_bufs, (void **)pps_out_bufs);
2922
2923
        /* increment the memtab pointer */
2924
8.22k
        ps_memtab += ihevce_buff_que_get_num_mem_recs();
2925
2926
8.22k
        ps_out_desc++;
2927
8.22k
    }
2928
2929
    /* ----------Recon data Que Mem init --------------- */
2930
8.22k
    ps_rec_desc = ps_recon_data_buffs_desc;
2931
16.4k
    for(i = 0; i < i4_num_bitrate_inst; i++)
2932
8.22k
    {
2933
8.22k
        if(ps_hle_ctxt->ps_static_cfg_prms->i4_save_recon)
2934
0
        {
2935
0
            iv_enc_recon_data_buffs_t **pps_recon_bufs;
2936
0
            iv_enc_recon_data_buffs_t *ps_recon_bufs;
2937
2938
0
            pps_recon_bufs = (iv_enc_recon_data_buffs_t **)ps_memtab->pv_base;
2939
0
            ps_memtab++;
2940
2941
0
            ps_recon_bufs = (iv_enc_recon_data_buffs_t *)ps_memtab->pv_base;
2942
0
            ps_memtab++;
2943
2944
            /* loop to initialise the buffer pointer */
2945
0
            for(ctr = 0; ctr < ps_rec_desc->i4_num_recon_bufs; ctr++)
2946
0
            {
2947
0
                pps_recon_bufs[ctr] = &ps_recon_bufs[ctr];
2948
2949
0
                pps_recon_bufs[ctr]->i4_size = sizeof(iv_enc_recon_data_buffs_t);
2950
2951
0
                pps_recon_bufs[ctr]->pv_y_buf = ps_rec_desc->ppv_y_buf[ctr];
2952
2953
0
                pps_recon_bufs[ctr]->pv_cb_buf = ps_rec_desc->ppv_u_buf[ctr];
2954
2955
0
                pps_recon_bufs[ctr]->pv_cr_buf = ps_rec_desc->ppv_v_buf[ctr];
2956
0
            }
2957
2958
            /* Get the output data buffer Q handle */
2959
0
            ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_RECON_DATA_Q + i] = ihevce_buff_que_init(
2960
0
                ps_memtab, ps_rec_desc->i4_num_recon_bufs, (void **)pps_recon_bufs);
2961
2962
            /* increment the memtab pointer */
2963
0
            ps_memtab += ihevce_buff_que_get_num_mem_recs();
2964
2965
0
            ps_rec_desc++;
2966
0
        }
2967
8.22k
        else
2968
8.22k
        {
2969
8.22k
            ps_enc_ctxt->s_enc_ques.apv_q_hdl[IHEVCE_RECON_DATA_Q + i] = NULL;
2970
8.22k
        }
2971
8.22k
    }
2972
2973
8.22k
    return;
2974
8.22k
}
2975
2976
/*!
2977
******************************************************************************
2978
* \if Function name : ihevce_mem_manager_free \endif
2979
*
2980
* \brief
2981
*    Encoder memory free function
2982
*
2983
* \param[in] Processing interface context pointer
2984
*
2985
* \return
2986
*    None
2987
*
2988
* \author
2989
*  Ittiam
2990
*
2991
*****************************************************************************
2992
*/
2993
void ihevce_mem_manager_free(enc_ctxt_t *ps_enc_ctxt, ihevce_hle_ctxt_t *ps_intrf_ctxt)
2994
8.22k
{
2995
8.22k
    WORD32 ctr;
2996
2997
    /* run a loop to free all the memory allocated create time */
2998
7.24M
    for(ctr = 0; ctr < ps_enc_ctxt->s_mem_mngr.i4_num_create_memtabs; ctr++)
2999
7.23M
    {
3000
7.23M
        ps_intrf_ctxt->ihevce_mem_free(
3001
7.23M
            ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->s_mem_mngr.ps_create_memtab[ctr]);
3002
7.23M
    }
3003
3004
    /* free the memtab memory */
3005
8.22k
    {
3006
8.22k
        iv_mem_rec_t s_memtab;
3007
3008
8.22k
        s_memtab.i4_size = sizeof(iv_mem_rec_t);
3009
8.22k
        s_memtab.i4_mem_size = ps_enc_ctxt->s_mem_mngr.i4_num_create_memtabs * sizeof(iv_mem_rec_t);
3010
8.22k
        s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
3011
8.22k
        s_memtab.i4_mem_alignment = 4;
3012
8.22k
        s_memtab.pv_base = (void *)ps_enc_ctxt->s_mem_mngr.ps_create_memtab;
3013
3014
8.22k
        ps_intrf_ctxt->ihevce_mem_free(ps_intrf_ctxt->pv_mem_mgr_hdl, &s_memtab);
3015
8.22k
    }
3016
3017
8.22k
    if(1 == ps_enc_ctxt->i4_io_queues_created)
3018
8.22k
    {
3019
        /* run a loop to free all the memory allocated durign que creation */
3020
180k
        for(ctr = 0; ctr < ps_enc_ctxt->s_mem_mngr.i4_num_q_memtabs; ctr++)
3021
172k
        {
3022
172k
            ps_intrf_ctxt->ihevce_mem_free(
3023
172k
                ps_intrf_ctxt->pv_mem_mgr_hdl, &ps_enc_ctxt->s_mem_mngr.ps_q_memtab[ctr]);
3024
172k
        }
3025
3026
        /* free the  memtab memory */
3027
8.22k
        {
3028
8.22k
            iv_mem_rec_t s_memtab;
3029
3030
8.22k
            s_memtab.i4_size = sizeof(iv_mem_rec_t);
3031
8.22k
            s_memtab.i4_mem_size = ps_enc_ctxt->s_mem_mngr.i4_num_q_memtabs * sizeof(iv_mem_rec_t);
3032
8.22k
            s_memtab.e_mem_type = IV_EXT_CACHEABLE_NORMAL_MEM;
3033
8.22k
            s_memtab.i4_mem_alignment = 4;
3034
8.22k
            s_memtab.pv_base = (void *)ps_enc_ctxt->s_mem_mngr.ps_q_memtab;
3035
3036
8.22k
            ps_intrf_ctxt->ihevce_mem_free(ps_intrf_ctxt->pv_mem_mgr_hdl, &s_memtab);
3037
8.22k
        }
3038
8.22k
    }
3039
8.22k
    return;
3040
8.22k
}